diff options
Diffstat (limited to 'lib/DebugInfo')
-rw-r--r-- | lib/DebugInfo/DWARFContext.cpp | 6 | ||||
-rw-r--r-- | lib/DebugInfo/DWARFDebugInfoEntry.cpp | 51 | ||||
-rw-r--r-- | lib/DebugInfo/DWARFDebugInfoEntry.h | 6 |
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; }; |