summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJonas Devlieghere <jonas@devlieghere.com>2019-02-13 00:32:06 +0000
committerJonas Devlieghere <jonas@devlieghere.com>2019-02-13 00:32:06 +0000
commit1bf1b9857f8733eabe009da9f529e0b1b5323a28 (patch)
treec1de1ead0d5d1b09c3756a8cb59178b54c561370
parent8bb5d7e76a37228b687b9b95a3129b0f2624cbec (diff)
downloadbcm5719-llvm-1bf1b9857f8733eabe009da9f529e0b1b5323a28.tar.gz
bcm5719-llvm-1bf1b9857f8733eabe009da9f529e0b1b5323a28.zip
[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 llvm-svn: 353903
-rw-r--r--llvm/test/tools/dsymutil/X86/empty-CU.test1
-rw-r--r--llvm/test/tools/dsymutil/X86/generate-empty-CU.test8
-rw-r--r--llvm/tools/dsymutil/CompileUnit.cpp9
-rw-r--r--llvm/tools/dsymutil/DwarfLinker.cpp8
4 files changed, 11 insertions, 15 deletions
diff --git a/llvm/test/tools/dsymutil/X86/empty-CU.test b/llvm/test/tools/dsymutil/X86/empty-CU.test
index c55a3ca8659..e2acefcdccf 100644
--- a/llvm/test/tools/dsymutil/X86/empty-CU.test
+++ b/llvm/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/llvm/test/tools/dsymutil/X86/generate-empty-CU.test b/llvm/test/tools/dsymutil/X86/generate-empty-CU.test
index 5b1dd751593..02914181b33 100644
--- a/llvm/test/tools/dsymutil/X86/generate-empty-CU.test
+++ b/llvm/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/llvm/tools/dsymutil/CompileUnit.cpp b/llvm/tools/dsymutil/CompileUnit.cpp
index 3eb6abbb852..670591a9436 100644
--- a/llvm/tools/dsymutil/CompileUnit.cpp
+++ b/llvm/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/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp
index 384805808e5..ce8653173c3 100644
--- a/llvm/tools/dsymutil/DwarfLinker.cpp
+++ b/llvm/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());
+ }
}
}
OpenPOWER on IntegriCloud