From: Jonas Devlieghere Date: Wed, 13 Feb 2019 00:32:06 +0000 (+0000) Subject: [dsymutil] Don't clone empty CUs X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=629efa3c8d69c8d504db299168c7ef0f9c73270e;p=llvm [dsymutil] Don't clone empty CUs The DWARF standard says that an empty compile unit is not valid: > Each such contribution consists of a compilation unit header (see > Section 7.5.1.1 on page 200) followed by a single DW_TAG_compile_unit or > DW_TAG_partial_unit debugging information entry, together with its > children. Therefore we shouldn't clone them in dsymutil. Differential revision: https://reviews.llvm.org/D57979 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353903 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/dsymutil/X86/empty-CU.test b/test/tools/dsymutil/X86/empty-CU.test index c55a3ca8659..e2acefcdccf 100644 --- a/test/tools/dsymutil/X86/empty-CU.test +++ b/test/tools/dsymutil/X86/empty-CU.test @@ -4,4 +4,3 @@ CHECK: .debug_info contents: CHECK: 0x00000000: Compile Unit: length = 0x00000008 version = 0x0003 abbr_offset = 0x0000 addr_size = 0x04 (next unit at 0x0000000c) CHECK: 0x0000000b: DW_TAG_compile_unit [1] -CHECK: 0x0000000c: Compile Unit: length = 0x00000007 version = 0x0003 abbr_offset = 0x0000 addr_size = 0x04 (next unit at 0x00000017) diff --git a/test/tools/dsymutil/X86/generate-empty-CU.test b/test/tools/dsymutil/X86/generate-empty-CU.test index 5b1dd751593..02914181b33 100644 --- a/test/tools/dsymutil/X86/generate-empty-CU.test +++ b/test/tools/dsymutil/X86/generate-empty-CU.test @@ -1,8 +1,8 @@ # RUN: dsymutil -f -o - -oso-prepend-path=%p/.. -y %s | llvm-dwarfdump -v - | FileCheck %s # This test on links the Dwarf for an LTO binary and on purpose doesn't retain -# any symbol in the second CU out of 3. This is the only case where dsymutil -# will generate an empty CU and it requires special handling. +# any symbol in the second CU out of 3. To be valid DWARF ssymutil must not +# generate an empty CU but omit it. --- triple: 'x86_64-apple-darwin' @@ -22,9 +22,7 @@ CHECK: DW_AT_name {{.*}} "basic1.c" CHECK: DW_TAG_subprogram DW_AT_name {{.*}} "main" -CHECK: Compile Unit: length = 0x00000007 version = 0x0002 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x0000008c) - -CHECK: Compile Unit: length = 0x00000089 version = 0x0002 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x00000119) +CHECK: 0x00000081: Compile Unit: length = 0x00000089 version = 0x0002 abbr_offset = 0x0000 addr_size = 0x08 (next unit at 0x0000010e) CHECK: DW_TAG_compile_unit CHECK: DW_AT_name {{.*}} "basic3.c" diff --git a/tools/dsymutil/CompileUnit.cpp b/tools/dsymutil/CompileUnit.cpp index 3eb6abbb852..670591a9436 100644 --- a/tools/dsymutil/CompileUnit.cpp +++ b/tools/dsymutil/CompileUnit.cpp @@ -55,12 +55,11 @@ void CompileUnit::markEverythingAsKept() { } uint64_t CompileUnit::computeNextUnitOffset() { - NextUnitOffset = StartOffset + 11 /* Header size */; - // The root DIE might be null, meaning that the Unit had nothing to - // contribute to the linked output. In that case, we will emit the - // unit header without any actual DIE. - if (NewUnit) + NextUnitOffset = StartOffset; + if (NewUnit) { + NextUnitOffset += 11 /* Header size */; NextUnitOffset += NewUnit->getUnitDie().getSize(); + } return NextUnitOffset; } diff --git a/tools/dsymutil/DwarfLinker.cpp b/tools/dsymutil/DwarfLinker.cpp index 384805808e5..ce8653173c3 100644 --- a/tools/dsymutil/DwarfLinker.cpp +++ b/tools/dsymutil/DwarfLinker.cpp @@ -2266,10 +2266,10 @@ void DwarfLinker::DIECloner::cloneAllCompileUnits( if (LLVM_LIKELY(!Linker.Options.Update)) Linker.generateUnitRanges(*CurrentUnit); CurrentUnit->fixupForwardReferences(); - Linker.Streamer->emitCompileUnitHeader(*CurrentUnit); - if (!CurrentUnit->getOutputUnitDIE()) - continue; - Linker.Streamer->emitDIE(*CurrentUnit->getOutputUnitDIE()); + if (CurrentUnit->getOutputUnitDIE()) { + Linker.Streamer->emitCompileUnitHeader(*CurrentUnit); + Linker.Streamer->emitDIE(*CurrentUnit->getOutputUnitDIE()); + } } }