X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=gdb%2Fmips-tdep.c;h=727620986b19c299492b9fa944ee834c30e8900f;hb=e5ab0dce47238bc3fc006b9a9aa69ee626bd7254;hp=4009ca542abd8a556a42feb02e6372a87adb10d5;hpb=a4b8ebc89d2cbe6be8b4fe808e0d4c9ac2556a51;p=binutils-gdb.git diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 4009ca542ab..727620986b1 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -50,6 +50,7 @@ #include "sim-regno.h" static void set_reg_offset (CORE_ADDR *saved_regs, int regnum, CORE_ADDR off); +static struct type *mips_register_type (struct gdbarch *gdbarch, int regnum); /* A useful bit in the CP0 status register (PS_REGNUM). */ /* This bit is set if we are emulating 32-bit FPRs on a 64-bit chip. */ @@ -670,7 +671,7 @@ mips_register_raw_size (int regnum) /* For the moment map [NUM_REGS .. 2*NUM_REGS) onto the same raw registers, but always return the virtual size. */ int rawnum = regnum % NUM_REGS; - return TYPE_LENGTH (MIPS_REGISTER_TYPE (rawnum)); + return TYPE_LENGTH (gdbarch_register_type (current_gdbarch, rawnum)); } else internal_error (__FILE__, __LINE__, "Register %d out of range", regnum); @@ -700,7 +701,8 @@ mips_register_byte (int regnum) /* Add space for all the proceeding registers based on their real size. */ for (reg = NUM_REGS; reg < regnum; reg++) - byte += TYPE_LENGTH (MIPS_REGISTER_TYPE ((reg % NUM_REGS))); + byte += TYPE_LENGTH (gdbarch_register_type (current_gdbarch, + (reg % NUM_REGS))); return byte; } else @@ -4284,10 +4286,10 @@ print_gp_register_row (struct ui_file *file, struct frame_info *frame, col++; } /* print the R0 to R31 names */ - fprintf_filtered (file, - (start_regnum % NUM_REGS) < MIPS_NUMREGS - ? "\n R%-4d" : "\n ", - start_regnum); + if ((start_regnum % NUM_REGS) < MIPS_NUMREGS) + fprintf_filtered (file, "\n R%-4d", start_regnum % NUM_REGS); + else + fprintf_filtered (file, "\n "); /* now print the values in hex, 4 or 8 to the row */ for (col = 0, regnum = start_regnum; @@ -5256,6 +5258,7 @@ reinit_frame_cache_sfunc (char *args, int from_tty, int gdb_print_insn_mips (bfd_vma memaddr, disassemble_info *info) { + struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); mips_extra_func_info_t proc_desc; /* Search for the function containing this address. Set the low bit @@ -5270,16 +5273,44 @@ gdb_print_insn_mips (bfd_vma memaddr, disassemble_info *info) the procedure descriptor exists and the address therein is odd, it's definitely a 16-bit function. Otherwise, we have to just guess that if the address passed in is odd, it's 16-bits. */ + /* FIXME: cagney/2003-06-26: Is this even necessary? The + disassembler needs to be able to locally determine the ISA, and + not rely on GDB. Otherwize the stand-alone 'objdump -d' will not + work. */ if (proc_desc) - info->mach = pc_is_mips16 (PROC_LOW_ADDR (proc_desc)) ? - bfd_mach_mips16 : 0; + { + if (pc_is_mips16 (PROC_LOW_ADDR (proc_desc))) + info->mach = bfd_mach_mips16; + } else - info->mach = pc_is_mips16 (memaddr) ? - bfd_mach_mips16 : 0; + { + if (pc_is_mips16 (memaddr)) + info->mach = bfd_mach_mips16; + } /* Round down the instruction address to the appropriate boundary. */ memaddr &= (info->mach == bfd_mach_mips16 ? ~1 : ~3); + /* Set the disassembler options. */ + if (tdep->mips_abi == MIPS_ABI_N32 + || tdep->mips_abi == MIPS_ABI_N64) + { + /* Set up the disassembler info, so that we get the right + register names from libopcodes. */ + if (tdep->mips_abi == MIPS_ABI_N32) + info->disassembler_options = "gpr-names=n32"; + else + info->disassembler_options = "gpr-names=64"; + info->flavour = bfd_target_elf_flavour; + } + else + /* This string is not recognized explicitly by the disassembler, + but it tells the disassembler to not try to guess the ABI from + the bfd elf headers, such that, if the user overrides the ABI + of a program linked as NewABI, the disassembly will follow the + register naming conventions specified by the user. */ + info->disassembler_options = "gpr-names=32"; + /* Call the appropriate disassembler based on the target endian-ness. */ if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) return print_insn_big_mips (memaddr, info); @@ -5530,25 +5561,6 @@ mips_ignore_helper (CORE_ADDR pc) } -/* Return a location where we can set a breakpoint that will be hit - when an inferior function call returns. This is normally the - program's entry point. Executables that don't have an entry - point (e.g. programs in ROM) should define a symbol __CALL_DUMMY_ADDRESS - whose address is the location where the breakpoint should be placed. */ - -static CORE_ADDR -mips_call_dummy_address (void) -{ - struct minimal_symbol *sym; - - sym = lookup_minimal_symbol ("__CALL_DUMMY_ADDRESS", NULL, NULL); - if (sym) - return SYMBOL_VALUE_ADDRESS (sym); - else - return entry_point_address (); -} - - /* When debugging a 64 MIPS target running a 32 bit ABI, the size of the register stored on the stack (32) is different to its real raw size (64). The below ensures that registers are fetched from the @@ -5735,12 +5747,6 @@ mips_gdbarch_init (struct gdbarch_info info, enum mips_abi mips_abi, found_abi, wanted_abi; int num_regs; - /* Reset the disassembly info, in case it was set to something - non-default. */ - deprecated_tm_print_insn_info.flavour = bfd_target_unknown_flavour; - deprecated_tm_print_insn_info.arch = bfd_arch_unknown; - deprecated_tm_print_insn_info.mach = 0; - elf_flags = 0; if (info.abfd) @@ -5820,34 +5826,6 @@ mips_gdbarch_init (struct gdbarch_info info, if (wanted_abi != MIPS_ABI_UNKNOWN) mips_abi = wanted_abi; - /* We have to set deprecated_tm_print_insn_info before looking for a - pre-existing architecture, otherwise we may return before we get - a chance to set it up. */ - if (mips_abi == MIPS_ABI_N32 || mips_abi == MIPS_ABI_N64) - { - /* Set up the disassembler info, so that we get the right - register names from libopcodes. */ - if (mips_abi == MIPS_ABI_N32) - deprecated_tm_print_insn_info.disassembler_options = "gpr-names=n32"; - else - deprecated_tm_print_insn_info.disassembler_options = "gpr-names=64"; - deprecated_tm_print_insn_info.flavour = bfd_target_elf_flavour; - deprecated_tm_print_insn_info.arch = bfd_arch_mips; - if (info.bfd_arch_info != NULL - && info.bfd_arch_info->arch == bfd_arch_mips - && info.bfd_arch_info->mach) - deprecated_tm_print_insn_info.mach = info.bfd_arch_info->mach; - else - deprecated_tm_print_insn_info.mach = bfd_mach_mips8000; - } - else - /* This string is not recognized explicitly by the disassembler, - but it tells the disassembler to not try to guess the ABI from - the bfd elf headers, such that, if the user overrides the ABI - of a program linked as NewABI, the disassembly will follow the - register naming conventions specified by the user. */ - deprecated_tm_print_insn_info.disassembler_options = "gpr-names=32"; - if (gdbarch_debug) { fprintf_unfiltered (gdb_stdlog, @@ -6103,7 +6081,10 @@ mips_gdbarch_init (struct gdbarch_info info, /* MIPS version of CALL_DUMMY */ - set_gdbarch_call_dummy_address (gdbarch, mips_call_dummy_address); + /* NOTE: cagney/2003-08-05: Eventually call dummy location will be + replaced by a command, and all targets will default to on stack + (regardless of the stack's execute status). */ + set_gdbarch_call_dummy_location (gdbarch, AT_SYMBOL); set_gdbarch_deprecated_pop_frame (gdbarch, mips_pop_frame); set_gdbarch_frame_align (gdbarch, mips_frame_align); set_gdbarch_deprecated_save_dummy_frame_tos (gdbarch, generic_save_dummy_frame_tos); @@ -6137,6 +6118,8 @@ mips_gdbarch_init (struct gdbarch_info info, set_gdbarch_print_registers_info (gdbarch, mips_print_registers_info); set_gdbarch_pc_in_sigtramp (gdbarch, mips_pc_in_sigtramp); + set_gdbarch_print_insn (gdbarch, gdb_print_insn_mips); + /* Hook in OS ABI-specific overrides, if they have been registered. */ gdbarch_init_osabi (info, gdbarch); @@ -6551,8 +6534,6 @@ _initialize_mips_tdep (void) internal_error (__FILE__, __LINE__, "mips_abi_strings out of sync"); gdbarch_register (bfd_arch_mips, mips_gdbarch_init, mips_dump_tdep); - if (!deprecated_tm_print_insn) /* Someone may have already set it */ - deprecated_tm_print_insn = gdb_print_insn_mips; /* Add root prefix command for all "set mips"/"show mips" commands */ add_prefix_cmd ("mips", no_class, set_mips_command,