From: Andrew Cagney Date: Mon, 3 Apr 2000 00:00:32 +0000 (+0000) Subject: * gdbarch-utils.h, gdbarch-utils.c: New files. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c0e8c25248ec2df52f15aef6f66a5aefa189adb1;p=binutils-gdb.git * gdbarch-utils.h, gdbarch-utils.c: New files. * Makefile.in (SFILES, COMMON_OBS): Update. (gdbarch_utils_h) Define. (gdbarch-utils.o): Add dependencies. * gdbarch.c, gdbarch.sh: Include "gdbarch-utils.h". Fix code handling default method values. (startup_gdbarch): Rename default_gdbarch, name misleading. (breakpoint_from_pc): Default to legacy_breakpoint_from_pc. (register_name): Default to legacy_register_name. (call_dummy_words): Default to legacy_call_dummy_words. (sizeof_call_dummy_words): Default to legacy_sizeof_call_dummy_words. (register_convertible): Default to generic_register_convertible_not. (breakpoint_from_pc): Default to legacy_breakpoint_from_pc. (remote_translate_xfer_address): Default to generic_remote_translate_xfer_address. (frameless_function_invocation): Default to generic_frameless_function_invocation_not. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index be1a291a6b3..9ff56736ba5 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,26 @@ +Fri Mar 31 08:59:58 2000 Andrew Cagney + + * gdbarch-utils.h, gdbarch-utils.c: New files. + * Makefile.in (SFILES, COMMON_OBS): Update. + (gdbarch_utils_h) Define. + (gdbarch-utils.o): Add dependencies. + + * gdbarch.c, gdbarch.sh: Include "gdbarch-utils.h". Fix code + handling default method values. + (startup_gdbarch): Rename default_gdbarch, name misleading. + (breakpoint_from_pc): Default to legacy_breakpoint_from_pc. + (register_name): Default to legacy_register_name. + (call_dummy_words): Default to legacy_call_dummy_words. + (sizeof_call_dummy_words): Default to + legacy_sizeof_call_dummy_words. + (register_convertible): Default to + generic_register_convertible_not. + (breakpoint_from_pc): Default to legacy_breakpoint_from_pc. + (remote_translate_xfer_address): Default to + generic_remote_translate_xfer_address. + (frameless_function_invocation): Default to + generic_frameless_function_invocation_not. + 2000-04-02 Mark Kettenis * i386-linux-nat.c: Add copyright notice. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 857b28bf91c..d036ce1d1f5 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -466,7 +466,7 @@ SFILES = ax-general.c ax-gdb.c bcache.c blockframe.c breakpoint.c \ demangle.c dwarfread.c dwarf2read.c elfread.c environ.c eval.c \ event-loop.c event-top.c \ expprint.c f-exp.y f-lang.c f-typeprint.c f-valprint.c \ - findvar.c gdbarch.c gdbtypes.c \ + findvar.c gdbarch.c gdbarch-utils.c gdbtypes.c \ inf-loop.c infcmd.c inflow.c infrun.c language.c \ kod.c kod-cisco.c \ ui-out.c cli-out.c \ @@ -548,6 +548,7 @@ remote_h = remote.h version_h = version.h ui_out_h = ui-out.h cli_out_h = cli-out.h +gdbarch_utils_h = gdbarch-utils.h # Header files that need to have srcdir added. Note that in the cases # where we use a macro like $(gdbcmd_h), things are carefully arranged @@ -605,7 +606,7 @@ COMMON_OBS = version.o blockframe.o breakpoint.o findvar.o stack.o thread.o \ symtab.o symfile.o symmisc.o infcmd.o infrun.o command.o \ expprint.o environ.o \ event-loop.o event-top.o inf-loop.o \ - gdbarch.o gdbtypes.o copying.o $(DEPFILES) \ + gdbarch.o gdbarch-utils.o gdbtypes.o copying.o $(DEPFILES) \ mem-break.o target.o parse.o language.o $(YYOBJ) buildsym.o \ kod.o kod-cisco.o \ gdb-events.o \ @@ -1353,6 +1354,9 @@ tracepoint.o: tracepoint.c $(defs_h) $(symtab_h) $(frame_h) $(tracepoint_h) \ gdbarch.o: gdbarch.c $(defs_h) $(bfd_h) $(gdbcmd_h) +gdbarch-utils.o: gdbarch-utils.c $(defs_h) $(bfd_h) $(gdbcmd_h) \ + $(gdbarch_utils_h) + gdbtypes.o: gdbtypes.c $(bfd_h) complaints.h $(defs_h) $(expression_h) \ $(gdbtypes_h) language.h objfiles.h symfile.h $(symtab_h) target.h \ $(value_h) gdb_string.h @@ -1522,6 +1526,7 @@ minsyms.o: minsyms.c $(bfd_h) $(defs_h) objfiles.h symfile.h \ mips-nat.o: mips-nat.c $(defs_h) $(gdbcore_h) $(inferior_h) mips-tdep.o: mips-tdep.c $(defs_h) $(gdbcmd_h) $(gdbcore_h) \ + $(gdbarch_utils_h) \ $(inferior_h) language.h objfiles.h symfile.h gdb_string.h mipsread.o: mipsread.c buildsym.h complaints.h $(bfd_h) $(defs_h) \ diff --git a/gdb/gdbarch-utils.c b/gdb/gdbarch-utils.c new file mode 100644 index 00000000000..9048bd75419 --- /dev/null +++ b/gdb/gdbarch-utils.c @@ -0,0 +1,137 @@ +/* Dynamic architecture support for GDB, the GNU debugger. + Copyright 1998-1999, 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "defs.h" + +#if GDB_MULTI_ARCH +#include "gdbcmd.h" +#include "inferior.h" /* enum CALL_DUMMY_LOCATION et.al. */ +#else +/* Just include everything in sight so that the every old definition + of macro is visible. */ +#include "gdb_string.h" +#include +#include "symtab.h" +#include "frame.h" +#include "inferior.h" +#include "breakpoint.h" +#include "gdb_wait.h" +#include "gdbcore.h" +#include "gdbcmd.h" +#include "target.h" +#include "gdbthread.h" +#include "annotate.h" +#include "symfile.h" /* for overlay functions */ +#endif + +/* Convenience macro for allocting typesafe memory. */ + +#ifndef XMALLOC +#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE)) +#endif + + +/* Use the program counter to determine the contents and size + of a breakpoint instruction. If no target-dependent macro + BREAKPOINT_FROM_PC has been defined to implement this function, + assume that the breakpoint doesn't depend on the PC, and + use the values of the BIG_BREAKPOINT and LITTLE_BREAKPOINT macros. + Return a pointer to a string of bytes that encode a breakpoint + instruction, stores the length of the string to *lenptr, + and optionally adjust the pc to point to the correct memory location + for inserting the breakpoint. */ + +unsigned char * +legacy_breakpoint_from_pc (CORE_ADDR * pcptr, int *lenptr) +{ + /* {BIG_,LITTLE_}BREAKPOINT is the sequence of bytes we insert for a + breakpoint. On some machines, breakpoints are handled by the + target environment and we don't have to worry about them here. */ +#ifdef BIG_BREAKPOINT + if (TARGET_BYTE_ORDER == BIG_ENDIAN) + { + static unsigned char big_break_insn[] = BIG_BREAKPOINT; + *lenptr = sizeof (big_break_insn); + return big_break_insn; + } +#endif +#ifdef LITTLE_BREAKPOINT + if (TARGET_BYTE_ORDER != BIG_ENDIAN) + { + static unsigned char little_break_insn[] = LITTLE_BREAKPOINT; + *lenptr = sizeof (little_break_insn); + return little_break_insn; + } +#endif +#ifdef BREAKPOINT + { + static unsigned char break_insn[] = BREAKPOINT; + *lenptr = sizeof (break_insn); + return break_insn; + } +#endif + *lenptr = 0; + return NULL; +} + +int +generic_frameless_function_invocation_not (struct frame_info *fi) +{ + return 0; +} + +char * +legacy_register_name (int i) +{ +#ifdef REGISTER_NAMES + static char *names[] = REGISTER_NAMES; + if (i < 0 || i >= (sizeof (names) / sizeof (*names))) + return NULL; + else + return names[i]; +#else + internal_error ("legacy_register_name: called."); + return NULL; +#endif +} + +#if defined (CALL_DUMMY) +LONGEST legacy_call_dummy_words[] = CALL_DUMMY; +#else +LONGEST legacy_call_dummy_words[1]; +#endif +int legacy_sizeof_call_dummy_words = sizeof (legacy_call_dummy_words); + +void +generic_remote_translate_xfer_address (CORE_ADDR gdb_addr, int gdb_len, + CORE_ADDR * rem_addr, int *rem_len) +{ + *rem_addr = gdb_addr; + *rem_len = gdb_len; +} + +/* */ + +extern initialize_file_ftype __initialize_gdbarch_utils; + +void +__initialize_gdbarch_utils (void) +{ +} diff --git a/gdb/gdbarch-utils.h b/gdb/gdbarch-utils.h new file mode 100644 index 00000000000..57da8ceb45f --- /dev/null +++ b/gdb/gdbarch-utils.h @@ -0,0 +1,52 @@ +/* Dynamic architecture support for GDB, the GNU debugger. + Copyright 1998-2000, 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 2 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, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef GDBARCH_UTILS_H +#define GDBARCH_UTILS_H + +/* gdbarch trace variable */ +extern int gdbarch_debug; + +/* Fallback for register convertible. */ +extern gdbarch_register_convertible_ftype generic_register_convertible_not; + +/* Helper function for targets that don't know how my arguments are + being passed */ +extern gdbarch_frame_num_args_ftype frame_num_args_unknown; + +/* Implementation of breakpoint from PC using any of the deprecated + macros BREAKPOINT, LITTLE_BREAKPOINT, BIG_BREAPOINT. For legacy + targets that don't yet implement their own breakpoint_from_pc(). */ +extern gdbarch_breakpoint_from_pc_ftype legacy_breakpoint_from_pc; + +/* Frameless functions not identifable. */ +extern gdbarch_frameless_function_invocation_ftype generic_frameless_function_invocation_not; + +/* Map onto old REGISTER_NAMES. */ +extern char *legacy_register_name (int i); + +/* Backward compatible call_dummy_words. */ +extern LONGEST legacy_call_dummy_words[]; +extern int legacy_sizeof_call_dummy_words; + +/* Typical remote_translate_xfer_address */ +extern gdbarch_remote_translate_xfer_address_ftype generic_remote_translate_xfer_address; + +#endif diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index bae87341e0f..4425e081804 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -34,6 +34,7 @@ #include "defs.h" +#include "gdbarch-utils.h" #if GDB_MULTI_ARCH #include "gdbcmd.h" @@ -117,7 +118,7 @@ struct gdbarch gdbarch_dump(): Add a fprintf_unfiltered call to so that the new field is dumped out - ``default_gdbarch()'': Append an initial value to the static + ``startup_gdbarch()'': Append an initial value to the static variable (base values on the host's c-type system). get_gdbarch(): Implement the set/get functions (probably using @@ -216,7 +217,7 @@ struct gdbarch extern const struct bfd_arch_info bfd_default_arch_struct; -struct gdbarch default_gdbarch = { +struct gdbarch startup_gdbarch = { /* basic architecture information */ &bfd_default_arch_struct, BIG_ENDIAN, @@ -308,9 +309,9 @@ struct gdbarch default_gdbarch = { 0, 0, 0, - /* default_gdbarch() */ + /* startup_gdbarch() */ }; -struct gdbarch *current_gdbarch = &default_gdbarch; +struct gdbarch *current_gdbarch = &startup_gdbarch; /* Create a new ``struct gdbarch'' based in information provided by @@ -334,6 +335,7 @@ gdbarch_alloc (const struct gdbarch_info *info, gdbarch->sp_regnum = -1; gdbarch->fp_regnum = -1; gdbarch->pc_regnum = -1; + gdbarch->register_name = legacy_register_name; gdbarch->register_size = -1; gdbarch->register_bytes = -1; gdbarch->max_register_raw_size = -1; @@ -344,13 +346,19 @@ gdbarch_alloc (const struct gdbarch_info *info, gdbarch->call_dummy_breakpoint_offset_p = -1; gdbarch->call_dummy_length = -1; gdbarch->call_dummy_p = -1; + gdbarch->call_dummy_words = legacy_call_dummy_words; + gdbarch->sizeof_call_dummy_words = legacy_sizeof_call_dummy_words; gdbarch->call_dummy_stack_adjust_p = -1; gdbarch->coerce_float_to_double = default_coerce_float_to_double; + gdbarch->register_convertible = generic_register_convertible_not; + gdbarch->breakpoint_from_pc = legacy_breakpoint_from_pc; gdbarch->memory_insert_breakpoint = default_memory_insert_breakpoint; gdbarch->memory_remove_breakpoint = default_memory_remove_breakpoint; gdbarch->decr_pc_after_break = -1; gdbarch->function_start_offset = -1; + gdbarch->remote_translate_xfer_address = generic_remote_translate_xfer_address; gdbarch->frame_args_skip = -1; + gdbarch->frameless_function_invocation = generic_frameless_function_invocation_not; /* gdbarch_alloc() */ return gdbarch; @@ -384,9 +392,7 @@ verify_gdbarch (struct gdbarch *gdbarch) if (gdbarch->bfd_arch_info == NULL) internal_error ("verify_gdbarch: bfd_arch_info unset"); /* Check those that need to be defined for the given multi-arch level. */ - if ((GDB_MULTI_ARCH >= 1) - && (0)) - internal_error ("gdbarch: verify_gdbarch: bfd_vma_bit invalid"); + /* Skip verify of bfd_vma_bit, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 1) && (gdbarch->ptr_bit == 0)) internal_error ("gdbarch: verify_gdbarch: ptr_bit invalid"); @@ -441,9 +447,7 @@ verify_gdbarch (struct gdbarch *gdbarch) if ((GDB_MULTI_ARCH >= 2) && (gdbarch->pc_regnum == -1)) internal_error ("gdbarch: verify_gdbarch: pc_regnum invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->register_name == 0)) - internal_error ("gdbarch: verify_gdbarch: register_name invalid"); + /* Skip verify of register_name, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 2) && (gdbarch->register_size == -1)) internal_error ("gdbarch: verify_gdbarch: register_size invalid"); @@ -495,6 +499,8 @@ verify_gdbarch (struct gdbarch *gdbarch) if ((GDB_MULTI_ARCH >= 1) && (gdbarch->call_dummy_p == -1)) internal_error ("gdbarch: verify_gdbarch: call_dummy_p invalid"); + /* Skip verify of call_dummy_words, invalid_p == 0 */ + /* Skip verify of sizeof_call_dummy_words, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 1) && (gdbarch->call_dummy_stack_adjust_p == -1)) internal_error ("gdbarch: verify_gdbarch: call_dummy_stack_adjust_p invalid"); @@ -504,21 +510,13 @@ verify_gdbarch (struct gdbarch *gdbarch) if ((GDB_MULTI_ARCH >= 2) && (gdbarch->fix_call_dummy == 0)) internal_error ("gdbarch: verify_gdbarch: fix_call_dummy invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->coerce_float_to_double == default_coerce_float_to_double)) - internal_error ("gdbarch: verify_gdbarch: coerce_float_to_double invalid"); + /* Skip verify of coerce_float_to_double, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 1) && (gdbarch->get_saved_register == 0)) internal_error ("gdbarch: verify_gdbarch: get_saved_register invalid"); - if ((GDB_MULTI_ARCH >= 1) - && (gdbarch->register_convertible == 0)) - internal_error ("gdbarch: verify_gdbarch: register_convertible invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->register_convert_to_virtual == 0)) - internal_error ("gdbarch: verify_gdbarch: register_convert_to_virtual invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->register_convert_to_raw == 0)) - internal_error ("gdbarch: verify_gdbarch: register_convert_to_raw invalid"); + /* Skip verify of register_convertible, invalid_p == 0 */ + /* Skip verify of register_convert_to_virtual, invalid_p == 0 */ + /* Skip verify of register_convert_to_raw, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 2) && (gdbarch->extract_return_value == 0)) internal_error ("gdbarch: verify_gdbarch: extract_return_value invalid"); @@ -534,12 +532,8 @@ verify_gdbarch (struct gdbarch *gdbarch) if ((GDB_MULTI_ARCH >= 2) && (gdbarch->pop_frame == 0)) internal_error ("gdbarch: verify_gdbarch: pop_frame invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->d10v_make_daddr == 0)) - internal_error ("gdbarch: verify_gdbarch: d10v_make_daddr invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->d10v_make_iaddr == 0)) - internal_error ("gdbarch: verify_gdbarch: d10v_make_iaddr invalid"); + /* Skip verify of d10v_make_daddr, invalid_p == 0 */ + /* Skip verify of d10v_make_iaddr, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 2) && (gdbarch->d10v_daddr_p == 0)) internal_error ("gdbarch: verify_gdbarch: d10v_daddr_p invalid"); @@ -576,30 +570,20 @@ verify_gdbarch (struct gdbarch *gdbarch) if ((GDB_MULTI_ARCH >= 2) && (gdbarch->inner_than == 0)) internal_error ("gdbarch: verify_gdbarch: inner_than invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->breakpoint_from_pc == 0)) - internal_error ("gdbarch: verify_gdbarch: breakpoint_from_pc invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (0)) - internal_error ("gdbarch: verify_gdbarch: memory_insert_breakpoint invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (0)) - internal_error ("gdbarch: verify_gdbarch: memory_remove_breakpoint invalid"); + /* Skip verify of breakpoint_from_pc, invalid_p == 0 */ + /* Skip verify of memory_insert_breakpoint, invalid_p == 0 */ + /* Skip verify of memory_remove_breakpoint, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 2) && (gdbarch->decr_pc_after_break == -1)) internal_error ("gdbarch: verify_gdbarch: decr_pc_after_break invalid"); if ((GDB_MULTI_ARCH >= 2) && (gdbarch->function_start_offset == -1)) internal_error ("gdbarch: verify_gdbarch: function_start_offset invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->remote_translate_xfer_address == 0)) - internal_error ("gdbarch: verify_gdbarch: remote_translate_xfer_address invalid"); + /* Skip verify of remote_translate_xfer_address, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 2) && (gdbarch->frame_args_skip == -1)) internal_error ("gdbarch: verify_gdbarch: frame_args_skip invalid"); - if ((GDB_MULTI_ARCH >= 2) - && (gdbarch->frameless_function_invocation == 0)) - internal_error ("gdbarch: verify_gdbarch: frameless_function_invocation invalid"); + /* Skip verify of frameless_function_invocation, invalid_p == 0 */ if ((GDB_MULTI_ARCH >= 2) && (gdbarch->frame_chain == 0)) internal_error ("gdbarch: verify_gdbarch: frame_chain invalid"); @@ -971,8 +955,7 @@ gdbarch_byte_order (struct gdbarch *gdbarch) int gdbarch_bfd_vma_bit (struct gdbarch *gdbarch) { - if (0) - internal_error ("gdbarch: gdbarch_bfd_vma_bit invalid"); + /* Skip verify of bfd_vma_bit, invalid_p == 0 */ if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_bfd_vma_bit called\n"); return gdbarch->bfd_vma_bit; @@ -1600,6 +1583,7 @@ set_gdbarch_call_dummy_p (struct gdbarch *gdbarch, LONGEST * gdbarch_call_dummy_words (struct gdbarch *gdbarch) { + /* Skip verify of call_dummy_words, invalid_p == 0 */ if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_call_dummy_words called\n"); return gdbarch->call_dummy_words; @@ -1615,6 +1599,7 @@ set_gdbarch_call_dummy_words (struct gdbarch *gdbarch, int gdbarch_sizeof_call_dummy_words (struct gdbarch *gdbarch) { + /* Skip verify of sizeof_call_dummy_words, invalid_p == 0 */ if (gdbarch_debug >= 2) fprintf_unfiltered (gdb_stdlog, "gdbarch_sizeof_call_dummy_words called\n"); return gdbarch->sizeof_call_dummy_words; diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index 01520d6756a..8a907cc37db 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -34,8 +34,32 @@ compare_new () } +# DEFAULT is a valid fallback definition of a MACRO when +# multi-arch is not enabled. +default_is_fallback_p () +{ + [ "${default}" != "" -a "${invalid_p}" = "0" ] + # FIXME: cagney - not until after 5.0 + false +} + # Format of the input table -read="class level macro returntype function formal actual attrib default init invalid_p fmt print print_p description" +read="class level macro returntype function formal actual attrib startup default invalid_p fmt print print_p description" + +do_read () +{ + if eval read $read + then + test "${startup}" || startup=0 + test "${fmt}" || fmt="%ld" + test "${print}" || print="(long) ${macro}" + #test "${default}" || default=0 + : + else + false + fi +} + # dump out/verify the doco for field in ${read} @@ -44,90 +68,102 @@ do class ) : ;; - # # -> line disable - # f -> function - # hiding a function - # v -> variable - # hiding a variable - # i -> set from info - # hiding something from the ``struct info'' object + # # -> line disable + # f -> function + # hiding a function + # v -> variable + # hiding a variable + # i -> set from info + # hiding something from the ``struct info'' object level ) : ;; - # See GDB_MULTI_ARCH description. Having GDB_MULTI_ARCH >= - # LEVEL is a predicate on checking that a given method is - # initialized (using INVALID_P). + # See GDB_MULTI_ARCH description. Having GDB_MULTI_ARCH >= + # LEVEL is a predicate on checking that a given method is + # initialized (using INVALID_P). macro ) : ;; - # The name of the MACRO that this method is to be accessed by. + # The name of the MACRO that this method is to be accessed by. returntype ) : ;; - # For functions, the return type; for variables, the data type + # For functions, the return type; for variables, the data type function ) : ;; - # For functions, the member function name; for variables, the - # variable name. Member function names are always prefixed with - # ``gdbarch_'' for name-space purity. + # For functions, the member function name; for variables, the + # variable name. Member function names are always prefixed with + # ``gdbarch_'' for name-space purity. formal ) : ;; - # The formal argument list. It is assumed that the formal - # argument list includes the actual name of each list element. - # A function with no arguments shall have ``void'' as the formal - # argument list. + # The formal argument list. It is assumed that the formal + # argument list includes the actual name of each list element. + # A function with no arguments shall have ``void'' as the + # formal argument list. actual ) : ;; - # The list of actual arguments. The arguments specified shall - # match the FORMAL list given above. Functions with out - # arguments leave this blank. + # The list of actual arguments. The arguments specified shall + # match the FORMAL list given above. Functions with out + # arguments leave this blank. attrib ) : ;; - # Any GCC attributes that should be attached to the function - # declaration. At present this field is unused. + # Any GCC attributes that should be attached to the function + # declaration. At present this field is unused. - default ) : ;; + startup ) : ;; - # To help with the GDB startup a default static gdbarch object - # is created. DEFAULT is the value to insert into the static - # gdbarch object. If empty ZERO is used. + # To help with the GDB startup a static gdbarch object is + # created. STARTUP is the value to insert into that static + # gdbarch object. - init ) : ;; + # By default ``0'' is used. - # Any initial value to assign to a new gdbarch object after it - # as been malloc()ed. Zero is used by default. + default ) : ;; + + # Any initial value to assign to a new gdbarch object after it + # as been malloc()ed. Zero is used by default. + + # Specify a non-empty DEFAULT and a zero INVALID_P to create a + # fallback value or function for when multi-arch is disabled. + # Specify a zero DEFAULT function to make that fallback + # illegal to call. invalid_p ) : ;; - # A predicate equation that validates MEMBER. Non-zero is returned - # if the code creating the new architecture failed to initialize - # the MEMBER or initialized the member to something invalid. - # By default, a check that the value is no longer equal to INIT - # is performed. The equation ``0'' disables the invalid_p check. + # A predicate equation that validates MEMBER. Non-zero is + # returned if the code creating the new architecture failed to + # initialize the MEMBER or initialized the member to something + # invalid. By default, a check that the value is no longer + # equal to DEFAULT ips performed. The equation ``0'' disables + # the invalid_p check. fmt ) : ;; - # printf style format string that can be used to print out the - # MEMBER. The default is to assume "%ld" is safe. Sometimes - # "%s" is useful. For functions, this is ignored and the - # function address is printed. + # printf style format string that can be used to print out the + # MEMBER. Sometimes "%s" is useful. For functions, this is + # ignored and the function address is printed. + + # By default ```%ld'' is used. print ) : ;; - # An optional equation that converts the MEMBER into a value - # suitable for that FMT. By default it is assumed that the - # member's MACRO cast to long is safe. + # An optional equation that casts MEMBER to a value suitable + # for formatting by FMT. + + # By default ``(long)'' is used. print_p ) : ;; - # An optional indicator for any predicte to wrap around the - # print member code. - # # -> Wrap print up in ``#ifdef MACRO'' - # exp -> Wrap print up in ``if (${print_p}) ... + # An optional indicator for any predicte to wrap around the + # print member code. + + # # -> Wrap print up in ``#ifdef MACRO'' + # exp -> Wrap print up in ``if (${print_p}) ... + # ``'' -> No predicate description ) : ;; @@ -169,7 +205,7 @@ v:2:NUM_REGS:int:num_regs::::0:-1 v:2:SP_REGNUM:int:sp_regnum::::0:-1 v:2:FP_REGNUM:int:fp_regnum::::0:-1 v:2:PC_REGNUM:int:pc_regnum::::0:-1 -f:2:REGISTER_NAME:char *:register_name:int regnr:regnr::0:0 +f:2:REGISTER_NAME:char *:register_name:int regnr:regnr:::legacy_register_name:0 v:2:REGISTER_SIZE:int:register_size::::0:-1 v:2:REGISTER_BYTES:int:register_bytes::::0:-1 f:2:REGISTER_BYTE:int:register_byte:int reg_nr:reg_nr::0:0 @@ -188,55 +224,55 @@ v:1:CALL_DUMMY_BREAKPOINT_OFFSET_P:int:call_dummy_breakpoint_offset_p::::0:-1 v:2:CALL_DUMMY_LENGTH:int:call_dummy_length::::0:-1::::CALL_DUMMY_LOCATION == BEFORE_TEXT_END || CALL_DUMMY_LOCATION == AFTER_TEXT_END f:2:PC_IN_CALL_DUMMY:int:pc_in_call_dummy:CORE_ADDR pc, CORE_ADDR sp, CORE_ADDR frame_address:pc, sp, frame_address::0:0 v:1:CALL_DUMMY_P:int:call_dummy_p::::0:-1 -v:2:CALL_DUMMY_WORDS:LONGEST *:call_dummy_words::::0:::0x%08lx -v:2:SIZEOF_CALL_DUMMY_WORDS:int:sizeof_call_dummy_words::::0:::0x%08lx +v:2:CALL_DUMMY_WORDS:LONGEST *:call_dummy_words::::0:legacy_call_dummy_words:0:0x%08lx +v:2:SIZEOF_CALL_DUMMY_WORDS:int:sizeof_call_dummy_words::::0:legacy_sizeof_call_dummy_words:0:0x%08lx v:1:CALL_DUMMY_STACK_ADJUST_P:int:call_dummy_stack_adjust_p::::0:-1::0x%08lx v:2:CALL_DUMMY_STACK_ADJUST:int:call_dummy_stack_adjust::::0::gdbarch->call_dummy_stack_adjust_p && gdbarch->call_dummy_stack_adjust == 0:0x%08lx::CALL_DUMMY_STACK_ADJUST_P f:2:FIX_CALL_DUMMY:void:fix_call_dummy:char *dummy, CORE_ADDR pc, CORE_ADDR fun, int nargs, struct value **args, struct type *type, int gcc_p:dummy, pc, fun, nargs, args, type, gcc_p::0:0 # v:2:BELIEVE_PCC_PROMOTION:int:believe_pcc_promotion::::0:::::# v:2:BELIEVE_PCC_PROMOTION_TYPE:int:believe_pcc_promotion_type::::0:::::# -f:2:COERCE_FLOAT_TO_DOUBLE:int:coerce_float_to_double:struct type *formal, struct type *actual:formal, actual:::default_coerce_float_to_double +f:2:COERCE_FLOAT_TO_DOUBLE:int:coerce_float_to_double:struct type *formal, struct type *actual:formal, actual:::default_coerce_float_to_double:0 f:1:GET_SAVED_REGISTER:void:get_saved_register:char *raw_buffer, int *optimized, CORE_ADDR *addrp, struct frame_info *frame, int regnum, enum lval_type *lval:raw_buffer, optimized, addrp, frame, regnum, lval::generic_get_saved_register:0 # -f:1:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr::0:0 -f:2:REGISTER_CONVERT_TO_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to::0:0 -f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to::0:0 +f:1:REGISTER_CONVERTIBLE:int:register_convertible:int nr:nr:::generic_register_convertible_not:0 +f:2:REGISTER_CONVERT_TO_VIRTUAL:void:register_convert_to_virtual:int regnum, struct type *type, char *from, char *to:regnum, type, from, to:::0:0 +f:2:REGISTER_CONVERT_TO_RAW:void:register_convert_to_raw:struct type *type, int regnum, char *from, char *to:type, regnum, from, to:::0:0 # f:2:EXTRACT_RETURN_VALUE:void:extract_return_value:struct type *type, char *regbuf, char *valbuf:type, regbuf, valbuf::0:0 f:1:PUSH_ARGUMENTS:CORE_ADDR:push_arguments:int nargs, struct value **args, CORE_ADDR sp, int struct_return, CORE_ADDR struct_addr:nargs, args, sp, struct_return, struct_addr::0:0 -f:2:PUSH_DUMMY_FRAME:void:push_dummy_frame:void:-::0:0 -f:1:PUSH_RETURN_ADDRESS:CORE_ADDR:push_return_address:CORE_ADDR pc, CORE_ADDR sp:pc, sp::0:0 -f:2:POP_FRAME:void:pop_frame:void:-::0:0 +f:2:PUSH_DUMMY_FRAME:void:push_dummy_frame:void:-:::0 +f:1:PUSH_RETURN_ADDRESS:CORE_ADDR:push_return_address:CORE_ADDR pc, CORE_ADDR sp:pc, sp:::0 +f:2:POP_FRAME:void:pop_frame:void:-:::0 # # I wish that these would just go away.... -f:2:D10V_MAKE_DADDR:CORE_ADDR:d10v_make_daddr:CORE_ADDR x:x::0:0 -f:2:D10V_MAKE_IADDR:CORE_ADDR:d10v_make_iaddr:CORE_ADDR x:x::0:0 -f:2:D10V_DADDR_P:int:d10v_daddr_p:CORE_ADDR x:x::0:0 -f:2:D10V_IADDR_P:int:d10v_iaddr_p:CORE_ADDR x:x::0:0 -f:2:D10V_CONVERT_DADDR_TO_RAW:CORE_ADDR:d10v_convert_daddr_to_raw:CORE_ADDR x:x::0:0 -f:2:D10V_CONVERT_IADDR_TO_RAW:CORE_ADDR:d10v_convert_iaddr_to_raw:CORE_ADDR x:x::0:0 +f:2:D10V_MAKE_DADDR:CORE_ADDR:d10v_make_daddr:CORE_ADDR x:x:::0:0 +f:2:D10V_MAKE_IADDR:CORE_ADDR:d10v_make_iaddr:CORE_ADDR x:x:::0:0 +f:2:D10V_DADDR_P:int:d10v_daddr_p:CORE_ADDR x:x:::0 +f:2:D10V_IADDR_P:int:d10v_iaddr_p:CORE_ADDR x:x:::0 +f:2:D10V_CONVERT_DADDR_TO_RAW:CORE_ADDR:d10v_convert_daddr_to_raw:CORE_ADDR x:x:::0 +f:2:D10V_CONVERT_IADDR_TO_RAW:CORE_ADDR:d10v_convert_iaddr_to_raw:CORE_ADDR x:x:::0 # -f:2:STORE_STRUCT_RETURN:void:store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp::0:0 -f:2:STORE_RETURN_VALUE:void:store_return_value:struct type *type, char *valbuf:type, valbuf::0:0 -f:2:EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:extract_struct_value_address:char *regbuf:regbuf::0:0 -f:2:USE_STRUCT_CONVENTION:int:use_struct_convention:int gcc_p, struct type *value_type:gcc_p, value_type::0:0 +f:2:STORE_STRUCT_RETURN:void:store_struct_return:CORE_ADDR addr, CORE_ADDR sp:addr, sp:::0 +f:2:STORE_RETURN_VALUE:void:store_return_value:struct type *type, char *valbuf:type, valbuf:::0 +f:2:EXTRACT_STRUCT_VALUE_ADDRESS:CORE_ADDR:extract_struct_value_address:char *regbuf:regbuf:::0 +f:2:USE_STRUCT_CONVENTION:int:use_struct_convention:int gcc_p, struct type *value_type:gcc_p, value_type:::0 # f:2:FRAME_INIT_SAVED_REGS:void:frame_init_saved_regs:struct frame_info *frame:frame::0:0 -f:2:INIT_EXTRA_FRAME_INFO:void:init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame::0:0 +f:2:INIT_EXTRA_FRAME_INFO:void:init_extra_frame_info:int fromleaf, struct frame_info *frame:fromleaf, frame:::0 # f:2:SKIP_PROLOGUE:CORE_ADDR:skip_prologue:CORE_ADDR ip:ip::0:0 f:2:INNER_THAN:int:inner_than:CORE_ADDR lhs, CORE_ADDR rhs:lhs, rhs::0:0 -f:2:BREAKPOINT_FROM_PC:unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr::0:0 +f:2:BREAKPOINT_FROM_PC:unsigned char *:breakpoint_from_pc:CORE_ADDR *pcptr, int *lenptr:pcptr, lenptr:::legacy_breakpoint_from_pc:0 f:2:MEMORY_INSERT_BREAKPOINT:int:memory_insert_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_insert_breakpoint:0 f:2:MEMORY_REMOVE_BREAKPOINT:int:memory_remove_breakpoint:CORE_ADDR addr, char *contents_cache:addr, contents_cache::0:default_memory_remove_breakpoint:0 v:2:DECR_PC_AFTER_BREAK:CORE_ADDR:decr_pc_after_break::::0:-1 v:2:FUNCTION_START_OFFSET:CORE_ADDR:function_start_offset::::0:-1 # -f:2:REMOTE_TRANSLATE_XFER_ADDRESS:void:remote_translate_xfer_address:CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:gdb_addr, gdb_len, rem_addr, rem_len::0:0 +f:2:REMOTE_TRANSLATE_XFER_ADDRESS:void:remote_translate_xfer_address:CORE_ADDR gdb_addr, int gdb_len, CORE_ADDR *rem_addr, int *rem_len:gdb_addr, gdb_len, rem_addr, rem_len:::generic_remote_translate_xfer_address:0 # v:2:FRAME_ARGS_SKIP:CORE_ADDR:frame_args_skip::::0:-1 -f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi::0:0 +f:2:FRAMELESS_FUNCTION_INVOCATION:int:frameless_function_invocation:struct frame_info *fi:fi:::generic_frameless_function_invocation_not:0 f:2:FRAME_CHAIN:CORE_ADDR:frame_chain:struct frame_info *frame:frame::0:0 f:1:FRAME_CHAIN_VALID:int:frame_chain_valid:CORE_ADDR chain, struct frame_info *thisframe:chain, thisframe::0:0 f:2:FRAME_SAVED_PC:CORE_ADDR:frame_saved_pc:struct frame_info *fi:fi::0:0 @@ -254,14 +290,14 @@ EOF if true then exec > new-gdbarch - function_list | while eval read $read + function_list | while do_read # eval read $read do cat < 1) || !defined (${macro})" if [ "${actual}" = "" ] then @@ -424,7 +463,10 @@ do echo "#define ${macro}(${actual}) (gdbarch_${function} (current_gdbarch, ${actual}))" fi echo "#endif" - echo "#endif" + if ! default_is_fallback_p + then + echo "#endif" + fi ;; esac done @@ -770,6 +812,7 @@ copyright cat <tdep = tdep; EOF echo "" -function_list | while eval read $read +function_list | while do_read # eval read $read do case "${class}" in "i" ) echo " gdbarch->${function} = info->${function};" @@ -955,13 +990,13 @@ do done echo "" echo " /* Force the explicit initialization of these. */" -function_list | while eval read $read +function_list | while do_read # eval read $read do case "${class}" in "f" | "v" ) - if [ "${init}" != "" -a "${init}" != "0" ] + if [ "${default}" != "" -a "${default}" != "0" ] then - echo " gdbarch->${function} = ${init};" + echo " gdbarch->${function} = ${default};" fi ;; esac @@ -1009,20 +1044,23 @@ verify_gdbarch (struct gdbarch *gdbarch) internal_error ("verify_gdbarch: bfd_arch_info unset"); /* Check those that need to be defined for the given multi-arch level. */ EOF -function_list | while eval read $read +function_list | while do_read # eval read $read do case "${class}" in "f" | "v" ) - if [ "${invalid_p}" ] + if [ "${invalid_p}" = "0" ] then - echo " if ((GDB_MULTI_ARCH >= ${level})" - echo " && (${invalid_p}))" - echo " internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");" - elif [ "${init}" ] + echo " /* Skip verify of ${function}, invalid_p == 0 */" + elif [ "${invalid_p}" ] then - echo " if ((GDB_MULTI_ARCH >= ${level})" - echo " && (gdbarch->${function} == ${init}))" - echo " internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");" + echo " if ((GDB_MULTI_ARCH >= ${level})" + echo " && (${invalid_p}))" + echo " internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");" + elif [ "${default}" ] + then + echo " if ((GDB_MULTI_ARCH >= ${level})" + echo " && (gdbarch->${function} == ${default}))" + echo " internal_error (\"gdbarch: verify_gdbarch: ${function} invalid\");" fi ;; esac @@ -1041,7 +1079,7 @@ void gdbarch_dump (void) { EOF -function_list | while eval read $read +function_list | while do_read # eval read $read do case "${class}" in "f" ) @@ -1051,8 +1089,6 @@ do echo " /*${macro} ()*/);" ;; * ) - test "${fmt}" || fmt="%ld" - test "${print}" || print="(long) ${macro}" if [ "${print_p}" = "#" ] then echo "#ifdef ${macro}" @@ -1089,7 +1125,7 @@ gdbarch_tdep (struct gdbarch *gdbarch) } EOF echo "" -function_list | while eval read $read +function_list | while do_read # eval read $read do case "${class}" in "f" ) @@ -1102,6 +1138,19 @@ do echo "gdbarch_${function} (struct gdbarch *gdbarch, ${formal})" fi echo "{" + if default_is_fallback_p && [ "${default}" != "0" ] + then + echo " if (GDB_MULTI_ARCH == 0)" + if [ "${returntype}" = "void" ] + then + echo " {" + echo " ${default} (${actual});" + echo " return;" + echo " }" + else + echo " return ${default} (${actual});" + fi + fi echo " if (gdbarch->${function} == 0)" echo " internal_error (\"gdbarch: gdbarch_${function} invalid\");" echo " if (gdbarch_debug >= 2)" @@ -1127,13 +1176,16 @@ do echo "${returntype}" echo "gdbarch_${function} (struct gdbarch *gdbarch)" echo "{" - if [ "${invalid_p}" ] + if [ "${invalid_p}" = "0" ] + then + echo " /* Skip verify of ${function}, invalid_p == 0 */" + elif [ "${invalid_p}" ] then echo " if (${invalid_p})" echo " internal_error (\"gdbarch: gdbarch_${function} invalid\");" - elif [ "${init}" ] + elif [ "${default}" ] then - echo " if (gdbarch->${function} == ${init})" + echo " if (gdbarch->${function} == ${default})" echo " internal_error (\"gdbarch: gdbarch_${function} invalid\");" fi echo " if (gdbarch_debug >= 2)"