[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