This is the mail archive of the binutils@sources.redhat.com mailing list for the binutils 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]

Re: [RFC] objcopy/objdump targets list


On Mon, Mar 17, 2003 at 11:30:33AM +0000, Nick Clifton wrote:
> Hi Elias,
> 
> > objdump has a very nice and handy -i option to list all the
> > supported targets. I propose to move this code
> > (display_targets_table, etc) in bucomm.c and make objcopy use it,
> > too.
> 
> This would be OK.  It might also be an idea to tidy up the formatting

Here is a patch that moves all the needed stuff from objdump.c to bucomm.c.
If it is approved I'm going to change objcopy to use the 'new' functions.

Regards,
Elias

ChangeLog

2003-03-24  Elias Athanasopoulos  <elathan at phys dot uoa dot gr>

	* objdump.c (endian_string): Move to bucomm.c.
	(display_info): Likewise.
	(display_target_list): Likewise.
	(display_info_table): Likewise.
	(display_target_tables): Likewise.
	(main): Assign the return value of display_info to exit_status.

	* bucomm.c: Include bfdver.h
	(display_target_list): Call bfd_nonfatal instead of nonfatal and
	return 0 on a non-fatal errror, 1 on success.
	(display_info_table): Likewise.
	
	* bucomm.h (endian_string): Define. Make it non-static.
	(display_info): Define. Change prototype so as to return int, 
	instead of static void.
	(display_target_list): Likewise.
	(display_info_table): Likewise.
	(display_target_tables): Likewise.


===================================================================
RCS file: /home/anteater/bucvs/src/binutils/objdump.c,v
retrieving revision 1.2
diff -u -r1.2 /home/anteater/bucvs/src/binutils/objdump.c
--- /home/anteater/bucvs/src/binutils/objdump.c	2003/03/20 16:20:39	1.2
+++ /home/anteater/bucvs/src/binutils/objdump.c	2003/03/24 07:54:15
@@ -146,14 +146,6 @@
   PARAMS ((bfd *));
 static void display_bfd
   PARAMS ((bfd *abfd));
-static void display_target_list
-  PARAMS ((void));
-static void display_info_table
-  PARAMS ((int, int));
-static void display_target_tables
-  PARAMS ((void));
-static void display_info
-  PARAMS ((void));
 static void objdump_print_value
   PARAMS ((bfd_vma, struct disassemble_info *, bfd_boolean));
 static void objdump_print_symname
@@ -176,8 +168,6 @@
 	   bfd_byte *, bfd_vma, bfd_vma, arelent ***, arelent **));
 static void disassemble_data
   PARAMS ((bfd *));
-static const char *endian_string
-  PARAMS ((enum bfd_endian));
 static asymbol ** slurp_symtab
   PARAMS ((bfd *));
 static asymbol ** slurp_dynamic_symtab
@@ -2570,183 +2560,6 @@
       printf ("\n");
     }
 }
