123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379 |
- /* 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
|