This is the mail archive of the gdb-patches@sourceware.cygnus.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[patch] New command ``maint print arch [output-file]''


FYI,

I've committed the attatched.  It adds a new command:

	maint print arch [output-file]

that dumps out all the details of the current target architecture
configuration - multi-arch or not.  The dump includes the macro values
and, optionally, target dependant details.  See mips-tdep.c for an
example.

This makes comparing pre/post multi-arch code much easier.

Next is to extend it so that it dumps out the contents of various tables
- REGISTER_NAME() for instance.

	enjoy,
		Andrew
Fri Jun  9 15:06:37 2000  Andrew Cagney  <cagney@b1.cygnus.com>

	* gdbarch.sh (struct gdbarch): Add member dump_tdep.
	(struct gdbarch_registration): Ditto.
	(gdbarch_dump): Add ui_file and gdbarch arguments.  Add support
 	for external dump functions.  Dump the macro value.  Call target
 	dump routine.
	(gdbarch_register): New function.
	(gdbarch_registrary): Replace gdbarch_init_registrary.
	* gdbarch.h, gdbarch.c: Re-generate.
	* arch-utils.c (set_arch): Update.
	
	* mips-tdep.c (mips_dump_tdep): New function. Move dump code here.
	(mips_gdbarch_init): From here.

	* maint.c (maintenance_print_architecture): New function.
	(_initialize_maint_cmds): Add command ``maintenance print
 	architecture''.

Index: arch-utils.c
===================================================================
RCS file: /cvs/src/src/gdb/arch-utils.c,v
retrieving revision 1.9
diff -p -r1.9 arch-utils.c
*** arch-utils.c	2000/06/08 04:00:56	1.9
--- arch-utils.c	2000/06/09 10:22:55
*************** set_arch (const struct bfd_arch_info *ar
*** 413,419 ****
        break;
      }
    if (gdbarch_debug)
!     gdbarch_dump ();
  }
  
  /* Set the architecture from arch/machine (deprecated) */
--- 413,419 ----
        break;
      }
    if (gdbarch_debug)
!     gdbarch_dump (current_gdbarch, gdb_stdlog);
  }
  
  /* Set the architecture from arch/machine (deprecated) */
*************** set_gdbarch_from_file (abfd)
*** 564,570 ****
  extern const bfd_arch_info_type DEFAULT_BFD_ARCH;
  static const bfd_arch_info_type *default_bfd_arch = &DEFAULT_BFD_ARCH;
  #else
! static const bfd_arch_info_type *default_bfd_arch
  #endif
  
  #ifdef DEFAULT_BFD_VEC
--- 564,570 ----
  extern const bfd_arch_info_type DEFAULT_BFD_ARCH;
  static const bfd_arch_info_type *default_bfd_arch = &DEFAULT_BFD_ARCH;
  #else
! static const bfd_arch_info_type *default_bfd_arch;
  #endif
  
  #ifdef DEFAULT_BFD_VEC
Index: maint.c
===================================================================
RCS file: /cvs/src/src/gdb/maint.c,v
retrieving revision 1.9
diff -p -r1.9 maint.c
*** maint.c	2000/05/28 01:12:28	1.9
--- maint.c	2000/06/09 10:23:06
*************** maintenance_print_statistics (args, from
*** 283,288 ****
--- 283,303 ----
    print_symbol_bcache_statistics ();
  }
  
+ void
+ maintenance_print_architecture (char *args, int from_tty)
+ {
+   if (args == NULL)
+     gdbarch_dump (current_gdbarch, gdb_stdout);
+   else
+     {
+       struct ui_file *file = gdb_fopen (args, "w");
+       if (file == NULL)
+ 	perror_with_name ("maintenance print architecture");
+       gdbarch_dump (current_gdbarch, file);    
+       ui_file_delete (file);
+     }
+ }
+ 
  /* The "maintenance print" command is defined as a prefix, with
     allow_unknown 0.  Therefore, its own definition is called only for
     "maintenance print" with no args.  */
