mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
bf31fd38f0
This moves the gdb-specific obstack code -- both extensions like obconcat and obstack_strdup, and things like auto_obstack -- to gdbsupport.
380 lines
13 KiB
C++
380 lines
13 KiB
C++
/* Dynamic architecture support for GDB, the GNU debugger.
|
|
|
|
Copyright (C) 1998-2022 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/>. */
|
|
|
|
|
|
#ifndef GDBARCH_H
|
|
#define GDBARCH_H
|
|
|
|
#include <vector>
|
|
#include "frame.h"
|
|
#include "dis-asm.h"
|
|
#include "gdbsupport/gdb_obstack.h"
|
|
#include "infrun.h"
|
|
#include "osabi.h"
|
|
#include "displaced-stepping.h"
|
|
|
|
struct floatformat;
|
|
struct ui_file;
|
|
struct value;
|
|
struct objfile;
|
|
struct obj_section;
|
|
struct minimal_symbol;
|
|
struct regcache;
|
|
struct reggroup;
|
|
struct regset;
|
|
struct disassemble_info;
|
|
struct target_ops;
|
|
struct obstack;
|
|
struct bp_target_info;
|
|
struct target_desc;
|
|
struct symbol;
|
|
struct syscall;
|
|
struct agent_expr;
|
|
struct axs_value;
|
|
struct stap_parse_info;
|
|
struct expr_builder;
|
|
struct ravenscar_arch_ops;
|
|
struct mem_range;
|
|
struct syscalls_info;
|
|
struct thread_info;
|
|
struct ui_out;
|
|
struct inferior;
|
|
|
|
#include "regcache.h"
|
|
|
|
struct gdbarch_tdep {};
|
|
|
|
/* The architecture associated with the inferior through the
|
|
connection to the target.
|
|
|
|
The architecture vector provides some information that is really a
|
|
property of the inferior, accessed through a particular target:
|
|
ptrace operations; the layout of certain RSP packets; the solib_ops
|
|
vector; etc. To differentiate architecture accesses to
|
|
per-inferior/target properties from
|
|
per-thread/per-frame/per-objfile properties, accesses to
|
|
per-inferior/target properties should be made through this
|
|
gdbarch. */
|
|
|
|
/* This is a convenience wrapper for 'current_inferior ()->gdbarch'. */
|
|
extern struct gdbarch *target_gdbarch (void);
|
|
|
|
/* Callback type for the 'iterate_over_objfiles_in_search_order'
|
|
gdbarch method. */
|
|
|
|
typedef int (iterate_over_objfiles_in_search_order_cb_ftype)
|
|
(struct objfile *objfile, void *cb_data);
|
|
|
|
/* Callback type for regset section iterators. The callback usually
|
|
invokes the REGSET's supply or collect method, to which it must
|
|
pass a buffer - for collects this buffer will need to be created using
|
|
COLLECT_SIZE, for supply the existing buffer being read from should
|
|
be at least SUPPLY_SIZE. SECT_NAME is a BFD section name, and HUMAN_NAME
|
|
is used for diagnostic messages. CB_DATA should have been passed
|
|
unchanged through the iterator. */
|
|
|
|
typedef void (iterate_over_regset_sections_cb)
|
|
(const char *sect_name, int supply_size, int collect_size,
|
|
const struct regset *regset, const char *human_name, void *cb_data);
|
|
|
|
/* For a function call, does the function return a value using a
|
|
normal value return or a structure return - passing a hidden
|
|
argument pointing to storage. For the latter, there are two
|
|
cases: language-mandated structure return and target ABI
|
|
structure return. */
|
|
|
|
enum function_call_return_method
|
|
{
|
|
/* Standard value return. */
|
|
return_method_normal = 0,
|
|
|
|
/* Language ABI structure return. This is handled
|
|
by passing the return location as the first parameter to
|
|
the function, even preceding "this". */
|
|
return_method_hidden_param,
|
|
|
|
/* Target ABI struct return. This is target-specific; for instance,
|
|
on ia64 the first argument is passed in out0 but the hidden
|
|
structure return pointer would normally be passed in r8. */
|
|
return_method_struct,
|
|
};
|
|
|
|
enum class memtag_type
|
|
{
|
|
/* Logical tag, the tag that is stored in unused bits of a pointer to a
|
|
virtual address. */
|
|
logical = 0,
|
|
|
|
/* Allocation tag, the tag that is associated with every granule of memory in
|
|
the physical address space. Allocation tags are used to validate memory
|
|
accesses via pointers containing logical tags. */
|
|
allocation,
|
|
};
|
|
|
|
/* Callback types for 'read_core_file_mappings' gdbarch method. */
|
|
|
|
using read_core_file_mappings_pre_loop_ftype =
|
|
gdb::function_view<void (ULONGEST count)>;
|
|
|
|
using read_core_file_mappings_loop_ftype =
|
|
gdb::function_view<void (int num,
|
|
ULONGEST start,
|
|
ULONGEST end,
|
|
ULONGEST file_ofs,
|
|
const char *filename,
|
|
const bfd_build_id *build_id)>;
|
|
|
|
#include "gdbarch-gen.h"
|
|
|
|
extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
|
|
|
|
|
|
/* Mechanism for co-ordinating the selection of a specific
|
|
architecture.
|
|
|
|
GDB targets (*-tdep.c) can register an interest in a specific
|
|
architecture. Other GDB components can register a need to maintain
|
|
per-architecture data.
|
|
|
|
The mechanisms below ensures that there is only a loose connection
|
|
between the set-architecture command and the various GDB
|
|
components. Each component can independently register their need
|
|
to maintain architecture specific data with gdbarch.
|
|
|
|
Pragmatics:
|
|
|
|
Previously, a single TARGET_ARCHITECTURE_HOOK was provided. It
|
|
didn't scale.
|
|
|
|
The more traditional mega-struct containing architecture specific
|
|
data for all the various GDB components was also considered. Since
|
|
GDB is built from a variable number of (fairly independent)
|
|
components it was determined that the global aproach was not
|
|
applicable. */
|
|
|
|
|
|
/* Register a new architectural family with GDB.
|
|
|
|
Register support for the specified ARCHITECTURE with GDB. When
|
|
gdbarch determines that the specified architecture has been
|
|
selected, the corresponding INIT function is called.
|
|
|
|
--
|
|
|
|
The INIT function takes two parameters: INFO which contains the
|
|
information available to gdbarch about the (possibly new)
|
|
architecture; ARCHES which is a list of the previously created
|
|
``struct gdbarch'' for this architecture.
|
|
|
|
The INFO parameter is, as far as possible, be pre-initialized with
|
|
information obtained from INFO.ABFD or the global defaults.
|
|
|
|
The ARCHES parameter is a linked list (sorted most recently used)
|
|
of all the previously created architures for this architecture
|
|
family. The (possibly NULL) ARCHES->gdbarch can used to access
|
|
values from the previously selected architecture for this
|
|
architecture family.
|
|
|
|
The INIT function shall return any of: NULL - indicating that it
|
|
doesn't recognize the selected architecture; an existing ``struct
|
|
gdbarch'' from the ARCHES list - indicating that the new
|
|
architecture is just a synonym for an earlier architecture (see
|
|
gdbarch_list_lookup_by_info()); a newly created ``struct gdbarch''
|
|
- that describes the selected architecture (see gdbarch_alloc()).
|
|
|
|
The DUMP_TDEP function shall print out all target specific values.
|
|
Care should be taken to ensure that the function works in both the
|
|
multi-arch and non- multi-arch cases. */
|
|
|
|
struct gdbarch_list
|
|
{
|
|
struct gdbarch *gdbarch;
|
|
struct gdbarch_list *next;
|
|
};
|
|
|
|
struct gdbarch_info
|
|
{
|
|
gdbarch_info ()
|
|
/* Ensure the union is zero-initialized. Relies on the fact that there's
|
|
no member larger than TDESC_DATA. */
|
|
: tdesc_data ()
|
|
{}
|
|
|
|
const struct bfd_arch_info *bfd_arch_info = nullptr;
|
|
|
|
enum bfd_endian byte_order = BFD_ENDIAN_UNKNOWN;
|
|
|
|
enum bfd_endian byte_order_for_code = BFD_ENDIAN_UNKNOWN;
|
|
|
|
bfd *abfd = nullptr;
|
|
|
|
union
|
|
{
|
|
/* Architecture-specific target description data. Numerous targets
|
|
need only this, so give them an easy way to hold it. */
|
|
struct tdesc_arch_data *tdesc_data;
|
|
|
|
/* SPU file system ID. This is a single integer, so using the
|
|
generic form would only complicate code. Other targets may
|
|
reuse this member if suitable. */
|
|
int *id;
|
|
};
|
|
|
|
enum gdb_osabi osabi = GDB_OSABI_UNKNOWN;
|
|
|
|
const struct target_desc *target_desc = nullptr;
|
|
};
|
|
|
|
typedef struct gdbarch *(gdbarch_init_ftype) (struct gdbarch_info info, struct gdbarch_list *arches);
|
|
typedef void (gdbarch_dump_tdep_ftype) (struct gdbarch *gdbarch, struct ui_file *file);
|
|
|
|
/* DEPRECATED - use gdbarch_register() */
|
|
extern void register_gdbarch_init (enum bfd_architecture architecture, gdbarch_init_ftype *);
|
|
|
|
extern void gdbarch_register (enum bfd_architecture architecture,
|
|
gdbarch_init_ftype *,
|
|
gdbarch_dump_tdep_ftype *);
|
|
|
|
|
|
/* Return a vector of the valid architecture names. Since architectures are
|
|
registered during the _initialize phase this function only returns useful
|
|
information once initialization has been completed. */
|
|
|
|
extern std::vector<const char *> gdbarch_printable_names ();
|
|
|
|
|
|
/* Helper function. Search the list of ARCHES for a GDBARCH that
|
|
matches the information provided by INFO. */
|
|
|
|
extern struct gdbarch_list *gdbarch_list_lookup_by_info (struct gdbarch_list *arches, const struct gdbarch_info *info);
|
|
|
|
|
|
/* Helper function. Create a preliminary ``struct gdbarch''. Perform
|
|
basic initialization using values obtained from the INFO and TDEP
|
|
parameters. set_gdbarch_*() functions are called to complete the
|
|
initialization of the object. */
|
|
|
|
extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
|
|
|
|
|
|
/* Helper function. Free a partially-constructed ``struct gdbarch''.
|
|
It is assumed that the caller freeds the ``struct
|
|
gdbarch_tdep''. */
|
|
|
|
extern void gdbarch_free (struct gdbarch *);
|
|
|
|
/* Get the obstack owned by ARCH. */
|
|
|
|
extern obstack *gdbarch_obstack (gdbarch *arch);
|
|
|
|
/* Helper function. Allocate memory from the ``struct gdbarch''
|
|
obstack. The memory is freed when the corresponding architecture
|
|
is also freed. */
|
|
|
|
#define GDBARCH_OBSTACK_CALLOC(GDBARCH, NR, TYPE) obstack_calloc<TYPE> (gdbarch_obstack ((GDBARCH)), (NR))
|
|
|
|
#define GDBARCH_OBSTACK_ZALLOC(GDBARCH, TYPE) obstack_zalloc<TYPE> (gdbarch_obstack ((GDBARCH)))
|
|
|
|
/* Duplicate STRING, returning an equivalent string that's allocated on the
|
|
obstack associated with GDBARCH. The string is freed when the corresponding
|
|
architecture is also freed. */
|
|
|
|
extern char *gdbarch_obstack_strdup (struct gdbarch *arch, const char *string);
|
|
|
|
/* Helper function. Force an update of the current architecture.
|
|
|
|
The actual architecture selected is determined by INFO, ``(gdb) set
|
|
architecture'' et.al., the existing architecture and BFD's default
|
|
architecture. INFO should be initialized to zero and then selected
|
|
fields should be updated.
|
|
|
|
Returns non-zero if the update succeeds. */
|
|
|
|
extern int gdbarch_update_p (struct gdbarch_info info);
|
|
|
|
|
|
/* Helper function. Find an architecture matching info.
|
|
|
|
INFO should have relevant fields set, and then finished using
|
|
gdbarch_info_fill.
|
|
|
|
Returns the corresponding architecture, or NULL if no matching
|
|
architecture was found. */
|
|
|
|
extern struct gdbarch *gdbarch_find_by_info (struct gdbarch_info info);
|
|
|
|
|
|
/* Helper function. Set the target gdbarch to "gdbarch". */
|
|
|
|
extern void set_target_gdbarch (struct gdbarch *gdbarch);
|
|
|
|
|
|
/* Register per-architecture data-pointer.
|
|
|
|
Reserve space for a per-architecture data-pointer. An identifier
|
|
for the reserved data-pointer is returned. That identifer should
|
|
be saved in a local static variable.
|
|
|
|
Memory for the per-architecture data shall be allocated using
|
|
gdbarch_obstack_zalloc. That memory will be deleted when the
|
|
corresponding architecture object is deleted.
|
|
|
|
When a previously created architecture is re-selected, the
|
|
per-architecture data-pointer for that previous architecture is
|
|
restored. INIT() is not re-called.
|
|
|
|
Multiple registrarants for any architecture are allowed (and
|
|
strongly encouraged). */
|
|
|
|
struct gdbarch_data;
|
|
|
|
typedef void *(gdbarch_data_pre_init_ftype) (struct obstack *obstack);
|
|
extern struct gdbarch_data *gdbarch_data_register_pre_init (gdbarch_data_pre_init_ftype *init);
|
|
typedef void *(gdbarch_data_post_init_ftype) (struct gdbarch *gdbarch);
|
|
extern struct gdbarch_data *gdbarch_data_register_post_init (gdbarch_data_post_init_ftype *init);
|
|
|
|
extern void *gdbarch_data (struct gdbarch *gdbarch, struct gdbarch_data *);
|
|
|
|
|
|
/* Set the dynamic target-system-dependent parameters (architecture,
|
|
byte-order, ...) using information found in the BFD. */
|
|
|
|
extern void set_gdbarch_from_file (bfd *);
|
|
|
|
|
|
/* Initialize the current architecture to the "first" one we find on
|
|
our list. */
|
|
|
|
extern void initialize_current_architecture (void);
|
|
|
|
/* gdbarch trace variable */
|
|
extern unsigned int gdbarch_debug;
|
|
|
|
extern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
|
|
|
|
/* Return the number of cooked registers (raw + pseudo) for ARCH. */
|
|
|
|
static inline int
|
|
gdbarch_num_cooked_regs (gdbarch *arch)
|
|
{
|
|
return gdbarch_num_regs (arch) + gdbarch_num_pseudo_regs (arch);
|
|
}
|
|
|
|
#endif
|