diff options
-rw-r--r-- | gdb/ChangeLog | 21 | ||||
-rw-r--r-- | gdb/config/mips/tm-mips.h | 52 | ||||
-rw-r--r-- | gdb/mips-tdep.c | 80 |
3 files changed, 89 insertions, 64 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index c8ec523..27d9d30 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -18,6 +18,27 @@ 2002-08-19 Michael Snyder <msnyder@redhat.com> + * config/mips/tm-mips.h (ELF_MAKE_MSYMBOL_SPECIAL): Delete. + (MSYMBOL_IS_SPECIAL, MSYMBOL_SIZE): Change into functions. + (FIX_CALL_DUMMY, PUSH_RETURN_ADDRESS, PUSH_DUMMY_FRAME, + POP_FRAME, INIT_EXTRA_FRAME_INFO): Delete. + (CALL_DUMMY_START_OFFSET, CALL_DUMMY_BREAKPOINT_OFFSET, + CALL_DUMMY_ADDRESS): Delete. + * mips-tdep.c (mips_elf_make_msymbol_special, mips_msymbol_size, + mips_msymbol_is_special, mips_fix_call_dummy): New functions. + (mips_gdbarch_init): Set elf_make_msymbol_special, pop_frame, + push_dummy_frame, fix_call_dummy, init_extra_frame_info, + push_return_address. + (mips_register_raw_size, mips_eabi_use_struct_convention, + mips_n32n64_use_struct_convention, mips_o32_use_struct_convention, + mips_o32_reg_struct_has_addr, mips_frame_saved_pc, mips_frame_chain, + mips_init_extra_frame_info, mips_eabi_push_arguments, + mips_n32n64_push_arguments, mips_push_return_address, + mips_push_dummy_frame, mips_pop_frame, mips_skip_prologue, + mips_breakpoint_from_pc, mips_call_dummy_address): Make static. + +2002-08-19 Michael Snyder <msnyder@redhat.com> + * mips-tdep.c (mips_frame_num_args): New function. (mips_gdbarch_init): Set frame_chain, frameless_function_invocation, frame_saved_pc, frame_args_address, frame_locals_address, diff --git a/gdb/config/mips/tm-mips.h b/gdb/config/mips/tm-mips.h index 1d16abe..4417bf9 100644 --- a/gdb/config/mips/tm-mips.h +++ b/gdb/config/mips/tm-mips.h @@ -171,39 +171,6 @@ extern void mips_register_convert_from_type (int regnum, mips_register_convert_from_type ((n), (type), (buffer)) -/* Things needed for making the inferior call functions. */ - -/* Stack must be aligned on 32-bit boundaries when synthesizing - function calls. We don't need STACK_ALIGN, PUSH_ARGUMENTS will - handle it. */ - -extern CORE_ADDR mips_push_return_address (CORE_ADDR pc, CORE_ADDR sp); -#define PUSH_RETURN_ADDRESS(PC, SP) (mips_push_return_address ((PC), (SP))) - -/* Push an empty stack frame, to record the current PC, etc. */ - -#define PUSH_DUMMY_FRAME mips_push_dummy_frame() -extern void mips_push_dummy_frame (void); - -/* Discard from the stack the innermost frame, restoring all registers. */ - -#define POP_FRAME mips_pop_frame() -extern void mips_pop_frame (void); - -#define CALL_DUMMY_START_OFFSET (0) - -#define CALL_DUMMY_BREAKPOINT_OFFSET (0) - -/* When calling functions on Irix 5 (or any MIPS SVR4 ABI compliant - platform), $t9 ($25) (Dest_Reg) contains the address of the callee - (used for PIC). It doesn't hurt to do this on other systems; $t9 - will be ignored. */ -#define FIX_CALL_DUMMY(dummyname, start_sp, fun, nargs, args, rettype, gcc_p) \ - write_register(T9_REGNUM, fun) - -#define CALL_DUMMY_ADDRESS() (mips_call_dummy_address ()) -extern CORE_ADDR mips_call_dummy_address (void); - /* Special symbol found in blocks associated with routines. We can hang mips_extra_func_info_t's off of this. */ @@ -223,10 +190,6 @@ typedef struct mips_extra_func_info } *mips_extra_func_info_t; -extern void mips_init_extra_frame_info (int fromleaf, struct frame_info *); -#define INIT_EXTRA_FRAME_INFO(fromleaf, fci) \ - mips_init_extra_frame_info(fromleaf, fci) - extern void mips_print_extra_frame_info (struct frame_info *frame); #define PRINT_EXTRA_FRAME_INFO(fi) \ mips_print_extra_frame_info (fi) @@ -302,18 +265,13 @@ typedef unsigned long t_inst; /* Integer big enough to hold an instruction */ the "info" field with the "special" bit masked out */ -#define ELF_MAKE_MSYMBOL_SPECIAL(sym,msym) \ - { \ - if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_MIPS16) { \ - MSYMBOL_INFO (msym) = (char *) (((long) MSYMBOL_INFO (msym)) | 0x80000000); \ - SYMBOL_VALUE_ADDRESS (msym) |= 1; \ - } \ - } - #define MSYMBOL_IS_SPECIAL(msym) \ - (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0) + mips_msymbol_is_special (msym) #define MSYMBOL_SIZE(msym) \ - ((long) MSYMBOL_INFO (msym) & 0x7fffffff) + mips_msymbol_size (msym) +struct minimal_symbol; +extern int mips_msymbol_is_special (struct minimal_symbol *msym); +extern long mips_msymbol_size (struct minimal_symbol *msym); /* Command to set the processor type. */ diff --git a/gdb/mips-tdep.c b/gdb/mips-tdep.c index 6a36dd8..6f74df2 100644 --- a/gdb/mips-tdep.c +++ b/gdb/mips-tdep.c @@ -476,7 +476,7 @@ mips_print_extra_frame_info (struct frame_info *fi) static int mips64_transfers_32bit_regs_p = 0; -int +static int mips_register_raw_size (int reg_nr) { if (mips64_transfers_32bit_regs_p) @@ -653,19 +653,19 @@ show_mask_address (char *cmd, int from_tty, struct cmd_list_element *c) /* Should call_function allocate stack space for a struct return? */ -int +static int mips_eabi_use_struct_convention (int gcc_p, struct type *type) { return (TYPE_LENGTH (type) > 2 * MIPS_SAVED_REGSIZE); } -int +static int mips_n32n64_use_struct_convention (int gcc_p, struct type *type) { return (TYPE_LENGTH (type) > 2 * MIPS_SAVED_REGSIZE); } -int +static int mips_o32_use_struct_convention (int gcc_p, struct type *type) { return 1; /* Structures are returned by ref in extra arg0. */ @@ -693,7 +693,7 @@ mips_n32n64_reg_struct_has_addr (int gcc_p, struct type *type) return 0; /* Assumption: N32/N64 never passes struct by ref. */ } -int +static int mips_o32_reg_struct_has_addr (int gcc_p, struct type *type) { return 0; /* Assumption: O32/O64 never passes struct by ref. */ @@ -720,6 +720,38 @@ pc_is_mips16 (bfd_vma memaddr) return 0; } +/* ELF_MAKE_MSYMBOL_SPECIAL tests whether an ELF symbol is "special", + i.e. refers to a 16-bit function, and sets a "special" bit in a + minimal symbol to mark it as a 16-bit function. */ + +static void +mips_elf_make_msymbol_special (asymbol *sym, struct minimal_symbol *msym) +{ + if (((elf_symbol_type *)(sym))->internal_elf_sym.st_other == STO_MIPS16) + { + MSYMBOL_INFO (msym) = (char *) + (((long) MSYMBOL_INFO (msym)) | 0x80000000); + SYMBOL_VALUE_ADDRESS (msym) |= 1; + } +} + +/* MSYMBOL_IS_SPECIAL tests the "special" bit in a minimal symbol. */ + +int +mips_msymbol_is_special (struct minimal_symbol *msym) +{ + return (((long) MSYMBOL_INFO (msym) & 0x80000000) != 0); +} + +/* MSYMBOL_SIZE returns the size of the minimal symbol, i.e. the + "info" field with the "special" bit masked out. */ + +long +mips_msymbol_size (struct minimal_symbol *msym) +{ + return ((long) MSYMBOL_INFO (msym) & 0x7fffffff); +} + /* MIPS believes that the PC has a sign extended value. Perhaphs the all registers should be sign extended for simplicity? */ @@ -1649,7 +1681,7 @@ mips_init_frame_pc_first (int fromleaf, struct frame_info *prev) } -CORE_ADDR +static CORE_ADDR mips_frame_saved_pc (struct frame_info *frame) { CORE_ADDR saved_pc; @@ -2361,7 +2393,7 @@ get_frame_pointer (struct frame_info *frame, mips_extra_func_info_t cached_proc_desc; -CORE_ADDR +static CORE_ADDR mips_frame_chain (struct frame_info *frame) { mips_extra_func_info_t proc_desc; @@ -2392,13 +2424,13 @@ mips_frame_chain (struct frame_info *frame) and have frame size zero. */ && !frame->signal_handler_caller /* Check if this is a call dummy frame. */ - && frame->pc != mips_call_dummy_address ()) + && frame->pc != CALL_DUMMY_ADDRESS ()) return 0; else return get_frame_pointer (frame, proc_desc); } -void +static void mips_init_extra_frame_info (int fromleaf, struct frame_info *fci) { int regnum; @@ -2539,7 +2571,7 @@ mips_type_needs_double_align (struct type *type) #define ROUND_DOWN(n,a) ((n) & ~((a)-1)) #define ROUND_UP(n,a) (((n)+(a)-1) & ~((a)-1)) -CORE_ADDR +static CORE_ADDR mips_eabi_push_arguments (int nargs, struct value **args, CORE_ADDR sp, @@ -2792,7 +2824,7 @@ mips_eabi_push_arguments (int nargs, /* N32/N64 version of push_arguments. */ -CORE_ADDR +static CORE_ADDR mips_n32n64_push_arguments (int nargs, struct value **args, CORE_ADDR sp, @@ -3614,7 +3646,7 @@ mips_o64_push_arguments (int nargs, return sp; } -CORE_ADDR +static CORE_ADDR mips_push_return_address (CORE_ADDR pc, CORE_ADDR sp) { /* Set the return address register to point to the entry @@ -3649,7 +3681,7 @@ mips_push_register (CORE_ADDR * sp, int regno) /* MASK(i,j) == (1<<i) + (1<<(i+1)) + ... + (1<<j)). Assume i<=j<(MIPS_NUMREGS-1). */ #define MASK(i,j) (((1 << ((j)+1))-1) ^ ((1 << (i))-1)) -void +static void mips_push_dummy_frame (void) { int ireg; @@ -3728,7 +3760,7 @@ mips_push_dummy_frame (void) PROC_PC_REG (proc_desc) = RA_REGNUM; } -void +static void mips_pop_frame (void) { register int regnum; @@ -3786,6 +3818,13 @@ mips_pop_frame (void) } } +static void +mips_fix_call_dummy (char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, + struct value **args, struct type *type, int gcc_p) +{ + write_register(T9_REGNUM, fun); +} + /* Floating point register management. Background: MIPS1 & 2 fp registers are 32 bits wide. To support @@ -4381,7 +4420,7 @@ mips16_skip_prologue (CORE_ADDR pc) We must skip more in the case where part of the prologue is in the delay slot of a non-prologue instruction). */ -CORE_ADDR +static CORE_ADDR mips_skip_prologue (CORE_ADDR pc) { /* See if we can determine the end of the prologue via the symbol table. @@ -5097,7 +5136,7 @@ gdb_print_insn_mips (bfd_vma memaddr, disassemble_info *info) (if necessary) to point to the actual memory location where the breakpoint should be inserted. */ -const unsigned char * +static const unsigned char * mips_breakpoint_from_pc (CORE_ADDR * pcptr, int *lenptr) { if (TARGET_BYTE_ORDER == BFD_ENDIAN_BIG) @@ -5340,7 +5379,7 @@ mips_ignore_helper (CORE_ADDR pc) point (e.g. programs in ROM) should define a symbol __CALL_DUMMY_ADDRESS whose address is the location where the breakpoint should be placed. */ -CORE_ADDR +static CORE_ADDR mips_call_dummy_address (void) { struct minimal_symbol *sym; @@ -5674,6 +5713,9 @@ mips_gdbarch_init (struct gdbarch_info info, tdep->found_abi = found_abi; tdep->mips_abi = mips_abi; + set_gdbarch_elf_make_msymbol_special (gdbarch, + mips_elf_make_msymbol_special); + switch (mips_abi) { case MIPS_ABI_O32: @@ -5897,10 +5939,14 @@ mips_gdbarch_init (struct gdbarch_info info, set_gdbarch_use_generic_dummy_frames (gdbarch, 0); set_gdbarch_call_dummy_location (gdbarch, AT_ENTRY_POINT); set_gdbarch_call_dummy_address (gdbarch, mips_call_dummy_address); + set_gdbarch_push_return_address (gdbarch, mips_push_return_address); + set_gdbarch_push_dummy_frame (gdbarch, mips_push_dummy_frame); + set_gdbarch_pop_frame (gdbarch, mips_pop_frame); set_gdbarch_call_dummy_start_offset (gdbarch, 0); set_gdbarch_call_dummy_breakpoint_offset_p (gdbarch, 1); set_gdbarch_call_dummy_breakpoint_offset (gdbarch, 0); set_gdbarch_call_dummy_length (gdbarch, 0); + set_gdbarch_fix_call_dummy (gdbarch, mips_fix_call_dummy); set_gdbarch_pc_in_call_dummy (gdbarch, pc_in_call_dummy_at_entry_point); set_gdbarch_call_dummy_words (gdbarch, mips_call_dummy_words); set_gdbarch_sizeof_call_dummy_words (gdbarch, sizeof (mips_call_dummy_words)); |