* 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.
This commit is contained in:
parent
6c571f0083
commit
0defa245fc
@ -1,3 +1,12 @@
|
|||||||
|
2002-02-01 Richard Earnshaw <reanrsha@arm.com>
|
||||||
|
|
||||||
|
* 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 <msnyder@redhat.com>
|
2002-01-31 Michael Snyder <msnyder@redhat.com>
|
||||||
|
|
||||||
* breakpoint.c (break_at_finish_command): Export.
|
* breakpoint.c (break_at_finish_command): Export.
|
||||||
|
@ -297,12 +297,28 @@ arm_saved_pc_after_call (struct frame_info *frame)
|
|||||||
return ADDR_BITS_REMOVE (read_register (LR_REGNUM));
|
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
|
int
|
||||||
arm_frameless_function_invocation (struct frame_info *fi)
|
arm_frameless_function_invocation (struct frame_info *fi)
|
||||||
{
|
{
|
||||||
CORE_ADDR func_start, after_prologue;
|
CORE_ADDR func_start, after_prologue;
|
||||||
int frameless;
|
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);
|
func_start = (get_pc_function_start ((fi)->pc) + FUNCTION_START_OFFSET);
|
||||||
after_prologue = SKIP_PROLOGUE (func_start);
|
after_prologue = SKIP_PROLOGUE (func_start);
|
||||||
|
|
||||||
@ -314,6 +330,28 @@ arm_frameless_function_invocation (struct frame_info *fi)
|
|||||||
return frameless;
|
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:
|
/* A typical Thumb prologue looks like this:
|
||||||
push {r7, lr}
|
push {r7, lr}
|
||||||
add sp, sp, #-28
|
add sp, sp, #-28
|
||||||
|
@ -330,48 +330,29 @@ CORE_ADDR arm_target_read_fp (void);
|
|||||||
However, if FRAME_CHAIN_VALID returns zero,
|
However, if FRAME_CHAIN_VALID returns zero,
|
||||||
it means the given frame is the outermost one and has no caller. */
|
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)
|
#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) \
|
#define FRAME_CHAIN_VALID(chain, thisframe) \
|
||||||
arm_frame_chain_valid (chain, thisframe)
|
arm_frame_chain_valid (chain, thisframe)
|
||||||
|
|
||||||
/* Define other aspects of the stack frame. */
|
/* Define other aspects of the stack frame. */
|
||||||
|
|
||||||
/* A macro that tells us whether the function invocation represented
|
int arm_frameless_function_invocation (struct frame_info *fi);
|
||||||
by FI does not have a frame on the stack associated with it. If it
|
#define FRAMELESS_FUNCTION_INVOCATION(FI) arm_frameless_function_invocation(FI)
|
||||||
does not, FRAMELESS is set to 1, else 0.
|
|
||||||
|
|
||||||
Sometimes we have functions that do a little setup (like saving the
|
CORE_ADDR arm_frame_saved_pc (struct frame_info *);
|
||||||
vN registers with the stmdb instruction, but DO NOT set up a frame.
|
#define FRAME_SAVED_PC(FI) arm_frame_saved_pc (FI)
|
||||||
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
|
CORE_ADDR arm_frame_args_address(struct frame_info *);
|
||||||
prologue before I call it a real prologue, i.e. at least
|
#define FRAME_ARGS_ADDRESS(FI) arm_frame_args_address(FI)
|
||||||
mov ip, sp,
|
|
||||||
stmdb sp!, {}
|
|
||||||
sub sp, ip, #4. */
|
|
||||||
|
|
||||||
extern int arm_frameless_function_invocation (struct frame_info *fi);
|
CORE_ADDR arm_frame_locals_address(struct frame_info *);
|
||||||
#define FRAMELESS_FUNCTION_INVOCATION(FI) \
|
#define FRAME_LOCALS_ADDRESS(FI) arm_frame_locals_address(FI)
|
||||||
(arm_frameless_function_invocation (FI))
|
|
||||||
|
|
||||||
/* Saved Pc. */
|
int arm_frame_num_args(struct frame_info *);
|
||||||
|
#define FRAME_NUM_ARGS(FI) arm_frame_num_args(FI)
|
||||||
#define FRAME_SAVED_PC(FRAME) arm_frame_saved_pc (FRAME)
|
|
||||||
extern CORE_ADDR arm_frame_saved_pc (struct frame_info *);
|
|
||||||
|
|
||||||
#define FRAME_ARGS_ADDRESS(fi) (fi->frame)
|
|
||||||
|
|
||||||
#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)
|
|
||||||
|
|
||||||
/* Return number of bytes at start of arglist that are not really args. */
|
/* 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. */
|
/* 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) \
|
#define PUSH_ARGUMENTS(nargs, args, sp, struct_return, struct_addr) \
|
||||||
sp = arm_push_arguments ((nargs), (args), (sp), (struct_return), (struct_addr))
|
arm_push_arguments ((nargs), (args), (sp), (struct_return), (struct_addr))
|
||||||
extern CORE_ADDR arm_push_arguments (int, struct value **, CORE_ADDR, int,
|
|
||||||
CORE_ADDR);
|
|
||||||
|
|
||||||
/* Push an empty stack frame, to record the current PC, etc. */
|
/* Push an empty stack frame, to record the current PC, etc. */
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user