diff options
Diffstat (limited to 'gdb/mips-tdep.c')
-rw-r--r-- | gdb/mips-tdep.c | 126 |
1 files changed, 114 insertions, 12 deletions
diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 092ae34..71b3482 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -45,6 +45,22 @@ struct frame_extra_info int num_args; }; +/* We allow the user to override MIPS_SAVED_REGSIZE, so define + the subcommand enum settings allowed. */ +static char saved_gpreg_size_auto[] = "auto"; +static char saved_gpreg_size_32[] = "32"; +static char saved_gpreg_size_64[] = "64"; + +static char *saved_gpreg_size_enums[] = { + saved_gpreg_size_auto, + saved_gpreg_size_32, + saved_gpreg_size_64, + 0 +}; + +/* The current (string) value of saved_gpreg_size. */ +static char *mips_saved_regsize_string = saved_gpreg_size_auto; + /* Some MIPS boards don't support floating point while others only support single-precision floating-point operations. See also FP_REGISTER_DOUBLE. */ @@ -63,10 +79,12 @@ static int mips_fpu_type_auto = 1; static enum mips_fpu_type mips_fpu_type = MIPS_DEFAULT_FPU_TYPE; #define MIPS_FPU_TYPE mips_fpu_type -#ifndef MIPS_SAVED_REGSIZE -#define MIPS_SAVED_REGSIZE MIPS_REGSIZE +#ifndef MIPS_DEFAULT_SAVED_REGSIZE +#define MIPS_DEFAULT_SAVED_REGSIZE MIPS_REGSIZE #endif +#define MIPS_SAVED_REGSIZE (mips_saved_regsize()) + /* Do not use "TARGET_IS_MIPS64" to test the size of floating point registers */ #ifndef FP_REGISTER_DOUBLE #define FP_REGISTER_DOUBLE (REGISTER_VIRTUAL_SIZE(FP0_REGNUM) == 8) @@ -83,7 +101,7 @@ struct gdbarch_tdep enum mips_fpu_type mips_fpu_type; int mips_last_arg_regnum; int mips_last_fp_arg_regnum; - int mips_saved_regsize; + int mips_default_saved_regsize; int mips_fp_register_double; }; @@ -108,8 +126,8 @@ struct gdbarch_tdep #endif #if GDB_MULTI_ARCH -#undef MIPS_SAVED_REGSIZE -#define MIPS_SAVED_REGSIZE (gdbarch_tdep (current_gdbarch)->mips_saved_regsize) +#undef MIPS_DEFAULT_SAVED_REGSIZE +#define MIPS_DEFAULT_SAVED_REGSIZE (gdbarch_tdep (current_gdbarch)->mips_default_saved_regsize) #endif /* Indicate that the ABI makes use of double-precision registers @@ -166,6 +184,10 @@ char *tmp_mips_processor_type; char *mips_generic_reg_names[] = MIPS_REGISTER_NAMES; char **mips_processor_reg_names = mips_generic_reg_names; +/* The list of available "set mips " and "show mips " commands */ +static struct cmd_list_element *setmipscmdlist = NULL; +static struct cmd_list_element *showmipscmdlist = NULL; + char * mips_register_name (i) int i; @@ -303,6 +325,19 @@ mips_print_extra_frame_info (fi) paddr_d (fi->extra_info->proc_desc->pdr.frameoffset)); } +/* Return the currently configured (or set) saved register size */ + +static unsigned int +mips_saved_regsize () +{ + if (mips_saved_regsize_string == saved_gpreg_size_auto) + return MIPS_DEFAULT_SAVED_REGSIZE; + else if (mips_saved_regsize_string == saved_gpreg_size_64) + return 8; + else /* if (mips_saved_regsize_string == saved_gpreg_size_32) */ + return 4; +} + /* Convert between RAW and VIRTUAL registers. The RAW register size defines the remote-gdb packet. */ @@ -3144,6 +3179,28 @@ in_sigtramp (pc, ignore) return (pc >= sigtramp_address && pc < sigtramp_end); } +/* Root of all "set mips "/"show mips " commands. This will eventually be + used for all MIPS-specific commands. */ + +static void show_mips_command PARAMS ((char *, int)); +static void +show_mips_command (args, from_tty) + char *args; + int from_tty; +{ + help_list (showmipscmdlist, "show mips ", all_commands, gdb_stdout); +} + +static void set_mips_command PARAMS ((char *, int)); +static void +set_mips_command (args, from_tty) + char *args; + int from_tty; +{ + printf_unfiltered ("\"set mips\" must be followed by an appropriate subcommand.\n"); + help_list (setmipscmdlist, "set mips ", all_commands, gdb_stdout); +} + /* Commands to show/set the MIPS FPU type. */ static void show_mipsfpu_command PARAMS ((char *, int)); @@ -3708,7 +3765,7 @@ mips_gdbarch_init (info, arches) case E_MIPS_ABI_O32: ef_mips_abi = "o32"; tdep->mips_eabi = 0; - tdep->mips_saved_regsize = 4; + tdep->mips_default_saved_regsize = 4; tdep->mips_fp_register_double = 0; set_gdbarch_long_bit (gdbarch, 32); set_gdbarch_ptr_bit (gdbarch, 32); @@ -3717,7 +3774,7 @@ mips_gdbarch_init (info, arches) case E_MIPS_ABI_O64: ef_mips_abi = "o64"; tdep->mips_eabi = 0; - tdep->mips_saved_regsize = 8; + tdep->mips_default_saved_regsize = 8; tdep->mips_fp_register_double = 1; set_gdbarch_long_bit (gdbarch, 32); set_gdbarch_ptr_bit (gdbarch, 32); @@ -3726,7 +3783,7 @@ mips_gdbarch_init (info, arches) case E_MIPS_ABI_EABI32: ef_mips_abi = "eabi32"; tdep->mips_eabi = 1; - tdep->mips_saved_regsize = 4; + tdep->mips_default_saved_regsize = 4; tdep->mips_fp_register_double = 0; set_gdbarch_long_bit (gdbarch, 32); set_gdbarch_ptr_bit (gdbarch, 32); @@ -3735,7 +3792,7 @@ mips_gdbarch_init (info, arches) case E_MIPS_ABI_EABI64: ef_mips_abi = "eabi64"; tdep->mips_eabi = 1; - tdep->mips_saved_regsize = 8; + tdep->mips_default_saved_regsize = 8; tdep->mips_fp_register_double = 1; set_gdbarch_long_bit (gdbarch, 64); set_gdbarch_ptr_bit (gdbarch, 64); @@ -3744,7 +3801,7 @@ mips_gdbarch_init (info, arches) default: ef_mips_abi = "default"; tdep->mips_eabi = 0; - tdep->mips_saved_regsize = MIPS_REGSIZE; + tdep->mips_default_saved_regsize = MIPS_REGSIZE; tdep->mips_fp_register_double = (REGISTER_VIRTUAL_SIZE (FP0_REGNUM) == 8); set_gdbarch_long_bit (gdbarch, 32); set_gdbarch_ptr_bit (gdbarch, 32); @@ -3752,6 +3809,27 @@ mips_gdbarch_init (info, arches) break; } + /* FIXME: jlarmour/2000-04-07: There *is* a flag EF_MIPS_32BIT_MODE + that could indicate -gp32 BUT gas/config/tc-mips.c contains the + comment: + + ``We deliberately don't allow "-gp32" to set the MIPS_32BITMODE + flag in object files because to do so would make it impossible to + link with libraries compiled without "-gp32". This is + unnecessarily restrictive. + + We could solve this problem by adding "-gp32" multilibs to gcc, + but to set this flag before gcc is built with such multilibs will + break too many systems.'' + + But even more unhelpfully, the default linker output target for + mips64-elf is elf32-bigmips, and has EF_MIPS_32BIT_MODE set, even + for 64-bit programs - you need to change the ABI to change this, + and not all gcc targets support that currently. Therefore using + this flag to detect 32-bit mode would do the wrong thing given + the current gcc - it would make GDB treat these 64-bit programs + as 32-bit programs by default. */ + /* determine the ISA */ switch (elf_flags & EF_MIPS_ARCH) { @@ -3890,8 +3968,8 @@ mips_gdbarch_init (info, arches) : tdep->mips_fpu_type == MIPS_FPU_DOUBLE ? "double" : "???")); fprintf_unfiltered (gdb_stderr, - "mips_gdbarch_init: tdep->mips_saved_regsize = %d\n", - tdep->mips_saved_regsize); + "mips_gdbarch_init: tdep->mips_default_saved_regsize = %d\n", + tdep->mips_default_saved_regsize); fprintf_unfiltered (gdb_stderr, "mips_gdbarch_init: tdep->mips_fp_register_double = %d (%s)\n", tdep->mips_fp_register_double, @@ -3913,6 +3991,30 @@ _initialize_mips_tdep () if (!tm_print_insn) /* Someone may have already set it */ 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, + "Various MIPS specific commands.", + &setmipscmdlist, "set mips ", 0, &setlist); + + add_prefix_cmd ("mips", no_class, show_mips_command, + "Various MIPS specific commands.", + &showmipscmdlist, "show mips ", 0, &showlist); + + /* Allow the user to override the saved register size. */ + add_show_from_set (add_set_enum_cmd ("saved-gpreg-size", + class_obscure, + saved_gpreg_size_enums, + (char *) &mips_saved_regsize_string, "\ +Set size of general purpose registers saved on the stack.\n\ +This option can be set to one of:\n\ + 32 - Force GDB to treat saved GP registers as 32-bit\n\ + 64 - Force GDB to treat saved GP registers as 64-bit\n\ + auto - Allow GDB to use the target's default setting or autodetect the\n\ + saved GP register size from information contained in the executable.\n\ + (default: auto)", + &setmipscmdlist), + &showmipscmdlist); + /* Let the user turn off floating point and set the fence post for heuristic_proc_start. */ |