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]

RFC: build somread everywhere


This patch arranges for somread.c to be built on any host that has the
needed BFD support.  It also updates somread.c so that it no longer
depends on a host-specific header; these parts are based on similar code
in BFD.

John David Anglin tested this on his HP-UX machine.

In the absence of comments I plan to put this in.

Tom

2013-01-02  Tom Tromey  <tromey@redhat.com>

	* config/pa/hpux.mh (NATDEPFILES): Remove somread.o.
	* configure: Rebuild.
	* configure.ac: Add somread.o to the build if BFD has SOM
	support.
	* somread.c: Include som/aout.h, not syms.h.
	(som_symtab_read): Use som_external_symbol_dictionary_record.
	Unpack records manually.
	(_initialize_somread): Declare.

diff --git a/gdb/config/pa/hpux.mh b/gdb/config/pa/hpux.mh
index e88bddb..3151120 100644
--- a/gdb/config/pa/hpux.mh
+++ b/gdb/config/pa/hpux.mh
@@ -1,3 +1,3 @@
 # Host: PA-RISC HP-UX
 NATDEPFILES= fork-child.o inf-ptrace.o inf-ttrace.o \
-	hppa-hpux-nat.o somread.o
+	hppa-hpux-nat.o
diff --git a/gdb/configure.ac b/gdb/configure.ac
index de096b8..e501766 100644
--- a/gdb/configure.ac
+++ b/gdb/configure.ac
@@ -2034,6 +2034,13 @@ if test $gdb_cv_var_macho = yes; then
   CONFIG_OBS="$CONFIG_OBS machoread.o"
 fi
 
+# Add SOM support to GDB, but only if BFD includes it.
+GDB_AC_CHECK_BFD([for SOM support in BFD], gdb_cv_var_som,
+                 [bfd_som_attach_aux_hdr (NULL, 0, NULL)], som.h)
+if test $gdb_cv_var_som = yes; then
+  CONFIG_OBS="$CONFIG_OBS somread.o"
+fi
+
 # Add any host-specific objects to GDB.
 CONFIG_OBS="${CONFIG_OBS} ${gdb_host_obs}"
 
diff --git a/gdb/somread.c b/gdb/somread.c
index 2d619f3..b21e767 100644
--- a/gdb/somread.c
+++ b/gdb/somread.c
@@ -19,7 +19,7 @@
 
 #include "defs.h"
 #include "bfd.h"
-#include <syms.h>
+#include "som/aout.h"
 #include "symtab.h"
 #include "symfile.h"
 #include "objfiles.h"
@@ -51,9 +51,9 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
   int val, dynamic;
   char *stringtab;
   asection *shlib_info;
-  struct symbol_dictionary_record *buf, *bufp, *endbufp;
+  struct som_external_symbol_dictionary_record *buf, *bufp, *endbufp;
   char *symname;
-  CONST int symsize = sizeof (struct symbol_dictionary_record);
+  CONST int symsize = sizeof (struct som_external_symbol_dictionary_record);
   CORE_ADDR text_offset, data_offset;
 
 