*************** If a SOURCE file is specified, dump only
*** 567,572 ****
--- 582,592 ----
  
    add_cmd ("statistics", class_maintenance, maintenance_print_statistics,
  	   "Print statistics about internal gdb state.",
+ 	   &maintenanceprintlist);
+ 
+   add_cmd ("architecture", class_maintenance, maintenance_print_architecture,
+ 	   "Print the internal architecture configuration.\
+ Takes an optional file parameter.",
  	   &maintenanceprintlist);
  
    add_cmd ("check-symtabs", class_maintenance, maintenance_check_symtabs,
Index: mips-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/mips-tdep.c,v
retrieving revision 1.14
diff -p -r1.14 mips-tdep.c
*** mips-tdep.c	2000/06/08 06:35:39	1.14
--- mips-tdep.c	2000/06/09 10:23:15
*************** mips_gdbarch_init (info, arches)
*** 3840,3846 ****
    struct gdbarch *gdbarch;
    struct gdbarch_tdep *tdep;
    int elf_flags;
-   char *ef_mips_abi;
    int ef_mips_bitptrs;
    int ef_mips_arch;
    enum mips_abi mips_abi;
--- 3840,3845 ----
*************** mips_gdbarch_init (info, arches)
*** 3891,3899 ****
    if (mips_abi == MIPS_ABI_UNKNOWN)
      mips_abi = MIPS_DEFAULT_ABI;
  #endif
-   if (mips_abi == MIPS_ABI_UNKNOWN)
-     mips_abi = MIPS_ABI_O32;
  
    /* try to find a pre-existing architecture */
    for (arches = gdbarch_list_lookup_by_info (arches, &info);
         arches != NULL;
--- 3890,3912 ----
    if (mips_abi == MIPS_ABI_UNKNOWN)
      mips_abi = MIPS_DEFAULT_ABI;
  #endif
  
+   if (gdbarch_debug)
+     {
+       fprintf_unfiltered (gdb_stdlog,
+ 			  "mips_gdbarch_init: elf_flags = %08x\n",
+ 			  elf_flags);
+       fprintf_unfiltered (gdb_stdlog,
+ 			  "mips_gdbarch_init: ef_mips_arch = %d\n",
+ 			  ef_mips_arch);
+       fprintf_unfiltered (gdb_stdlog,
+ 			  "mips_gdbarch_init: ef_mips_bitptrs = %d\n",
+ 			  ef_mips_bitptrs);
+       fprintf_unfiltered (gdb_stdlog,
+ 			  "mips_gdbarch_init: mips_abi = %d\n",
+ 			  mips_abi);
+     }
+ 
    /* try to find a pre-existing architecture */
    for (arches = gdbarch_list_lookup_by_info (arches, &info);
         arches != NULL;
*************** mips_gdbarch_init (info, arches)
*** 3923,3929 ****
    switch (mips_abi)
      {
      case MIPS_ABI_O32:
-       ef_mips_abi = "o32";
        tdep->mips_default_saved_regsize = 4;
        tdep->mips_default_stack_argsize = 4;
        tdep->mips_fp_register_double = 0;
--- 3936,3941 ----
*************** mips_gdbarch_init (info, arches)
*** 3935,3941 ****
        set_gdbarch_long_long_bit (gdbarch, 64);
        break;
      case MIPS_ABI_O64:
-       ef_mips_abi = "o64";
        tdep->mips_default_saved_regsize = 8;
        tdep->mips_default_stack_argsize = 8;
        tdep->mips_fp_register_double = 1;
--- 3947,3952 ----
*************** mips_gdbarch_init (info, arches)
*** 3947,3953 ****
        set_gdbarch_long_long_bit (gdbarch, 64);
        break;
      case MIPS_ABI_EABI32:
-       ef_mips_abi = "eabi32";
        tdep->mips_default_saved_regsize = 4;
        tdep->mips_default_stack_argsize = 4;
        tdep->mips_fp_register_double = 0;
--- 3958,3963 ----
*************** mips_gdbarch_init (info, arches)
*** 3959,3965 ****
        set_gdbarch_long_long_bit (gdbarch, 64);
        break;
      case MIPS_ABI_EABI64:
-       ef_mips_abi = "eabi64";
        tdep->mips_default_saved_regsize = 8;
        tdep->mips_default_stack_argsize = 8;
        tdep->mips_fp_register_double = 1;
--- 3969,3974 ----
*************** mips_gdbarch_init (info, arches)
*** 3971,3977 ****
        set_gdbarch_long_long_bit (gdbarch, 64);
        break;
      case MIPS_ABI_N32:
-       ef_mips_abi = "n32";
        tdep->mips_default_saved_regsize = 4;
        tdep->mips_default_stack_argsize = 8;
        tdep->mips_fp_register_double = 1;
--- 3980,3985 ----
*************** mips_gdbarch_init (info, arches)
*** 3983,3989 ****
        set_gdbarch_long_long_bit (gdbarch, 64);
        break;
      default:
-       ef_mips_abi = "default";
        tdep->mips_default_saved_regsize = MIPS_REGSIZE;
        tdep->mips_default_stack_argsize = MIPS_REGSIZE;
        tdep->mips_fp_register_double = (REGISTER_VIRTUAL_SIZE (FP0_REGNUM) == 8);
--- 3991,3996 ----
*************** mips_gdbarch_init (info, arches)
*** 4111,4177 ****
    set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
    set_gdbarch_get_saved_register (gdbarch, mips_get_saved_register);
  
!   if (gdbarch_debug)
      {
!       fprintf_unfiltered (gdb_stdlog,
! 			  "mips_gdbarch_init: (info)ef_mips_abi = %s\n",
! 			  ef_mips_abi);
!       fprintf_unfiltered (gdb_stdlog,
! 			  "mips_gdbarch_init: (info)ef_mips_arch = %d\n",
! 			  ef_mips_arch);
!       fprintf_unfiltered (gdb_stdlog,
! 			  "mips_gdbarch_init: (info)ef_mips_bitptrs = %d\n",
! 			  ef_mips_bitptrs);
!       fprintf_unfiltered (gdb_stdlog,
! 			  "mips_gdbarch_init: MIPS_REGSIZE = %d\n",
! 			  MIPS_REGSIZE);
!       fprintf_unfiltered (gdb_stdlog,
! 			  "mips_gdbarch_init: tdep->elf_flags = 0x%x\n",
  			  tdep->elf_flags);
!       fprintf_unfiltered (gdb_stdlog,
! 			  "mips_gdbarch_init: tdep->mips_abi = %d\n",
  			  tdep->mips_abi);
-       fprintf_unfiltered (gdb_stdlog,
- 			  "mips_gdbarch_init: tdep->mips_fpu_type = %d (%s)\n",
- 			  tdep->mips_fpu_type,
- 			  (tdep->mips_fpu_type == MIPS_FPU_NONE ? "none"
- 			   : tdep->mips_fpu_type == MIPS_FPU_SINGLE ? "single"
- 			   : tdep->mips_fpu_type == MIPS_FPU_DOUBLE ? "double"
- 			   : "???"));
-       fprintf_unfiltered (gdb_stdlog,
- 			  "mips_gdbarch_init: tdep->mips_last_arg_regnum = %d\n",
- 			  tdep->mips_last_arg_regnum);
-       fprintf_unfiltered (gdb_stdlog,
- 			  "mips_gdbarch_init: tdep->mips_last_fp_arg_regnum = %d (%d)\n",
- 			  tdep->mips_last_fp_arg_regnum,
- 			  tdep->mips_last_fp_arg_regnum - FP0_REGNUM);
-       fprintf_unfiltered (gdb_stdlog,
- 			  "mips_gdbarch_init: tdep->mips_default_saved_regsize = %d\n",
- 			  tdep->mips_default_saved_regsize);
-       fprintf_unfiltered (gdb_stdlog,
- 			  "mips_gdbarch_init: tdep->mips_fp_register_double = %d (%s)\n",
- 			  tdep->mips_fp_register_double,
- 			  (tdep->mips_fp_register_double ? "true" : "false"));
-       fprintf_unfiltered (gdb_stdlog,
- 			  "mips_gdbarch_init: tdep->mips_regs_have_home_p = %d\n",
- 			  tdep->mips_regs_have_home_p);
-       fprintf_unfiltered (gdb_stdlog,
- 			  "mips_gdbarch_init: tdep->mips_default_stack_argsize = %d\n",
- 			  tdep->mips_default_stack_argsize);
      }
! 
!   return gdbarch;
  }
  
- 
  void
  _initialize_mips_tdep ()
  {
    static struct cmd_list_element *mipsfpulist = NULL;
    struct cmd_list_element *c;
  
!   if (GDB_MULTI_ARCH)
!     register_gdbarch_init (bfd_arch_mips, mips_gdbarch_init);
    if (!tm_print_insn)		/* Someone may have already set it */
      tm_print_insn = gdb_print_insn_mips;
  
--- 4118,4195 ----
    set_gdbarch_frame_chain_valid (gdbarch, func_frame_chain_valid);
    set_gdbarch_get_saved_register (gdbarch, mips_get_saved_register);
  
!   return gdbarch;
! }
! 
! static void
! mips_dump_tdep (struct gdbarch *current_gdbarch, struct ui_file *file)
! {
!   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
!   if (tdep != NULL)
      {
!       fprintf_unfiltered (file,
! 			  "mips_dump_tdep: tdep->elf_flags = 0x%x\n",
  			  tdep->elf_flags);
!       fprintf_unfiltered (file,
! 			  "mips_dump_tdep: tdep->mips_abi = %d\n",
  			  tdep->mips_abi);
      }
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: FP_REGISTER_DOUBLE = %d\n",
! 		      FP_REGISTER_DOUBLE);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_DEFAULT_FPU_TYPE = %d (%s)\n",
! 		      MIPS_DEFAULT_FPU_TYPE,
! 		      (MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_NONE ? "none"
! 		       : MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_SINGLE ? "single"
! 		       : MIPS_DEFAULT_FPU_TYPE == MIPS_FPU_DOUBLE ? "double"
! 		       : "???"));
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_EABI = %d\n",
! 		      MIPS_EABI);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_LAST_FP_ARG_REGNUM = %d\n",
! 		      MIPS_LAST_FP_ARG_REGNUM);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_LAST_ARG_REGNUM = %d\n",
! 		      MIPS_LAST_ARG_REGNUM);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_FPU_TYPE = %d (%s)\n",
! 		      MIPS_FPU_TYPE,
! 		      (MIPS_FPU_TYPE == MIPS_FPU_NONE ? "none"
! 		       : MIPS_FPU_TYPE == MIPS_FPU_SINGLE ? "single"
! 		       : MIPS_FPU_TYPE == MIPS_FPU_DOUBLE ? "double"
! 		       : "???"));
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_DEFAULT_SAVED_REGSIZE = %d\n",
! 		      MIPS_DEFAULT_SAVED_REGSIZE);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_SAVED_REGSIZE = %d\n",
! 		      MIPS_SAVED_REGSIZE);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: FP_REGISTER_DOUBLE = %d\n",
! 		      FP_REGISTER_DOUBLE);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_REGS_HAVE_HOME_P = %d\n",
! 		      MIPS_REGS_HAVE_HOME_P);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_DEFAULT_STACK_ARGSIZE = %d\n",
! 		      MIPS_DEFAULT_STACK_ARGSIZE);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_STACK_ARGSIZE = %d\n",
! 		      MIPS_STACK_ARGSIZE);
!   fprintf_unfiltered (file,
! 		      "mips_dump_tdep: MIPS_REGSIZE = %d\n",
! 		      MIPS_REGSIZE);
  }
  
  void
  _initialize_mips_tdep ()
  {
    static struct cmd_list_element *mipsfpulist = NULL;
    struct cmd_list_element *c;
  
!   gdbarch_register (bfd_arch_mips, mips_gdbarch_init, mips_dump_tdep);
    if (!tm_print_insn)		/* Someone may have already set it */
      tm_print_insn = gdb_print_insn_mips;
  
Index: gdbarch.sh
===================================================================
RCS file: /cvs/src/src/gdb/gdbarch.sh,v
retrieving revision 1.27
diff -p -r1.27 gdbarch.sh
*** gdbarch.sh	2000/06/07 04:38:02	1.27
--- gdbarch.sh	2000/06/09 10:23:04
*************** do
*** 250,255 ****
--- 250,256 ----
  	# An optional indicator for any predicte to wrap around the
  	# print member code.
  
+ 	#   () -> Call a custom function to do the dump.
  	#   exp -> Wrap print up in ``if (${print_p}) ...
  	#   ``'' -> No predicate
  
*************** extern struct gdbarch_tdep *gdbarch_tdep
*** 670,678 ****
     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()). */
  
  struct gdbarch_list
  {
    struct gdbarch *gdbarch;
--- 671,682 ----
     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_info
*** 698,706 ****
--- 702,716 ----
  };
  
  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 freshly allocated, NULL terminated, array of the valid
     architecture names.  Since architectures are registered during the
