[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