-
-/* The length of the longest architecture name + 1.  */
-#define LONGEST_ARCH sizeof("powerpc:common")
-
-static const char *
-endian_string (endian)
-     enum bfd_endian endian;
-{
-  if (endian == BFD_ENDIAN_BIG)
-    return "big endian";
-  else if (endian == BFD_ENDIAN_LITTLE)
-    return "little endian";
-  else
-    return "endianness unknown";
-}
-
-/* List the targets that BFD is configured to support, each followed
-   by its endianness and the architectures it supports.  */
-
-static void
-display_target_list ()
-{
-  extern const bfd_target *const *bfd_target_vector;
-  char *dummy_name;
-  int t;
-
-  dummy_name = make_temp_file (NULL);
-  for (t = 0; bfd_target_vector[t]; t++)
-    {
-      const bfd_target *p = bfd_target_vector[t];
-      bfd *abfd = bfd_openw (dummy_name, p->name);
-      int a;
-
-      printf ("%s\n (header %s, data %s)\n", p->name,
-	      endian_string (p->header_byteorder),
-	      endian_string (p->byteorder));
-
-      if (abfd == NULL)
-	{
-	  nonfatal (dummy_name);
-	  continue;
-	}
-
-      if (! bfd_set_format (abfd, bfd_object))
-	{
-	  if (bfd_get_error () != bfd_error_invalid_operation)
-	    nonfatal (p->name);
-	  bfd_close_all_done (abfd);
-	  continue;
-	}
-
-      for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
-	if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
-	  printf ("  %s\n",
-		  bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
-      bfd_close_all_done (abfd);
-    }
-  unlink (dummy_name);
-  free (dummy_name);
-}
-
-/* Print a table showing which architectures are supported for entries
-   FIRST through LAST-1 of bfd_target_vector (targets across,
-   architectures down).  */
-
-static void
-display_info_table (first, last)
-     int first;
-     int last;
-{
-  extern const bfd_target *const *bfd_target_vector;
-  int t, a;
-  char *dummy_name;
-
-  /* Print heading of target names.  */
-  printf ("\n%*s", (int) LONGEST_ARCH, " ");
-  for (t = first; t < last && bfd_target_vector[t]; t++)
-    printf ("%s ", bfd_target_vector[t]->name);
-  putchar ('\n');
-
-  dummy_name = make_temp_file (NULL);
-  for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
-    if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
-      {
-	printf ("%*s ", (int) LONGEST_ARCH - 1,
-		bfd_printable_arch_mach (a, 0));
-	for (t = first; t < last && bfd_target_vector[t]; t++)
-	  {
-	    const bfd_target *p = bfd_target_vector[t];
-	    bfd_boolean ok = TRUE;
-	    bfd *abfd = bfd_openw (dummy_name, p->name);
-
-	    if (abfd == NULL)
-	      {
-		nonfatal (p->name);
-		ok = FALSE;
-	      }
-
-	    if (ok)
-	      {
-		if (! bfd_set_format (abfd, bfd_object))
-		  {
-		    if (bfd_get_error () != bfd_error_invalid_operation)
-		      nonfatal (p->name);
-		    ok = FALSE;
-		  }
-	      }
-
-	    if (ok)
-	      {
-		if (! bfd_set_arch_mach (abfd, a, 0))
-		  ok = FALSE;
-	      }
-
-	    if (ok)
-	      printf ("%s ", p->name);
-	    else
-	      {
-		int l = strlen (p->name);
-		while (l--)
-		  putchar ('-');
-		putchar (' ');
-	      }
-	    if (abfd != NULL)
-	      bfd_close_all_done (abfd);
-	  }
-	putchar ('\n');
-      }
-  unlink (dummy_name);
-  free (dummy_name);
-}
-
-/* Print tables of all the target-architecture combinations that
-   BFD has been configured to support.  */
-
-static void
-display_target_tables ()
-{
-  int t, columns;
-  extern const bfd_target *const *bfd_target_vector;
-  char *colum;
-
-  columns = 0;
-  colum = getenv ("COLUMNS");
-  if (colum != NULL)
-    columns = atoi (colum);
-  if (columns == 0)
-    columns = 80;
-
-  t = 0;
-  while (bfd_target_vector[t] != NULL)
-    {
-      int oldt = t, wid;
-
-      wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
-      ++t;
-      while (wid < columns && bfd_target_vector[t] != NULL)
-	{
-	  int newwid;
-
-	  newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
-	  if (newwid >= columns)
-	    break;
-	  wid = newwid;
-	  ++t;
-	}
-      display_info_table (oldt, t);
-    }
-}
-
-static void
-display_info ()
-{
-  printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
-  display_target_list ();
-  display_target_tables ();
-}
 
 int main PARAMS ((int, char **));
 
@@ -2943,7 +2756,7 @@
     usage (stderr, 2);
 
   if (formats_info)
-    display_info ();
+    exit_status = display_info ();
   else
     {
       if (optind == argc)
	

===================================================================
RCS file: /home/anteater/bucvs/src/binutils/bucomm.c,v
retrieving revision 1.2
diff -u -r1.2 /home/anteater/bucvs/src/binutils/bucomm.c
--- /home/anteater/bucvs/src/binutils/bucomm.c	2003/03/20 16:20:44	1.2
+++ /home/anteater/bucvs/src/binutils/bucomm.c	2003/03/24 07:52:19
@@ -1,5 +1,6 @@
 /* bucomm.c -- Bin Utils COMmon code.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002
+   Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
+   2003
    Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
@@ -23,6 +24,7 @@
    loaded, but for now it's not necessary.  */
 
 #include "bfd.h"
+#include "bfdver.h"
 #include "libiberty.h"
 #include "bucomm.h"
 #include "filenames.h"
@@ -160,7 +162,201 @@
     fprintf (f, " %s", *arch);
   fprintf (f, "\n");
 }
-
+
+/* The length of the longest architecture name + 1.  */
+#define LONGEST_ARCH sizeof("powerpc:common")
+
+const char *
+endian_string (endian)
+     enum bfd_endian endian;
+{
+  if (endian == BFD_ENDIAN_BIG)
+    return "big endian";
+  else if (endian == BFD_ENDIAN_LITTLE)
+    return "little endian";
+  else
+    return "endianness unknown";
+}
+
+/* List the targets that BFD is configured to support, each followed
+   by its endianness and the architectures it supports.  */
+
+int
+display_target_list ()
+{
+  extern const bfd_target *const *bfd_target_vector;
+  char *dummy_name;
+  int t, ret = 1;
+
+  dummy_name = make_temp_file (NULL);
+  for (t = 0; bfd_target_vector[t]; t++)
+    {
+      const bfd_target *p = bfd_target_vector[t];
+      bfd *abfd = bfd_openw (dummy_name, p->name);
+      int a;
+
+      printf ("%s\n (header %s, data %s)\n", p->name,
+	      endian_string (p->header_byteorder),
+	      endian_string (p->byteorder));
+
+      if (abfd == NULL)
+	{
+          bfd_nonfatal (dummy_name);
+          ret = 0;
+	  continue;
+	}
+
+      if (! bfd_set_format (abfd, bfd_object))
+	{
+	  if (bfd_get_error () != bfd_error_invalid_operation)
+            {
+	      bfd_nonfatal (p->name);
+              ret = 0;
+            }
+	  bfd_close_all_done (abfd);
+	  continue;
+	}
+
+      for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
+	if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
+	  printf ("  %s\n",
+		  bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
+      bfd_close_all_done (abfd);
+    }
+  unlink (dummy_name);
+  free (dummy_name);
+
+  return ret;
+}
+
+/* Print a table showing which architectures are supported for entries
+   FIRST through LAST-1 of bfd_target_vector (targets across,
+   architectures down).  */
+
+int
+display_info_table (first, last)
+     int first;
+     int last;
+{
+  extern const bfd_target *const *bfd_target_vector;
+  int t, a, ret = 1;
+  char *dummy_name;
+
+  /* Print heading of target names.  */
+  printf ("\n%*s", (int) LONGEST_ARCH, " ");
+  for (t = first; t < last && bfd_target_vector[t]; t++)
+    printf ("%s ", bfd_target_vector[t]->name);
+  putchar ('\n');
+
+  dummy_name = make_temp_file (NULL);
+  for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
+    if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
+      {
+	printf ("%*s ", (int) LONGEST_ARCH - 1,
+		bfd_printable_arch_mach (a, 0));
+	for (t = first; t < last && bfd_target_vector[t]; t++)
+	  {
+	    const bfd_target *p = bfd_target_vector[t];
+	    bfd_boolean ok = TRUE;
+	    bfd *abfd = bfd_openw (dummy_name, p->name);
+
+	    if (abfd == NULL)
+	      {
+		bfd_nonfatal (p->name);
+                ret = 0;
+		ok = FALSE;
+	      }
+
+	    if (ok)
+	      {
+		if (! bfd_set_format (abfd, bfd_object))
+		  {
+		    if (bfd_get_error () != bfd_error_invalid_operation)
+                      {
+		        bfd_nonfatal (p->name);
+                        ret = 0;
+                      }
+		    ok = FALSE;
+		  }
+	      }
+
+	    if (ok)
+	      {
+		if (! bfd_set_arch_mach (abfd, a, 0))
+		  ok = FALSE;
+	      }
+
+	    if (ok)
+	      printf ("%s ", p->name);
+	    else
+	      {
+		int l = strlen (p->name);
+		while (l--)
+		  putchar ('-');
+		putchar (' ');
+	      }
+	    if (abfd != NULL)
+	      bfd_close_all_done (abfd);
+	  }
+	putchar ('\n');
+      }
+  unlink (dummy_name);
+  free (dummy_name);
+
+  return ret;
+}
+
+/* Print tables of all the target-architecture combinations that
+   BFD has been configured to support.  */
+
+int
+display_target_tables ()
+{
+  int t, columns, ret = 1;
+  extern const bfd_target *const *bfd_target_vector;
+  char *colum;
+
+  columns = 0;
+  colum = getenv ("COLUMNS");
+  if (colum != NULL)
+    columns = atoi (colum);
+  if (columns == 0)
+    columns = 80;
+
+  t = 0;
+  while (bfd_target_vector[t] != NULL)
+    {
+      int oldt = t, wid;
+
+      wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
+      ++t;
+      while (wid < columns && bfd_target_vector[t] != NULL)
+	{
+	  int newwid;
+
+	  newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
+	  if (newwid >= columns)
+	    break;
+	  wid = newwid;
+	  ++t;
+	}
+      if (! display_info_table (oldt, t))
+        ret = 0;
+    }
+
+  return ret;
+}
+
+int
+display_info ()
+{
+  printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
+  if (! display_target_list () || ! display_target_tables ())
+    return 1;
+  else
+    return 0;
+}
+
 /* Display the archive header for an element as if it were an ls -l listing:
 
    Mode       User\tGroup\tSize\tDate               Name */

===================================================================
RCS file: /home/anteater/bucvs/src/binutils/bucomm.h,v
retrieving revision 1.1
diff -u -r1.1 /home/anteater/bucvs/src/binutils/bucomm.h
--- /home/anteater/bucvs/src/binutils/bucomm.h	2003/03/20 16:34:06	1.1
+++ /home/anteater/bucvs/src/binutils/bucomm.h	2003/03/24 07:52:34
@@ -1,6 +1,6 @@
 /* bucomm.h -- binutils common include file.
    Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
-   2002 Free Software Foundation, Inc.
+   2002, 2003 Free Software Foundation, Inc.
 
 This file is part of GNU Binutils.
 
@@ -175,6 +175,21 @@
 void list_supported_architectures
   PARAMS ((const char *, FILE *));
 
+const char * endian_string
+  PARAMS ((enum bfd_endian));
+
+int display_info
+  PARAMS ((void));
+  
+int display_target_list
+  PARAMS ((void));
+
+int display_info_table
+  PARAMS ((int, int));
+
+int display_target_tables 
+  PARAMS ((void));
+
 void print_arelt_descr
   PARAMS ((FILE *file, bfd *abfd, bfd_boolean verbose));
 


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