From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca (simark.ca [158.69.221.121]) by sourceware.org (Postfix) with ESMTPS id 23F133851C0C for ; Thu, 28 May 2020 02:00:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 23F133851C0C Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=simark.ca Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=simark@simark.ca Received: from [10.0.0.11] (173-246-6-90.qc.cable.ebox.net [173.246.6.90]) (using TLSv1.3 with cipher TLS_AES_128_GCM_SHA256 (128/128 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by simark.ca (Postfix) with ESMTPSA id 708261E76A; Wed, 27 May 2020 22:00:52 -0400 (EDT) Subject: Re: [PATCH v2 28/42] Remove dwarf2_per_cu_data::objfile () To: Simon Marchi , Tom de Vries , gdb-patches@sourceware.org References: <20200512210913.5593-1-simon.marchi@efficios.com> <20200512211250.6230-29-simon.marchi@efficios.com> <04473d43-9719-436b-648a-bdc8e5f55751@suse.de> <354bbf9d-6bca-deaa-c64b-714c8d6b477d@suse.de> From: Simon Marchi Message-ID: Date: Wed, 27 May 2020 22:00:51 -0400 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.8.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: fr Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 May 2020 02:00:54 -0000 On 2020-05-27 6:16 p.m., Simon Marchi via Gdb-patches wrote: > Ok, I reproduced it with opensuse/tumbleweed, after installing glibc's debug info. I'll > look into it. Quick update to say that I understand a bit more what happens. It turns out that call sites can refer indirectly to other objfiles. Here, we deal with an indirect call (through a function pointer probably). In that case, the call site doesn't know at compile time what it calls. It provides a DWARF expression to compute the called address. The DIE corresponding to the call site is: 0x0091aa10: DW_TAG_GNU_call_site DW_AT_low_pc [DW_FORM_addr] (0x00000000001398e0) DW_AT_GNU_call_site_target [DW_FORM_exprloc] (DW_OP_fbreg -272, DW_OP_deref) DW_AT_sibling [DW_FORM_ref4] (0x0091aa2b) This call site is in the _dl_catch_exception function of libc (which indeed takes a function pointer as argument). In our case, the function pointer is a function in ld-linux.so. So this is how the two objfiles can be different. For comparison, when the function being called is known at compile time, the call site DIE will refer directly to the function being called, like in this case: 0x0091a9f2: DW_TAG_GNU_call_site DW_AT_low_pc [DW_FORM_addr] (0x00000000001398cd) DW_AT_abstract_origin [DW_FORM_ref4] (0x0091ad45 "__GI___sigsetjmp") DW_AT_sibling [DW_FORM_ref4] (0x0091aa10) In that case, I presume that it's not really possible for the caller and calle to be in different objfiles (this is the scenarion I had in my mind, I didn't know that indirect call sites could be described as well). See the patch below (still missing the commit message). I think we only need to put and restore the caller's per_objfile in this->per_objfile. Alternatively, we could maybe just create a new dwarf_evaluate_loc_desc local object, instead of setting and restoring all the fields. I'll try that tomorrow. Simon >From 2381d562b3130b94ad8e266dd034431f80275c8b Mon Sep 17 00:00:00 2001 From: Simon Marchi Date: Wed, 27 May 2020 21:54:45 -0400 Subject: [PATCH] gdb: use caller objfile in dwarf_evaluate_loc_desc::push_dwarf_reg_entry_value Change-Id: Ib227d767ce525c10607ab6621a373aaae982c67a --- gdb/dwarf2/loc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gdb/dwarf2/loc.c b/gdb/dwarf2/loc.c index 7953361adeed..1aab1a4f51bc 100644 --- a/gdb/dwarf2/loc.c +++ b/gdb/dwarf2/loc.c @@ -726,8 +726,6 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context data_src = deref_size == -1 ? parameter->value : parameter->data_value; size = deref_size == -1 ? parameter->value_size : parameter->data_value_size; - gdb_assert (this->per_objfile == caller_per_objfile); - /* DEREF_SIZE size is not verified here. */ if (data_src == NULL) throw_error (NO_ENTRY_VALUE_ERROR, @@ -739,11 +737,13 @@ class dwarf_evaluate_loc_desc : public dwarf_expr_context caller_per_cu); scoped_restore save_obj_addr = make_scoped_restore (&this->obj_address, (CORE_ADDR) 0); + scoped_restore save_per_objfile = make_scoped_restore (&this->per_objfile, + caller_per_objfile); scoped_restore save_arch = make_scoped_restore (&this->gdbarch); this->gdbarch = this->per_objfile->objfile->arch (); scoped_restore save_addr_size = make_scoped_restore (&this->addr_size); - this->addr_size = per_cu->addr_size (); + this->addr_size = this->per_cu->addr_size (); this->eval (data_src, size); } -- 2.26.2