diff options
author | Tom de Vries <tdevries@suse.de> | 2019-01-16 07:46:56 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2019-01-16 07:46:56 +0000 |
commit | df1de0641543701e6cde7c47e1da594eed83325e (patch) | |
tree | 2bc7148a6377ff8cff86a81fd15244165864d1ba /libbacktrace | |
parent | 9a60361196767f7ebf9bd088661512822d06aa66 (diff) | |
download | gcc-df1de0641543701e6cde7c47e1da594eed83325e.zip gcc-df1de0641543701e6cde7c47e1da594eed83325e.tar.gz gcc-df1de0641543701e6cde7c47e1da594eed83325e.tar.bz2 |
[libbacktrace] Unify function name preference handling
Both read_function_entry and read_referenced_name implement a priority scheme
for names. The priorities are:
- 1st: DW_AT_linkage_name
- 2nd: Name from DW_AT_abstract_origin or DW_AT_specification
- 3rd: DW_AT_name.
Ensure both functions fully adhere to it.
2019-01-16 Tom de Vries <tdevries@suse.de>
* dwarf.c (read_referenced_name): Don't allow DW_AT_name to override any
name.
(read_function_entry): Same. Don't allow name found via
DW_AT_abstract_origin or case DW_AT_specification to override linkage
name.
From-SVN: r267963
Diffstat (limited to 'libbacktrace')
-rw-r--r-- | libbacktrace/ChangeLog | 8 | ||||
-rw-r--r-- | libbacktrace/dwarf.c | 33 |
2 files changed, 31 insertions, 10 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog index cd6aba0..a64537d 100644 --- a/libbacktrace/ChangeLog +++ b/libbacktrace/ChangeLog @@ -1,3 +1,11 @@ +2019-01-16 Tom de Vries <tdevries@suse.de> + + * dwarf.c (read_referenced_name): Don't allow DW_AT_name to override any + name. + (read_function_entry): Same. Don't allow name found via + DW_AT_abstract_origin or case DW_AT_specification to override linkage + name. + 2019-01-09 Sandra Loosemore <sandra@codesourcery.com> PR other/16615 diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c index c9ce383..af864d6 100644 --- a/libbacktrace/dwarf.c +++ b/libbacktrace/dwarf.c @@ -2151,18 +2151,25 @@ read_referenced_name (struct dwarf_data *ddata, struct unit *u, switch (abbrev->attrs[i].name) { case DW_AT_name: - /* We prefer the linkage name if get one. */ + /* Third name preference: don't override. A name we found in some + other way, will normally be more useful -- e.g., this name is + normally not mangled. */ + if (ret != NULL) + break; if (val.encoding == ATTR_VAL_STRING) ret = val.u.string; break; case DW_AT_linkage_name: case DW_AT_MIPS_linkage_name: + /* First name preference: override all. */ if (val.encoding == ATTR_VAL_STRING) return val.u.string; break; case DW_AT_specification: + /* Second name preference: override DW_AT_name, don't override + DW_AT_linkage_name. */ if (abbrev->attrs[i].form == DW_FORM_ref_addr || abbrev->attrs[i].form == DW_FORM_ref_sig8) { @@ -2315,6 +2322,7 @@ read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata, int highpc_is_relative; uint64_t ranges; int have_ranges; + int have_linkage_name; code = read_uleb128 (unit_buf); if (code == 0) @@ -2351,6 +2359,7 @@ read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata, highpc_is_relative = 0; ranges = 0; have_ranges = 0; + have_linkage_name = 0; for (i = 0; i < abbrev->num_attrs; ++i) { struct attr_val val; @@ -2399,6 +2408,10 @@ read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata, case DW_AT_abstract_origin: case DW_AT_specification: + /* Second name preference: override DW_AT_name, don't override + DW_AT_linkage_name. */ + if (have_linkage_name) + break; if (abbrev->attrs[i].form == DW_FORM_ref_addr || abbrev->attrs[i].form == DW_FORM_ref_sig8) { @@ -2420,21 +2433,21 @@ read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata, break; case DW_AT_name: + /* Third name preference: don't override. */ + if (function->name != NULL) + break; if (val.encoding == ATTR_VAL_STRING) - { - /* Don't override a name we found in some other - way, as it will normally be more - useful--e.g., this name is normally not - mangled. */ - if (function->name == NULL) - function->name = val.u.string; - } + function->name = val.u.string; break; case DW_AT_linkage_name: case DW_AT_MIPS_linkage_name: + /* First name preference: override all. */ if (val.encoding == ATTR_VAL_STRING) - function->name = val.u.string; + { + function->name = val.u.string; + have_linkage_name = 1; + } break; case DW_AT_low_pc: |