From 0defa245fc33ed9585f8f2f0f898f26e31801ee0 Mon Sep 17 00:00:00 2001 From: Richard Earnshaw Date: Fri, 1 Feb 2002 13:39:43 +0000 Subject: [PATCH] * arm-tdep.c (arm_frameless_function_invocation): Add some comments. (arm_frame_args_address, arm_frame_locals_address): New functions. (arm_frame_num_args): New function. * config/tm-arm.h (FRAME_ARGS_ADDRESS): Call arm_frame_args_address. (FRAME_LOCALS_ADDRESS): Call arm_frame_locals_address. (FRMA_NUM_ARGS): Call arm_frame_num_args. --- gdb/ChangeLog | 9 ++++++++ gdb/arm-tdep.c | 38 ++++++++++++++++++++++++++++++++ gdb/config/arm/tm-arm.h | 48 ++++++++++++----------------------------- 3 files changed, 61 insertions(+), 34 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 92de3bca02..6d6000cb04 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +2002-02-01 Richard Earnshaw + + * arm-tdep.c (arm_frameless_function_invocation): Add some comments. + (arm_frame_args_address, arm_frame_locals_address): New functions. + (arm_frame_num_args): New function. + * config/tm-arm.h (FRAME_ARGS_ADDRESS): Call arm_frame_args_address. + (FRAME_LOCALS_ADDRESS): Call arm_frame_locals_address. + (FRMA_NUM_ARGS): Call arm_frame_num_args. + 2002-01-31 Michael Snyder * breakpoint.c (break_at_finish_command): Export. diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c index 8fdb1e57e2..1539d0d17e 100644 --- a/gdb/arm-tdep.c +++ b/gdb/arm-tdep.c @@ -297,12 +297,28 @@ arm_saved_pc_after_call (struct frame_info *frame) return ADDR_BITS_REMOVE (read_register (LR_REGNUM)); } +/* Determine whether the function invocation represented by FI has a + frame on the stack associated with it. If it does return zero, + otherwise return 1. */ + int arm_frameless_function_invocation (struct frame_info *fi) { CORE_ADDR func_start, after_prologue; int frameless; + /* Sometimes we have functions that do a little setup (like saving the + vN registers with the stmdb instruction, but DO NOT set up a frame. + The symbol table will report this as a prologue. However, it is + important not to try to parse these partial frames as frames, or we + will get really confused. + + So I will demand 3 instructions between the start & end of the + prologue before I call it a real prologue, i.e. at least + mov ip, sp, + stmdb sp!, {} + sub sp, ip, #4. */ + func_start = (get_pc_function_start ((fi)->pc) + FUNCTION_START_OFFSET); after_prologue = SKIP_PROLOGUE (func_start); @@ -314,6 +330,28 @@ arm_frameless_function_invocation (struct frame_info *fi) return frameless; } +/* The address of the arguments in the frame. */ +CORE_ADDR +arm_frame_args_address (struct frame_info *fi) +{ + return fi->frame; +} + +/* The address of the local variables in the frame. */ +CORE_ADDR +arm_frame_locals_address (struct frame_info *fi) +{ + return fi->frame; +} + +/* The number of arguments being passed in the frame. */ +int +arm_frame_num_args (struct frame_info *fi) +{ + /* We have no way of knowing. */ + return -1; +} + /* A typical Thumb prologue looks like this: push {r7, lr} add sp, sp, #-28 diff --git a/gdb/config/arm/tm-arm.h b/gdb/config/arm/tm-arm.h index 941af9106e..4a1648f5cc 100644 --- a/gdb/config/arm/tm-arm.h +++ b/gdb/config/arm/tm-arm.h @@ -330,48 +330,29 @@ CORE_ADDR arm_target_read_fp (void); However, if FRAME_CHAIN_VALID returns zero, it means the given frame is the outermost one and has no caller. */ +CORE_ADDR arm_frame_chain (struct frame_info *); #define FRAME_CHAIN(thisframe) arm_frame_chain (thisframe) -extern CORE_ADDR arm_frame_chain (struct frame_info *); -extern int arm_frame_chain_valid (CORE_ADDR, struct frame_info *); +int arm_frame_chain_valid (CORE_ADDR, struct frame_info *); #define FRAME_CHAIN_VALID(chain, thisframe) \ arm_frame_chain_valid (chain, thisframe) /* Define other aspects of the stack frame. */ -/* A macro that tells us whether the function invocation represented - by FI does not have a frame on the stack associated with it. If it - does not, FRAMELESS is set to 1, else 0. - - Sometimes we have functions that do a little setup (like saving the - vN registers with the stmdb instruction, but DO NOT set up a frame. - The symbol table will report this as a prologue. However, it is - important not to try to parse these partial frames as frames, or we - will get really confused. - - So I will demand 3 instructions between the start & end of the - prologue before I call it a real prologue, i.e. at least - mov ip, sp, - stmdb sp!, {} - sub sp, ip, #4. */ - -extern int arm_frameless_function_invocation (struct frame_info *fi); -#define FRAMELESS_FUNCTION_INVOCATION(FI) \ -(arm_frameless_function_invocation (FI)) +int arm_frameless_function_invocation (struct frame_info *fi); +#define FRAMELESS_FUNCTION_INVOCATION(FI) arm_frameless_function_invocation(FI) -/* Saved Pc. */ +CORE_ADDR arm_frame_saved_pc (struct frame_info *); +#define FRAME_SAVED_PC(FI) arm_frame_saved_pc (FI) -#define FRAME_SAVED_PC(FRAME) arm_frame_saved_pc (FRAME) -extern CORE_ADDR arm_frame_saved_pc (struct frame_info *); +CORE_ADDR arm_frame_args_address(struct frame_info *); +#define FRAME_ARGS_ADDRESS(FI) arm_frame_args_address(FI) -#define FRAME_ARGS_ADDRESS(fi) (fi->frame) +CORE_ADDR arm_frame_locals_address(struct frame_info *); +#define FRAME_LOCALS_ADDRESS(FI) arm_frame_locals_address(FI) -#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame) - -/* Return number of args passed to a frame. - Can return -1, meaning no way to tell. */ - -#define FRAME_NUM_ARGS(fi) (-1) +int arm_frame_num_args(struct frame_info *); +#define FRAME_NUM_ARGS(FI) arm_frame_num_args(FI) /* Return number of bytes at start of arglist that are not really args. */ @@ -389,10 +370,9 @@ void arm_frame_init_saved_regs (struct frame_info *); /* Things needed for making the inferior call functions. */ +CORE_ADDR arm_push_arguments (int, struct value **, CORE_ADDR, int, CORE_ADDR); #define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \ - sp = arm_push_arguments ((nargs), (args), (sp), (struct_return), (struct_addr)) -extern CORE_ADDR arm_push_arguments (int, struct value **, CORE_ADDR, int, - CORE_ADDR); + arm_push_arguments ((nargs), (args), (sp), (struct_return), (struct_addr)) /* Push an empty stack frame, to record the current PC, etc. */