*************** extern struct gdbarch_list *gdbarch_list
*** 723,730 ****
  
  extern struct gdbarch *gdbarch_alloc (const struct gdbarch_info *info, struct gdbarch_tdep *tdep);
  
  
- /* Helper function.  Free a partially-constructed \`\`struct gdbarch''.  */
  extern void gdbarch_free (struct gdbarch *);
  
  
--- 733,743 ----
  
  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 *);
  
  
*************** extern void initialize_current_architect
*** 897,903 ****
  /* gdbarch trace variable */
  extern int gdbarch_debug;
  
! extern void gdbarch_dump (void);
  
  #endif
  EOF
--- 910,916 ----
  /* gdbarch trace variable */
  extern int gdbarch_debug;
  
! extern void gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file);
  
  #endif
  EOF
*************** done
*** 982,987 ****
--- 995,1001 ----
  echo ""
  echo "  /* target specific vector. */"
  echo "  struct gdbarch_tdep *tdep;"
+ echo "  gdbarch_dump_tdep_ftype *dump_tdep;"
  echo ""
  echo "  /* per-architecture data-pointers */"
  echo "  int nr_data;"
*************** EOF
*** 1040,1048 ****
  echo ""
  echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
  echo ""
! echo "struct gdbarch startup_gdbarch = {"
  echo "  /* basic architecture information */"
