forked from OSchip/llvm-project
[dsymutil] Skip DW_AT_sibling attributes.
Following DW_AT_sibling attributes completely defeats the pruning pass. Although clang doesn't generate the DW_AT_sibling attribute we should still handle it correctly. Differential revision: https://reviews.llvm.org/D43439 llvm-svn: 326231
This commit is contained in:
parent
482bf0f531
commit
de979bfe58
Binary file not shown.
|
@ -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 }
|
||||
...
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue