diff options
author | Andrew Cagney <cagney@redhat.com> | 1998-12-16 15:01:03 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 1998-12-16 15:01:03 +0000 |
commit | dcf46491d817c78708176a83fb034a7b72664d0c (patch) | |
tree | ef46eddbae06ad75fa7c1ab3f22f4efaa606f71d /gdb/gdbarch.h | |
parent | e81bad50a8605ae3c02521e6b7bf59c88aa1ecda (diff) | |
download | gdb-dcf46491d817c78708176a83fb034a7b72664d0c.zip gdb-dcf46491d817c78708176a83fb034a7b72664d0c.tar.gz gdb-dcf46491d817c78708176a83fb034a7b72664d0c.tar.bz2 |
CARP:
Add multi-arch code!
Diffstat (limited to 'gdb/gdbarch.h')
-rw-r--r-- | gdb/gdbarch.h | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 098db4c..a6a18be 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -20,6 +20,177 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifndef GDBARCH_H #define GDBARCH_H +/* start-sanitize-carp start-sanitize-vr4xxx */ + +#ifndef GDB_MULTI_ARCH +#define GDB_MULTI_ARCH 0 +#endif + +extern struct gdbarch *current_gdbarch; + + +/* When GDB_MULTI_ARCH override any earlier definitions of the + below. */ + +extern const struct bfd_arch_info *gdbarch_bfd_arch_info PARAMS ((struct gdbarch*)); +#if GDB_MULTI_ARCH +#undef TARGET_ARCHITECTURE +#define TARGET_ARCHITECTURE (gdbarch_bfd_arch_info (current_gdbarch)) +#endif + +extern int gdbarch_byte_order PARAMS ((struct gdbarch*)); +#if GDB_MULTI_ARCH +#undef TARGET_BYTE_ORDER +#define TARGET_BYTE_ORDER (gdbarch_byte_order (current_gdbarch)) +#endif + +extern int gdbarch_long_bit PARAMS ((struct gdbarch*)); +extern void set_gdbarch_long_bit PARAMS ((struct gdbarch*, int)); +#if GDB_MULTI_ARCH +#undef TARGET_LONG_BIT +#define TARGET_LONG_BIT (gdbarch_long_bit (current_gdbarch)) +#endif + +extern int gdbarch_long_long_bit PARAMS ((struct gdbarch*)); +extern void set_gdbarch_long_long_bit PARAMS ((struct gdbarch*, int)); +#if GDB_MULTI_ARCH +#undef TARGET_LONG_LONG_BIT +#define TARGET_LONG_LONG_BIT (gdbarch_long_long_bit (current_gdbarch)) +#endif + +extern int gdbarch_ptr_bit PARAMS ((struct gdbarch*)); +extern void set_gdbarch_ptr_bit PARAMS ((struct gdbarch*, int)); +#if GDB_MULTI_ARCH +#undef TARGET_PTR_BIT +#define TARGET_PTR_BIT (gdbarch_ptr_bit (current_gdbarch)) +#endif + +extern struct gdbarch_tdep *gdbarch_tdep PARAMS ((struct 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 only a loose connection between + the set-architecture command and the various GDB components exists. + Each component can independantly 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 independant) + components this global aproach was considered non-applicable. */ + + +/* Register a new architectural family with GDB. + + Register support for the specified architecture with GDB. When + ever gdbarch determines that this architecture has been selected, + the specifed INIT function is called. + + INIT 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. Fields within the structure INFO which have no + previous value are set to defaults: BFD_ARCHITECTURE - + bfd_arch_unknown; BFD_ARCH_INFO - NULL; BYTE_ORDER - 0; ABFD - + NULL; + + The INIT function shall return any of: NULL indicating that it + doesn't reconize the selected architecture; an existing ``struct + gdbarch'' from the ARCHES list (indicating that the new + architecture is just a synonym for an earlier architecture); create + and then return a new ``struct gdbarch'' for this new architecture + (using gdbarch_alloc()). */ + +struct gdbarch_list +{ + struct gdbarch *gdbarch; + struct gdbarch_list *next; +}; + +struct gdbarch_info +{ + enum bfd_architecture bfd_architecture; + const struct bfd_arch_info *bfd_arch_info; + int byte_order; + bfd *abfd; +}; + +typedef struct gdbarch *(gdbarch_init_ftype) PARAMS ((const struct gdbarch_info *info, struct gdbarch_list *arches)); + +extern void register_gdbarch_init PARAMS ((enum bfd_architecture, gdbarch_init_ftype *)); + +/* Helper function. Search ARCHES for a gdbarch that matches + information provided by INFO. */ + +extern struct gdbarch_list *gdbarch_list_lookup_by_info PARAMS ((struct gdbarch_list *arches, const struct gdbarch_info *info)); + +/* Helper function. Create a preliminary ``struct gdbarch''. Perform + basic initialization using values from the INFO structure. */ + +extern struct gdbarch *gdbarch_alloc PARAMS ((const struct gdbarch_info *, struct gdbarch_tdep *)); + +/* Helper function. Force the updating of the current architecture. + Used by targets that have added their own target specific + architecture manipulation commands. */ + +extern int gdbarch_update PARAMS ((struct gdbarch_info)); + + + +/* 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. + + When a new architecture is selected, INIT() is called. When a + previous architecture is re-selected, the per-architecture + data-pointer for that previous architecture is restored (INIT() is + not called). + + INIT() shall return the initial value for the per-architecture + data-pointer for the current architecture. + + Multiple registrarants for any architecture are allowed (and + strongly encouraged). */ + +typedef void *(gdbarch_data_ftype) PARAMS ((void)); +extern struct gdbarch_data *register_gdbarch_data PARAMS ((gdbarch_data_ftype *init)); + + +/* Return the value of the per-architecture data-pointer for the + current architecture. */ + +extern void *gdbarch_data PARAMS ((struct gdbarch_data*)); + + +/* Register per-architecture memory region. + + For legacy code, provide a memory-region swap mechanism. + Per-architecture memory blocks are created, these being swapped + whenever the architecture is changed. For a new architecture, the + memory region is initialized with zero (0) and the INIT function is + called. + + Memory regions are swapped / initialized in the order that they are + registered. NULL DATA and/or INIT values can be specified. */ + +typedef void (gdbarch_swap_ftype) PARAMS ((void)); +extern void register_gdbarch_swap PARAMS ((void *data, unsigned long size, gdbarch_swap_ftype *init)); + + +/* end-sanitize-carp end-sanitize-vr4xxx */ /* The target-system-dependant byte order is dynamic */ |