[llvm] r292949 - [CodeView] Fix off-by-one error in def range gap emission

Hans Wennborg via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 8 09:26:17 PST 2017


Merged to 4.0 in r294479.

On Tue, Jan 24, 2017 at 8:57 AM, Reid Kleckner via llvm-commits
<llvm-commits at lists.llvm.org> wrote:
> 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:
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits


More information about the llvm-commits mailing list