! function_list | while do_read # eval read $read
  do
      if class_is_info_p
      then
--- 1054,1063 ----
  echo ""
  echo "extern const struct bfd_arch_info bfd_default_arch_struct;"
  echo ""
! echo "struct gdbarch startup_gdbarch ="
! echo "{"
  echo "  /* basic architecture information */"
! function_list | while do_read
  do
      if class_is_info_p
      then
*************** do
*** 1050,1057 ****
      fi
  done
  cat <<EOF
!   /* target specific vector */
!   NULL,
    /*per-architecture data-pointers and swap regions */
    0, NULL, NULL,
    /* Multi-arch values */
--- 1065,1072 ----
      fi
  done
  cat <<EOF
!   /* target specific vector and its dump routine */
!   NULL, NULL,
    /*per-architecture data-pointers and swap regions */
    0, NULL, NULL,
    /* Multi-arch values */
*************** done
*** 1066,1071 ****
--- 1081,1087 ----
  cat <<EOF
    /* startup_gdbarch() */
  };
+ 
  struct gdbarch *current_gdbarch = &startup_gdbarch;
  EOF
  
*************** cat <<EOF
*** 1123,1128 ****
--- 1139,1145 ----
     However, if an architecture's init function encounters an error
     building the structure, it may need to clean up a partially
     constructed gdbarch.  */
