diff options
author | Fred Fish <fnf@specifix.com> | 1997-08-11 23:14:47 +0000 |
---|---|---|
committer | Fred Fish <fnf@specifix.com> | 1997-08-11 23:14:47 +0000 |
commit | 53a9bb1a3291342c524d17083bddb4c1e07049b9 (patch) | |
tree | 27980415484e547d86541a17e03bc3a763e78107 /gdb/frame.h | |
parent | c070fb34dfa5589d1796852f2fd5134815b042b8 (diff) | |
download | gdb-53a9bb1a3291342c524d17083bddb4c1e07049b9.zip gdb-53a9bb1a3291342c524d17083bddb4c1e07049b9.tar.gz gdb-53a9bb1a3291342c524d17083bddb4c1e07049b9.tar.bz2 |
* frame.h (enum lval_type): Conditionalize on __GNUC__
instead of __STDC__.
Diffstat (limited to 'gdb/frame.h')
-rw-r--r-- | gdb/frame.h | 201 |
1 files changed, 90 insertions, 111 deletions
diff --git a/gdb/frame.h b/gdb/frame.h index b3ac40e..634765f 100644 --- a/gdb/frame.h +++ b/gdb/frame.h @@ -15,54 +15,25 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if !defined (FRAME_H) #define FRAME_H 1 -/* A FRAME identifies a specific stack frame. It is not constant over - calls to the inferior (frame addresses are, see below). - - This is implemented as a "struct frame_info *". This file and - blockframe.c are the only places which are allowed to use the - equivalence between FRAME and struct frame_info *. Exception: - Prototypes in other files use "struct frame_info *" because this - file might not be included. - - The distinction between a FRAME and a "struct frame_info *" is made - with the idea of maybe someday changing a FRAME to be something else, - but seems to me that a "struct frame_info *" is fully general (since - any necessarily fields can be added; changing the meaning of existing - fields is not helped by the FRAME distinction), and this distinction - merely creates unnecessary hair. -kingdon, 18 May 93. */ -typedef struct frame_info *FRAME; - -/* Convert from a "struct frame_info *" into a FRAME. */ -#define FRAME_INFO_ID(f) (f) - -/* Convert from a FRAME into a "struct frame_info *". */ -extern struct frame_info * -get_frame_info PARAMS ((FRAME)); - -/* Type of the address of a frame. It is widely assumed (at least in - prototypes in headers which might not include this header) that - this is the same as CORE_ADDR, and no one can think of a case in - which it wouldn't be, so it might be best to remove this typedef. */ -typedef CORE_ADDR FRAME_ADDR; - -/* Convert from a FRAME into a frame address. Except in the - machine-dependent *FRAME* macros, a frame address has no defined - meaning other than as a magic cookie which identifies a frame over - calls to the inferior. The only known exception is inferior.h - (PC_IN_CALL_DUMMY) [ON_STACK]; see comments there. You cannot - assume that a frame address contains enough information to - reconstruct the frame; if you want more than just to identify the - frame (e.g. be able to fetch variables relative to that frame), - then save the whole struct frame_info (and the next struct - frame_info, since the latter is used for fetching variables on some - machines). */ +/* Describe the saved registers of a frame. */ -#define FRAME_FP(fr) ((fr)->frame) +struct frame_saved_regs + { + + /* For each register, address of where it was saved on entry to + the frame, or zero if it was not saved on entry to this frame. + This includes special registers such as pc and fp saved in + special ways in the stack frame. The SP_REGNUM is even more + special, the address here is the sp for the next frame, not the + address where the sp was saved. */ + + CORE_ADDR regs[NUM_REGS]; + }; /* We keep a cache of stack frames, each of which is a "struct frame_info". The innermost one gets allocated (in @@ -80,7 +51,7 @@ struct frame_info /* Nominal address of the frame described. See comments at FRAME_FP about what this means outside the *FRAME* macros; in the *FRAME* macros, it can mean whatever makes most sense for this machine. */ - FRAME_ADDR frame; + CORE_ADDR frame; /* Address at which execution is occurring in this frame. For the innermost frame, it's the current pc. @@ -108,23 +79,36 @@ struct frame_info but there is no reason it couldn't be general. */ /* Pointers to the next and previous frame_info's in the frame cache. */ - FRAME next, prev; + struct frame_info *next, *prev; }; -/* Describe the saved registers of a frame. */ +/* Dummy frame. This saves the processor state just prior to setting up the + inferior function call. On most targets, the registers are saved on the + target stack, but that really slows down function calls. */ -struct frame_saved_regs - { +struct dummy_frame +{ + struct dummy_frame *next; - /* For each register, address of where it was saved on entry to - the frame, or zero if it was not saved on entry to this frame. - This includes special registers such as pc and fp saved in - special ways in the stack frame. The SP_REGNUM is even more - special, the address here is the sp for the next frame, not the - address where the sp was saved. */ + CORE_ADDR pc; + CORE_ADDR fp; + CORE_ADDR sp; + char regs[REGISTER_BYTES]; +}; - CORE_ADDR regs[NUM_REGS]; - }; +/* Return the frame address from FR. Except in the machine-dependent + *FRAME* macros, a frame address has no defined meaning other than + as a magic cookie which identifies a frame over calls to the + inferior. The only known exception is inferior.h + (PC_IN_CALL_DUMMY) [ON_STACK]; see comments there. You cannot + assume that a frame address contains enough information to + reconstruct the frame; if you want more than just to identify the + frame (e.g. be able to fetch variables relative to that frame), + then save the whole struct frame_info (and the next struct + frame_info, since the latter is used for fetching variables on some + machines). */ + +#define FRAME_FP(fi) ((fi)->frame) /* Define a default FRAME_CHAIN_VALID, in the form that is suitable for most targets. If FRAME_CHAIN_VALID returns zero it means that the given frame @@ -156,25 +140,10 @@ struct frame_saved_regs #endif /* FRAME_CHAIN_VALID */ -/* If we encounter a request to use base register addressing of variables - on a machine for which gdb has not been configured to support such - access, report the failure to support this access mode. */ - -/* FIXME: Code using this should be using get_saved_register, and a - basereg number should just be an ordinary register number. There - is no reason for this to be machine-specific. */ - -#if !defined (FRAME_GET_BASEREG_VALUE) - -#define FRAME_GET_BASEREG_VALUE(frame, regno) \ - (error ("Missing valid method for finding contents of base register."),0) - -#endif - /* The stack frame that the user has specified for commands to act on. Note that one cannot assume this is the address of valid data. */ -extern FRAME selected_frame; +extern struct frame_info *selected_frame; /* Level of the selected frame: 0 for innermost, 1 for its caller, ... @@ -182,72 +151,82 @@ extern FRAME selected_frame; extern int selected_frame_level; -extern struct frame_info * -get_prev_frame_info PARAMS ((FRAME)); +extern struct frame_info *get_prev_frame_info PARAMS ((struct frame_info *)); -extern FRAME -create_new_frame PARAMS ((FRAME_ADDR, CORE_ADDR)); +extern struct frame_info *create_new_frame PARAMS ((CORE_ADDR, CORE_ADDR)); -extern void -flush_cached_frames PARAMS ((void)); +extern void flush_cached_frames PARAMS ((void)); -extern void -reinit_frame_cache PARAMS ((void)); +extern void reinit_frame_cache PARAMS ((void)); -extern void -get_frame_saved_regs PARAMS ((struct frame_info *, struct frame_saved_regs *)); +extern void get_frame_saved_regs PARAMS ((struct frame_info *, + struct frame_saved_regs *)); -extern void -set_current_frame PARAMS ((FRAME)); +extern void set_current_frame PARAMS ((struct frame_info *)); -extern FRAME -get_prev_frame PARAMS ((FRAME)); +extern struct frame_info *get_prev_frame PARAMS ((struct frame_info *)); -extern FRAME -get_current_frame PARAMS ((void)); +extern struct frame_info *get_current_frame PARAMS ((void)); -extern FRAME -get_next_frame PARAMS ((FRAME)); +extern struct frame_info *get_next_frame PARAMS ((struct frame_info *)); -extern struct block * -get_frame_block PARAMS ((FRAME)); +extern struct block *get_frame_block PARAMS ((struct frame_info *)); -extern struct block * -get_current_block PARAMS ((void)); +extern struct block *get_current_block PARAMS ((void)); -extern struct block * -get_selected_block PARAMS ((void)); +extern struct block *get_selected_block PARAMS ((void)); -extern struct symbol * -get_frame_function PARAMS ((FRAME)); +extern struct symbol *get_frame_function PARAMS ((struct frame_info *)); -extern CORE_ADDR -get_frame_pc PARAMS ((FRAME)); +extern CORE_ADDR get_frame_pc PARAMS ((struct frame_info *)); -extern CORE_ADDR -get_pc_function_start PARAMS ((CORE_ADDR)); +extern CORE_ADDR get_pc_function_start PARAMS ((CORE_ADDR)); extern struct block * block_for_pc PARAMS ((CORE_ADDR)); -extern int frameless_look_for_prologue PARAMS ((FRAME)); +extern struct block * block_for_pc_sect PARAMS ((CORE_ADDR, asection *)); + +extern int frameless_look_for_prologue PARAMS ((struct frame_info *)); extern void print_frame_args PARAMS ((struct symbol *, struct frame_info *, - int, FILE *)); + int, GDB_FILE *)); -extern FRAME find_relative_frame PARAMS ((FRAME, int*)); +extern struct frame_info *find_relative_frame PARAMS ((struct frame_info *, int*)); -extern void print_stack_frame PARAMS ((FRAME, int, int)); +extern void print_stack_frame PARAMS ((struct frame_info *, int, int)); -extern void select_frame PARAMS ((FRAME, int)); +extern void select_frame PARAMS ((struct frame_info *, int)); -extern void record_selected_frame PARAMS ((FRAME_ADDR *, int *)); +extern void record_selected_frame PARAMS ((CORE_ADDR *, int *)); extern void print_frame_info PARAMS ((struct frame_info *, int, int, int)); -extern CORE_ADDR find_saved_register PARAMS ((FRAME, int)); +extern CORE_ADDR find_saved_register PARAMS ((struct frame_info *, int)); + +extern struct frame_info *block_innermost_frame PARAMS ((struct block *)); + +extern struct frame_info *find_frame_addr_in_frame_chain PARAMS ((CORE_ADDR)); + +extern CORE_ADDR sigtramp_saved_pc PARAMS ((struct frame_info *)); + +extern int generic_frame_chain_valid PARAMS ((CORE_ADDR, + struct frame_info *)); +extern CORE_ADDR generic_read_register_dummy PARAMS ((CORE_ADDR pc, + CORE_ADDR fp, + int)); +extern void generic_push_dummy_frame PARAMS ((void)); +extern void generic_pop_dummy_frame PARAMS ((void)); + +extern int generic_pc_in_call_dummy PARAMS ((CORE_ADDR pc, + CORE_ADDR fp)); +extern char * generic_find_dummy_frame PARAMS ((CORE_ADDR pc, + CORE_ADDR fp)); + +#ifdef __GNUC__ +enum lval_type; +#endif -extern FRAME block_innermost_frame PARAMS ((struct block *)); +extern void generic_get_saved_register PARAMS ((char *, int *, CORE_ADDR *, struct frame_info *, int, enum lval_type *)); -extern CORE_ADDR sigtramp_saved_pc PARAMS ((FRAME)); #endif /* !defined (FRAME_H) */ |