mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-25 16:24:23 +00:00
This patch extends the libLLVMDebugInfo which contains a minimalistic DWARF parser:
1) DIContext is now able to return function name for a given instruction address (besides file/line info). 2) llvm-dwarfdump accepts flag --functions that prints the function name (if address is specified by --address flag). 3) test case that checks the basic functionality of llvm-dwarfdump added git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159512 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -440,3 +440,51 @@ DWARFDebugInfoEntryMinimal::buildAddressRangeTable(const DWARFCompileUnit *cu,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
DWARFDebugInfoEntryMinimal::addressRangeContainsAddress(
|
||||
const DWARFCompileUnit *cu, const uint64_t address) const {
|
||||
if (!isNULL() && getTag() == DW_TAG_subprogram) {
|
||||
uint64_t hi_pc = -1ULL;
|
||||
uint64_t lo_pc = getAttributeValueAsUnsigned(cu, DW_AT_low_pc, -1ULL);
|
||||
if (lo_pc != -1ULL)
|
||||
hi_pc = getAttributeValueAsUnsigned(cu, DW_AT_high_pc, -1ULL);
|
||||
if (hi_pc != -1ULL) {
|
||||
return (lo_pc <= address && address < hi_pc);
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
Reference in New Issue
Block a user