public inbox for gdb-patches@sourceware.org
 help / color / mirror / Atom feed
* [PATCH 2/3] arc: Add evaluation of long jump targets
  2016-10-07 12:38 [PATCH 1/3] arc: Add a gdbarch_tdep structure Anton Kolesov
@ 2016-10-07 12:38 ` Anton Kolesov
  2016-10-11 16:22   ` Yao Qi
  2016-10-07 12:38 ` [PATCH 3/3] arc: Add support for Newlib Anton Kolesov
  2016-10-11 16:16 ` [PATCH 1/3] arc: Add a gdbarch_tdep structure Yao Qi
  2 siblings, 1 reply; 9+ messages in thread
From: Anton Kolesov @ 2016-10-07 12:38 UTC (permalink / raw)
  To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard

Standard get_longjmp_target implementation, similar to what is in arm-tdep.c.
Actual value of jb_pc should be set in init_osabi methods of particular OS/ABI
implementations.

gdb/ChangeLog:

	* arc-tdep.h (gdbarch_tdep): Add jb_pc.
	* arc-tdep.c (arc_get_longjmp_target): New function.
	(arc_gdbarch_init): Set get_longjmp_target if jb_pc is non-negative.
	(arc_dump_tdep): Print jb_pc.
---
 gdb/arc-tdep.c | 36 +++++++++++++++++++++++++++++++++++-
 gdb/arc-tdep.h |  3 +++
 2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index 58de8e9..bc8bb98 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -557,6 +557,34 @@ arc_store_return_value (struct gdbarch *gdbarch, struct type *type,
     error (_("arc_store_return_value: type length too large."));
 }
 
+/* Implement the "get_longjmp_target" gdbarch method.
+
+   Detemine the address the longjmp will jump to.  We need to use the frame
+   info to get the register pointing to the jmp_buf, then extract the PC from
+   that.  Since jmp_buf is the first argument to longjmp () it will be in r0.
+   Where we then go depends on the OS - OS/ABI initialization should set offset
+   from jmp_buf start to the stored PC location.  */
+
+static int
+arc_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
+{
+  if (arc_debug)
+    debug_printf ("arc: get_longjmp_target\n");
+
+  struct gdbarch *gdbarch = get_frame_arch (frame);
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+  int pc_offset = tdep->jb_pc * ARC_REGISTER_SIZE;
+  gdb_byte buf[ARC_REGISTER_SIZE];
+  CORE_ADDR jb_addr = get_frame_register_unsigned (frame, ARC_FIRST_ARG_REGNUM);
+
+  if (target_read_memory (jb_addr + pc_offset, buf, ARC_REGISTER_SIZE))
+    return 0; /* Failed to read from memory.  */
+
+  *pc = extract_unsigned_integer (buf, ARC_REGISTER_SIZE,
+				  gdbarch_byte_order (gdbarch));
+  return 1;
+}
+
 /* Implement the "return_value" gdbarch method.  */
 
 static enum return_value_convention
@@ -1162,6 +1190,7 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   /* Allocate the ARC-private target-dependent information structure, and the
      GDB target-independent information structure.  */
   struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
+  tdep->jb_pc = -1; /* No longjmp support by default.  */
   struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Data types.  */
@@ -1246,6 +1275,9 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
      It can override functions set earlier.  */
   gdbarch_init_osabi (info, gdbarch);
 
+  if (tdep->jb_pc >= 0)
+    set_gdbarch_get_longjmp_target (gdbarch, arc_get_longjmp_target);
+
   tdesc_use_registers (gdbarch, tdesc, tdesc_data);
 
   return gdbarch;
@@ -1256,7 +1288,9 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
 static void
 arc_dump_tdep (struct gdbarch *gdbarch, struct ui_file *file)
 {
-  /* Empty for now.  */
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  fprintf_unfiltered (file, "arc_dump_tdep: jb_pc = %i\n", tdep->jb_pc);
 }
 
 /* Suppress warning from -Wmissing-prototypes.  */
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
index ea34b9e..1e792b9 100644
--- a/gdb/arc-tdep.h
+++ b/gdb/arc-tdep.h
@@ -81,6 +81,9 @@ extern int arc_debug;
 
 struct gdbarch_tdep
 {
+  /* Offset to PC value in jump buffer.  If this is negative, longjmp
+     support will be disabled.  */
+  int jb_pc;
 };
 
 /* Utility functions used by other ARC-specific modules.  */
