[llvm] r292949 - [CodeView] Fix off-by-one error in def range gap emission
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Tue Jan 24 08:57:55 PST 2017
Author: rnk
Date: Tue Jan 24 10:57:55 2017
New Revision: 292949
URL: http://llvm.org/viewvc/llvm-project?rev=292949&view=rev
Log:
[CodeView] Fix off-by-one error in def range gap emission
Also fixes a much worse bug where we emitted the wrong gap size for the
def range uncovered by the test for this issue.
Fixes PR31726.
Modified:
llvm/trunk/lib/MC/MCCodeView.cpp
llvm/trunk/test/MC/COFF/cv-def-range-gap.s
Modified: llvm/trunk/lib/MC/MCCodeView.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCCodeView.cpp?rev=292949&r1=292948&r2=292949&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCCodeView.cpp (original)
+++ llvm/trunk/lib/MC/MCCodeView.cpp Tue Jan 24 10:57:55 2017
@@ -509,17 +509,17 @@ void CodeViewContext::encodeDefRange(MCA
// are artificially constructing.
size_t RecordSize = FixedSizePortion.size() +
sizeof(LocalVariableAddrRange) + 4 * NumGaps;
- // Write out the recrod size.
- support::endian::Writer<support::little>(OS).write<uint16_t>(RecordSize);
+ // Write out the record size.
+ LEWriter.write<uint16_t>(RecordSize);
// Write out the fixed size prefix.
OS << FixedSizePortion;
// Make space for a fixup that will eventually have a section relative
// relocation pointing at the offset where the variable becomes live.
Fixups.push_back(MCFixup::create(Contents.size(), BE, FK_SecRel_4));
- Contents.resize(Contents.size() + 4); // Fixup for code start.
+ LEWriter.write<uint32_t>(0); // Fixup for code start.
// Make space for a fixup that will record the section index for the code.
Fixups.push_back(MCFixup::create(Contents.size(), BE, FK_SecRel_2));
- Contents.resize(Contents.size() + 2); // Fixup for section index.
+ LEWriter.write<uint16_t>(0); // Fixup for section index.
// Write down the range's extent.
LEWriter.write<uint16_t>(Chunk);
@@ -529,7 +529,7 @@ void CodeViewContext::encodeDefRange(MCA
} while (RangeSize > 0);
// Emit the gaps afterwards.
- assert((NumGaps == 0 || Bias < MaxDefRange) &&
+ assert((NumGaps == 0 || Bias <= MaxDefRange) &&
"large ranges should not have gaps");
unsigned GapStartOffset = GapAndRangeSizes[I].second;
for (++I; I != J; ++I) {
@@ -537,7 +537,7 @@ void CodeViewContext::encodeDefRange(MCA
assert(I < GapAndRangeSizes.size());
std::tie(GapSize, RangeSize) = GapAndRangeSizes[I];
LEWriter.write<uint16_t>(GapStartOffset);
- LEWriter.write<uint16_t>(RangeSize);
+ LEWriter.write<uint16_t>(GapSize);
GapStartOffset += GapSize + RangeSize;
}
}
Modified: llvm/trunk/test/MC/COFF/cv-def-range-gap.s
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/MC/COFF/cv-def-range-gap.s?rev=292949&r1=292948&r2=292949&view=diff
==============================================================================
--- llvm/trunk/test/MC/COFF/cv-def-range-gap.s (original)
+++ llvm/trunk/test/MC/COFF/cv-def-range-gap.s Tue Jan 24 10:57:55 2017
@@ -38,6 +38,19 @@
# CHECK-NEXT: Range: 0x1
# CHECK-NEXT: }
# CHECK-NEXT: }
+# CHECK-NEXT: DefRangeRegister {
+# CHECK-NEXT: Register: 23
+# CHECK-NEXT: MayHaveNoName: 0
+# CHECK-NEXT: LocalVariableAddrRange {
+# CHECK-NEXT: OffsetStart: .text+0x2001C
+# CHECK-NEXT: ISectStart: 0x0
+# CHECK-NEXT: Range: 0xF000
+# CHECK-NEXT: }
+# CHECK-NEXT: LocalVariableAddrGap [
+# CHECK-NEXT: GapStartOffset: 0x1
+# CHECK-NEXT: Range: 0xEFFE
+# CHECK-NEXT: ]
+# CHECK-NEXT: }
.text
f: # @f
@@ -62,6 +75,16 @@ f:
.Lbegin3:
nop
.Lend3:
+
+ # Create a range that is exactly 0xF000 bytes long with a gap in the
+ # middle.
+.Lbegin4:
+ nop
+.Lend4:
+ .fill 0xeffe, 1, 0x90
+.Lbegin5:
+ nop
+.Lend5:
ret
.Lfunc_end0:
@@ -94,6 +117,7 @@ f:
.asciz "p"
.Ltmp19:
.cv_def_range .Lbegin0 .Lend0 .Lbegin1 .Lend1 .Lbegin2 .Lend2 .Lbegin3 .Lend3, "A\021\027\000\000\000"
+ .cv_def_range .Lbegin4 .Lend4 .Lbegin5 .Lend5, "A\021\027\000\000\000"
.short 2 # Record length
.short 4431 # Record kind: S_PROC_ID_END
.Ltmp15:
More information about the llvm-commits
mailing list