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

Vlad Tsyrklevich via llvm-commits llvm-commits at lists.llvm.org
Sat Oct 27 10:44:16 PDT 2018


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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20181027/2ea0978d/attachment-0001.html>


More information about the llvm-commits mailing list