[llvm] r345441 - DebugInfo: reduce DIE range verification on object files

Saleem Abdulrasool via llvm-commits llvm-commits at lists.llvm.org
Sun Oct 28 15:17:13 PDT 2018


Thanks, I'll check them out.

On Sat, Oct 27, 2018 at 10:44 AM Vlad Tsyrklevich <vlad at tsyrklevich.net>
wrote:

> I reverted this commit as it was causing msan buildbot failures, like the
> following
> <http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/25452/steps/check-llvm%20msan/logs/stdio>
> :
>
> [ RUN      ] DWARFDebugInfo.TestDwarfVerifyCUDontShareLineTable
> ==42558==WARNING: MemorySanitizer: use-of-uninitialized-value
>     #0 0x36bc80a in llvm::DWARFVerifier::verifyDieRanges(llvm::DWARFDie const&, llvm::DWARFVerifier::DieRangeInfo&) /b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:417:21
>     #1 0x36b6b96 in llvm::DWARFVerifier::verifyUnitContents(llvm::DWARFUnit&) /b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:222:20
>     #2 0x36be884 in llvm::DWARFVerifier::verifyUnitSection(llvm::DWARFSection const&, llvm::DWARFSectionKind) /b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:350:29
>     #3 0x36bfdec in llvm::DWARFVerifier::handleDebugInfo() /b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:369:21
>     #4 0x3620883 in llvm::DWARFContext::verify(llvm::raw_ostream&, llvm::DIDumpOptions) /b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp:652:25
>     #5 0x7a901a in (anonymous namespace)::VerifyError(llvm::DWARFContext&, llvm::StringRef) /b/sanitizer-x86_64-linux-fast/build/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp:1871:3
>     #6 0x7ae9df in (anonymous namespace)::DWARFDebugInfo_TestDwarfVerifyCUDontShareLineTable_Test::TestBody() /b/sanitizer-x86_64-linux-fast/build/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp:2505:3
>     #7 0x3b0a041 in HandleExceptionsInMethodIfSupported<testing::Test, void> /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/src/gtest.cc
>     #8 0x3b0a041 in testing::Test::Run() /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/src/gtest.cc:2474
>     #9 0x3b0d6e6 in testing::TestInfo::Run() /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/src/gtest.cc:2656:11
>     #10 0x3b0ea6f in testing::TestCase::Run() /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/src/gtest.cc:2774:28
>     #11 0x3b2a9d8 in testing::internal::UnitTestImpl::RunAllTests() /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/src/gtest.cc:4649:43
>     #12 0x3b29748 in HandleExceptionsInMethodIfSupported<testing::internal::UnitTestImpl, bool> /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/src/gtest.cc
>     #13 0x3b29748 in testing::UnitTest::Run() /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/src/gtest.cc:4257
>     #14 0x3af5ccb in RUN_ALL_TESTS /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/googletest/include/gtest/gtest.h:2233:46
>     #15 0x3af5ccb in main /b/sanitizer-x86_64-linux-fast/build/llvm/utils/unittest/UnitTestMain/TestMain.cpp:51
>     #16 0x7fcd6ed8c2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)
>     #17 0x562e39 in _start (/b/sanitizer-x86_64-linux-fast/build/llvm_build_msan/unittests/DebugInfo/DWARF/DebugInfoDWARFTests+0x562e39)
>
> SUMMARY: MemorySanitizer: use-of-uninitialized-value /b/sanitizer-x86_64-linux-fast/build/llvm/lib/DebugInfo/DWARF/DWARFVerifier.cpp:417:21 in llvm::DWARFVerifier::verifyDieRanges(llvm::DWARFDie const&, llvm::DWARFVerifier::DieRangeInfo&)
>
>
> On Fri, Oct 26, 2018 at 5:51 PM Saleem Abdulrasool via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: compnerd
>> Date: Fri Oct 26 17:49:33 2018
>> New Revision: 345441
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=345441&view=rev
>> Log:
>> DebugInfo: reduce DIE range verification on object files
>>
>> Relocatable content may have overlapping ranges until the sections are
>> finalized.  This reduces the amount of verification that is done on an
>> object
>> file so that invalid errors are not raised.
>>
>> Added:
>>     llvm/trunk/test/tools/llvm-dwarfdump/X86/debug-verify-object.s
>> Modified:
>>     llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
>>     llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
>>
>> Modified: llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFVerifier.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFVerifier.h?rev=345441&r1=345440&r2=345441&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFVerifier.h (original)
>> +++ llvm/trunk/include/llvm/DebugInfo/DWARF/DWARFVerifier.h Fri Oct 26
>> 17:49:33 2018
>> @@ -97,6 +97,9 @@ private:
>>    /// lies between to valid DIEs.
>>    std::map<uint64_t, std::set<uint32_t>> ReferenceToDIEOffsets;
>>    uint32_t NumDebugLineErrors = 0;
>> +  // Used to relax some checks that do not currently work portably
>> +  bool IsObjectFile;
>> +  bool IsMachOObject;
>>
>>    raw_ostream &error() const;
>>    raw_ostream &warn() const;
>> @@ -286,8 +289,8 @@ private:
>>
>>  public:
>>    DWARFVerifier(raw_ostream &S, DWARFContext &D,
>> -                DIDumpOptions DumpOpts =
>> DIDumpOptions::getForSingleDIE())
>> -      : OS(S), DCtx(D), DumpOpts(std::move(DumpOpts)) {}
>> +                DIDumpOptions DumpOpts =
>> DIDumpOptions::getForSingleDIE());
>> +
>>    /// Verify the information in any of the following sections, if
>> available:
>>    /// .debug_abbrev, debug_abbrev.dwo
>>    ///
>>
>> Modified: llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp?rev=345441&r1=345440&r2=345441&view=diff
>>
>> ==============================================================================
>> --- llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp (original)
>> +++ llvm/trunk/lib/DebugInfo/DWARF/DWARFVerifier.cpp Fri Oct 26 17:49:33
>> 2018
>> @@ -394,20 +394,42 @@ unsigned DWARFVerifier::verifyDieRanges(
>>    // Build RI for this DIE and check that ranges within this DIE do not
>>    // overlap.
>>    DieRangeInfo RI(Die);
>> -  for (auto Range : Ranges) {
>> -    if (!Range.valid()) {
>> -      ++NumErrors;
>> -      error() << "Invalid address range " << Range << "\n";
>> -      continue;
>> -    }
>>
>> -    // Verify that ranges don't intersect.
>> -    const auto IntersectingRange = RI.insert(Range);
>> -    if (IntersectingRange != RI.Ranges.end()) {
>> -      ++NumErrors;
>> -      error() << "DIE has overlapping address ranges: " << Range << "
>> and "
>> -              << *IntersectingRange << "\n";
>> -      break;
>> +  // TODO support object files better
>> +  //
>> +  // Some object file formats (i.e. non-MachO) support COMDAT.  ELF in
>> +  // particular does so by placing each function into a section.  The
>> DWARF data
>> +  // for the function at that point uses a section relative
>> DW_FORM_addrp for
>> +  // the DW_AT_low_pc and a DW_FORM_data4 for the offset as the
>> DW_AT_high_pc.
>> +  // In such a case, when the Die is the CU, the ranges will overlap,
>> and we
>> +  // will flag valid conflicting ranges as invalid.
>> +  //
>> +  // For such targets, we should read the ranges from the CU and
>> partition them
>> +  // by the section id.  The ranges within a particular section should be
>> +  // disjoint, although the ranges across sections may overlap.  We
>> would map
>> +  // the child die to the entity that it references and the section with
>> which
>> +  // it is associated.  The child would then be checked against the range
>> +  // information for the associated section.
>> +  //
>> +  // For now, simply elide the range verification for the CU DIEs if we
>> are
>> +  // processing an object file.
>> +
>> +  if (!IsObjectFile || IsMachOObject || Die.getTag() ==
>> DW_TAG_subprogram) {
>> +    for (auto Range : Ranges) {
>> +      if (!Range.valid()) {
>> +        ++NumErrors;
>> +        error() << "Invalid address range " << Range << "\n";
>> +        continue;
>> +      }
>> +
>> +      // Verify that ranges don't intersect.
>> +      const auto IntersectingRange = RI.insert(Range);
>> +      if (IntersectingRange != RI.Ranges.end()) {
>> +        ++NumErrors;
>> +        error() << "DIE has overlapping address ranges: " << Range << "
>> and "
>> +                << *IntersectingRange << "\n";
>> +        break;
>> +      }
>>      }
>>    }
>>
>> @@ -745,6 +767,15 @@ void DWARFVerifier::verifyDebugLineRows(
>>    }
>>  }
>>
>> +DWARFVerifier::DWARFVerifier(raw_ostream &S, DWARFContext &D,
>> +                             DIDumpOptions DumpOpts)
>> +    : OS(S), DCtx(D), DumpOpts(std::move(DumpOpts)) {
>> +  if (const auto *F = DCtx.getDWARFObj().getFile()) {
>> +    IsObjectFile = F->isRelocatableObject();
>> +    IsMachOObject = F->isMachO();
>> +  }
>> +}
>> +
>>  bool DWARFVerifier::handleDebugLine() {
>>    NumDebugLineErrors = 0;
>>    OS << "Verifying .debug_line...\n";
>>
>> Added: llvm/trunk/test/tools/llvm-dwarfdump/X86/debug-verify-object.s
>> URL:
>> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/debug-verify-object.s?rev=345441&view=auto
>>
>> ==============================================================================
>> --- llvm/trunk/test/tools/llvm-dwarfdump/X86/debug-verify-object.s (added)
>> +++ llvm/trunk/test/tools/llvm-dwarfdump/X86/debug-verify-object.s Fri
>> Oct 26 17:49:33 2018
>> @@ -0,0 +1,57 @@
>> +# RUN: llvm-mc -filetype obj -o - %s | llvm-dwarfdump --verify -
>> +
>> +       .text
>> +
>> +       .section        .text.f,"ax", at progbits
>> +       .globl  f
>> +       .type   f, at function
>> +f:
>> +.Lfunc_begin0:
>> +       pushq   $32
>> +       popq    %rax
>> +       retq
>> +.Lfunc_end0:
>> +       .size   f, .Lfunc_end0-f
>> +
>> +       .section        .text.g,"ax", at progbits
>> +       .globl  g
>> +       .type   g, at function
>> +g:
>> +.Lfunc_begin1:
>> +       pushq   $64
>> +       popq    %rax
>> +       retq
>> +.Lfunc_end1:
>> +       .size   g, .Lfunc_end1-g
>> +
>> +       .section        .debug_abbrev,"", at progbits
>> +       .byte   1                       # Abbreviation Code
>> +       .byte   17                      # DW_TAG_compile_unit
>> +       .byte   0                       # DW_CHILDREN_no
>> +       .byte   17                      # DW_AT_low_pc
>> +       .byte   1                       # DW_FORM_addr
>> +       .byte   85                      # DW_AT_ranges
>> +       .byte   23                      # DW_FORM_sec_offset
>> +       .byte   0                       # EOM(1)
>> +       .byte   0                       # EOM(2)
>> +       .byte   0                       # EOM(3)
>> +
>> +       .section        .debug_info,"", at progbits
>> +.Lcu_begin0:
>> +       .long   20                      # Length of Unit
>> +       .short  4                       # DWARF version number
>> +       .long   .debug_abbrev           # Offset Into Abbrev. Section
>> +       .byte   8                       # Address Size (in bytes)
>> +       .byte   1                       # Abbrev [1] 0xb:0x1f
>> DW_TAG_compile_unit
>> +       .quad   0                       # DW_AT_low_pc
>> +       .long   .Ldebug_ranges0         # DW_AT_ranges
>> +
>> +       .section        .debug_ranges,"", at progbits
>> +.Ldebug_ranges0:
>> +       .quad   .Lfunc_begin0
>> +       .quad   .Lfunc_end0
>> +       .quad   .Lfunc_begin1
>> +       .quad   .Lfunc_end1
>> +       .quad   0
>> +       .quad   0
>> +
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>

-- 
Saleem Abdulrasool
compnerd (at) compnerd (dot) org
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181028/757ead77/attachment.html>


More information about the llvm-commits mailing list