#include "floatformat.h"
#include "gdb_assert.h"
+#include "gdb-events.h"
/* Static function declarations */
gdbarch_write_fp_ftype *write_fp;
gdbarch_read_sp_ftype *read_sp;
gdbarch_write_sp_ftype *write_sp;
+ gdbarch_virtual_frame_pointer_ftype *virtual_frame_pointer;
gdbarch_register_read_ftype *register_read;
gdbarch_register_write_ftype *register_write;
int num_regs;
gdbarch_push_dummy_frame_ftype *push_dummy_frame;
gdbarch_push_return_address_ftype *push_return_address;
gdbarch_pop_frame_ftype *pop_frame;
- gdbarch_d10v_make_daddr_ftype *d10v_make_daddr;
- gdbarch_d10v_make_iaddr_ftype *d10v_make_iaddr;
- gdbarch_d10v_daddr_p_ftype *d10v_daddr_p;
- gdbarch_d10v_iaddr_p_ftype *d10v_iaddr_p;
- gdbarch_d10v_convert_daddr_to_raw_ftype *d10v_convert_daddr_to_raw;
- gdbarch_d10v_convert_iaddr_to_raw_ftype *d10v_convert_iaddr_to_raw;
gdbarch_store_struct_return_ftype *store_struct_return;
gdbarch_store_return_value_ftype *store_return_value;
gdbarch_extract_struct_value_address_ftype *extract_struct_value_address;
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_skip_trampoline_code_ftype *skip_trampoline_code;
};
0,
0,
0,
- generic_get_saved_register,
- 0,
- 0,
- 0,
- 0,
0,
+ generic_get_saved_register,
0,
0,
0,
gdbarch->write_fp = generic_target_write_fp;
gdbarch->read_sp = generic_target_read_sp;
gdbarch->write_sp = generic_target_write_sp;
+ gdbarch->virtual_frame_pointer = legacy_virtual_frame_pointer;
gdbarch->num_regs = -1;
gdbarch->sp_regnum = -1;
gdbarch->fp_regnum = -1;
gdbarch->extra_stack_alignment_needed = 1;
gdbarch->convert_from_func_ptr_addr = core_addr_identity;
gdbarch->addr_bits_remove = core_addr_identity;
+ gdbarch->skip_trampoline_code = generic_skip_trampoline_code;
/* gdbarch_alloc() */
return gdbarch;
/* Skip verify of write_fp, invalid_p == 0 */
/* Skip verify of read_sp, invalid_p == 0 */
/* Skip verify of write_sp, invalid_p == 0 */
+ /* Skip verify of virtual_frame_pointer, invalid_p == 0 */
/* Skip verify of register_read, has predicate */
/* Skip verify of register_write, has predicate */
if ((GDB_MULTI_ARCH >= 2)
&& (gdbarch->pop_frame == 0))
internal_error (__FILE__, __LINE__,
"gdbarch: verify_gdbarch: pop_frame invalid");
- /* Skip verify of d10v_make_daddr, invalid_p == 0 */
- /* Skip verify of d10v_make_iaddr, invalid_p == 0 */
- /* Skip verify of d10v_daddr_p, invalid_p == 0 */
- /* Skip verify of d10v_iaddr_p, invalid_p == 0 */
- /* Skip verify of d10v_convert_daddr_to_raw, invalid_p == 0 */
- /* Skip verify of d10v_convert_iaddr_to_raw, invalid_p == 0 */
if ((GDB_MULTI_ARCH >= 2)
&& (gdbarch->store_struct_return == 0))
internal_error (__FILE__, __LINE__,
/* 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 skip_trampoline_code, invalid_p == 0 */
}
"TARGET_WRITE_SP(val)",
XSTRING (TARGET_WRITE_SP (val)));
#endif
+#if defined (TARGET_VIRTUAL_FRAME_POINTER) && GDB_MULTI_ARCH
+ /* Macro might contain `[{}]' when not multi-arch */
+ fprintf_unfiltered (file,
+ "gdbarch_dump: %s # %s\n",
+ "TARGET_VIRTUAL_FRAME_POINTER(pc, frame_regnum, frame_offset)",
+ XSTRING (TARGET_VIRTUAL_FRAME_POINTER (pc, frame_regnum, frame_offset)));
+#endif
#ifdef NUM_REGS
fprintf_unfiltered (file,
"gdbarch_dump: NUM_REGS # %s\n",
"POP_FRAME(-)",
XSTRING (POP_FRAME (-)));
#endif
-#ifdef D10V_MAKE_DADDR
- fprintf_unfiltered (file,
- "gdbarch_dump: %s # %s\n",
- "D10V_MAKE_DADDR(x)",
- XSTRING (D10V_MAKE_DADDR (x)));
-#endif
-#ifdef D10V_MAKE_IADDR
- fprintf_unfiltered (file,
- "gdbarch_dump: %s # %s\n",
- "D10V_MAKE_IADDR(x)",
- XSTRING (D10V_MAKE_IADDR (x)));
-#endif
-#ifdef D10V_DADDR_P
- fprintf_unfiltered (file,
- "gdbarch_dump: %s # %s\n",
- "D10V_DADDR_P(x)",
- XSTRING (D10V_DADDR_P (x)));
-#endif
-#ifdef D10V_IADDR_P
- fprintf_unfiltered (file,
- "gdbarch_dump: %s # %s\n",
- "D10V_IADDR_P(x)",
- XSTRING (D10V_IADDR_P (x)));
-#endif
-#ifdef D10V_CONVERT_DADDR_TO_RAW
- fprintf_unfiltered (file,
- "gdbarch_dump: %s # %s\n",
- "D10V_CONVERT_DADDR_TO_RAW(x)",
- XSTRING (D10V_CONVERT_DADDR_TO_RAW (x)));
-#endif
-#ifdef D10V_CONVERT_IADDR_TO_RAW
- fprintf_unfiltered (file,
- "gdbarch_dump: %s # %s\n",
- "D10V_CONVERT_IADDR_TO_RAW(x)",
- XSTRING (D10V_CONVERT_IADDR_TO_RAW (x)));
-#endif
#if defined (STORE_STRUCT_RETURN) && GDB_MULTI_ARCH
/* Macro might contain `[{}]' when not multi-arch */
fprintf_unfiltered (file,
"SOFTWARE_SINGLE_STEP(sig, insert_breakpoints_p)",
XSTRING (SOFTWARE_SINGLE_STEP (sig, insert_breakpoints_p)));
#endif
+#ifdef SKIP_TRAMPOLINE_CODE
+ fprintf_unfiltered (file,
+ "gdbarch_dump: %s # %s\n",
+ "SKIP_TRAMPOLINE_CODE(pc)",
+ XSTRING (SKIP_TRAMPOLINE_CODE (pc)));
+#endif
#ifdef TARGET_ARCHITECTURE
if (TARGET_ARCHITECTURE != NULL)
fprintf_unfiltered (file,
"gdbarch_dump: TARGET_WRITE_SP = 0x%08lx\n",
(long) current_gdbarch->write_sp
/*TARGET_WRITE_SP ()*/);
+#endif
+#ifdef TARGET_VIRTUAL_FRAME_POINTER
+ if (GDB_MULTI_ARCH)
+ fprintf_unfiltered (file,
+ "gdbarch_dump: TARGET_VIRTUAL_FRAME_POINTER = 0x%08lx\n",
+ (long) current_gdbarch->virtual_frame_pointer
+ /*TARGET_VIRTUAL_FRAME_POINTER ()*/);
#endif
if (GDB_MULTI_ARCH)
fprintf_unfiltered (file,
(long) current_gdbarch->pop_frame
/*POP_FRAME ()*/);
#endif
-#ifdef D10V_MAKE_DADDR
- if (GDB_MULTI_ARCH)
- fprintf_unfiltered (file,
- "gdbarch_dump: D10V_MAKE_DADDR = 0x%08lx\n",
- (long) current_gdbarch->d10v_make_daddr
- /*D10V_MAKE_DADDR ()*/);
-#endif
-#ifdef D10V_MAKE_IADDR
- if (GDB_MULTI_ARCH)
- fprintf_unfiltered (file,
- "gdbarch_dump: D10V_MAKE_IADDR = 0x%08lx\n",
- (long) current_gdbarch->d10v_make_iaddr
- /*D10V_MAKE_IADDR ()*/);
-#endif
-#ifdef D10V_DADDR_P
- if (GDB_MULTI_ARCH)
- fprintf_unfiltered (file,
- "gdbarch_dump: D10V_DADDR_P = 0x%08lx\n",
- (long) current_gdbarch->d10v_daddr_p
- /*D10V_DADDR_P ()*/);
-#endif
-#ifdef D10V_IADDR_P
- if (GDB_MULTI_ARCH)
- fprintf_unfiltered (file,
- "gdbarch_dump: D10V_IADDR_P = 0x%08lx\n",
- (long) current_gdbarch->d10v_iaddr_p
- /*D10V_IADDR_P ()*/);
-#endif
-#ifdef D10V_CONVERT_DADDR_TO_RAW
- if (GDB_MULTI_ARCH)
- fprintf_unfiltered (file,
- "gdbarch_dump: D10V_CONVERT_DADDR_TO_RAW = 0x%08lx\n",
- (long) current_gdbarch->d10v_convert_daddr_to_raw
- /*D10V_CONVERT_DADDR_TO_RAW ()*/);
-#endif
-#ifdef D10V_CONVERT_IADDR_TO_RAW
- if (GDB_MULTI_ARCH)
- fprintf_unfiltered (file,
- "gdbarch_dump: D10V_CONVERT_IADDR_TO_RAW = 0x%08lx\n",
- (long) current_gdbarch->d10v_convert_iaddr_to_raw
- /*D10V_CONVERT_IADDR_TO_RAW ()*/);
-#endif
#ifdef STORE_STRUCT_RETURN
if (GDB_MULTI_ARCH)
fprintf_unfiltered (file,
"gdbarch_dump: SOFTWARE_SINGLE_STEP = 0x%08lx\n",
(long) current_gdbarch->software_single_step
/*SOFTWARE_SINGLE_STEP ()*/);
+#endif
+#ifdef SKIP_TRAMPOLINE_CODE
+ if (GDB_MULTI_ARCH)
+ fprintf_unfiltered (file,
+ "gdbarch_dump: SKIP_TRAMPOLINE_CODE = 0x%08lx\n",
+ (long) current_gdbarch->skip_trampoline_code
+ /*SKIP_TRAMPOLINE_CODE ()*/);
#endif
if (current_gdbarch->dump_tdep != NULL)
current_gdbarch->dump_tdep (current_gdbarch, file);
gdbarch->write_sp = write_sp;
}
+void
+gdbarch_virtual_frame_pointer (struct gdbarch *gdbarch, CORE_ADDR pc, int *frame_regnum, LONGEST *frame_offset)
+{
+ if (gdbarch->virtual_frame_pointer == 0)
+ internal_error (__FILE__, __LINE__,
+ "gdbarch: gdbarch_virtual_frame_pointer invalid");
+ if (gdbarch_debug >= 2)
+ fprintf_unfiltered (gdb_stdlog, "gdbarch_virtual_frame_pointer called\n");
+ gdbarch->virtual_frame_pointer (pc, frame_regnum, frame_offset);
+}
+
+void
+set_gdbarch_virtual_frame_pointer (struct gdbarch *gdbarch,
+ gdbarch_virtual_frame_pointer_ftype virtual_frame_pointer)
+{
+ gdbarch->virtual_frame_pointer = virtual_frame_pointer;
+}
+
int
gdbarch_register_read_p (struct gdbarch *gdbarch)
{
gdbarch->pop_frame = pop_frame;
}
-CORE_ADDR
-gdbarch_d10v_make_daddr (struct gdbarch *gdbarch, CORE_ADDR x)
-{
- if (gdbarch->d10v_make_daddr == 0)
- internal_error (__FILE__, __LINE__,
- "gdbarch: gdbarch_d10v_make_daddr invalid");
- if (gdbarch_debug >= 2)
- fprintf_unfiltered (gdb_stdlog, "gdbarch_d10v_make_daddr called\n");
- return gdbarch->d10v_make_daddr (x);
-}
-
-void
-set_gdbarch_d10v_make_daddr (struct gdbarch *gdbarch,
- gdbarch_d10v_make_daddr_ftype d10v_make_daddr)
-{
- gdbarch->d10v_make_daddr = d10v_make_daddr;
-}
-
-CORE_ADDR
-gdbarch_d10v_make_iaddr (struct gdbarch *gdbarch, CORE_ADDR x)
-{
- if (gdbarch->d10v_make_iaddr == 0)
- internal_error (__FILE__, __LINE__,
- "gdbarch: gdbarch_d10v_make_iaddr invalid");
- if (gdbarch_debug >= 2)
- fprintf_unfiltered (gdb_stdlog, "gdbarch_d10v_make_iaddr called\n");
- return gdbarch->d10v_make_iaddr (x);
-}
-
-void
-set_gdbarch_d10v_make_iaddr (struct gdbarch *gdbarch,
- gdbarch_d10v_make_iaddr_ftype d10v_make_iaddr)
-{
- gdbarch->d10v_make_iaddr = d10v_make_iaddr;
-}
-
-int
-gdbarch_d10v_daddr_p (struct gdbarch *gdbarch, CORE_ADDR x)
-{
- if (gdbarch->d10v_daddr_p == 0)
- internal_error (__FILE__, __LINE__,
- "gdbarch: gdbarch_d10v_daddr_p invalid");
- if (gdbarch_debug >= 2)
- fprintf_unfiltered (gdb_stdlog, "gdbarch_d10v_daddr_p called\n");
- return gdbarch->d10v_daddr_p (x);
-}
-
-void
-set_gdbarch_d10v_daddr_p (struct gdbarch *gdbarch,
- gdbarch_d10v_daddr_p_ftype d10v_daddr_p)
-{
- gdbarch->d10v_daddr_p = d10v_daddr_p;
-}
-
-int
-gdbarch_d10v_iaddr_p (struct gdbarch *gdbarch, CORE_ADDR x)
-{
- if (gdbarch->d10v_iaddr_p == 0)
- internal_error (__FILE__, __LINE__,
- "gdbarch: gdbarch_d10v_iaddr_p invalid");
- if (gdbarch_debug >= 2)
- fprintf_unfiltered (gdb_stdlog, "gdbarch_d10v_iaddr_p called\n");
- return gdbarch->d10v_iaddr_p (x);
-}
-
-void
-set_gdbarch_d10v_iaddr_p (struct gdbarch *gdbarch,
- gdbarch_d10v_iaddr_p_ftype d10v_iaddr_p)
-{
- gdbarch->d10v_iaddr_p = d10v_iaddr_p;
-}
-
-CORE_ADDR
-gdbarch_d10v_convert_daddr_to_raw (struct gdbarch *gdbarch, CORE_ADDR x)
-{
- if (gdbarch->d10v_convert_daddr_to_raw == 0)
- internal_error (__FILE__, __LINE__,
- "gdbarch: gdbarch_d10v_convert_daddr_to_raw invalid");
- if (gdbarch_debug >= 2)
- fprintf_unfiltered (gdb_stdlog, "gdbarch_d10v_convert_daddr_to_raw called\n");
- return gdbarch->d10v_convert_daddr_to_raw (x);
-}
-
-void
-set_gdbarch_d10v_convert_daddr_to_raw (struct gdbarch *gdbarch,
- gdbarch_d10v_convert_daddr_to_raw_ftype d10v_convert_daddr_to_raw)
-{
- gdbarch->d10v_convert_daddr_to_raw = d10v_convert_daddr_to_raw;
-}
-
-CORE_ADDR
-gdbarch_d10v_convert_iaddr_to_raw (struct gdbarch *gdbarch, CORE_ADDR x)
-{
- if (gdbarch->d10v_convert_iaddr_to_raw == 0)
- internal_error (__FILE__, __LINE__,
- "gdbarch: gdbarch_d10v_convert_iaddr_to_raw invalid");
- if (gdbarch_debug >= 2)
- fprintf_unfiltered (gdb_stdlog, "gdbarch_d10v_convert_iaddr_to_raw called\n");
- return gdbarch->d10v_convert_iaddr_to_raw (x);
-}
-
-void
-set_gdbarch_d10v_convert_iaddr_to_raw (struct gdbarch *gdbarch,
- gdbarch_d10v_convert_iaddr_to_raw_ftype d10v_convert_iaddr_to_raw)
-{
- gdbarch->d10v_convert_iaddr_to_raw = d10v_convert_iaddr_to_raw;
-}
-
void
gdbarch_store_struct_return (struct gdbarch *gdbarch, CORE_ADDR addr, CORE_ADDR sp)
{
gdbarch->software_single_step = software_single_step;
}
+CORE_ADDR
+gdbarch_skip_trampoline_code (struct gdbarch *gdbarch, CORE_ADDR pc)
+{
+ if (gdbarch->skip_trampoline_code == 0)
+ internal_error (__FILE__, __LINE__,
+ "gdbarch: gdbarch_skip_trampoline_code invalid");
+ if (gdbarch_debug >= 2)
+ fprintf_unfiltered (gdb_stdlog, "gdbarch_skip_trampoline_code called\n");
+ return gdbarch->skip_trampoline_code (pc);
+}
+
+void
+set_gdbarch_skip_trampoline_code (struct gdbarch *gdbarch,
+ gdbarch_skip_trampoline_code_ftype skip_trampoline_code)
+{
+ gdbarch->skip_trampoline_code = skip_trampoline_code;
+}
+
/* Keep a registry of per-architecture data-pointers required by GDB
modules. */
new_gdbarch->bfd_arch_info->printable_name);
current_gdbarch = new_gdbarch;
swapin_gdbarch_swap (new_gdbarch);
+ architecture_changed_event ();
return 1;
}
}
registered an interest in this architecture. CURRENT_GDBARCH
must be updated before these modules are called. */
init_gdbarch_data (new_gdbarch);
-
+ architecture_changed_event ();
+
if (gdbarch_debug)
gdbarch_dump (current_gdbarch, gdb_stdlog);