+
+/* Function: m68k_gdbarch_init
+ Initializer function for the m68k gdbarch vector.
+ Called by gdbarch. Sets up the gdbarch vector(s) for this target. */
+
+static struct gdbarch *
+m68k_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches)
+{
+ struct gdbarch_tdep *tdep = NULL;
+ struct gdbarch *gdbarch;
+
+ /* find a candidate among the list of pre-declared architectures. */
+ arches = gdbarch_list_lookup_by_info (arches, &info);
+ if (arches != NULL)
+ return (arches->gdbarch);
+
+ tdep = xmalloc (sizeof (struct gdbarch_tdep));
+ gdbarch = gdbarch_alloc (&info, tdep);
+
+ set_gdbarch_long_double_format (gdbarch, &floatformat_m68881_ext);
+ set_gdbarch_long_double_bit (gdbarch, 96);
+
+ set_gdbarch_skip_prologue (gdbarch, m68k_skip_prologue);
+#ifdef SYSCALL_TRAP
+ set_gdbarch_deprecated_saved_pc_after_call (gdbarch, m68k_saved_pc_after_call);
+#endif
+ set_gdbarch_breakpoint_from_pc (gdbarch, m68k_local_breakpoint_from_pc);
+
+ /* Stack grows down. */
+ set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
+ set_gdbarch_parm_boundary (gdbarch, 32);
+
+ set_gdbarch_believe_pcc_promotion (gdbarch, 1);
+ set_gdbarch_decr_pc_after_break (gdbarch, 2);
+
+ set_gdbarch_extract_return_value (gdbarch, m68k_extract_return_value);
+ set_gdbarch_store_return_value (gdbarch, m68k_store_return_value);
+ set_gdbarch_extract_struct_value_address (gdbarch,
+ m68k_extract_struct_value_address);
+ set_gdbarch_use_struct_convention (gdbarch, m68k_use_struct_convention);
+
+ set_gdbarch_frameless_function_invocation (gdbarch,
+ m68k_frameless_function_invocation);
+ set_gdbarch_frame_args_skip (gdbarch, 8);
+
+ set_gdbarch_register_type (gdbarch, m68k_register_type);
+ set_gdbarch_register_name (gdbarch, m68k_register_name);
+ set_gdbarch_num_regs (gdbarch, 29);
+ set_gdbarch_register_bytes_ok (gdbarch, m68k_register_bytes_ok);
+ set_gdbarch_sp_regnum (gdbarch, M68K_SP_REGNUM);
+ set_gdbarch_pc_regnum (gdbarch, M68K_PC_REGNUM);
+ set_gdbarch_ps_regnum (gdbarch, M68K_PS_REGNUM);
+ set_gdbarch_fp0_regnum (gdbarch, M68K_FP0_REGNUM);
+
+ set_gdbarch_push_dummy_call (gdbarch, m68k_push_dummy_call);
+
+ /* Disassembler. */
+ set_gdbarch_print_insn (gdbarch, print_insn_m68k);
+
+#if defined JB_PC && defined JB_ELEMENT_SIZE
+ tdep->jb_pc = JB_PC;
+ tdep->jb_elt_size = JB_ELEMENT_SIZE;
+#else
+ tdep->jb_pc = -1;
+#endif
+ tdep->get_sigtramp_info = NULL;
+ tdep->struct_return = pcc_struct_return;
+
+ /* Frame unwinder. */
+ set_gdbarch_unwind_dummy_id (gdbarch, m68k_unwind_dummy_id);
+ set_gdbarch_unwind_pc (gdbarch, m68k_unwind_pc);
+
+ /* Hook in the DWARF CFI frame unwinder. */
+ frame_unwind_append_sniffer (gdbarch, dwarf2_frame_sniffer);
+
+ frame_base_set_default (gdbarch, &m68k_frame_base);
+
+ /* Hook in ABI-specific overrides, if they have been registered. */
+ gdbarch_init_osabi (info, gdbarch);
+
+ /* Now we have tuned the configuration, set a few final things,
+ based on what the OS ABI has told us. */
+
+ if (tdep->jb_pc >= 0)
+ set_gdbarch_get_longjmp_target (gdbarch, m68k_get_longjmp_target);
+
+ frame_unwind_append_sniffer (gdbarch, m68k_sigtramp_frame_sniffer);
+ frame_unwind_append_sniffer (gdbarch, m68k_frame_sniffer);
+
+ return gdbarch;