+ 
  void
  gdbarch_free (struct gdbarch *arch)
  {
*************** EOF
*** 1193,1233 ****
  # dump the structure
  echo ""
  echo ""
- echo "/* Print out the details of the current architecture. */"
- echo ""
  cat <<EOF
  void
! gdbarch_dump (void)
  {
  EOF
! function_list | while do_read # eval read $read
  do
      echo "#ifdef ${macro}"
      if class_is_function_p
      then
! 	echo "  fprintf_unfiltered (gdb_stdlog,"
! 	echo "                      \"gdbarch_update: ${macro} = 0x%08lx\\n\","
! 	echo "                      (long) current_gdbarch->${function}"
! 	echo "                      /*${macro} ()*/);"
      else
! 	if [ "${print_p}" ]
! 	then
! 	  echo "  if (${print_p})"
! 	  echo "    fprintf_unfiltered (gdb_stdlog,"
! 	  echo "                        \"gdbarch_update: ${macro} = ${fmt}\\n\","
! 	  echo "                        ${print});"
! 	else
! 	  echo "  fprintf_unfiltered (gdb_stdlog,"
! 	  echo "                      \"gdbarch_update: ${macro} = ${fmt}\\n\","
! 	  echo "                      ${print});"
! 	fi
      fi
      echo "#endif"
  done
  cat <<EOF
!   fprintf_unfiltered (gdb_stdlog,
!                       "gdbarch_update: GDB_MULTI_ARCH = %d\\n",
!                       GDB_MULTI_ARCH);
  }
  EOF
  
--- 1210,1279 ----
  # dump the structure
  echo ""
  echo ""
  cat <<EOF
+ /* Print out the details of the current architecture. */
+ 
+ /* NOTE/WARNING: The parameter is called \`\`current_gdbarch'' so that it
+    just happens to match the global variable \`\`current_gdbarch''.  That
+    way macros refering to that variable get the local and not the global
+    version - ulgh.  Once everything is parameterised with gdbarch, this
+    will go away. */
+ 
  void
! gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file)
  {
+   fprintf_unfiltered (file,
+                       "gdbarch_dump: GDB_MULTI_ARCH = %d\\n",
+                       GDB_MULTI_ARCH);
  EOF
! function_list | while do_read
  do
      echo "#ifdef ${macro}"
      if class_is_function_p
      then
! 	echo "  fprintf_unfiltered (file,"
! 	echo "                      \"gdbarch_dump: %s # %s\\n\","
! 	echo "                      \"${macro}(${actual})\","
! 	echo "                      XSTRING (${macro} (${actual})));"
      else
! 	echo "  fprintf_unfiltered (file,"
! 	echo "                      \"gdbarch_dump: ${macro} # %s\\n\","
! 	echo "                      XSTRING (${macro}));"
      fi
      echo "#endif"
  done
+ function_list | while do_read
+ do
+     echo "#ifdef ${macro}"
+     if [ "${print_p}" = "()" ]
+     then
+ 	echo "  gdbarch_dump_${function} (current_gdbarch);"
+     elif [ "${print_p}" = "0" ]
+     then
+ 	echo "  /* skip print of ${macro}, print_p == 0. */"
+     elif [ "${print_p}" ]
+     then
+ 	echo "  if (${print_p})"
+ 	echo "    fprintf_unfiltered (file,"
+ 	echo "                        \"gdbarch_dump: ${macro} = ${fmt}\\n\","
+ 	echo "                        ${print});"
+     elif class_is_function_p
+     then
+ 	echo "  if (GDB_MULTI_ARCH)"
+ 	echo "    fprintf_unfiltered (file,"
+ 	echo "                        \"gdbarch_dump: ${macro} = 0x%08lx\\n\","
+ 	echo "                        (long) current_gdbarch->${function}"
+ 	echo "                        /*${macro} ()*/);"
+     else
+ 	echo "  fprintf_unfiltered (file,"
+ 	echo "                      \"gdbarch_dump: ${macro} = ${fmt}\\n\","
+ 	echo "                      ${print});"
+     fi
+     echo "#endif"
+ done
  cat <<EOF
!   if (current_gdbarch->dump_tdep != NULL)
!     current_gdbarch->dump_tdep (current_gdbarch, file);
  }
  EOF
  
