/* Definitions for dealing with stack frames, for GDB, the GNU debugger.
- Copyright (C) 1986, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997,
- 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2007, 2008, 2009, 2010, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 1986-2013 Free Software Foundation, Inc.
This file is part of GDB.
unsigned int code_addr_p : 1;
unsigned int special_addr_p : 1;
- /* The inline depth of this frame. A frame representing a "called"
- inlined function will have this set to a nonzero value. */
- int inline_depth;
+ /* It is non-zero for a frame made up by GDB without stack data
+ representation in inferior, such as INLINE_FRAME or TAILCALL_FRAME.
+ Caller of inlined function will have it zero, each more inner called frame
+ will have it increasingly one, two etc. Similarly for TAILCALL_FRAME. */
+ int artificial_depth;
};
/* Methods for constructing and comparing Frame IDs. */
/* Flag to control debugging. */
-extern int frame_debug;
+extern unsigned int frame_debug;
/* Construct a frame ID. The first parameter is the frame's constant
stack address (typically the outer-bound), and the second the
ID. */
extern int frame_id_p (struct frame_id l);
-/* Returns non-zero when L is a valid frame representing an inlined
- function. */
-extern int frame_id_inlined_p (struct frame_id l);
+/* Returns non-zero when L is a valid frame representing a frame made up by GDB
+ without stack data representation in inferior, such as INLINE_FRAME or
+ TAILCALL_FRAME. */
+extern int frame_id_artificial_p (struct frame_id l);
/* Returns non-zero when L and R identify the same frame, or, if
either L or R have a zero .func, then the same frame base. */
/* A frame representing an inlined function, associated with an
upcoming (prev, outer, older) NORMAL_FRAME. */
INLINE_FRAME,
+ /* A virtual frame of a tail call - see dwarf2_tailcall_frame_unwind. */
+ TAILCALL_FRAME,
/* In a signal handler, various OSs handle this in various ways.
The main thing is that the frame may be far from normal. */
SIGTRAMP_FRAME,
and then return that thread's previously selected frame. */
extern struct frame_info *get_selected_frame (const char *message);
+/* If there is a selected frame, return it. Otherwise, return NULL. */
+extern struct frame_info *get_selected_frame_if_set (void);
+
/* Select a specific frame. NULL, apparently implies re-select the
inner most frame. */
extern void select_frame (struct frame_info *);
This replaced: frame->pc; */
extern CORE_ADDR get_frame_pc (struct frame_info *);
+/* Same as get_frame_pc, but return a boolean indication of whether
+ the PC is actually available, instead of throwing an error. */
+
+extern int get_frame_pc_if_available (struct frame_info *frame,
+ CORE_ADDR *pc);
+
/* An address (not necessarily aligned to an instruction boundary)
that falls within THIS frame's code block.
extern CORE_ADDR get_frame_address_in_block (struct frame_info *this_frame);
+/* Same as get_frame_address_in_block, but returns a boolean
+ indication of whether the frame address is determinable (when the
+ PC is unavailable, it will not be), instead of possibly throwing an
+ error trying to read an unavailable PC. */
+
+extern int
+ get_frame_address_in_block_if_available (struct frame_info *this_frame,
+ CORE_ADDR *pc);
+
/* The frame's inner-most bound. AKA the stack-pointer. Confusingly
known as top-of-stack. */
that function isn't known. */
extern CORE_ADDR get_frame_func (struct frame_info *fi);
+/* Same as get_frame_func, but returns a boolean indication of whether
+ the frame function is determinable (when the PC is unavailable, it
+ will not be), instead of possibly throwing an error trying to read
+ an unavailable PC. */
+
+extern int get_frame_func_if_available (struct frame_info *fi, CORE_ADDR *);
+
/* Closely related to the resume address, various symbol table
attributes that are determined by the PC. Note that for a normal
frame, the PC refers to the resume address after the return, and
low-level unwinder, the stack part [typically] being the
top-of-stack of the previous frame, and the function part being the
function's start address. Since the correct identification of a
- frameless function requires both the a stack and function address,
+ frameless function requires both a stack and function address,
the old get_frame_base method was not sufficient.
get_frame_base_address: get_frame_locals_address:
enum unwind_stop_reason
{
- /* No particular reason; either we haven't tried unwinding yet,
- or we didn't fail. */
- UNWIND_NO_REASON,
-
- /* The previous frame's analyzer returns an invalid result
- from this_id.
-
- FIXME drow/2006-08-16: This is how GDB used to indicate end of
- stack. We should migrate to a model where frames always have a
- valid ID, and this becomes not just an error but an internal
- error. But that's a project for another day. */
- UNWIND_NULL_ID,
-
- /* All the conditions after this point are considered errors;
- abnormal stack termination. If a backtrace stops for one
- of these reasons, we'll let the user know. This marker
- is not a valid stop reason. */
- UNWIND_FIRST_ERROR,
-
- /* This frame ID looks like it ought to belong to a NEXT frame,
- but we got it for a PREV frame. Normally, this is a sign of
- unwinder failure. It could also indicate stack corruption. */
- UNWIND_INNER_ID,
-
- /* This frame has the same ID as the previous one. That means
- that unwinding further would almost certainly give us another
- frame with exactly the same ID, so break the chain. Normally,
- this is a sign of unwinder failure. It could also indicate
- stack corruption. */
- UNWIND_SAME_ID,
-
- /* The frame unwinder didn't find any saved PC, but we needed
- one to unwind further. */
- UNWIND_NO_SAVED_PC,
+#define SET(name, description) name,
+#define FIRST_ENTRY(name) UNWIND_FIRST = name,
+#define LAST_ENTRY(name) UNWIND_LAST = name,
+#define FIRST_ERROR(name) UNWIND_FIRST_ERROR = name,
+
+#include "unwind_stop_reasons.def"
+#undef SET
+#undef FIRST_ENTRY
+#undef LAST_ENTRY
+#undef FIRST_ERROR
};
/* Return the reason why we can't unwind past this frame. */
fetch/compute the value. Instead just return the location of the
value. */
extern void frame_register_unwind (struct frame_info *frame, int regnum,
- int *optimizedp, enum lval_type *lvalp,
+ int *optimizedp, int *unavailablep,
+ enum lval_type *lvalp,
CORE_ADDR *addrp, int *realnump,
gdb_byte *valuep);
extern ULONGEST get_frame_register_unsigned (struct frame_info *frame,
int regnum);
+/* Read a register from this, or unwind a register from the next
+ frame. Note that the read_frame methods are wrappers to
+ get_frame_register_value, that do not throw if the result is
+ optimized out or unavailable. */
+
+extern int read_frame_register_unsigned (struct frame_info *frame,
+ int regnum, ULONGEST *val);
/* Get the value of the register that belongs to this FRAME. This
function is a wrapper to the call sequence ``frame_register_unwind
VALUEP is NULL, the registers value is not fetched/computed. */
extern void frame_register (struct frame_info *frame, int regnum,
- int *optimizedp, enum lval_type *lvalp,
+ int *optimizedp, int *unavailablep,
+ enum lval_type *lvalp,
CORE_ADDR *addrp, int *realnump,
gdb_byte *valuep);
const gdb_byte *buf);
/* Read LEN bytes from one or multiple registers starting with REGNUM
- in frame FRAME, starting at OFFSET, into BUF. */
+ in frame FRAME, starting at OFFSET, into BUF. If the register
+ contents are optimized out or unavailable, set *OPTIMIZEDP,
+ *UNAVAILABLEP accordingly. */
extern int get_frame_register_bytes (struct frame_info *frame, int regnum,
CORE_ADDR offset, int len,
- gdb_byte *myaddr);
+ gdb_byte *myaddr,
+ int *optimizedp, int *unavailablep);
/* Write LEN bytes to one or multiple registers starting with REGNUM
in frame FRAME, starting at OFFSET, into BUF. */
extern CORE_ADDR frame_unwind_caller_pc (struct frame_info *frame);
+/* Same as frame_unwind_caller_pc, but returns a boolean indication of
+ whether the caller PC is determinable (when the PC is unavailable,
+ it will not be), instead of possibly throwing an error trying to
+ read unavailable memory or registers. */
+
+extern int frame_unwind_caller_pc_if_available (struct frame_info *this_frame,
+ CORE_ADDR *pc);
+
/* Discard the specified frame. Restoring the registers to the state
of the caller. */
extern void frame_pop (struct frame_info *frame);
extern struct frame_info *find_relative_frame (struct frame_info *, int *);
-extern void show_and_print_stack_frame (struct frame_info *fi, int print_level,
- enum print_what print_what);
-
extern void print_stack_frame (struct frame_info *, int print_level,
enum print_what print_what);
extern void print_frame_info (struct frame_info *, int print_level,
enum print_what print_what, int args);
-extern struct frame_info *block_innermost_frame (struct block *);
-
-extern int deprecated_pc_in_call_dummy (struct gdbarch *gdbarch, CORE_ADDR pc);
-
-/* FIXME: cagney/2003-02-02: Should be deprecated or replaced with a
- function called get_frame_register_p(). This slightly weird (and
- older) variant of get_frame_register() returns zero (indicating the
- register is unavailable) if either: the register isn't cached; or
- the register has been optimized out. Problem is, neither check is
- exactly correct. A register can't be optimized out (it may not
- have been saved as part of a function call); The fact that a
- register isn't in the register cache doesn't mean that the register
- isn't available (it could have been fetched from memory). */
+extern struct frame_info *block_innermost_frame (const struct block *);
-extern int frame_register_read (struct frame_info *frame, int regnum,
+extern int deprecated_frame_register_read (struct frame_info *frame, int regnum,
gdb_byte *buf);
/* From stack.c. */
+
+extern const char print_entry_values_no[];
+extern const char print_entry_values_only[];
+extern const char print_entry_values_preferred[];
+extern const char print_entry_values_if_needed[];
+extern const char print_entry_values_both[];
+extern const char print_entry_values_compact[];
+extern const char print_entry_values_default[];
+extern const char *print_entry_values;
+
+/* Inferior function parameter value read in from a frame. */
+
+struct frame_arg
+{
+ /* Symbol for this parameter used for example for its name. */
+ struct symbol *sym;
+
+ /* Value of the parameter. It is NULL if ERROR is not NULL; if both VAL and
+ ERROR are NULL this parameter's value should not be printed. */
+ struct value *val;
+
+ /* String containing the error message, it is more usually NULL indicating no
+ error occured reading this parameter. */
+ char *error;
+
+ /* One of the print_entry_values_* entries as appropriate specifically for
+ this frame_arg. It will be different from print_entry_values. With
+ print_entry_values_no this frame_arg should be printed as a normal
+ parameter. print_entry_values_only says it should be printed as entry
+ value parameter. print_entry_values_compact says it should be printed as
+ both as a normal parameter and entry values parameter having the same
+ value - print_entry_values_compact is not permitted fi ui_out_is_mi_like_p
+ (in such case print_entry_values_no and print_entry_values_only is used
+ for each parameter kind specifically. */
+ const char *entry_kind;
+};
+
+extern void read_frame_arg (struct symbol *sym, struct frame_info *frame,
+ struct frame_arg *argp,
+ struct frame_arg *entryargp);
+extern void read_frame_local (struct symbol *sym, struct frame_info *frame,
+ struct frame_arg *argp);
+
extern void args_info (char *, int);
extern void locals_info (char *, int);