This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
[RFA] Multiarch tm_print_insn
- To: gdb-patches at sources dot redhat dot com
- Subject: [RFA] Multiarch tm_print_insn
- From: Elena Zannoni <ezannoni at cygnus dot com>
- Date: Tue, 21 Aug 2001 19:34:55 -0400
This patch multiarches tm_print_insn.
I changed all the direct callers to (*tm_print_insn), to use
the multiarch macro TARGET_PRINT_INSN.
If a target doesn't set the multiarch function, gdb falls back to
using the global, via an access function called legacy_print_insn.
Elena
2001-08-01 Elena Zannoni <ezannoni@redhat.com>
* gdbarch.sh: Move include of dis-asm.h so it is generated earlier
in gdbarch.h.
(TARGET_PRINT_INSN): Multiarch.
* gdbarch.h: Regenerate.
* gdbarch.c: Regenerate.
* arch-utils.c (legacy_print_insn): New function.
* arch-utils.h (legacy_print_insn): Export.
* cris-tdep.c (cris_delayed_get_disassembler): Use
TARGET_PRINT_INSN, instead of tm_print_insn.
* d10v-tdep.c (print_insn): Ditto.
* d30v-tdep.c (print_insn): Ditto.
* m32r-tdep.c (dump_insn): Ditto.
* v850-tdep.c (v850_scan_prologue): Ditto.
* mcore-tdep.c (mcore_dump_insn): Ditto.
* sh-tdep.c (sh_gdbarch_init): Set print_insn gdbarch field.
mi/ChangeLog
2001-08-21 Elena Zannoni <ezannoni@redhat.com>
* mi-cmd-disas.c (mi_cmd_disassemble): Use TARGET_PRINT_INSN,
instead of tm_print_insn.
Index: arch-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.c,v
retrieving revision 1.35
diff -u -p -r1.35 arch-utils.c
--- arch-utils.c 2001/08/15 15:29:55 1.35
+++ arch-utils.c 2001/08/21 22:35:31
@@ -146,6 +146,13 @@ generic_prologue_frameless_p (CORE_ADDR
#endif
}
+/* New/multi-arched targets should use the correct gdbarch field
+ instead of using this global pointer. */
+int
+legacy_print_insn (bfd_vma vma, disassemble_info *info)
+{
+ return (*tm_print_insn) (vma, info);
+}
/* Helper functions for INNER_THAN */
Index: arch-utils.h
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.h,v
retrieving revision 1.20
diff -u -p -r1.20 arch-utils.h
--- arch-utils.h 2001/08/15 15:29:55 1.20
+++ arch-utils.h 2001/08/21 22:35:32
@@ -47,6 +47,9 @@ extern gdbarch_return_value_on_stack_fty
/* Map onto old REGISTER_NAMES. */
extern char *legacy_register_name (int i);
+/* Accessor for old global function pointer for disassembly. */
+extern int legacy_print_insn (bfd_vma vma, disassemble_info *info);
+
/* Backward compatible call_dummy_words. */
extern LONGEST legacy_call_dummy_words[];
extern int legacy_sizeof_call_dummy_words;
Index: cris-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/cris-tdep.c,v
retrieving revision 1.1
diff -u -p -r1.1 cris-tdep.c
--- cris-tdep.c 2001/07/16 08:52:41 1.1
+++ cris-tdep.c 2001/08/21 22:35:35
@@ -3532,7 +3532,7 @@ static int
cris_delayed_get_disassembler (bfd_vma addr, disassemble_info *info)
{
tm_print_insn = cris_get_disassembler (exec_bfd);
- return (*tm_print_insn) (addr, info);
+ return TARGET_PRINT_INSN (addr, info);
}
void
Index: d10v-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/d10v-tdep.c,v
retrieving revision 1.23
diff -u -p -r1.23 d10v-tdep.c
--- d10v-tdep.c 2001/07/15 20:10:02 1.23
+++ d10v-tdep.c 2001/08/21 22:35:37
@@ -1239,7 +1239,7 @@ print_insn (CORE_ADDR memaddr, struct ui
tm_print_insn_info.endian = BFD_ENDIAN_BIG;
else
tm_print_insn_info.endian = BFD_ENDIAN_LITTLE;
- return (*tm_print_insn) (memaddr, &tm_print_insn_info);
+ return TARGET_PRINT_INSN (memaddr, &tm_print_insn_info);
}
static void
Index: d30v-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/d30v-tdep.c,v
retrieving revision 1.10
diff -u -p -r1.10 d30v-tdep.c
--- d30v-tdep.c 2001/07/15 20:10:02 1.10
+++ d30v-tdep.c 2001/08/21 22:35:38
@@ -1156,7 +1156,7 @@ print_insn (CORE_ADDR memaddr, struct ui
tm_print_insn_info.endian = BFD_ENDIAN_BIG;
else
tm_print_insn_info.endian = BFD_ENDIAN_LITTLE;
- return (*tm_print_insn) (memaddr, &tm_print_insn_info);
+ return TARGET_PRINT_INSN (memaddr, &tm_print_insn_info);
}
void
Index: gdbarch.c
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.c,v
retrieving revision 1.72
diff -u -p -r1.72 gdbarch.c
--- gdbarch.c 2001/08/15 15:29:55 1.72
+++ gdbarch.c 2001/08/21 22:35:42
@@ -249,6 +249,7 @@ struct gdbarch
gdbarch_convert_from_func_ptr_addr_ftype *convert_from_func_ptr_addr;
gdbarch_addr_bits_remove_ftype *addr_bits_remove;
gdbarch_software_single_step_ftype *software_single_step;
+ gdbarch_print_insn_ftype *print_insn;
gdbarch_skip_trampoline_code_ftype *skip_trampoline_code;
};
@@ -385,6 +386,7 @@ struct gdbarch startup_gdbarch =
0,
0,
0,
+ 0,
/* startup_gdbarch() */
};
@@ -484,6 +486,7 @@ gdbarch_alloc (const struct gdbarch_info
gdbarch->extra_stack_alignment_needed = 1;
gdbarch->convert_from_func_ptr_addr = core_addr_identity;
gdbarch->addr_bits_remove = core_addr_identity;
+ gdbarch->print_insn = legacy_print_insn;
gdbarch->skip_trampoline_code = generic_skip_trampoline_code;
/* gdbarch_alloc() */
@@ -780,6 +783,7 @@ verify_gdbarch (struct gdbarch *gdbarch)
/* Skip verify of convert_from_func_ptr_addr, invalid_p == 0 */
/* Skip verify of addr_bits_remove, invalid_p == 0 */
/* Skip verify of software_single_step, has predicate */
+ /* Skip verify of print_insn, invalid_p == 0 */
/* Skip verify of skip_trampoline_code, invalid_p == 0 */
}
@@ -1472,6 +1476,12 @@ gdbarch_dump (struct gdbarch *gdbarch, s
"SOFTWARE_SINGLE_STEP(sig, insert_breakpoints_p)",
XSTRING (SOFTWARE_SINGLE_STEP (sig, insert_breakpoints_p)));
#endif
+#ifdef TARGET_PRINT_INSN
+ fprintf_unfiltered (file,
+ "gdbarch_dump: %s # %s\n",
+ "TARGET_PRINT_INSN(vma, info)",
+ XSTRING (TARGET_PRINT_INSN (vma, info)));
+#endif
#ifdef SKIP_TRAMPOLINE_CODE
fprintf_unfiltered (file,
"gdbarch_dump: %s # %s\n",
@@ -2210,6 +2220,13 @@ gdbarch_dump (struct gdbarch *gdbarch, s
(long) current_gdbarch->software_single_step
/*SOFTWARE_SINGLE_STEP ()*/);
#endif
+#ifdef TARGET_PRINT_INSN
+ if (GDB_MULTI_ARCH)
+ fprintf_unfiltered (file,
+ "gdbarch_dump: TARGET_PRINT_INSN = 0x%08lx\n",
+ (long) current_gdbarch->print_insn
+ /*TARGET_PRINT_INSN ()*/);
+#endif
#ifdef SKIP_TRAMPOLINE_CODE
if (GDB_MULTI_ARCH)
fprintf_unfiltered (file,
@@ -4328,6 +4345,24 @@ set_gdbarch_software_single_step (struct
gdbarch_software_single_step_ftype software_single_step)
{
gdbarch->software_single_step = software_single_step;
+}
+
+int
+gdbarch_print_insn (struct gdbarch *gdbarch, bfd_vma vma, disassemble_info *info)
+{
+ if (gdbarch->print_insn == 0)
+ internal_error (__FILE__, __LINE__,
+ "gdbarch: gdbarch_print_insn invalid");
+ if (gdbarch_debug >= 2)
+ fprintf_unfiltered (gdb_stdlog, "gdbarch_print_insn called\n");
+ return gdbarch->print_insn (vma, info);
+}
+
+void
+set_gdbarch_print_insn (struct gdbarch *gdbarch,
+ gdbarch_print_insn_ftype print_insn)
+{
+ gdbarch->print_insn = print_insn;
}
CORE_ADDR
Index: gdbarch.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.h,v
retrieving revision 1.59
diff -u -p -r1.59 gdbarch.h
--- gdbarch.h 2001/08/15 15:29:55 1.59
+++ gdbarch.h 2001/08/21 22:35:45
@@ -35,6 +35,8 @@
#ifndef GDBARCH_H
#define GDBARCH_H
+#include "dis-asm.h" /* Get defs for disassemble_info, which unfortunately is a typedef. */
+
struct frame_info;
struct value;
@@ -1948,6 +1950,23 @@ extern void set_gdbarch_software_single_
#endif
/* Default (function) for non- multi-arch platforms. */
+#if (!GDB_MULTI_ARCH) && !defined (TARGET_PRINT_INSN)
+#define TARGET_PRINT_INSN(vma, info) (legacy_print_insn (vma, info))
+#endif
+
+typedef int (gdbarch_print_insn_ftype) (bfd_vma vma, disassemble_info *info);
+extern int gdbarch_print_insn (struct gdbarch *gdbarch, bfd_vma vma, disassemble_info *info);
+extern void set_gdbarch_print_insn (struct gdbarch *gdbarch, gdbarch_print_insn_ftype *print_insn);
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) && defined (TARGET_PRINT_INSN)
+#error "Non multi-arch definition of TARGET_PRINT_INSN"
+#endif
+#if GDB_MULTI_ARCH
+#if (GDB_MULTI_ARCH > GDB_MULTI_ARCH_PARTIAL) || !defined (TARGET_PRINT_INSN)
+#define TARGET_PRINT_INSN(vma, info) (gdbarch_print_insn (current_gdbarch, vma, info))
+#endif
+#endif
+
+/* Default (function) for non- multi-arch platforms. */
#if (!GDB_MULTI_ARCH) && !defined (SKIP_TRAMPOLINE_CODE)
#define SKIP_TRAMPOLINE_CODE(pc) (generic_skip_trampoline_code (pc))
#endif
@@ -2205,8 +2224,6 @@ extern const struct bfd_arch_info *targe
/* The target-system-dependent disassembler is semi-dynamic */
-#include "dis-asm.h" /* Get defs for disassemble_info */
-
extern int dis_asm_read_memory (bfd_vma memaddr, bfd_byte *myaddr,
unsigned int len, disassemble_info *info);
@@ -2218,9 +2235,6 @@ extern void dis_asm_print_address (bfd_v
extern int (*tm_print_insn) (bfd_vma, disassemble_info*);
extern disassemble_info tm_print_insn_info;
-#ifndef TARGET_PRINT_INSN
-#define TARGET_PRINT_INSN(vma, info) (*tm_print_insn) (vma, info)
-#endif
#ifndef TARGET_PRINT_INSN_INFO
#define TARGET_PRINT_INSN_INFO (&tm_print_insn_info)
#endif
Index: gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.76
diff -u -p -r1.76 gdbarch.sh
--- gdbarch.sh 2001/08/15 15:29:56 1.76
+++ gdbarch.sh 2001/08/21 22:35:47
@@ -539,6 +539,7 @@ f:2:ADDR_BITS_REMOVE:CORE_ADDR:addr_bits
# FIXME/cagney/2001-01-18: The logic is backwards. It should be asking if the target can
# single step. If not, then implement single step using breakpoints.
F:2:SOFTWARE_SINGLE_STEP:void:software_single_step:enum target_signal sig, int insert_breakpoints_p:sig, insert_breakpoints_p::0:0
+f:2:TARGET_PRINT_INSN:int:print_insn:bfd_vma vma, disassemble_info *info:vma, info:::legacy_print_insn::0
f:2:SKIP_TRAMPOLINE_CODE:CORE_ADDR:skip_trampoline_code:CORE_ADDR pc:pc:::generic_skip_trampoline_code::0
EOF
}
@@ -629,6 +630,8 @@ cat <<EOF
#ifndef GDBARCH_H
#define GDBARCH_H
+#include "dis-asm.h" /* Get defs for disassemble_info, which unfortunately is a typedef. */
+
struct frame_info;
struct value;
@@ -1048,8 +1051,6 @@ extern const struct bfd_arch_info *targe
/* The target-system-dependent disassembler is semi-dynamic */
-#include "dis-asm.h" /* Get defs for disassemble_info */
-
extern int dis_asm_read_memory (bfd_vma memaddr, bfd_byte *myaddr,
unsigned int len, disassemble_info *info);
@@ -1061,9 +1062,6 @@ extern void dis_asm_print_address (bfd_v
extern int (*tm_print_insn) (bfd_vma, disassemble_info*);
extern disassemble_info tm_print_insn_info;
-#ifndef TARGET_PRINT_INSN
-#define TARGET_PRINT_INSN(vma, info) (*tm_print_insn) (vma, info)
-#endif
#ifndef TARGET_PRINT_INSN_INFO
#define TARGET_PRINT_INSN_INFO (&tm_print_insn_info)
#endif
Index: m32r-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/m32r-tdep.c,v
retrieving revision 1.6
diff -u -p -r1.6 m32r-tdep.c
--- m32r-tdep.c 2001/07/15 20:10:02 1.6
+++ m32r-tdep.c 2001/08/21 22:35:48
@@ -60,7 +60,7 @@ dump_insn (char *commnt, CORE_ADDR pc, i
{
printf_filtered (" %s %08x %08x ",
commnt, (unsigned int) pc, (unsigned int) insn);
- (*tm_print_insn) (pc, &tm_print_insn_info);
+ TARGET_PRINT_INSN (pc, &tm_print_insn_info);
printf_filtered ("\n");
}
#define insn_debug(args) { printf_filtered args; }
Index: mcore-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mcore-tdep.c,v
retrieving revision 1.10
diff -u -p -r1.10 mcore-tdep.c
--- mcore-tdep.c 2001/07/15 20:10:02 1.10
+++ mcore-tdep.c 2001/08/21 22:35:49
@@ -167,7 +167,7 @@ mcore_dump_insn (char *commnt, CORE_ADDR
{
printf_filtered ("MCORE: %s %08x %08x ",
commnt, (unsigned int) pc, (unsigned int) insn);
- (*tm_print_insn) (pc, &tm_print_insn_info);
+ TARGET_PRINT_INSN (pc, &tm_print_insn_info);
printf_filtered ("\n");
}
}
Index: sh-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/sh-tdep.c,v
retrieving revision 1.39
diff -u -p -r1.39 sh-tdep.c
--- sh-tdep.c 2001/08/01 18:39:23 1.39
+++ sh-tdep.c 2001/08/21 22:35:52
@@ -47,7 +47,6 @@
#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE)))
void (*sh_show_regs) (void);
-int (*print_sh_insn) (bfd_vma, disassemble_info*);
CORE_ADDR (*skip_prologue_hard_way) (CORE_ADDR);
void (*do_pseudo_register) (int);
@@ -1928,7 +1927,7 @@ sh_gdbarch_init (struct gdbarch_info inf
set_gdbarch_use_struct_convention (gdbarch, sh_use_struct_convention);
set_gdbarch_extract_struct_value_address (gdbarch, sh_extract_struct_value_address);
set_gdbarch_pop_frame (gdbarch, sh_pop_frame);
- print_sh_insn = gdb_print_insn_sh;
+ set_gdbarch_print_insn (gdbarch, gdb_print_insn_sh);
skip_prologue_hard_way = sh_skip_prologue_hard_way;
do_pseudo_register = sh_do_pseudo_register;
@@ -2125,7 +2124,6 @@ sh_gdbarch_init (struct gdbarch_info inf
set_gdbarch_frame_num_args (gdbarch, frame_num_args_unknown);
set_gdbarch_believe_pcc_promotion (gdbarch, 1);
set_gdbarch_ieee_float (gdbarch, 1);
- tm_print_insn = print_sh_insn;
return gdbarch;
}
Index: v850-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/v850-tdep.c,v
retrieving revision 1.11
diff -u -p -r1.11 v850-tdep.c
--- v850-tdep.c 2001/07/15 20:10:02 1.11
+++ v850-tdep.c 2001/08/21 22:35:52
@@ -361,7 +361,7 @@ v850_scan_prologue (CORE_ADDR pc, struct
#ifdef DEBUG
printf_filtered ("0x%.8lx ", (long) current_pc);
- (*tm_print_insn) (current_pc, &tm_print_insn_info);
+ TARGET_PRINT_INSN (current_pc, &tm_print_insn_info);
#endif
insn = read_memory_unsigned_integer (current_pc, 2);
Index: mi/mi-cmd-disas.c
===================================================================
RCS file: /cvs/src/src/gdb/mi/mi-cmd-disas.c,v
retrieving revision 1.11
diff -u -p -r1.11 mi-cmd-disas.c
--- mi-cmd-disas.c 2001/06/23 20:43:56 1.11
+++ mi-cmd-disas.c 2001/08/21 22:35:54
@@ -434,7 +434,7 @@ mi_cmd_disassemble (char *command, char
xfree (name);
ui_file_rewind (stb->stream);
- pc += (*tm_print_insn) (pc, &di);
+ pc += TARGET_PRINT_INSN (pc, &di);
ui_out_field_stream (uiout, "inst", stb);
ui_file_rewind (stb->stream);
ui_out_tuple_end (uiout);
@@ -482,7 +482,7 @@ mi_cmd_disassemble (char *command, char
xfree (name);
ui_file_rewind (stb->stream);
- pc += (*tm_print_insn) (pc, &di);
+ pc += TARGET_PRINT_INSN (pc, &di);
ui_out_field_stream (uiout, "inst", stb);
ui_file_rewind (stb->stream);
ui_out_tuple_end (uiout);