]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
gdb: add convert_from_addr_func_ptr hook
authorJie Zhang <jie@codesourcery.com>
Wed, 10 Mar 2010 15:36:52 +0000 (10:36 -0500)
committerMike Frysinger <vapier@gentoo.org>
Thu, 10 Nov 2022 18:44:13 +0000 (01:44 +0700)
Signed-off-by: Jie Zhang <jie@codesourcery.com>
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
gdb/arch-utils.c
gdb/arch-utils.h
gdb/gdbarch-components.py
gdb/gdbarch-gen.h
gdb/gdbarch.c
gdb/valops.c

index 5218bfc05e11910de265f1a2567fc75017386632..ade68bdc69a8478723239bb50b6b08462c2383e7 100644 (file)
@@ -192,6 +192,13 @@ convert_from_func_ptr_addr_identity (struct gdbarch *gdbarch, CORE_ADDR addr,
   return addr;
 }
 
+CORE_ADDR
+convert_from_addr_func_ptr_identity (struct gdbarch *gdbarch, CORE_ADDR addr,
+                                    struct target_ops *targ)
+{
+  return addr;
+}
+
 int
 no_op_reg_to_regnum (struct gdbarch *gdbarch, int reg)
 {
index f6229f434fd021a3d5b0edda829da55baba67fa6..58fbff64f791a455f6fac5dada72a69d29e3b4bd 100644 (file)
@@ -90,6 +90,7 @@ extern int core_addr_greaterthan (CORE_ADDR lhs, CORE_ADDR rhs);
 
 extern CORE_ADDR core_addr_identity (struct gdbarch *gdbarch, CORE_ADDR addr);
 extern gdbarch_convert_from_func_ptr_addr_ftype convert_from_func_ptr_addr_identity;
+extern gdbarch_convert_from_addr_func_ptr_ftype convert_from_addr_func_ptr_identity;
 
 /* No-op conversion of reg to regnum.  */
 
index b2c7b784761f03060c037147d393d799274c19e1..e9051db3f174cf97cb247cebf750b4b5cf120903 100644 (file)
@@ -1120,6 +1120,14 @@ Method(
     invalid=False,
 )
 
+Method(
+    type="CORE_ADDR",
+    name="convert_from_addr_func_ptr",
+    params=[("CORE_ADDR", "addr"), ("struct target_ops *", "targ")],
+    predefault="convert_from_addr_func_ptr_identity",
+    invalid=False,
+)
+
 Method(
     comment="""
 On some machines there are bits in addresses which are not really
index e0d7a08ff6a3dd9254336da299b9b5ec74c09c98..be83db144df90f75934b2da21f60fccdd6045049 100644 (file)
@@ -601,6 +601,10 @@ typedef CORE_ADDR (gdbarch_convert_from_func_ptr_addr_ftype) (struct gdbarch *gd
 extern CORE_ADDR gdbarch_convert_from_func_ptr_addr (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ);
 extern void set_gdbarch_convert_from_func_ptr_addr (struct gdbarch *gdbarch, gdbarch_convert_from_func_ptr_addr_ftype *convert_from_func_ptr_addr);
 
+typedef CORE_ADDR (gdbarch_convert_from_addr_func_ptr_ftype) (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ);
+extern CORE_ADDR gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ);
+extern void set_gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch, gdbarch_convert_from_addr_func_ptr_ftype *convert_from_addr_func_ptr);
+
 /* On some machines there are bits in addresses which are not really
    part of the address, but are used by the kernel, the hardware, etc.
    for special purposes.  gdbarch_addr_bits_remove takes out any such bits so
index 9d929da6da927acd03cf79f2b8192d7e189083da..8519be9c1056f6c2201a2263bdaa1bec08b0dd0d 100644 (file)
@@ -141,6 +141,7 @@ struct gdbarch
   gdbarch_stabs_argument_has_addr_ftype *stabs_argument_has_addr = default_stabs_argument_has_addr;
   int frame_red_zone_size = 0;
   gdbarch_convert_from_func_ptr_addr_ftype *convert_from_func_ptr_addr = convert_from_func_ptr_addr_identity;
+  gdbarch_convert_from_addr_func_ptr_ftype *convert_from_addr_func_ptr = convert_from_addr_func_ptr_identity;
   gdbarch_addr_bits_remove_ftype *addr_bits_remove = core_addr_identity;
   int significant_addr_bit = 0;
   gdbarch_memtag_to_string_ftype *memtag_to_string = default_memtag_to_string;
@@ -397,6 +398,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
   /* Skip verify of stabs_argument_has_addr, invalid_p == 0 */
   /* Skip verify of frame_red_zone_size, invalid_p == 0 */
   /* Skip verify of convert_from_func_ptr_addr, invalid_p == 0 */
+  /* Skip verify of convert_from_addr_func_ptr, invalid_p == 0 */
   /* Skip verify of addr_bits_remove, invalid_p == 0 */
   /* Skip verify of significant_addr_bit, invalid_p == 0 */
   /* Skip verify of memtag_to_string, invalid_p == 0 */
@@ -876,6 +878,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
   gdb_printf (file,
                       "gdbarch_dump: convert_from_func_ptr_addr = <%s>\n",
                       host_address_to_string (gdbarch->convert_from_func_ptr_addr));
+  gdb_printf (file,
+                      "gdbarch_dump: convert_from_addr_func_ptr = <%s>\n",
+                      host_address_to_string (gdbarch->convert_from_addr_func_ptr));
   gdb_printf (file,
                       "gdbarch_dump: addr_bits_remove = <%s>\n",
                       host_address_to_string (gdbarch->addr_bits_remove));
@@ -3061,6 +3066,23 @@ set_gdbarch_convert_from_func_ptr_addr (struct gdbarch *gdbarch,
   gdbarch->convert_from_func_ptr_addr = convert_from_func_ptr_addr;
 }
 
+CORE_ADDR
+gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch, CORE_ADDR addr, struct target_ops *targ)
+{
+  gdb_assert (gdbarch != NULL);
+  gdb_assert (gdbarch->convert_from_addr_func_ptr != NULL);
+  if (gdbarch_debug >= 2)
+    gdb_printf (gdb_stdlog, "gdbarch_convert_from_addr_func_ptr called\n");
+  return gdbarch->convert_from_addr_func_ptr (gdbarch, addr, targ);
+}
+
+void
+set_gdbarch_convert_from_addr_func_ptr (struct gdbarch *gdbarch,
+                                        gdbarch_convert_from_addr_func_ptr_ftype convert_from_addr_func_ptr)
+{
+  gdbarch->convert_from_addr_func_ptr = convert_from_addr_func_ptr;
+}
+
 CORE_ADDR
 gdbarch_addr_bits_remove (struct gdbarch *gdbarch, CORE_ADDR addr)
 {
index e90c3947b8d500460691cfe71b73da2db8bc9746..f14fd41dd7c5e71a3e5dcde98c0c47a96d1fe9c6 100644 (file)
@@ -1527,12 +1527,18 @@ struct value *
 value_coerce_function (struct value *arg1)
 {
   struct value *retval;
+  CORE_ADDR addr;
 
   if (VALUE_LVAL (arg1) != lval_memory)
     error (_("Attempt to take address of value not located in memory."));
 
+  addr = value_address (arg1);
+  addr = gdbarch_convert_from_addr_func_ptr (target_gdbarch,
+                                            addr,
+                                            &current_target);
+
   retval = value_from_pointer (lookup_pointer_type (value_type (arg1)),
-                              value_address (arg1));
+                              addr);
   return retval;
 }