-- 
2.8.1

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

* [PATCH 1/3] arc: Add a gdbarch_tdep structure
@ 2016-10-07 12:38 Anton Kolesov
  2016-10-07 12:38 ` [PATCH 2/3] arc: Add evaluation of long jump targets Anton Kolesov
                   ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Anton Kolesov @ 2016-10-07 12:38 UTC (permalink / raw)
  To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard

Add target-specific structure gdbarch_tdep for ARC.

gdb/ChangeLog:

	* arc-tdep.h: Define gdbarch_tdep.
	* arc-tdep.c (arc_gdbarch_init): Allocate gdbarch_tdep.
---
 gdb/arc-tdep.c | 5 ++++-
 gdb/arc-tdep.h | 6 ++++++
 2 files changed, 10 insertions(+), 1 deletion(-)

diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
index 60a4e04..58de8e9 100644
--- a/gdb/arc-tdep.c
+++ b/gdb/arc-tdep.c
@@ -1159,7 +1159,10 @@ arc_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
   if (!arc_tdesc_init (info, &tdesc, &tdesc_data))
     return NULL;
 
-  struct gdbarch *gdbarch = gdbarch_alloc (&info, NULL);
+  /* Allocate the ARC-private target-dependent information structure, and the
+     GDB target-independent information structure.  */
+  struct gdbarch_tdep *tdep = XCNEW (struct gdbarch_tdep);
+  struct gdbarch *gdbarch = gdbarch_alloc (&info, tdep);
 
   /* Data types.  */
   set_gdbarch_short_bit (gdbarch, 16);
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h
index 1b2694b..ea34b9e 100644
--- a/gdb/arc-tdep.h
+++ b/gdb/arc-tdep.h
@@ -77,6 +77,12 @@ enum arc_regnum
 
 extern int arc_debug;
 
+/* Target-dependent information.  */
+
+struct gdbarch_tdep
+{
+};
+
 /* Utility functions used by other ARC-specific modules.  */
 
 static inline int
-- 
2.8.1

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

* [PATCH 3/3] arc: Add support for Newlib
  2016-10-07 12:38 [PATCH 1/3] arc: Add a gdbarch_tdep structure Anton Kolesov
  2016-10-07 12:38 ` [PATCH 2/3] arc: Add evaluation of long jump targets Anton Kolesov
@ 2016-10-07 12:38 ` Anton Kolesov
  2016-10-11 14:14   ` Yao Qi
  2016-10-11 16:25   ` Yao Qi
  2016-10-11 16:16 ` [PATCH 1/3] arc: Add a gdbarch_tdep structure Yao Qi
  2 siblings, 2 replies; 9+ messages in thread
From: Anton Kolesov @ 2016-10-07 12:38 UTC (permalink / raw)
  To: gdb-patches; +Cc: Anton Kolesov, Francois Bedard

Add support for Newlib as an OS/ABI.  The only thing that is specific to it
relatively to "generic" baremetal target is location of PC register in jump
buffer for longjump support.

Sniffer uses .ivt section to decide if ELF file is for ARC Newlib or not.

gdb/ChangeLog:

	* arc-newlib-tdep.c: New file.
	* configure.tgt: Add newlib support for ARC.
---
 gdb/arc-newlib-tdep.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++
 gdb/configure.tgt     |  7 +++++-
 2 files changed, 75 insertions(+), 1 deletion(-)
 create mode 100644 gdb/arc-newlib-tdep.c

