summaryrefslogtreecommitdiffstats
path: root/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2012-07-17 15:28:35 +0000
committerAlexey Samsonov <samsonov@google.com>2012-07-17 15:28:35 +0000
commitb604ff2a078020b463dccec9d57fc55a7c500442 (patch)
tree96c94a75a89df8df1283f61b2bca52dcbb613b2d /llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp
parente3a14bb95b0d7cfb7f090da280ec2fc68e8f457d (diff)
downloadbcm5719-llvm-b604ff2a078020b463dccec9d57fc55a7c500442.tar.gz
bcm5719-llvm-b604ff2a078020b463dccec9d57fc55a7c500442.zip
Improve behavior of DebugInfoEntryMinimal::getSubprogramName() introduced in r159512.
To fetch a subprogram name we should not only inspect the DIE for this subprogram, but optionally inspect its specification, or its abstract origin (even if there is no inlining), or even specification of an abstract origin. Reviewed by Benjamin Kramer. llvm-svn: 160365
Diffstat (limited to 'llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp')
-rw-r--r--llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp51
1 files changed, 27 insertions, 24 deletions
diff --git a/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp
index 1024b452551..429a36c0871 100644
--- a/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp
+++ b/llvm/lib/DebugInfo/DWARFDebugInfoEntry.cpp
@@ -456,35 +456,38 @@ DWARFDebugInfoEntryMinimal::addressRangeContainsAddress(
return false;
}
-static inline const char*
-getSubprogramNameFromDie(const DWARFCompileUnit *cu,
- const DWARFDebugInfoEntryMinimal *die) {
- const char *result = 0;
- if (!die->isNULL() && die->getTag() == DW_TAG_subprogram) {
- // Try to get mangled name if possible.
- result = die->getAttributeValueAsString(cu, DW_AT_MIPS_linkage_name, 0);
- if (result == 0)
- result = die->getAttributeValueAsString(cu, DW_AT_linkage_name, 0);
- if (result == 0)
- result = die->getAttributeValueAsString(cu, DW_AT_name, 0);
- }
- return result;
-}
-
const char*
DWARFDebugInfoEntryMinimal::getSubprogramName(
const DWARFCompileUnit *cu) const {
if (isNULL() || getTag() != DW_TAG_subprogram)
return 0;
- const char *name = getSubprogramNameFromDie(cu, this);
- if (name == 0) {
- // Try to get name from specification DIE.
- uint32_t ref = getAttributeValueAsReference(cu, DW_AT_specification, -1U);
- if (ref != -1U) {
- DWARFDebugInfoEntryMinimal spec_die;
- if (spec_die.extract(cu, &ref))
- name = getSubprogramNameFromDie(cu, &spec_die);
+ // Try to get mangled name if possible.
+ if (const char *name =
+ getAttributeValueAsString(cu, DW_AT_MIPS_linkage_name, 0))
+ return name;
+ if (const char *name = getAttributeValueAsString(cu, DW_AT_linkage_name, 0))
+ return name;
+ if (const char *name = getAttributeValueAsString(cu, DW_AT_name, 0))
+ return name;
+ // Try to get name from specification DIE.
+ uint32_t spec_ref =
+ getAttributeValueAsReference(cu, DW_AT_specification, -1U);
+ if (spec_ref != -1U) {
+ DWARFDebugInfoEntryMinimal spec_die;
+ if (spec_die.extract(cu, &spec_ref)) {
+ if (const char *name = spec_die.getSubprogramName(cu))
+ return name;
}
}
- return name;
+ // Try to get name from abstract origin DIE.
+ uint32_t abs_origin_ref =
+ getAttributeValueAsReference(cu, DW_AT_abstract_origin, -1U);
+ if (abs_origin_ref != -1U) {
+ DWARFDebugInfoEntryMinimal abs_origin_die;
+ if (abs_origin_die.extract(cu, &abs_origin_ref)) {
+ if (const char *name = abs_origin_die.getSubprogramName(cu))
+ return name;
+ }
+ }
+ return 0;
}
OpenPOWER on IntegriCloud