@@ -100,14 +100,20 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
   for (bufp = buf; bufp < endbufp; ++bufp)
     {
       enum minimal_symbol_type ms_type;
+      unsigned int flags = bfd_getb32 (bufp->flags);
+      unsigned int symbol_type =
+        (flags >> SOM_SYMBOL_TYPE_SH) & SOM_SYMBOL_TYPE_MASK;
+      unsigned int symbol_scope =
+        (flags >> SOM_SYMBOL_SCOPE_SH) & SOM_SYMBOL_SCOPE_MASK;
+      CORE_ADDR symbol_value = bfd_getb32 (bufp->symbol_value);
 
       QUIT;
 
-      switch (bufp->symbol_scope)
+      switch (symbol_scope)
 	{
 	case SS_UNIVERSAL:
 	case SS_EXTERNAL:
-	  switch (bufp->symbol_type)
+	  switch (symbol_type)
 	    {
 	    case ST_SYM_EXT:
 	    case ST_ARG_EXT:
@@ -117,15 +123,14 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	    case ST_PRI_PROG:
 	    case ST_SEC_PROG:
 	    case ST_MILLICODE:
-	      symname = bufp->name.n_strx + stringtab;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_text;
-	      bufp->symbol_value += text_offset;
-	      bufp->symbol_value = gdbarch_addr_bits_remove
-				     (gdbarch, bufp->symbol_value);
+	      symbol_value += text_offset;
+	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_ENTRY:
-	      symname = bufp->name.n_strx + stringtab;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      /* For a dynamic executable, ST_ENTRY symbols are
 	         the stubs, while the ST_CODE symbol is the real
 	         function.  */
@@ -133,22 +138,20 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 		ms_type = mst_solib_trampoline;
 	      else
 		ms_type = mst_text;
-	      bufp->symbol_value += text_offset;
-	      bufp->symbol_value = gdbarch_addr_bits_remove
-				     (gdbarch, bufp->symbol_value);
+	      symbol_value += text_offset;
+	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_STUB:
-	      symname = bufp->name.n_strx + stringtab;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_solib_trampoline;
-	      bufp->symbol_value += text_offset;
-	      bufp->symbol_value = gdbarch_addr_bits_remove
-				     (gdbarch, bufp->symbol_value);
+	      symbol_value += text_offset;
+	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_DATA:
-	      symname = bufp->name.n_strx + stringtab;
-	      bufp->symbol_value += data_offset;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
+	      symbol_value += data_offset;
 	      ms_type = mst_data;
 	      break;
 	    default:
@@ -161,18 +164,17 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	case SS_GLOBAL:
 #endif
 	case SS_LOCAL:
-	  switch (bufp->symbol_type)
+	  switch (symbol_type)
 	    {
 	    case ST_SYM_EXT:
 	    case ST_ARG_EXT:
 	      continue;
 
 	    case ST_CODE:
-	      symname = bufp->name.n_strx + stringtab;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_file_text;
-	      bufp->symbol_value += text_offset;
-	      bufp->symbol_value = gdbarch_addr_bits_remove
-				     (gdbarch, bufp->symbol_value);
+	      symbol_value += text_offset;
+	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 
 	    check_strange_names:
 	      /* Utah GCC 2.5, FSF GCC 2.6 and later generate correct local
@@ -200,37 +202,34 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	    case ST_PRI_PROG:
 	    case ST_SEC_PROG:
 	    case ST_MILLICODE:
-	      symname = bufp->name.n_strx + stringtab;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_file_text;
-	      bufp->symbol_value += text_offset;
-	      bufp->symbol_value = gdbarch_addr_bits_remove
-				     (gdbarch, bufp->symbol_value);
+	      symbol_value += text_offset;
+	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_ENTRY:
-	      symname = bufp->name.n_strx + stringtab;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      /* SS_LOCAL symbols in a shared library do not have
 		 export stubs, so we do not have to worry about
 		 using mst_file_text vs mst_solib_trampoline here like
 		 we do for SS_UNIVERSAL and SS_EXTERNAL symbols above.  */
 	      ms_type = mst_file_text;
-	      bufp->symbol_value += text_offset;
-	      bufp->symbol_value = gdbarch_addr_bits_remove
-				     (gdbarch, bufp->symbol_value);
+	      symbol_value += text_offset;
+	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 	    case ST_STUB:
-	      symname = bufp->name.n_strx + stringtab;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
 	      ms_type = mst_solib_trampoline;
-	      bufp->symbol_value += text_offset;
-	      bufp->symbol_value = gdbarch_addr_bits_remove
-				     (gdbarch, bufp->symbol_value);
+	      symbol_value += text_offset;
+	      symbol_value = gdbarch_addr_bits_remove (gdbarch, symbol_value);
 	      break;
 
 
 	    case ST_DATA:
-	      symname = bufp->name.n_strx + stringtab;
-	      bufp->symbol_value += data_offset;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
+	      symbol_value += data_offset;
 	      ms_type = mst_file_data;
 	      goto check_strange_names;
 
@@ -246,12 +245,12 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	     This also happens for weak symbols, but their type is
 	     ST_DATA.  */
 	case SS_UNSAT:
-	  switch (bufp->symbol_type)
+	  switch (symbol_type)
 	    {
 	    case ST_STORAGE:
 	    case ST_DATA:
-	      symname = bufp->name.n_strx + stringtab;
-	      bufp->symbol_value += data_offset;
+	      symname = bfd_getb32 (bufp->name) + stringtab;
+	      symbol_value += data_offset;
 	      ms_type = mst_data;
 	      break;
 
@@ -264,12 +263,11 @@ som_symtab_read (bfd *abfd, struct objfile *objfile,
 	  continue;
 	}
 
-      if (bufp->name.n_strx > obj_som_stringtab_size (abfd))
-	error (_("Invalid symbol data; bad HP string table offset: %d"),
-	       bufp->name.n_strx);
+      if (bfd_getb32 (bufp->name) > obj_som_stringtab_size (abfd))
+	error (_("Invalid symbol data; bad HP string table offset: %s"),
+	       plongest (bfd_getb32 (bufp->name)));
 
-      prim_record_minimal_symbol (symname, bufp->symbol_value, ms_type,
-				  objfile);
+      prim_record_minimal_symbol (symname, symbol_value, ms_type, objfile);
     }
 }
 
@@ -426,6 +424,8 @@ static const struct sym_fns som_sym_fns =
   &psym_functions
 };
 
+initialize_file_ftype _initialize_somread;
+
 void
 _initialize_somread (void)
 {


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