diff options
author | David Blaikie <dblaikie@gmail.com> | 2017-03-13 21:46:37 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2017-03-13 21:46:37 +0000 |
commit | 1914c82d6c09e1c0ece9d6b2ca48cefbe097a1a0 (patch) | |
tree | 30e7811e86753c83a3b0ea5142733bec57feba03 | |
parent | 427f426f02cfba136f197cb96a2719a3aff98061 (diff) | |
download | bcm5719-llvm-1914c82d6c09e1c0ece9d6b2ca48cefbe097a1a0.tar.gz bcm5719-llvm-1914c82d6c09e1c0ece9d6b2ca48cefbe097a1a0.zip |
Fix llvm-symbolizer to navigate both DW_AT_abstract_origin and DW_AT_specification in a single chain
In a recent refactoring (r291959) this regressed to only following one
or the other, not both, in a single chain.
llvm-svn: 297676
-rw-r--r-- | llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h | 8 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/DWARF/DWARFDie.cpp | 32 | ||||
-rw-r--r-- | llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp | 30 |
3 files changed, 28 insertions, 42 deletions
diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h index 1c450d2d9a1..33e24fe3adc 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h @@ -146,14 +146,6 @@ public: /// exist in this DIE. Optional<DWARFFormValue> find(ArrayRef<dwarf::Attribute> Attrs) const; - /// Extract an attribute value from this DIE and recurse into any - /// DW_AT_specification or DW_AT_abstract_origin referenced DIEs. - /// - /// \param Attr the attribute to extract. - /// \returns an optional DWARFFormValue that will have the form value if the - /// attribute was successfully extracted. - Optional<DWARFFormValue> findRecursively(dwarf::Attribute Attr) const; - /// Extract the first value of any attribute in Attrs from this DIE and /// recurse into any DW_AT_specification or DW_AT_abstract_origin referenced /// DIEs. diff --git a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp index fc49fdeaad5..4308cc2e263 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFDie.cpp @@ -150,21 +150,6 @@ DWARFDie::find(dwarf::Attribute Attr) const { } Optional<DWARFFormValue> -DWARFDie::findRecursively(dwarf::Attribute Attr) const { - if (!isValid()) - return None; - if (auto Value = find(Attr)) - return Value; - if (auto Die = getAttributeValueAsReferencedDie(DW_AT_abstract_origin)) - if (auto Value = Die.find(Attr)) - return Value; - if (auto Die = getAttributeValueAsReferencedDie(DW_AT_specification)) - if (auto Value = Die.find(Attr)) - return Value; - return None; -} - -Optional<DWARFFormValue> DWARFDie::find(ArrayRef<dwarf::Attribute> Attrs) const { if (!isValid()) return None; @@ -182,14 +167,17 @@ Optional<DWARFFormValue> DWARFDie::findRecursively(ArrayRef<dwarf::Attribute> Attrs) const { if (!isValid()) return None; - if (auto Value = find(Attrs)) + auto Die = *this; + if (auto Value = Die.find(Attrs)) + return Value; + if (auto D = Die.getAttributeValueAsReferencedDie(DW_AT_abstract_origin)) + Die = D; + if (auto Value = Die.find(Attrs)) + return Value; + if (auto D = Die.getAttributeValueAsReferencedDie(DW_AT_specification)) + Die = D; + if (auto Value = Die.find(Attrs)) return Value; - if (auto Die = getAttributeValueAsReferencedDie(DW_AT_abstract_origin)) - if (auto Value = Die.find(Attrs)) - return Value; - if (auto Die = getAttributeValueAsReferencedDie(DW_AT_specification)) - if (auto Value = Die.find(Attrs)) - return Value; return None; } diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp index c13b610338f..a6c5b3a34cc 100644 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -1279,17 +1279,21 @@ TEST(DWARFDebugInfo, TestFindRecurse) { dwarfgen::Generator *DG = ExpectedDG.get().get(); dwarfgen::CompileUnit &CU = DG->addCompileUnit(); - StringRef SpecDieName("spec"); - StringRef AbsDieName("abs"); + StringRef SpecDieName = "spec"; + StringRef SpecLinkageName = "spec_linkage"; + StringRef AbsDieName = "abs"; // Scope to allow us to re-use the same DIE names { auto CUDie = CU.getUnitDIE(); auto FuncSpecDie = CUDie.addChild(DW_TAG_subprogram); + auto FuncAbsDie = CUDie.addChild(DW_TAG_subprogram); auto FuncDie = CUDie.addChild(DW_TAG_subprogram); auto VarAbsDie = CUDie.addChild(DW_TAG_variable); auto VarDie = CUDie.addChild(DW_TAG_variable); FuncSpecDie.addAttribute(DW_AT_name, DW_FORM_strp, SpecDieName); - FuncDie.addAttribute(DW_AT_specification, DW_FORM_ref4, FuncSpecDie); + FuncAbsDie.addAttribute(DW_AT_linkage_name, DW_FORM_strp, SpecLinkageName); + FuncAbsDie.addAttribute(DW_AT_specification, DW_FORM_ref4, FuncSpecDie); + FuncDie.addAttribute(DW_AT_abstract_origin, DW_FORM_ref4, FuncAbsDie); VarAbsDie.addAttribute(DW_AT_name, DW_FORM_strp, AbsDieName); VarDie.addAttribute(DW_AT_abstract_origin, DW_FORM_ref4, VarAbsDie); } @@ -1309,41 +1313,43 @@ TEST(DWARFDebugInfo, TestFindRecurse) { EXPECT_TRUE(CUDie.isValid()); auto FuncSpecDie = CUDie.getFirstChild(); - auto FuncDie = FuncSpecDie.getSibling(); + auto FuncAbsDie = FuncSpecDie.getSibling(); + auto FuncDie = FuncAbsDie.getSibling(); auto VarAbsDie = FuncDie.getSibling(); auto VarDie = VarAbsDie.getSibling(); // Make sure we can't extract the name from the specification die when using // DWARFDie::find() since it won't check the DW_AT_specification DIE. - EXPECT_FALSE(FuncDie.find(DW_AT_name).hasValue()); + EXPECT_FALSE(FuncDie.find(DW_AT_name)); // Make sure we can extract the name from the specification die when using // DWARFDie::findRecursively() since it should recurse through the // DW_AT_specification DIE. auto NameOpt = FuncDie.findRecursively(DW_AT_name); - EXPECT_TRUE(NameOpt.hasValue()); + EXPECT_TRUE(NameOpt); // Test the dwarf::toString() helper function. auto StringOpt = toString(NameOpt); - EXPECT_TRUE(StringOpt.hasValue()); + EXPECT_TRUE(StringOpt); EXPECT_EQ(SpecDieName, StringOpt.getValueOr(nullptr)); // Test the dwarf::toString() helper function with a default value specified. EXPECT_EQ(SpecDieName, toString(NameOpt, nullptr)); + + auto LinkageNameOpt = FuncDie.findRecursively(DW_AT_linkage_name); + EXPECT_EQ(SpecLinkageName, toString(LinkageNameOpt).getValueOr(nullptr)); // Make sure we can't extract the name from the abstract origin die when using // DWARFDie::find() since it won't check the DW_AT_abstract_origin DIE. - EXPECT_FALSE(VarDie.find(DW_AT_name).hasValue()); + EXPECT_FALSE(VarDie.find(DW_AT_name)); // Make sure we can extract the name from the abstract origin die when using // DWARFDie::findRecursively() since it should recurse through the // DW_AT_abstract_origin DIE. NameOpt = VarDie.findRecursively(DW_AT_name); - EXPECT_TRUE(NameOpt.hasValue()); + EXPECT_TRUE(NameOpt); // Test the dwarf::toString() helper function. StringOpt = toString(NameOpt); - EXPECT_TRUE(StringOpt.hasValue()); + EXPECT_TRUE(StringOpt); EXPECT_EQ(AbsDieName, StringOpt.getValueOr(nullptr)); - // Test the dwarf::toString() helper function with a default value specified. - EXPECT_EQ(AbsDieName, toString(NameOpt, nullptr)); } TEST(DWARFDebugInfo, TestDwarfToFunctions) { |