/* Definitions for dealing with stack frames, for GDB, the GNU debugger.
- Copyright (C) 1986-2015 Free Software Foundation, Inc.
+ Copyright (C) 1986-2017 Free Software Foundation, Inc.
This file is part of GDB.
*/
+#include "language.h"
+
struct symtab_and_line;
struct frame_unwind;
struct frame_base;
struct block;
struct gdbarch;
struct ui_file;
+struct ui_out;
/* Status of a given frame's stack. */
/* Stack address is valid, and is found in the stack_addr field. */
FID_STACK_VALID = 1,
+ /* Sentinel frame. */
+ FID_STACK_SENTINEL = 2,
+
/* Stack address is unavailable. I.e., there's a valid stack, but
we don't know where it is (because memory or registers we'd
compute it from were not collected). */
CORE_ADDR special_addr;
/* Flags to indicate the above fields have valid contents. */
- ENUM_BITFIELD(frame_id_stack_status) stack_status : 2;
+ ENUM_BITFIELD(frame_id_stack_status) stack_status : 3;
unsigned int code_addr_p : 1;
unsigned int special_addr_p : 1;
/* For convenience. All fields are zero. This means "there is no frame". */
extern const struct frame_id null_frame_id;
+/* Sentinel frame. */
+extern const struct frame_id sentinel_frame_id;
+
/* This means "there is no frame ID, but there is a frame". It should be
replaced by best-effort frame IDs for the outermost frame, somehow.
The implementation is only special_addr_p set. */
extern struct frame_info *get_prev_frame (struct frame_info *);
extern struct frame_info *get_next_frame (struct frame_info *);
+/* Like get_next_frame(), but allows return of the sentinel frame. NULL
+ is never returned. */
+extern struct frame_info *get_next_frame_sentinel_okay (struct frame_info *);
+
/* Return a "struct frame_info" corresponding to the frame that called
THIS_FRAME. Returns NULL if there is no such frame.
is not found. */
extern struct frame_info *frame_find_by_id (struct frame_id id);
+/* Given a frame's ID, find the previous frame's ID. Returns null_frame_id
+ if the frame is not found. */
+extern struct frame_id get_prev_frame_id_by_id (struct frame_id id);
+
/* Base attributes of a frame: */
/* The frame's `resume' address. Where the program will resume in
extern struct frame_info *find_relative_frame (struct frame_info *, int *);
+/* Wrapper over print_stack_frame modifying current_uiout with UIOUT for
+ the function call. */
+
+extern void print_stack_frame_to_uiout (struct ui_out *uiout,
+ struct frame_info *, int print_level,
+ enum print_what print_what,
+ int set_current_sal);
+
extern void print_stack_frame (struct frame_info *, int print_level,
enum print_what print_what,
int set_current_sal);
extern void locals_info (char *, int);
-extern void (*deprecated_selected_frame_level_changed_hook) (int);
-
extern void return_command (char *, int);
/* Set FRAME's unwinder temporarily, so that we can call a sniffer.
extern int frame_unwinder_is (struct frame_info *fi,
const struct frame_unwind *unwinder);
+/* Return the language of FRAME. */
+
+extern enum language get_frame_language (struct frame_info *frame);
+
+/* Return the first non-tailcall frame above FRAME or FRAME if it is not a
+ tailcall frame. Return NULL if FRAME is the start of a tailcall-only
+ chain. */
+
+extern struct frame_info *skip_tailcall_frames (struct frame_info *frame);
+
+/* Return the first frame above FRAME or FRAME of which the code is
+ writable. */
+
+extern struct frame_info *skip_unwritable_frames (struct frame_info *frame);
+
#endif /* !defined (FRAME_H) */