*************** swapin_gdbarch_swap (struct gdbarch *gdb
*** 1501,1515 ****
  
  /* Keep a registrary of the architectures known by GDB. */
  
! struct gdbarch_init_registration
  {
    enum bfd_architecture bfd_architecture;
    gdbarch_init_ftype *init;
    struct gdbarch_list *arches;
!   struct gdbarch_init_registration *next;
  };
  
! static struct gdbarch_init_registration *gdbarch_init_registrary = NULL;
  
  static void
  append_name (const char ***buf, int *nr, const char *name)
--- 1547,1562 ----
  
  /* Keep a registrary of the architectures known by GDB. */
  
! struct gdbarch_registration
  {
    enum bfd_architecture bfd_architecture;
    gdbarch_init_ftype *init;
+   gdbarch_dump_tdep_ftype *dump_tdep;
    struct gdbarch_list *arches;
!   struct gdbarch_registration *next;
  };
  
! static struct gdbarch_registration *gdbarch_registrary = NULL;
  
  static void
  append_name (const char ***buf, int *nr, const char *name)
*************** gdbarch_printable_names (void)
*** 1529,1536 ****
        enum bfd_architecture a;
        int nr_arches = 0;
        const char **arches = NULL;
!       struct gdbarch_init_registration *rego;
!       for (rego = gdbarch_init_registrary;
  	   rego != NULL;
  	   rego = rego->next)
  	{
--- 1576,1583 ----
        enum bfd_architecture a;
        int nr_arches = 0;
        const char **arches = NULL;
!       struct gdbarch_registration *rego;
!       for (rego = gdbarch_registrary;
  	   rego != NULL;
  	   rego = rego->next)
  	{
*************** gdbarch_printable_names (void)
*** 1556,1565 ****
  
  
  void
! register_gdbarch_init (enum bfd_architecture bfd_architecture,
!                        gdbarch_init_ftype *init)
  {
!   struct gdbarch_init_registration **curr;
    const struct bfd_arch_info *bfd_arch_info;
    /* Check that BFD reconizes this architecture */
    bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
--- 1603,1613 ----
  
  
  void
! gdbarch_register (enum bfd_architecture bfd_architecture,
!                   gdbarch_init_ftype *init,
! 		  gdbarch_dump_tdep_ftype *dump_tdep)
  {
!   struct gdbarch_registration **curr;
    const struct bfd_arch_info *bfd_arch_info;
    /* Check that BFD reconizes this architecture */
    bfd_arch_info = bfd_lookup_arch (bfd_architecture, 0);
*************** register_gdbarch_init (enum bfd_architec
*** 1568,1574 ****
        internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
      }
    /* Check that we haven't seen this architecture before */
!   for (curr = &gdbarch_init_registrary;
         (*curr) != NULL;
         curr = &(*curr)->next)
      {
--- 1616,1622 ----
        internal_error ("gdbarch: Attempt to register unknown architecture (%d)", bfd_architecture);
      }
    /* Check that we haven't seen this architecture before */
!   for (curr = &gdbarch_registrary;
         (*curr) != NULL;
         curr = &(*curr)->next)
      {
*************** register_gdbarch_init (enum bfd_architec
*** 1582,1594 ****
  			bfd_arch_info->printable_name,
  			(long) init);
    /* Append it */
!   (*curr) = XMALLOC (struct gdbarch_init_registration);
    (*curr)->bfd_architecture = bfd_architecture;
    (*curr)->init = init;
    (*curr)->arches = NULL;
    (*curr)->next = NULL;
  }
  
  
  /* Look for an architecture using gdbarch_info.  Base search on only
     BFD_ARCH_INFO and BYTE_ORDER. */
--- 1630,1656 ----
  			bfd_arch_info->printable_name,
  			(long) init);
    /* Append it */
!   (*curr) = XMALLOC (struct gdbarch_registration);
    (*curr)->bfd_architecture = bfd_architecture;
    (*curr)->init = init;
+   (*curr)->dump_tdep = dump_tdep;
    (*curr)->arches = NULL;
    (*curr)->next = NULL;
+   /* When non- multi-arch, install what ever target dump routine we've
+      been provided - hopefully that routine has been writen correct
+      and works regardless of multi-arch. */
+   if (!GDB_MULTI_ARCH && dump_tdep != NULL
+       && startup_gdbarch.dump_tdep == NULL)
+     startup_gdbarch.dump_tdep = dump_tdep;
  }
  
+ void
+ register_gdbarch_init (enum bfd_architecture bfd_architecture,
+ 		       gdbarch_init_ftype *init)
+ {
+   gdbarch_register (bfd_architecture, init, NULL);
+ }
+ 
  
  /* Look for an architecture using gdbarch_info.  Base search on only
     BFD_ARCH_INFO and BYTE_ORDER. */
*************** gdbarch_update (struct gdbarch_info info
*** 1617,1623 ****
  {
    struct gdbarch *new_gdbarch;
    struct gdbarch_list **list;
!   struct gdbarch_init_registration *rego;
  
    /* Fill in any missing bits. Most important is the bfd_architecture
       which is used to select the target architecture. */
--- 1679,1685 ----
  {
    struct gdbarch *new_gdbarch;
    struct gdbarch_list **list;
!   struct gdbarch_registration *rego;
  
    /* Fill in any missing bits. Most important is the bfd_architecture
       which is used to select the target architecture. */
*************** gdbarch_update (struct gdbarch_info info
*** 1651,1659 ****
    /* A default for abfd? */
  
    /* Find the target that knows about this architecture. */
!   for (rego = gdbarch_init_registrary;
!        rego != NULL && rego->bfd_architecture != info.bfd_architecture;
!        rego = rego->next);
    if (rego == NULL)
      {
        if (gdbarch_debug)
--- 1713,1723 ----
    /* A default for abfd? */
  
    /* Find the target that knows about this architecture. */
!   for (rego = gdbarch_registrary;
!        rego != NULL;
!        rego = rego->next)
!     if (rego->bfd_architecture == info.bfd_architecture)
!       break;
    if (rego == NULL)
      {
        if (gdbarch_debug)
*************** gdbarch_update (struct gdbarch_info info
*** 1718,1724 ****
        if ((*list)->gdbarch == new_gdbarch)
  	{
  	  if (gdbarch_debug)
! 	    fprintf_unfiltered (gdb_stdlog, "gdbarch_update: Previous architecture 0x%08lx (%s) selected\n",
  				(long) new_gdbarch,
  				new_gdbarch->bfd_arch_info->printable_name);
  	  current_gdbarch = new_gdbarch;
--- 1782,1789 ----
        if ((*list)->gdbarch == new_gdbarch)
  	{
  	  if (gdbarch_debug)
! 	    fprintf_unfiltered (gdb_stdlog,
!                                 "gdbarch_update: Previous architecture 0x%08lx (%s) selected\n",
  				(long) new_gdbarch,
  				new_gdbarch->bfd_arch_info->printable_name);
  	  current_gdbarch = new_gdbarch;
*************** gdbarch_update (struct gdbarch_info info
*** 1726,1732 ****
  	  return 1;
  	}
      }
!     
    /* Append this new architecture to this targets list. */
    (*list) = XMALLOC (struct gdbarch_list);
    (*list)->next = NULL;
--- 1791,1797 ----
  	  return 1;
  	}
      }
! 
    /* Append this new architecture to this targets list. */
    (*list) = XMALLOC (struct gdbarch_list);
    (*list)->next = NULL;
*************** gdbarch_update (struct gdbarch_info info
*** 1740,1749 ****
  			  "gdbarch_update: New architecture 0x%08lx (%s) selected\n",
  			  (long) new_gdbarch,
  			  new_gdbarch->bfd_arch_info->printable_name);
-       gdbarch_dump ();
      }
    
!   /* Check that the newly installed architecture is valid.  */
    verify_gdbarch (new_gdbarch);
  
    /* Initialize the per-architecture memory (swap) areas.
--- 1805,1815 ----
  			  "gdbarch_update: New architecture 0x%08lx (%s) selected\n",
  			  (long) new_gdbarch,
  			  new_gdbarch->bfd_arch_info->printable_name);
      }
    
!   /* Check that the newly installed architecture is valid.  Plug in
!      any post init values.  */
!   new_gdbarch->dump_tdep = rego->dump_tdep;
    verify_gdbarch (new_gdbarch);
  
    /* Initialize the per-architecture memory (swap) areas.
*************** gdbarch_update (struct gdbarch_info info
*** 1756,1764 ****
       must be updated before these modules are called. */
    init_gdbarch_data (new_gdbarch);
    
    return 1;
  }
- 
  
  
  /* Disassembler */
--- 1822,1832 ----
       must be updated before these modules are called. */
    init_gdbarch_data (new_gdbarch);
    
+   if (gdbarch_debug)
+     gdbarch_dump (current_gdbarch, gdb_stdlog);
+ 
    return 1;
  }
  
  
  /* Disassembler */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]