summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/test/tools/dsymutil/Inputs/sibling.obin1748 -> 1732 bytes
-rw-r--r--llvm/test/tools/dsymutil/PowerPC/sibling.test25
-rw-r--r--llvm/tools/dsymutil/DwarfLinker.cpp5
3 files changed, 22 insertions, 8 deletions
diff --git a/llvm/test/tools/dsymutil/Inputs/sibling.o b/llvm/test/tools/dsymutil/Inputs/sibling.o
index 01daa1cad0b..75a55d8f9f0 100644
--- a/llvm/test/tools/dsymutil/Inputs/sibling.o
+++ b/llvm/test/tools/dsymutil/Inputs/sibling.o
Binary files differ
diff --git a/llvm/test/tools/dsymutil/PowerPC/sibling.test b/llvm/test/tools/dsymutil/PowerPC/sibling.test
index 3f93cd37c81..b38b98a19bf 100644
--- a/llvm/test/tools/dsymutil/PowerPC/sibling.test
+++ b/llvm/test/tools/dsymutil/PowerPC/sibling.test
@@ -1,14 +1,27 @@
# Verify that we don't follow DW_AT_sibling references.
#
# Source:
-# struct A { int a; } a;
-# struct B { int b; } b;
+# struct A { };
+# struct B { };
+#
+# struct C {
+# A a;
+# };
+#
+# B b;
+# C c;
+#
+# Compiled with Apple-GCC 4.0.1 (build 5370):
+# g++ -g -c sibling.cpp -o sibling.o
# RUN: llvm-dsymutil -arch ppc -f -oso-prepend-path=%p/../Inputs/ -y %s -o - | llvm-dwarfdump -debug-info - | FileCheck %s
-# CHECK: DW_TAG_variable
-# CHECK-NEXT: DW_AT_name ("a")
-# CHECK-NOT: DW_AT_name ("b")
+# CHECK: DW_TAG_structure_type
+# CHECK-NEXT: DW_AT_name ("A")
+# CHECK: DW_TAG_structure_type
+# CHECK-NEXT: DW_AT_name ("C")
+
+# CHECK-NOT: DW_AT_name ("B")
---
triple: 'ppc-apple-darwin'
@@ -16,5 +29,5 @@ objects:
- filename: sibling.o
timestamp: 1518197670
symbols:
- - { sym: _a, objAddr: 0x00000000000000cb, binAddr: 0x0000000100000FA0, size: 0x00000010 }
+ - { sym: _c, objAddr: 0x000000000000017e, binAddr: 0x0000000100000FA0, size: 0x00000010 }
...
diff --git a/llvm/tools/dsymutil/DwarfLinker.cpp b/llvm/tools/dsymutil/DwarfLinker.cpp
index 200dccbc2aa..e35e17c9c02 100644
--- a/llvm/tools/dsymutil/DwarfLinker.cpp
+++ b/llvm/tools/dsymutil/DwarfLinker.cpp
@@ -2591,7 +2591,8 @@ void DwarfLinker::keepDIEAndDependencies(RelocationManager &RelocMgr,
for (const auto &AttrSpec : Abbrev->attributes()) {
DWARFFormValue Val(AttrSpec.Form);
- if (!Val.isFormClass(DWARFFormValue::FC_Reference)) {
+ if (!Val.isFormClass(DWARFFormValue::FC_Reference) ||
+ AttrSpec.Attr == dwarf::DW_AT_sibling) {
DWARFFormValue::skipValue(AttrSpec.Form, Data, &Offset,
Unit.getFormParams());
continue;
@@ -2767,7 +2768,7 @@ unsigned DwarfLinker::DIECloner::cloneDieReferenceAttribute(
resolveDIEReference(Linker, CompileUnits, Val, U, InputDIE, RefUnit);
// If the referenced DIE is not found, drop the attribute.
- if (!RefDie)
+ if (!RefDie || AttrSpec.Attr == dwarf::DW_AT_sibling)
return 0;
unsigned Idx = RefUnit->getOrigUnit().getDIEIndex(RefDie);
OpenPOWER on IntegriCloud