From patchwork Fri Aug 9 10:48:50 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tom de Vries X-Patchwork-Id: 34015 Received: (qmail 61643 invoked by alias); 9 Aug 2019 10:48:55 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 61632 invoked by uid 89); 9 Aug 2019 10:48:55 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.0 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_PASS autolearn=ham version=3.3.1 spammy=sk:amd64t, sk:amd64-t, nopie X-HELO: mx1.suse.de Received: from mx2.suse.de (HELO mx1.suse.de) (195.135.220.15) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 09 Aug 2019 10:48:53 +0000 Received: from relay2.suse.de (unknown [195.135.220.254]) by mx1.suse.de (Postfix) with ESMTP id AB2C3B022; Fri, 9 Aug 2019 10:48:51 +0000 (UTC) Date: Fri, 9 Aug 2019 12:48:50 +0200 From: Tom de Vries To: gdb-patches@sourceware.org Cc: Jan Kratochvil Subject: [PATCH][gdb] Fix gdb.arch/amd64-tailcall-*.exp with -fPIE/-pie Message-ID: <20190809104848.GA6563@delia> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.10.1 (2018-07-13) X-IsSubscribed: yes Hi, When running gdb.arch/amd64-tailcall-*.exp with target board unix/-fPIE/-pie, we get: ... FAIL: gdb.arch/amd64-tailcall-cxx.exp: bt FAIL: gdb.arch/amd64-tailcall-noret.exp: bt FAIL: gdb.arch/amd64-tailcall-self.exp: bt ... The first FAIL in more detail, compared to a nopie run: ... (gdb) bt #0 b () -#1 0x00000000004004df in a (q=) +#1 0x0000000000000672 in ?? () -#2 0x00000000004003d5 in main (argc=, argv=) +#2 0x0000555555554535 in main (argc=, argv=) -(gdb) PASS: gdb.arch/amd64-tailcall-self.exp: bt +(gdb) FAIL: gdb.arch/amd64-tailcall-self.exp: bt ... shows an unrelocated address for function a. The problem is that pretend_pc uses the pc field from a struct call_site without adding the missing relocation offset. Fix this by adding the appropriate offset. Tested on x86_64-linux, with and without -fPIE/-pie. OK for trunk? Thanks, - Tom [gdb] Fix gdb.arch/amd64-tailcall-*.exp with -fPIE/-pie gdb/ChangeLog: 2019-08-09 Tom de Vries * dwarf2-frame-tailcall.c (pretend_pc): Add relocation offset to pc field of struct call_site. --- gdb/dwarf2-frame-tailcall.c | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/gdb/dwarf2-frame-tailcall.c b/gdb/dwarf2-frame-tailcall.c index e8f5aaf9c7..02c50db3af 100644 --- a/gdb/dwarf2-frame-tailcall.c +++ b/gdb/dwarf2-frame-tailcall.c @@ -29,6 +29,8 @@ #include "value.h" #include "dwarf2-frame.h" #include "gdbarch.h" +#include "dwarf2read.h" +#include "objfiles.h" /* Contains struct tailcall_cache indexed by next_bottom_frame. */ static htab_t cache_htab; @@ -240,14 +242,38 @@ pretend_pc (struct frame_info *this_frame, struct tailcall_cache *cache) gdb_assert (next_levels >= 0); if (next_levels < chain->callees) - return chain->call_site[chain->length - next_levels - 1]->pc; + { + struct call_site *call_site + = chain->call_site[chain->length - next_levels - 1]; + CORE_ADDR addr = call_site->pc; + struct dwarf2_per_objfile *dwarf2_per_objfile + = call_site->per_cu->dwarf2_per_objfile; + struct objfile *objfile = dwarf2_per_objfile->objfile; + CORE_ADDR baseaddr + = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); + struct gdbarch *gdbarch = get_objfile_arch (objfile); + addr = gdbarch_adjust_dwarf2_addr (gdbarch, addr + baseaddr); + return addr; + } next_levels -= chain->callees; /* Otherwise CHAIN->CALLEES are already covered by CHAIN->CALLERS. */ if (chain->callees != chain->length) { if (next_levels < chain->callers) - return chain->call_site[chain->callers - next_levels - 1]->pc; + { + struct call_site *call_site + = chain->call_site[chain->callers - next_levels - 1]; + CORE_ADDR addr = call_site->pc; + struct dwarf2_per_objfile *dwarf2_per_objfile + = call_site->per_cu->dwarf2_per_objfile; + struct objfile *objfile = dwarf2_per_objfile->objfile; + CORE_ADDR baseaddr + = ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile)); + struct gdbarch *gdbarch = get_objfile_arch (objfile); + addr = gdbarch_adjust_dwarf2_addr (gdbarch, addr + baseaddr); + return addr; + } next_levels -= chain->callers; }