Refactor linkage name querying
This commit is contained in:
parent
4b0af6b6d0
commit
54b4701462
@ -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"};
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
} else if(auto linkage_name = die.get_string_attribute(DW_AT_name)) {
|
||||||
|
name = std::move(linkage_name);
|
||||||
}
|
}
|
||||||
if(ret == DW_DLV_OK) {
|
if(name) {
|
||||||
char* raw_linkage_name;
|
frame.symbol = std::move(name).unwrap();
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// TODO: Handle namespaces
|
// TODO: Handle namespaces
|
||||||
// TODO: Disabled for now
|
// TODO: Disabled for now
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user