diff --git a/gdb/arc-newlib-tdep.c b/gdb/arc-newlib-tdep.c
new file mode 100644
index 0000000..d93bf85
--- /dev/null
+++ b/gdb/arc-newlib-tdep.c
@@ -0,0 +1,69 @@
+/* Target-dependent code for Newlib ARC.
+
+   Copyright (C) 2016 Free Software Foundation, Inc.
+   Contributed by Synopsys Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+
+#include "gdbarch.h"
+#include "arc-tdep.h"
+#include "osabi.h"
+
+/* Implement the 'init_osabi' method of struct gdb_osabi_handler.  */
+
+static void
+arc_newlib_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
+{
+  if (arc_debug)
+    debug_printf ("arc-newlib: Initialization.\n");
+
+  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
+
+  /* Offset of original PC in longjmp jump buffer (in registers).  Value of PC
+     offset can be found in newlib/libc/machine/arc/setjmp.S.  */
+  tdep->jb_pc = 18;
+}
+
+/* Recognize ARC Newlib object files.  */
+
+static enum gdb_osabi
+arc_newlib_osabi_sniffer (bfd *abfd)
+{
+  if (arc_debug)
+    debug_printf ("arc-newlib: OS/ABI sniffer.\n");
+
+  /* crt0.S in libgloss for ARC defines .ivt section for interrupt handlers.
+     If this section is not present then this is likely not a newlib - could be
+     a Linux application or some non-newlib baremetal application.  */
+  if (bfd_get_section_by_name (abfd, ".ivt") != NULL)
+    return GDB_OSABI_NEWLIB;
+  else
+    return GDB_OSABI_UNKNOWN;
+}
+
+/* Provide a prototype to silence -Wmissing-prototypes.  */
+extern initialize_file_ftype _initialize_arc_newlib_tdep;
+
+void
+_initialize_arc_newlib_tdep (void)
+{
+  gdbarch_register_osabi_sniffer (bfd_arch_arc, bfd_target_elf_flavour,
+				  arc_newlib_osabi_sniffer);
+  gdbarch_register_osabi (bfd_arch_arc, 0, GDB_OSABI_NEWLIB,
+			  arc_newlib_init_osabi);
+}
diff --git a/gdb/configure.tgt b/gdb/configure.tgt
index ef041de..a64fe42 100644
--- a/gdb/configure.tgt
+++ b/gdb/configure.tgt
@@ -83,8 +83,13 @@ am33_2.0*-*-linux*)
 			solib-svr4.o"
 	;;
 
+arc*-*-elf32)
+	# Target: baremetal ARC elf32 (newlib) target
+	gdb_target_obs="arc-newlib-tdep.o arc-tdep.o"
+	;;
+
 arc*-*-*)
-	# Target: baremetal ARC elf32 target
+	# Target: Unidentified ARC target
 	gdb_target_obs="arc-tdep.o"
 	;;
 
-- 
2.8.1

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

* Re: [PATCH 3/3] arc: Add support for Newlib
  2016-10-07 12:38 ` [PATCH 3/3] arc: Add support for Newlib Anton Kolesov
@ 2016-10-11 14:14   ` Yao Qi
  2016-10-11 15:36     ` Anton Kolesov
  2016-10-11 16:25   ` Yao Qi
  1 sibling, 1 reply; 9+ messages in thread
From: Yao Qi @ 2016-10-11 14:14 UTC (permalink / raw)
  To: Anton Kolesov; +Cc: gdb-patches, Francois Bedard

Anton Kolesov <Anton.Kolesov@synopsys.com> writes:

Hi Anton,

