Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [PATCH][gdb] Fix gdb.arch/amd64-tailcall-*.exp with -fPIE/-pie
@ 2019-08-09 10:48 Tom de Vries
       [not found] ` <57ada901-a8d8-b632-f7d8-e42283314b5a@redhat.com>
  0 siblings, 1 reply; 4+ messages in thread
From: Tom de Vries @ 2019-08-09 10:48 UTC (permalink / raw)
  To: gdb-patches; +Cc: Jan Kratochvil

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=<optimized out>)
+#1  0x0000000000000672 in ?? ()
-#2  0x00000000004003d5 in main (argc=<optimized out>, argv=<optimized out>)
+#2  0x0000555555554535 in main (argc=<optimized out>, argv=<optimized out>)
-(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  <tdevries@suse.de>

	* 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;
     }
 


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-08-16 18:34 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-08-09 10:48 [PATCH][gdb] Fix gdb.arch/amd64-tailcall-*.exp with -fPIE/-pie Tom de Vries
     [not found] ` <57ada901-a8d8-b632-f7d8-e42283314b5a@redhat.com>
     [not found]   ` <38825791-ad92-3f7e-d3ae-2ac123dd6422@suse.de>
2019-08-09 17:38     ` Pedro Alves
2019-08-10  5:44       ` Tom de Vries
2019-08-16 18:34         ` Pedro Alves

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox