|  | /* Definitions for a frame base, for GDB, the GNU debugger. | 
|  |  | 
|  | Copyright (C) 2003-2024 Free Software Foundation, Inc. | 
|  |  | 
|  | This file is part of GDB. | 
|  |  | 
|  | This program is free software; you can redistribute it and/or modify | 
|  | it under the terms of the GNU General Public License as published by | 
|  | the Free Software Foundation; either version 3 of the License, or | 
|  | (at your option) any later version. | 
|  |  | 
|  | This program is distributed in the hope that it will be useful, | 
|  | but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | 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, see <http://www.gnu.org/licenses/>.  */ | 
|  |  | 
|  | #if !defined (FRAME_BASE_H) | 
|  | #define FRAME_BASE_H 1 | 
|  |  | 
|  | class frame_info_ptr; | 
|  | struct frame_id; | 
|  | struct frame_unwind; | 
|  | struct frame_base; | 
|  | struct gdbarch; | 
|  | struct regcache; | 
|  |  | 
|  | /* Assuming the frame chain: (outer) prev <-> this <-> next (inner); | 
|  | and that this is a `normal frame'; use THIS frame, and implicitly | 
|  | the NEXT frame's register unwind method, to determine the address | 
|  | of THIS frame's `base'. | 
|  |  | 
|  | The exact meaning of `base' is highly dependant on the type of the | 
|  | debug info.  It is assumed that dwarf2, stabs, ... will each | 
|  | provide their own methods. | 
|  |  | 
|  | A typical implementation will return the same value for base, | 
|  | locals-base and args-base.  That value, however, will likely be | 
|  | different to the frame ID's stack address.  */ | 
|  |  | 
|  | /* A generic base address.  */ | 
|  |  | 
|  | typedef CORE_ADDR (frame_this_base_ftype) (const frame_info_ptr &this_frame, | 
|  | void **this_base_cache); | 
|  |  | 
|  | /* The base address of the frame's local variables.  */ | 
|  |  | 
|  | typedef CORE_ADDR (frame_this_locals_ftype) (const frame_info_ptr &this_frame, | 
|  | void **this_base_cache); | 
|  |  | 
|  | /* The base address of the frame's arguments / parameters.  */ | 
|  |  | 
|  | typedef CORE_ADDR (frame_this_args_ftype) (const frame_info_ptr &this_frame, | 
|  | void **this_base_cache); | 
|  |  | 
|  | struct frame_base | 
|  | { | 
|  | /* If non-NULL, a low-level unwinder that shares its implementation | 
|  | with this high-level frame-base method.  */ | 
|  | const struct frame_unwind *unwind; | 
|  | frame_this_base_ftype *this_base; | 
|  | frame_this_locals_ftype *this_locals; | 
|  | frame_this_args_ftype *this_args; | 
|  | }; | 
|  |  | 
|  | /* Given THIS frame, return the frame base methods for THIS frame, | 
|  | or NULL if it can't handle THIS frame.  */ | 
|  |  | 
|  | typedef const struct frame_base *(frame_base_sniffer_ftype) (const frame_info_ptr &this_frame); | 
|  |  | 
|  | /* Append a frame base sniffer to the list.  The sniffers are polled | 
|  | in the order that they are appended.  */ | 
|  |  | 
|  | extern void frame_base_append_sniffer (struct gdbarch *gdbarch, | 
|  | frame_base_sniffer_ftype *sniffer); | 
|  |  | 
|  | /* Set the default frame base.  If all else fails, this one is | 
|  | returned.  If this isn't set, the default is to use legacy code | 
|  | that uses things like the frame ID's base (ulgh!).  */ | 
|  |  | 
|  | extern void frame_base_set_default (struct gdbarch *gdbarch, | 
|  | const struct frame_base *def); | 
|  |  | 
|  | /* Iterate through the list of frame base handlers until one returns | 
|  | an implementation.  */ | 
|  |  | 
|  | extern const struct frame_base *frame_base_find_by_frame (const frame_info_ptr &this_frame); | 
|  |  | 
|  | #endif |