This is the mail archive of the gdb-patches@sourceware.org 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]
Other format: [Raw text]

[commit] Make get_objfile_arch independent of current target description


Hello,

gdbarch_find_by_info will currently always use default values for
info.abfd and info.target_desc (based on exec_bfd/core_bfd and 
the current target description) when looking for a gdbarch.

This is somewhat problematic for get_objfile_arch, which is 
intended to depend solely on the given objfile, and not at all
on current target properties (in particular not the current
target description, which may potentially refer to a different
architecture altogether).

This patch moves the determination of those default values out of
gdbarch_find_by_info into its callers *except* for gdbarch_from_bfd.

Tested on powerpc-linux and powerpc64-linux, committed to mainline.

Bye,
Ulrich


ChangeLog:

	* arch-utils.c (gdbarch_update_p): Use default values for
	info.abfd and info.target_desc if they are NULL.
	(gdbarch_from_bfd): Remove assertion.
	(set_gdbarch_from_file): Call gdbarch_find_by_info directly,
	using the current target description.
	(gdbarch_info_fill): Do not use default values for info->abfd
	and info->target_desc.

diff -urNp gdb-orig/gdb/arch-utils.c gdb-head/gdb/arch-utils.c
--- gdb-orig/gdb/arch-utils.c	2008-05-03 01:25:56.000000000 +0200
+++ gdb-head/gdb/arch-utils.c	2008-05-04 16:21:12.516761017 +0200
@@ -466,7 +466,19 @@ set_architecture (char *ignore_args, int
 int
 gdbarch_update_p (struct gdbarch_info info)
 {
-  struct gdbarch *new_gdbarch = gdbarch_find_by_info (info);
+  struct gdbarch *new_gdbarch;
+
+  /* Check for the current file.  */
+  if (info.abfd == NULL)
+    info.abfd = exec_bfd;
+  if (info.abfd == NULL)
+    info.abfd = core_bfd;
+
+  /* Check for the current target description.  */
+  if (info.target_desc == NULL)
+    info.target_desc = target_current_description ();
+
+  new_gdbarch = gdbarch_find_by_info (info);
 
   /* If there no architecture by that name, reject the request.  */
   if (new_gdbarch == NULL)
@@ -507,14 +519,6 @@ struct gdbarch *
 gdbarch_from_bfd (bfd *abfd)
 {
   struct gdbarch_info info;
-
-  /* If we call gdbarch_find_by_info without filling in info.abfd,
-     then it will use the global exec_bfd.  That's fine if we don't
-     have one of those either.  And that's the only time we should
-     reach here with a NULL ABFD argument - when we are discarding
-     the executable.  */
-  gdb_assert (abfd != NULL || exec_bfd == NULL);
-
   gdbarch_info_init (&info);
   info.abfd = abfd;
   return gdbarch_find_by_info (info);
@@ -526,9 +530,14 @@ gdbarch_from_bfd (bfd *abfd)
 void
 set_gdbarch_from_file (bfd *abfd)
 {
+  struct gdbarch_info info;
   struct gdbarch *gdbarch;
 
-  gdbarch = gdbarch_from_bfd (abfd);
+  gdbarch_info_init (&info);
+  info.abfd = abfd;
+  info.target_desc = target_current_description ();
+  gdbarch = gdbarch_find_by_info (info);
+
   if (gdbarch == NULL)
     error (_("Architecture of file not recognized."));
   deprecated_current_gdbarch_select_hack (gdbarch);
@@ -668,16 +677,6 @@ gdbarch_info_init (struct gdbarch_info *
 void
 gdbarch_info_fill (struct gdbarch_info *info)
 {
-  /* Check for the current file.  */
-  if (info->abfd == NULL)
-    info->abfd = exec_bfd;
-  if (info->abfd == NULL)
-    info->abfd = core_bfd;
-
-  /* Check for the current target description.  */
-  if (info->target_desc == NULL)
-    info->target_desc = target_current_description ();
-
   /* "(gdb) set architecture ...".  */
   if (info->bfd_arch_info == NULL
       && target_architecture_user)
-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


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