summaryrefslogtreecommitdiff
path: root/lib/DebugInfo
diff options
context:
space:
mode:
Diffstat (limited to 'lib/DebugInfo')
-rw-r--r--lib/DebugInfo/DWARFContext.cpp6
-rw-r--r--lib/DebugInfo/DWARFDebugInfoEntry.cpp51
-rw-r--r--lib/DebugInfo/DWARFDebugInfoEntry.h6
3 files changed, 35 insertions, 28 deletions
diff --git a/lib/DebugInfo/DWARFContext.cpp b/lib/DebugInfo/DWARFContext.cpp
index 6be230e73a..08e5db2206 100644
--- a/lib/DebugInfo/DWARFContext.cpp
+++ b/lib/DebugInfo/DWARFContext.cpp
@@ -155,8 +155,10 @@ DILineInfo DWARFContext::getLineInfoForAddress(uint64_t address,
if (specifier.needs(DILineInfoSpecifier::FunctionName)) {
const DWARFDebugInfoEntryMinimal *function_die =
cu->getFunctionDIEForAddress(address);
- if (function_die)
- functionName = function_die->getSubprogramName(cu);
+ if (function_die) {
+ if (const char *name = function_die->getSubprogramName(cu))
+ functionName = name;
+ }
}
if (specifier.needs(DILineInfoSpecifier::FileLineInfo)) {
// Get the line table for this compile unit.
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.cpp b/lib/DebugInfo/DWARFDebugInfoEntry.cpp
index 1024b45255..429a36c087 100644
--- a/lib/DebugInfo/DWARFDebugInfoEntry.cpp
+++ b/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;
}
diff --git a/lib/DebugInfo/DWARFDebugInfoEntry.h b/lib/DebugInfo/DWARFDebugInfoEntry.h
index 1a040a53a3..d5d86b9ec0 100644
--- a/lib/DebugInfo/DWARFDebugInfoEntry.h
+++ b/lib/DebugInfo/DWARFDebugInfoEntry.h
@@ -132,8 +132,10 @@ public:
bool addressRangeContainsAddress(const DWARFCompileUnit *cu,
const uint64_t address) const;
- // If a DIE represents a subroutine, returns its mangled name
- // (or short name, if mangled is missing). Otherwise returns null.
+ // If a DIE represents a subprogram, returns its mangled name
+ // (or short name, if mangled is missing). This name may be fetched
+ // from specification or abstract origin for this subprogram.
+ // Returns null if no name is found.
const char* getSubprogramName(const DWARFCompileUnit *cu) const;
};