From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 115668 invoked by alias); 11 Dec 2018 10:14:09 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 115501 invoked by uid 89); 11 Dec 2018 10:14:08 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.2 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,SPF_SOFTFAIL autolearn=ham version=3.3.2 spammy=HX-detected-operating-system:timestamps, 1st, adhere X-HELO: eggs.gnu.org Received: from eggs.gnu.org (HELO eggs.gnu.org) (208.118.235.92) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 11 Dec 2018 10:14:04 +0000 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gWf3A-0008Vi-Rc for gcc-patches@gcc.gnu.org; Tue, 11 Dec 2018 05:14:03 -0500 Received: from mx2.suse.de ([195.135.220.15]:35336 helo=mx1.suse.de) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gWf3A-0008Ur-F5 for gcc-patches@gcc.gnu.org; Tue, 11 Dec 2018 05:14:00 -0500 Received: from relay1.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id 88D44ADF2; Tue, 11 Dec 2018 10:13:56 +0000 (UTC) From: Tom de Vries To: gcc-patches@gcc.gnu.org Cc: Ian Lance Taylor Subject: [PATCH 5/9] [libbacktrace] Unify function name preference handling Date: Tue, 11 Dec 2018 10:14:00 -0000 Message-Id: <20181211101411.7067-6-tdevries@suse.de> In-Reply-To: <20181211101411.7067-1-tdevries@suse.de> References: <20181211101411.7067-1-tdevries@suse.de> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-Received-From: 195.135.220.15 X-IsSubscribed: yes X-SW-Source: 2018-12/txt/msg00647.txt.bz2 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. 2018-11-21 Tom de Vries * 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. --- libbacktrace/dwarf.c | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/libbacktrace/dwarf.c b/libbacktrace/dwarf.c index 341b84605c0..2483295beb4 100644 --- a/libbacktrace/dwarf.c +++ b/libbacktrace/dwarf.c @@ -2175,18 +2175,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) { @@ -2339,6 +2346,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) @@ -2375,6 +2383,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; @@ -2423,6 +2432,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) { @@ -2444,21 +2457,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: -- 2.16.4