aboutsummaryrefslogtreecommitdiff
path: root/libbacktrace
diff options
context:
space:
mode:
authorTom de Vries <tdevries@suse.de>2019-01-16 07:46:56 +0000
committerTom de Vries <vries@gcc.gnu.org>2019-01-16 07:46:56 +0000
commitdf1de0641543701e6cde7c47e1da594eed83325e (patch)
tree2bc7148a6377ff8cff86a81fd15244165864d1ba /libbacktrace
parent9a60361196767f7ebf9bd088661512822d06aa66 (diff)
downloadgcc-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/ChangeLog8
-rw-r--r--libbacktrace/dwarf.c33
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: