diff options
author | Tom de Vries <tdevries@suse.de> | 2019-01-16 20:47:02 +0000 |
---|---|---|
committer | Tom de Vries <vries@gcc.gnu.org> | 2019-01-16 20:47:02 +0000 |
commit | 07e1534f44b26a1acb0b3393aae7d1a4a90fa942 (patch) | |
tree | 3e356bb8164268e1ca12f5d0ce9f6c8d5daeaef7 | |
parent | e42589bd629d1c4b38aee2c8fcb924c37c6889b7 (diff) | |
download | gcc-07e1534f44b26a1acb0b3393aae7d1a4a90fa942.zip gcc-07e1534f44b26a1acb0b3393aae7d1a4a90fa942.tar.gz gcc-07e1534f44b26a1acb0b3393aae7d1a4a90fa942.tar.bz2 |
[libbacktrace] Factor out read_referenced_name_from_attr
Factor out the common handling of DW_AT_abstract_origin and
DW_AT_specification from read_function_entry and read_referenced_name.
2019-01-16 Tom de Vries <tdevries@suse.de>
* dwarf.c (read_referenced_name_from_attr): New function. Factor out
of ...
(read_referenced_name): ... here, and ...
(read_function_entry): ... here.
From-SVN: r267986
-rw-r--r-- | libbacktrace/ChangeLog | 7 | ||||
-rw-r--r-- | libbacktrace/dwarf.c | 89 |
2 files changed, 61 insertions, 35 deletions
diff --git a/libbacktrace/ChangeLog b/libbacktrace/ChangeLog index a64537d..cc8bb74 100644 --- a/libbacktrace/ChangeLog +++ b/libbacktrace/ChangeLog @@ -1,5 +1,12 @@ 2019-01-16 Tom de Vries <tdevries@suse.de> + * dwarf.c (read_referenced_name_from_attr): New function. Factor out + of ... + (read_referenced_name): ... here, and ... + (read_function_entry): ... here. + +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 diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c index af864d6..dca5d90 100644 --- a/libbacktrace/dwarf.c +++ b/libbacktrace/dwarf.c @@ -2087,6 +2087,43 @@ read_line_info (struct backtrace_state *state, struct dwarf_data *ddata, return 0; } +static const char *read_referenced_name (struct dwarf_data *, struct unit *, + uint64_t, backtrace_error_callback, + void *); + +/* Read the name of a function from a DIE referenced by ATTR with VAL. */ + +static const char * +read_referenced_name_from_attr (struct dwarf_data *ddata, struct unit *u, + struct attr *attr, struct attr_val *val, + backtrace_error_callback error_callback, + void *data) +{ + switch (attr->name) + { + case DW_AT_abstract_origin: + case DW_AT_specification: + break; + default: + return NULL; + } + + if (attr->form == DW_FORM_ref_addr + || attr->form == DW_FORM_ref_sig8) + { + /* This refers to an abstract origin defined in + some other compilation unit. We can handle + this case if we must, but it's harder. */ + return NULL; + } + + if (val->encoding == ATTR_VAL_UINT + || val->encoding == ATTR_VAL_REF_UNIT) + return read_referenced_name (ddata, u, val->u.uint, error_callback, data); + + return NULL; +} + /* Read the name of a function from a DIE referenced by a DW_AT_abstract_origin or DW_AT_specification tag. OFFSET is within the same compilation unit. */ @@ -2170,24 +2207,14 @@ read_referenced_name (struct dwarf_data *ddata, struct unit *u, 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) - { - /* This refers to a specification defined in some other - compilation unit. We can handle this case if we - must, but it's harder. */ - break; - } - if (val.encoding == ATTR_VAL_UINT - || val.encoding == ATTR_VAL_REF_UNIT) - { - const char *name; + { + const char *name; - name = read_referenced_name (ddata, u, val.u.uint, - error_callback, data); - if (name != NULL) - ret = name; - } + name = read_referenced_name_from_attr (ddata, u, &abbrev->attrs[i], + &val, error_callback, data); + if (name != NULL) + ret = name; + } break; default: @@ -2412,24 +2439,16 @@ read_function_entry (struct backtrace_state *state, struct dwarf_data *ddata, 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) - { - /* This refers to an abstract origin defined in - some other compilation unit. We can handle - this case if we must, but it's harder. */ - break; - } - if (val.encoding == ATTR_VAL_UINT - || val.encoding == ATTR_VAL_REF_UNIT) - { - const char *name; - - name = read_referenced_name (ddata, u, val.u.uint, - error_callback, data); - if (name != NULL) - function->name = name; - } + { + const char *name; + + name + = read_referenced_name_from_attr (ddata, u, + &abbrev->attrs[i], &val, + error_callback, data); + if (name != NULL) + function->name = name; + } break; case DW_AT_name: |