Refactor linkage name querying

This commit is contained in:
Jeremy 2023-09-12 00:16:40 -04:00
parent 4b0af6b6d0
commit 54b4701462
No known key found for this signature in database
GPG Key ID: 19AA8270105E8EB4
2 changed files with 45 additions and 40 deletions

View File

@ -381,28 +381,28 @@ public:
holds_value = false; holds_value = false;
} }
T& value() & { T& unwrap() & {
if(!holds_value) { if(!holds_value) {
throw std::runtime_error{"Optional does not contain a value"}; throw std::runtime_error{"Optional does not contain a value"};
} }
return uvalue; return uvalue;
} }
const T& value() const & { const T& unwrap() const & {
if(!holds_value) { if(!holds_value) {
throw std::runtime_error{"Optional does not contain a value"}; throw std::runtime_error{"Optional does not contain a value"};
} }
return uvalue; return uvalue;
} }
T&& value() && { T&& unwrap() && {
if(!holds_value) { if(!holds_value) {
throw std::runtime_error{"Optional does not contain a value"}; throw std::runtime_error{"Optional does not contain a value"};
} }
return std::move(uvalue); return std::move(uvalue);
} }
const T&& value() const && { const T&& unwrap() const && {
if(!holds_value) { if(!holds_value) {
throw std::runtime_error{"Optional does not contain a value"}; throw std::runtime_error{"Optional does not contain a value"};
} }

View File

@ -336,6 +336,38 @@ namespace cpptrace {
return name; return name;
} }
optional<std::string> get_string_attribute(Dwarf_Half dw_attrnum) const {
Dwarf_Attribute attr;
int ret = dwarf_attr(die, dw_attrnum, &attr, nullptr);
if(ret == DW_DLV_OK) {
char* raw_str;
std::string str;
ret = dwarf_formstring(attr, &raw_str, nullptr);
assert(ret == DW_DLV_OK);
str = raw_str;
dwarf_dealloc(dbg, raw_str, DW_DLA_STRING);
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
return str;
} else {
return nullopt;
}
}
bool has_attr(Dwarf_Half dw_attrnum) const {
Dwarf_Attribute attr;
int ret = dwarf_attr(die, dw_attrnum, &attr, nullptr);
if(ret == DW_DLV_NO_ENTRY) {
return false;
} else if(ret == DW_DLV_OK) {
// TODO: Better impl that doesn't require allocation....?
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
return true;
} else {
fprintf(stderr, "Error\n");
exit(1);
}
}
Dwarf_Half get_tag() const { Dwarf_Half get_tag() const {
Dwarf_Half tag = 0; Dwarf_Half tag = 0;
dwarf_tag(die, &tag, nullptr); dwarf_tag(die, &tag, nullptr);
@ -645,43 +677,16 @@ namespace cpptrace {
stacktrace_frame& frame stacktrace_frame& frame
) { ) {
assert(die.get_tag() == DW_TAG_subprogram); assert(die.get_tag() == DW_TAG_subprogram);
Dwarf_Attribute attr; optional<std::string> name;
int ret = dwarf_attr(die.get(), DW_AT_linkage_name, &attr, nullptr); if(auto linkage_name = die.get_string_attribute(DW_AT_linkage_name)) {
if(ret != DW_DLV_OK) { name = std::move(linkage_name);
ret = dwarf_attr(die.get(), DW_AT_MIPS_linkage_name, &attr, nullptr); } else if(auto linkage_name = die.get_string_attribute(DW_AT_MIPS_linkage_name)) {
} name = std::move(linkage_name);
if(ret == DW_DLV_OK) { } else if(auto linkage_name = die.get_string_attribute(DW_AT_name)) {
char* raw_linkage_name; name = std::move(linkage_name);
std::string linkage_name;
if(dwarf_formstring(attr, &raw_linkage_name, nullptr) == DW_DLV_OK) {
linkage_name = raw_linkage_name;
if(dump_dwarf) {
fprintf(stderr, "name: %s\n", raw_linkage_name);
}
dwarf_dealloc(dbg, raw_linkage_name, DW_DLA_STRING);
}
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
if(!linkage_name.empty()) {
frame.symbol = linkage_name;
}
} else {
// TODO: temporary
ret = dwarf_attr(die.get(), DW_AT_name, &attr, nullptr);
if(ret == DW_DLV_OK) {
char* raw_linkage_name;
std::string linkage_name;
if(dwarf_formstring(attr, &raw_linkage_name, nullptr) == DW_DLV_OK) {
linkage_name = raw_linkage_name;
if(dump_dwarf) {
fprintf(stderr, "name: %s\n", raw_linkage_name);
}
dwarf_dealloc(dbg, raw_linkage_name, DW_DLA_STRING);
}
dwarf_dealloc(dbg, attr, DW_DLA_ATTR);
if(!linkage_name.empty()) {
frame.symbol = linkage_name;
}
} }
if(name) {
frame.symbol = std::move(name).unwrap();
} }
// TODO: Handle namespaces // TODO: Handle namespaces
// TODO: Disabled for now // TODO: Disabled for now