> +/* Implement the 'init_osabi' method of struct gdb_osabi_handler.  */
> +
> +static void
> +arc_newlib_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
> +{
> +  if (arc_debug)
> +    debug_printf ("arc-newlib: Initialization.\n");
> +
> +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> +
> +  /* Offset of original PC in longjmp jump buffer (in registers).  Value of PC
> +     offset can be found in newlib/libc/machine/arc/setjmp.S.  */
> +  tdep->jb_pc = 18;

What is jb_pc on arc-linux?  Is it 18 or a different one?  If it is 18
too, we can use arc_get_longjmp_target for both newlib and linux.  Patch
#1 is not needed.

-- 
Yao (齐尧)

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

* RE: [PATCH 3/3] arc: Add support for Newlib
  2016-10-11 14:14   ` Yao Qi
@ 2016-10-11 15:36     ` Anton Kolesov
  0 siblings, 0 replies; 9+ messages in thread
From: Anton Kolesov @ 2016-10-11 15:36 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, Francois Bedard

Hi Yao,

> -----Original Message-----
> From: Yao Qi [mailto:qiyaoltc@gmail.com]
> Sent: Tuesday, October 11, 2016 5:14 PM
> To: Anton Kolesov <Anton.Kolesov@synopsys.com>
> Cc: gdb-patches@sourceware.org; Francois Bedard <Francois.Bedard@synopsys.com>
> Subject: Re: [PATCH 3/3] arc: Add support for Newlib
> 
> Anton Kolesov <Anton.Kolesov@synopsys.com> writes:
> 
> Hi Anton,
> 
> > +/* Implement the 'init_osabi' method of struct gdb_osabi_handler.  */
> > +
> > +static void
> > +arc_newlib_init_osabi (struct gdbarch_info info, struct gdbarch *gdbarch)
> > +{
> > +  if (arc_debug)
> > +    debug_printf ("arc-newlib: Initialization.\n");
> > +
> > +  struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
> > +
> > +  /* Offset of original PC in longjmp jump buffer (in registers).  Value of
> PC
> > +     offset can be found in newlib/libc/machine/arc/setjmp.S.  */
> > +  tdep->jb_pc = 18;
> 
> What is jb_pc on arc-linux?  Is it 18 or a different one?  If it is 18
> too, we can use arc_get_longjmp_target for both newlib and linux.  Patch
> #1 is not needed.

Unfortunately, it is different in our uClibc port [1] - jb_pc is 15 there.
uClibc saves r13-r25, fp (r27), sp (r28), blink (r31); newlib on the other
hand saves all registers from r13 through r31. Back in time ARC port of GDB
had an "if" inside the get_longjump_target which was selecting offset based
on OS/ABI, instead of using tdep->jb_pc. But using jb_pc, like in arm-tdep.c,
looks like a better solution architecturally.

[1] http://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/libc/sysdeps/linux/arc/bits/setjmp.h

Anton

> 
> --
> Yao (齐尧)

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

* Re: [PATCH 1/3] arc: Add a gdbarch_tdep structure
  2016-10-07 12:38 [PATCH 1/3] arc: Add a gdbarch_tdep structure Anton Kolesov
  2016-10-07 12:38 ` [PATCH 2/3] arc: Add evaluation of long jump targets Anton Kolesov
  2016-10-07 12:38 ` [PATCH 3/3] arc: Add support for Newlib Anton Kolesov
@ 2016-10-11 16:16 ` Yao Qi
  2 siblings, 0 replies; 9+ messages in thread
From: Yao Qi @ 2016-10-11 16:16 UTC (permalink / raw)
  To: Anton Kolesov; +Cc: gdb-patches, Francois Bedard

Anton Kolesov <Anton.Kolesov@synopsys.com> writes:

Patch is good to me.

> gdb/ChangeLog:
>
> 	* arc-tdep.h: Define gdbarch_tdep.

Nit,

        * arc-tdep.h (struct gdbarch_tdep): New.

> 	* arc-tdep.c (arc_gdbarch_init): Allocate gdbarch_tdep.

-- 
Yao (齐尧)

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

* Re: [PATCH 2/3] arc: Add evaluation of long jump targets
  2016-10-07 12:38 ` [PATCH 2/3] arc: Add evaluation of long jump targets Anton Kolesov
@ 2016-10-11 16:22   ` Yao Qi
  0 siblings, 0 replies; 9+ messages in thread
From: Yao Qi @ 2016-10-11 16:22 UTC (permalink / raw)
  To: Anton Kolesov; +Cc: gdb-patches, Francois Bedard

Anton Kolesov <Anton.Kolesov@synopsys.com> writes:

> Standard get_longjmp_target implementation, similar to what is in arm-tdep.c.
> Actual value of jb_pc should be set in init_osabi methods of particular OS/ABI
> implementations.
>

Patch is good to me, two nits below,

> gdb/ChangeLog:
>
> 	* arc-tdep.h (gdbarch_tdep): Add jb_pc.

        * arc-tdep.h (struct gdbarch_tdep) <jb_pc>: New field.

> 	* arc-tdep.c (arc_get_longjmp_target): New function.
> 	(arc_gdbarch_init): Set get_longjmp_target if jb_pc is non-negative.
> 	(arc_dump_tdep): Print jb_pc.
> ---
>  gdb/arc-tdep.c | 36 +++++++++++++++++++++++++++++++++++-
>  gdb/arc-tdep.h |  3 +++
>  2 files changed, 38 insertions(+), 1 deletion(-)
>
> diff --git a/gdb/arc-tdep.c b/gdb/arc-tdep.c
> index 58de8e9..bc8bb98 100644
> --- a/gdb/arc-tdep.c
> +++ b/gdb/arc-tdep.c
> @@ -557,6 +557,34 @@ arc_store_return_value (struct gdbarch *gdbarch, struct type *type,
>      error (_("arc_store_return_value: type length too large."));
>  }
>  
> +/* Implement the "get_longjmp_target" gdbarch method.
> +
> +   Detemine the address the longjmp will jump to.  We need to use the frame
> +   info to get the register pointing to the jmp_buf, then extract the PC from
> +   that.  Since jmp_buf is the first argument to longjmp () it will be in r0.
> +   Where we then go depends on the OS - OS/ABI initialization should set offset
> +   from jmp_buf start to the stored PC location.  */
> +

I don't see any extra information these comments have, so the first
sentence is enough, IMO.

/* Implement the "get_longjmp_target" gdbarch method.  */

> +static int
> +arc_get_longjmp_target (struct frame_info *frame, CORE_ADDR *pc)
> +{


-- 
Yao (齐尧)

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

* Re: [PATCH 3/3] arc: Add support for Newlib
  2016-10-07 12:38 ` [PATCH 3/3] arc: Add support for Newlib Anton Kolesov
  2016-10-11 14:14   ` Yao Qi
@ 2016-10-11 16:25   ` Yao Qi
  2016-10-12 11:57     ` Anton Kolesov
  1 sibling, 1 reply; 9+ messages in thread
From: Yao Qi @ 2016-10-11 16:25 UTC (permalink / raw)
  To: Anton Kolesov; +Cc: gdb-patches, Francois Bedard

Anton Kolesov <Anton.Kolesov@synopsys.com> writes:

> Add support for Newlib as an OS/ABI.  The only thing that is specific to it
> relatively to "generic" baremetal target is location of PC register in jump
> buffer for longjump support.
>
> Sniffer uses .ivt section to decide if ELF file is for ARC Newlib or not.
>
> gdb/ChangeLog:
>
> 	* arc-newlib-tdep.c: New file.
> 	* configure.tgt: Add newlib support for ARC.

Patch is good to me.

-- 
Yao (齐尧)

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

* RE: [PATCH 3/3] arc: Add support for Newlib
  2016-10-11 16:25   ` Yao Qi
@ 2016-10-12 11:57     ` Anton Kolesov
  0 siblings, 0 replies; 9+ messages in thread
From: Anton Kolesov @ 2016-10-12 11:57 UTC (permalink / raw)
  To: Yao Qi; +Cc: gdb-patches, Francois Bedard

Hi,

> > Add support for Newlib as an OS/ABI.  The only thing that is specific to it
> > relatively to "generic" baremetal target is location of PC register in jump
> > buffer for longjump support.
> >
> > Sniffer uses .ivt section to decide if ELF file is for ARC Newlib or not.
> >
> > gdb/ChangeLog:
> >
> > 	* arc-newlib-tdep.c: New file.
> > 	* configure.tgt: Add newlib support for ARC.
> 
> Patch is good to me.


Patch series applied with requested fixes. Thanks for the review!

Anton


> 
> --
> Yao (齐尧)

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

end of thread, other threads:[~2016-10-12 11:57 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-07 12:38 [PATCH 1/3] arc: Add a gdbarch_tdep structure Anton Kolesov
2016-10-07 12:38 ` [PATCH 2/3] arc: Add evaluation of long jump targets Anton Kolesov
2016-10-11 16:22   ` Yao Qi
2016-10-07 12:38 ` [PATCH 3/3] arc: Add support for Newlib Anton Kolesov
2016-10-11 14:14   ` Yao Qi
2016-10-11 15:36     ` Anton Kolesov
2016-10-11 16:25   ` Yao Qi
2016-10-12 11:57     ` Anton Kolesov
2016-10-11 16:16 ` [PATCH 1/3] arc: Add a gdbarch_tdep structure Yao Qi

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).