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/rft] [3/3] Remove stabs target macros: SOFUN_ADDRESS_MAYBE_MISSING


Hello,

this removes the SOFUN_ADDRESS_MAYBE_MISSING target macro.  There are
two main parts to this:

- struct minimal_symbol used to have the member "filename" present
  only when SOFUN_ADDRESS_MAYBE_MISSING was true.  The patch changes
  this to make the member always available.  Code used to initialize
  and use those filenames is now also enabled unconditionally.  (This
  should not actually change the behaviour of GDB on any target.)

- Instead of the SOFUN_ADDRESS_MAYBE_MISSING macro, a new gdbarch
  variable gdbarch_sofun_address_maybe_missing is introduces.  All
  places where GDB behaviour depended on SOFUN_ADDRESS_MAYBE_MISSING
  now look at that gdbarch variable instead.

Bye,
Ulrich


ChangeLog:

	* gdbarch.sh (sofun_address_maybe_missing): New gdbarch variable.
	* gdbarch.c, gdbarch.h: Regenerate.
	* dbxread.c (find_stab_function_addr): Define unconditionally.
	(read_dbx_symtab): Use gdbarch_sofun_address_maybe_missing
	instead of SOFUN_ADDRESS_MAYBE_MISSING.
	(end_psymtab): Likewise.
	(process_one_symbol): Likewise.
	* mdebugread.c (parse_partial_symbols): Likewise.

	* symtab.h (struct minimal_symbol): Always define "filename" member.
	* elfread.c (elf_symtab_read): Use msym->filename unconditionally.
	* minsyms.c (lookup_minimal_symbol): Likewise.
	* symmisc.c (dump_msymbols): Likewise.

	* config/i386/i386sol2.mt (DEPRECATED_TM_FILE): Remove.
	* config/i386/linux.mt (DEPRECATED_TM_FILE): Remove.
	* config/i386/tm-i386sol2.h: Remove file.
	* config/i386/tm-linux.h: Remove file.
	* i386-linux-tdep.c (i386_linux_init_abi): Add call to
	set_gdbarch_sofun_address_maybe_missing.
	* i386-sol2-tdep.c (i386_sol2_init_abi): Likewise.

	* config/powerpc/linux.mt (DEPRECATED_TM_FILE): Remove.
	* config/powerpc/nbsd.mt (DEPRECATED_TM_FILE): Remove.
	* config/powerpc/obsd.mt (DEPRECATED_TM_FILE): Remove.
	* config/powerpc/ppc-eabi.mt (DEPRECATED_TM_FILE): Remove.
	* config/powerpc/ppc-sim.mt (DEPRECATED_TM_FILE): Remove.
	* config/powerpc/tm-ppc-eabi.h: Remove file.
	* rs6000-tdep.c (rs6000_gdbarch_init): Add call to
	set_gdbarch_sofun_address_maybe_missing.

	* config/sparc/sol2-64.mt (DEPRECATED_TM_FILE): Remove.
	* config/sparc/sol2.mt (DEPRECATED_TM_FILE): Remove.
	* config/sparc/tm-sol2.h: Remove file.
	* sparc64-sol2-tdep.c (sparc64_sol2_init_abi): Add call to
	set_gdbarch_sofun_address_maybe_missing.
	* sparc-sol2-tdep.c (sparc32_sol2_init_abi): Likewise.

doc/ChangeLog:

	* gdbint.texinfo: Document gdbarch_sofun_address_maybe_missing
	instead of SOFUN_ADDRESS_MAYBE_MISSING.


diff -urNp gdb-orig/gdb/config/i386/i386sol2.mt gdb-head/gdb/config/i386/i386sol2.mt
--- gdb-orig/gdb/config/i386/i386sol2.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/i386/i386sol2.mt	2007-10-05 17:55:13.498978656 +0200
@@ -1,4 +1,3 @@
 # Target: Solaris x86
 TDEPFILES= i386-tdep.o i387-tdep.o i386-sol2-tdep.o sol2-tdep.o \
 	corelow.o solib.o solib-svr4.o
-DEPRECATED_TM_FILE= tm-i386sol2.h
diff -urNp gdb-orig/gdb/config/i386/linux.mt gdb-head/gdb/config/i386/linux.mt
--- gdb-orig/gdb/config/i386/linux.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/i386/linux.mt	2007-10-05 17:55:13.502978080 +0200
@@ -1,4 +1,3 @@
 # Target: Intel 386 running GNU/Linux
 TDEPFILES= i386-tdep.o i386-linux-tdep.o glibc-tdep.o i387-tdep.o \
 	solib.o solib-svr4.o symfile-mem.o corelow.o
-DEPRECATED_TM_FILE= tm-linux.h
diff -urNp gdb-orig/gdb/config/i386/tm-i386sol2.h gdb-head/gdb/config/i386/tm-i386sol2.h
--- gdb-orig/gdb/config/i386/tm-i386sol2.h	2007-10-05 17:55:07.749008957 +0200
+++ gdb-head/gdb/config/i386/tm-i386sol2.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,27 +0,0 @@
-/* Macro definitions for GDB on an Intel i386 running Solaris 2.
-
-   Copyright 1998, 1999, 2000, 2004, 2007 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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef TM_I386SOL2_H
-#define TM_I386SOL2_H 1
-
-/* The SunPRO compiler puts out 0 instead of the address in N_SO symbols,
-   and for SunPRO 3.0, N_FUN symbols too.  */
-#define SOFUN_ADDRESS_MAYBE_MISSING
-
-#endif /* tm-i386sol2.h */
diff -urNp gdb-orig/gdb/config/i386/tm-linux.h gdb-head/gdb/config/i386/tm-linux.h
--- gdb-orig/gdb/config/i386/tm-linux.h	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/i386/tm-linux.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,28 +0,0 @@
-/* Definitions to target GDB to GNU/Linux on 386.
-
-   Copyright 1992, 1993, 1995, 1996, 1998, 1999, 2000, 2001, 2002, 2004, 2007
-   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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef TM_LINUX_H
-#define TM_LINUX_H
-
-/* N_FUN symbols in shared libaries have 0 for their values and need
-   to be relocated. */
-#define SOFUN_ADDRESS_MAYBE_MISSING
-
-#endif /* #ifndef TM_LINUX_H */
diff -urNp gdb-orig/gdb/config/powerpc/linux.mt gdb-head/gdb/config/powerpc/linux.mt
--- gdb-orig/gdb/config/powerpc/linux.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/powerpc/linux.mt	2007-10-05 17:55:13.536973183 +0200
@@ -1,7 +1,6 @@
 # Target: Motorola PPC on Linux
 TDEPFILES= rs6000-tdep.o ppc-linux-tdep.o ppc-sysv-tdep.o solib.o \
 	solib-svr4.o solib-legacy.o corelow.o symfile-mem.o
-DEPRECATED_TM_FILE= tm-ppc-eabi.h
 
 SIM_OBS = remote-sim.o
 SIM = ../sim/ppc/libsim.a
diff -urNp gdb-orig/gdb/config/powerpc/nbsd.mt gdb-head/gdb/config/powerpc/nbsd.mt
--- gdb-orig/gdb/config/powerpc/nbsd.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/powerpc/nbsd.mt	2007-10-05 17:55:13.540972606 +0200
@@ -1,7 +1,6 @@
 # Target: NetBSD/powerpc
 TDEPFILES= rs6000-tdep.o ppc-sysv-tdep.o ppcnbsd-tdep.o \
 	corelow.o solib.o solib-svr4.o
-DEPRECATED_TM_FILE= tm-ppc-eabi.h
 
 SIM_OBS = remote-sim.o
 SIM = ../sim/ppc/libsim.a
diff -urNp gdb-orig/gdb/config/powerpc/obsd.mt gdb-head/gdb/config/powerpc/obsd.mt
--- gdb-orig/gdb/config/powerpc/obsd.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/powerpc/obsd.mt	2007-10-05 17:55:13.544972030 +0200
@@ -1,4 +1,3 @@
 # Target: OpenBSD/powerpc
 TDEPFILES= rs6000-tdep.o ppc-sysv-tdep.o ppcobsd-tdep.o \
 	corelow.o solib.o solib-svr4.o
-DEPRECATED_TM_FILE= tm-ppc-eabi.h
diff -urNp gdb-orig/gdb/config/powerpc/ppc-eabi.mt gdb-head/gdb/config/powerpc/ppc-eabi.mt
--- gdb-orig/gdb/config/powerpc/ppc-eabi.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/powerpc/ppc-eabi.mt	2007-10-05 17:55:13.547971598 +0200
@@ -1,3 +1,2 @@
 # Target: PowerPC running eabi
 TDEPFILES= rs6000-tdep.o monitor.o dsrec.o ppcbug-rom.o dink32-rom.o ppc-sysv-tdep.o solib.o solib-svr4.o
-DEPRECATED_TM_FILE= tm-ppc-eabi.h
diff -urNp gdb-orig/gdb/config/powerpc/ppc-sim.mt gdb-head/gdb/config/powerpc/ppc-sim.mt
--- gdb-orig/gdb/config/powerpc/ppc-sim.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/powerpc/ppc-sim.mt	2007-10-05 17:55:13.556970302 +0200
@@ -1,6 +1,5 @@
 # Target: PowerPC running eabi and including the simulator
 TDEPFILES= rs6000-tdep.o monitor.o dsrec.o ppcbug-rom.o dink32-rom.o ppc-sysv-tdep.o solib.o solib-svr4.o
-DEPRECATED_TM_FILE= tm-ppc-eabi.h
 
 SIM_OBS = remote-sim.o
 SIM = ../sim/ppc/libsim.a
diff -urNp gdb-orig/gdb/config/powerpc/tm-ppc-eabi.h gdb-head/gdb/config/powerpc/tm-ppc-eabi.h
--- gdb-orig/gdb/config/powerpc/tm-ppc-eabi.h	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/powerpc/tm-ppc-eabi.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,27 +0,0 @@
-/* Macro definitions for Power PC running embedded ABI.
-   Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2007
-   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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef TM_PPC_EABI_H
-#define TM_PPC_EABI_H
-
-/* The value of symbols of type N_SO and N_FUN maybe null when 
-   it shouldn't be. */
-#define SOFUN_ADDRESS_MAYBE_MISSING
-
-#endif /* TM_PPC_EABI_H */
diff -urNp gdb-orig/gdb/config/sparc/sol2-64.mt gdb-head/gdb/config/sparc/sol2-64.mt
--- gdb-orig/gdb/config/sparc/sol2-64.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/sparc/sol2-64.mt	2007-10-05 17:55:13.569968429 +0200
@@ -1,4 +1,3 @@
 # Target: Solaris UltraSPARC
 TDEPFILES= sparc64-tdep.o sparc64-sol2-tdep.o sparc-tdep.o sparc-sol2-tdep.o \
 	sol2-tdep.o solib.o solib-svr4.o
-DEPRECATED_TM_FILE= tm-sol2.h
diff -urNp gdb-orig/gdb/config/sparc/sol2.mt gdb-head/gdb/config/sparc/sol2.mt
--- gdb-orig/gdb/config/sparc/sol2.mt	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/config/sparc/sol2.mt	2007-10-05 17:55:13.572967997 +0200
@@ -1,3 +1,2 @@
 # Target: Solaris SPARC
 TDEPFILES= sparc-tdep.o sparc-sol2-tdep.o sol2-tdep.o solib.o solib-svr4.o
-DEPRECATED_TM_FILE= tm-sol2.h
diff -urNp gdb-orig/gdb/config/sparc/tm-sol2.h gdb-head/gdb/config/sparc/tm-sol2.h
--- gdb-orig/gdb/config/sparc/tm-sol2.h	2007-10-05 17:55:07.753008381 +0200
+++ gdb-head/gdb/config/sparc/tm-sol2.h	1970-01-01 01:00:00.000000000 +0100
@@ -1,29 +0,0 @@
-/* Target-dependent definitions for Solaris SPARC.
-
-   Copyright 2003, 2004, 2007 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 3 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, see <http://www.gnu.org/licenses/>.  */
-
-#ifndef TM_SOL2_H
-#define TM_SOL2_H
-
-/* The Sun compilers (Sun ONE Studio, Forte Developer, Sun WorkShop,
-   SunPRO) compiler puts out 0 instead of the address in N_SO stabs.
-   Starting with SunPRO 3.0, the compiler does this for N_FUN stabs
-   too.  */
-#define SOFUN_ADDRESS_MAYBE_MISSING
-
-#endif /* tm-sol2.h */
diff -urNp gdb-orig/gdb/dbxread.c gdb-head/gdb/dbxread.c
--- gdb-orig/gdb/dbxread.c	2007-10-05 17:55:07.764006796 +0200
+++ gdb-head/gdb/dbxread.c	2007-10-05 17:55:13.586965980 +0200
@@ -1116,7 +1116,6 @@ read_dbx_dynamic_symtab (struct objfile 
   do_cleanups (back_to);
 }
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 static CORE_ADDR
 find_stab_function_addr (char *namestring, char *filename,
 			 struct objfile *objfile)
@@ -1160,7 +1159,6 @@ find_stab_function_addr (char *namestrin
 
   return msym == NULL ? 0 : SYMBOL_VALUE_ADDRESS (msym);
 }
-#endif /* SOFUN_ADDRESS_MAYBE_MISSING */
 
 static void
 function_outside_compilation_unit_complaint (const char *arg1)
@@ -1463,21 +1461,19 @@ read_dbx_symtab (struct objfile *objfile
 
 	    prev_textlow_not_set = textlow_not_set;
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	    /* A zero value is probably an indication for the SunPRO 3.0
 	       compiler. end_psymtab explicitly tests for zero, so
 	       don't relocate it.  */
 
-	    if (nlist.n_value == 0)
+	    if (nlist.n_value == 0
+		&& gdbarch_sofun_address_maybe_missing (current_gdbarch))
 	      {
 		textlow_not_set = 1;
 		valu = 0;
 	      }
 	    else
 	      textlow_not_set = 0;
-#else
-	    textlow_not_set = 0;
-#endif
+
 	    past_first_source_file = 1;
 
 	    if (prev_so_symnum != symnum - 1)
@@ -1832,11 +1828,11 @@ read_dbx_symtab (struct objfile *objfile
 				       SECT_OFF_TEXT (objfile));
 	    /* Kludges for ELF/STABS with Sun ACC */
 	    last_function_name = namestring;
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	    /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
 	       value for the bottom of the text seg in those cases. */
 	    if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-					   SECT_OFF_TEXT (objfile)))
+					   SECT_OFF_TEXT (objfile))
+		&& gdbarch_sofun_address_maybe_missing (current_gdbarch))
 	      {
 		CORE_ADDR minsym_valu = 
 		  find_stab_function_addr (namestring, 
@@ -1850,12 +1846,12 @@ read_dbx_symtab (struct objfile *objfile
 		if (minsym_valu != 0)
 		  nlist.n_value = minsym_valu;
 	      }
-	    if (pst && textlow_not_set)
+	    if (pst && textlow_not_set
+		&& gdbarch_sofun_address_maybe_missing (current_gdbarch))
 	      {
 		pst->textlow = nlist.n_value;
 		textlow_not_set = 0;
 	      }
-#endif
 	    /* End kludge.  */
 
 	    /* Keep track of the start of the last function so we
@@ -1900,11 +1896,11 @@ read_dbx_symtab (struct objfile *objfile
 				       SECT_OFF_TEXT (objfile));
 	    /* Kludges for ELF/STABS with Sun ACC */
 	    last_function_name = namestring;
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	    /* Do not fix textlow==0 for .o or NLM files, as 0 is a legit
 	       value for the bottom of the text seg in those cases. */
 	    if (nlist.n_value == ANOFFSET (objfile->section_offsets, 
-					   SECT_OFF_TEXT (objfile)))
+					   SECT_OFF_TEXT (objfile))
+		&& gdbarch_sofun_address_maybe_missing (current_gdbarch))
 	      {
 		CORE_ADDR minsym_valu = 
 		  find_stab_function_addr (namestring, 
@@ -1918,12 +1914,12 @@ read_dbx_symtab (struct objfile *objfile
 		if (minsym_valu != 0)
 		  nlist.n_value = minsym_valu;
 	      }
-	    if (pst && textlow_not_set)
+	    if (pst && textlow_not_set
+		&& gdbarch_sofun_address_maybe_missing (current_gdbarch))
 	      {
 		pst->textlow = nlist.n_value;
 		textlow_not_set = 0;
 	      }
-#endif
 	    /* End kludge.  */
 
 	    /* Keep track of the start of the last function so we
@@ -2049,12 +2045,11 @@ read_dbx_symtab (struct objfile *objfile
 	  continue;
 
 	  case N_ENDM:
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	  /* Solaris 2 end of module, finish current partial symbol table.
 	     end_psymtab will set pst->texthigh to the proper value, which
 	     is necessary if a module compiled without debugging info
 	     follows this module.  */
-	  if (pst)
+	  if (pst && gdbarch_sofun_address_maybe_missing (current_gdbarch))
 	  {
 	    end_psymtab (pst, psymtab_include_list, includes_used,
 			 symnum * symbol_size,
@@ -2064,7 +2059,6 @@ read_dbx_symtab (struct objfile *objfile
 	    includes_used = 0;
 	    dependencies_used = 0;
 	  }
-#endif
 	  continue;
 
 	  case N_RBRAC:
@@ -2186,7 +2180,6 @@ end_psymtab (struct partial_symtab *pst,
     LDSYMLEN (pst) = capping_symbol_offset - LDSYMOFF (pst);
   pst->texthigh = capping_text;
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
   /* Under Solaris, the N_SO symbols always have a value of 0,
      instead of the usual address of the .o file.  Therefore,
      we have to do some tricks to fill in texthigh and textlow.
@@ -2202,7 +2195,8 @@ end_psymtab (struct partial_symtab *pst,
      a reliable texthigh by taking the address plus size of the
      last function in the file.  */
 
-  if (pst->texthigh == 0 && last_function_name)
+  if (pst->texthigh == 0 && last_function_name
+      && gdbarch_sofun_address_maybe_missing (current_gdbarch))
     {
       char *p;
       int n;
@@ -2233,8 +2227,10 @@ end_psymtab (struct partial_symtab *pst,
       last_function_name = NULL;
     }
 
+  if (!gdbarch_sofun_address_maybe_missing (current_gdbarch))
+    ;
   /* this test will be true if the last .o file is only data */
-  if (textlow_not_set)
+  else if (textlow_not_set)
     pst->textlow = pst->texthigh;
   else
     {
@@ -2259,7 +2255,6 @@ end_psymtab (struct partial_symtab *pst,
     }
 
   /* End of kludge for patching Solaris textlow and texthigh.  */
-#endif /* SOFUN_ADDRESS_MAYBE_MISSING.  */
 
   pst->n_global_syms =
     objfile->global_psymbols.next - (objfile->global_psymbols.list + pst->globals_offset);
@@ -3107,12 +3102,12 @@ no enclosing block"));
 	    case 'F':
 	      function_stab_type = type;
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	      /* Deal with the SunPRO 3.0 compiler which omits the
 	         address from N_FUN symbols.  */
 	      if (type == N_FUN
 		  && valu == ANOFFSET (section_offsets,
-				       SECT_OFF_TEXT (objfile)))
+				       SECT_OFF_TEXT (objfile))
+		  && gdbarch_sofun_address_maybe_missing (current_gdbarch))
 		{
 		  CORE_ADDR minsym_valu = 
 		    find_stab_function_addr (name, last_source_file, objfile);
@@ -3126,7 +3121,6 @@ no enclosing block"));
 		  if (minsym_valu != 0)
 		    valu = minsym_valu;
 		}
-#endif
 
 	      if (block_address_function_relative)
 		/* For Solaris 2 compilers, the block addresses and
diff -urNp gdb-orig/gdb/doc/gdbint.texinfo gdb-head/gdb/doc/gdbint.texinfo
--- gdb-orig/gdb/doc/gdbint.texinfo	2007-10-05 17:52:44.557830426 +0200
+++ gdb-head/gdb/doc/gdbint.texinfo	2007-10-05 17:55:13.642090238 +0200
@@ -3847,21 +3847,21 @@ A function that inserts or removes (depe
 the next instruction. See @file{sparc-tdep.c} and @file{rs6000-tdep.c}
 for examples.
 
-@item SOFUN_ADDRESS_MAYBE_MISSING
-@findex SOFUN_ADDRESS_MAYBE_MISSING
+@item int gdbarch_sofun_address_maybe_missing
+@findex gdbarch_sofun_address_maybe_missing
 Somebody clever observed that, the more actual addresses you have in the
 debug information, the more time the linker has to spend relocating
 them.  So whenever there's some other way the debugger could find the
 address it needs, you should omit it from the debug info, to make
 linking faster.
 
-@code{SOFUN_ADDRESS_MAYBE_MISSING} indicates that a particular set of
+@code{gdbarch_sofun_address_maybe_missing} indicates that a particular set of
 hacks of this sort are in use, affecting @code{N_SO} and @code{N_FUN}
 entries in stabs-format debugging information.  @code{N_SO} stabs mark
 the beginning and ending addresses of compilation units in the text
 segment.  @code{N_FUN} stabs mark the starts and ends of functions.
 
-@code{SOFUN_ADDRESS_MAYBE_MISSING} means two things:
+@code{gdbarch_sofun_address_maybe_missing} means two things:
 
 @itemize @bullet
 @item
diff -urNp gdb-orig/gdb/elfread.c gdb-head/gdb/elfread.c
--- gdb-orig/gdb/elfread.c	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/elfread.c	2007-10-05 17:55:13.683084333 +0200
@@ -213,10 +213,8 @@ elf_symtab_read (struct objfile *objfile
   /* If filesym is nonzero, it points to a file symbol, but we haven't
      seen any section info for it yet.  */
   asymbol *filesym = 0;
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
   /* Name of filesym, as saved on the objfile_obstack.  */
   char *filesymname = obsavestring ("", 0, &objfile->objfile_obstack);
-#endif
   struct dbx_symfile_info *dbx = objfile->deprecated_sym_stab_info;
   int stripped = (bfd_get_symcount (objfile->obfd) == 0);
 
@@ -258,10 +256,8 @@ elf_symtab_read (struct objfile *objfile
 	  msym = record_minimal_symbol
 	    ((char *) sym->name, symaddr,
 	     mst_solib_trampoline, sym->section, objfile);
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	  if (msym != NULL)
 	    msym->filename = filesymname;
-#endif
 	  continue;
 	}
 
@@ -281,11 +277,9 @@ elf_symtab_read (struct objfile *objfile
 	      sectinfo = NULL;
 	    }
 	  filesym = sym;
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	  filesymname =
 	    obsavestring ((char *) filesym->name, strlen (filesym->name),
 			  &objfile->objfile_obstack);
-#endif
 	}
       else if (sym->flags & BSF_SECTION_SYM)
 	continue;
@@ -476,10 +470,8 @@ elf_symtab_read (struct objfile *objfile
 	      unsigned long size = ((elf_symbol_type *) sym)->internal_elf_sym.st_size;
 	      MSYMBOL_SIZE(msym) = size;
 	    }
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 	  if (msym != NULL)
 	    msym->filename = filesymname;
-#endif
 	  gdbarch_elf_make_msymbol_special (current_gdbarch, sym, msym);
 	}
     }
diff -urNp gdb-orig/gdb/gdbarch.c gdb-head/gdb/gdbarch.c
--- gdb-orig/gdb/gdbarch.c	2007-10-05 17:55:07.811999882 +0200
+++ gdb-head/gdb/gdbarch.c	2007-10-05 17:55:13.694082748 +0200
@@ -233,6 +233,7 @@ struct gdbarch
   gdbarch_core_read_description_ftype *core_read_description;
   gdbarch_variables_inside_block_ftype *variables_inside_block;
   gdbarch_static_transform_name_ftype *static_transform_name;
+  int sofun_address_maybe_missing;
 };
 
 
@@ -358,6 +359,7 @@ struct gdbarch startup_gdbarch =
   0,  /* core_read_description */
   0,  /* variables_inside_block */
   0,  /* static_transform_name */
+  0,  /* sofun_address_maybe_missing */
   /* startup_gdbarch() */
 };
 
@@ -608,6 +610,7 @@ verify_gdbarch (struct gdbarch *current_
   /* Skip verify of core_read_description, has predicate */
   /* Skip verify of variables_inside_block, has predicate */
   /* Skip verify of static_transform_name, has predicate */
+  /* Skip verify of sofun_address_maybe_missing, invalid_p == 0 */
   buf = ui_file_xstrdup (log, &dummy);
   make_cleanup (xfree, buf);
   if (strlen (buf) > 0)
@@ -1005,6 +1008,9 @@ gdbarch_dump (struct gdbarch *current_gd
                       "gdbarch_dump: software_single_step = <0x%lx>\n",
                       (long) current_gdbarch->software_single_step);
   fprintf_unfiltered (file,
+                      "gdbarch_dump: sofun_address_maybe_missing = %s\n",
+                      paddr_d (current_gdbarch->sofun_address_maybe_missing));
+  fprintf_unfiltered (file,
                       "gdbarch_dump: sp_regnum = %s\n",
                       paddr_d (current_gdbarch->sp_regnum));
   fprintf_unfiltered (file,
@@ -3100,6 +3106,23 @@ set_gdbarch_static_transform_name (struc
   gdbarch->static_transform_name = static_transform_name;
 }
 
+int
+gdbarch_sofun_address_maybe_missing (struct gdbarch *gdbarch)
+{
+  gdb_assert (gdbarch != NULL);
+  /* Skip verify of sofun_address_maybe_missing, invalid_p == 0 */
+  if (gdbarch_debug >= 2)
+    fprintf_unfiltered (gdb_stdlog, "gdbarch_sofun_address_maybe_missing called\n");
+  return gdbarch->sofun_address_maybe_missing;
+}
+
+void
+set_gdbarch_sofun_address_maybe_missing (struct gdbarch *gdbarch,
+                                         int sofun_address_maybe_missing)
+{
+  gdbarch->sofun_address_maybe_missing = sofun_address_maybe_missing;
+}
+
 
 /* Keep a registry of per-architecture data-pointers required by GDB
    modules. */
diff -urNp gdb-orig/gdb/gdbarch.h gdb-head/gdb/gdbarch.h
--- gdb-orig/gdb/gdbarch.h	2007-10-05 17:55:07.855993545 +0200
+++ gdb-head/gdb/gdbarch.h	2007-10-05 17:55:13.735076842 +0200
@@ -711,6 +711,11 @@ typedef char * (gdbarch_static_transform
 extern char * gdbarch_static_transform_name (struct gdbarch *gdbarch, char *name);
 extern void set_gdbarch_static_transform_name (struct gdbarch *gdbarch, gdbarch_static_transform_name_ftype *static_transform_name);
 
+/* Set if the address in N_SO or N_FUN stabs may be zero. */
+
+extern int gdbarch_sofun_address_maybe_missing (struct gdbarch *gdbarch);
+extern void set_gdbarch_sofun_address_maybe_missing (struct gdbarch *gdbarch, int sofun_address_maybe_missing);
+
 extern struct gdbarch_tdep *gdbarch_tdep (struct gdbarch *gdbarch);
 
 
diff -urNp gdb-orig/gdb/gdbarch.sh gdb-head/gdb/gdbarch.sh
--- gdb-orig/gdb/gdbarch.sh	2007-10-05 17:55:07.899987207 +0200
+++ gdb-head/gdb/gdbarch.sh	2007-10-05 17:55:13.759073385 +0200
@@ -661,6 +661,8 @@ M::const struct target_desc *:core_read_
 F::int:variables_inside_block:int desc, int gcc_p:desc, gcc_p
 # Handle special encoding of static variables in stabs debug info.
 F::char *:static_transform_name:char *name:name
+# Set if the address in N_SO or N_FUN stabs may be zero.
+v::int:sofun_address_maybe_missing:::0:0::0
 EOF
 }
 
diff -urNp gdb-orig/gdb/i386-linux-tdep.c gdb-head/gdb/i386-linux-tdep.c
--- gdb-orig/gdb/i386-linux-tdep.c	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/i386-linux-tdep.c	2007-10-05 17:55:13.802067192 +0200
@@ -429,6 +429,10 @@ i386_linux_init_abi (struct gdbarch_info
   tdep->sc_reg_offset = i386_linux_sc_reg_offset;
   tdep->sc_num_regs = ARRAY_SIZE (i386_linux_sc_reg_offset);
 
+  /* N_FUN symbols in shared libaries have 0 for their values and need
+     to be relocated. */
+  set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
+
   /* GNU/Linux uses SVR4-style shared libraries.  */
   set_gdbarch_skip_trampoline_code (gdbarch, find_solib_trampoline_target);
   set_solib_svr4_fetch_link_map_offsets
diff -urNp gdb-orig/gdb/i386-sol2-tdep.c gdb-head/gdb/i386-sol2-tdep.c
--- gdb-orig/gdb/i386-sol2-tdep.c	2007-10-05 17:55:07.940981301 +0200
+++ gdb-head/gdb/i386-sol2-tdep.c	2007-10-05 17:55:13.806066615 +0200
@@ -109,6 +109,10 @@ i386_sol2_init_abi (struct gdbarch_info 
   /* Solaris is SVR4-based.  */
   i386_svr4_init_abi (info, gdbarch);
 
+  /* The SunPRO compiler puts out 0 instead of the address in N_SO symbols,
+     and for SunPRO 3.0, N_FUN symbols too.  */
+  set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
+
   /* Handle SunPRO encoding of static symbols.  */
   set_gdbarch_static_transform_name (gdbarch, i386_sol2_static_transform_name);
 
diff -urNp gdb-orig/gdb/mdebugread.c gdb-head/gdb/mdebugread.c
--- gdb-orig/gdb/mdebugread.c	2007-10-05 17:55:07.996973235 +0200
+++ gdb-head/gdb/mdebugread.c	2007-10-05 17:55:13.828063447 +0200
@@ -2844,21 +2844,20 @@ parse_partial_symbols (struct objfile *o
 
 		      prev_textlow_not_set = textlow_not_set;
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 		      /* A zero value is probably an indication for the SunPRO 3.0
 			 compiler. end_psymtab explicitly tests for zero, so
 			 don't relocate it.  */
 
-		      if (sh.value == 0)
+		      if (sh.value == 0
+			  && gdbarch_sofun_address_maybe_missing
+			      (current_gdbarch))
 			{
 			  textlow_not_set = 1;
 			  valu = 0;
 			}
 		      else
 			textlow_not_set = 0;
-#else
-		      textlow_not_set = 0;
-#endif
+
 		      past_first_source_file = 1;
 
 		      if (prev_so_symnum != symnum - 1)
@@ -3225,19 +3224,19 @@ parse_partial_symbols (struct objfile *o
 		    continue;
 
 		  case N_ENDM:
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
 		    /* Solaris 2 end of module, finish current partial
 		       symbol table.  END_PSYMTAB will set
 		       pst->texthigh to the proper value, which is
 		       necessary if a module compiled without
 		       debugging info follows this module.  */
-		    if (pst)
+		    if (pst
+			&& gdbarch_sofun_address_maybe_missing
+			     (current_gdbarch))
 		      {
 			pst = (struct partial_symtab *) 0;
 			includes_used = 0;
 			dependencies_used = 0;
 		      }
-#endif
 		    continue;
 
 		  case N_RBRAC:
diff -urNp gdb-orig/gdb/minsyms.c gdb-head/gdb/minsyms.c
--- gdb-orig/gdb/minsyms.c	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/minsyms.c	2007-10-05 17:55:13.871057253 +0200
@@ -165,14 +165,12 @@ lookup_minimal_symbol (const char *name,
   unsigned int hash = msymbol_hash (name) % MINIMAL_SYMBOL_HASH_SIZE;
   unsigned int dem_hash = msymbol_hash_iw (name) % MINIMAL_SYMBOL_HASH_SIZE;
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
   if (sfile != NULL)
     {
       char *p = strrchr (sfile, '/');
       if (p != NULL)
 	sfile = p + 1;
     }
-#endif
 
   for (objfile = object_files;
        objfile != NULL && found_symbol == NULL;
@@ -209,18 +207,9 @@ lookup_minimal_symbol (const char *name,
                       case mst_file_text:
                       case mst_file_data:
                       case mst_file_bss:
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
                         if (sfile == NULL
 			    || strcmp (msymbol->filename, sfile) == 0)
                           found_file_symbol = msymbol;
-#else
-                        /* We have neither the ability nor the need to
-                           deal with the SFILE parameter.  If we find
-                           more than one symbol, just return the latest
-                           one (the user can't expect useful behavior in
-                           that case).  */
-                        found_file_symbol = msymbol;
-#endif
                         break;
 
                       case mst_solib_trampoline:
diff -urNp gdb-orig/gdb/rs6000-tdep.c gdb-head/gdb/rs6000-tdep.c
--- gdb-orig/gdb/rs6000-tdep.c	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/rs6000-tdep.c	2007-10-05 17:55:13.882055668 +0200
@@ -3739,6 +3739,10 @@ rs6000_gdbarch_init (struct gdbarch_info
   set_gdbarch_inner_than (gdbarch, core_addr_lessthan);
   set_gdbarch_breakpoint_from_pc (gdbarch, rs6000_breakpoint_from_pc);
 
+  /* The value of symbols of type N_SO and N_FUN maybe null when
+     it shouldn't be. */
+  set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
+
   /* Handles single stepping of atomic sequences.  */
   set_gdbarch_software_single_step (gdbarch, deal_with_atomic_sequence);
   
diff -urNp gdb-orig/gdb/sparc64-sol2-tdep.c gdb-head/gdb/sparc64-sol2-tdep.c
--- gdb-orig/gdb/sparc64-sol2-tdep.c	2007-10-05 17:55:08.036967473 +0200
+++ gdb-head/gdb/sparc64-sol2-tdep.c	2007-10-05 17:55:13.921050051 +0200
@@ -157,6 +157,11 @@ sparc64_sol2_init_abi (struct gdbarch_in
 
   sparc64_init_abi (info, gdbarch);
 
+  /* The Sun compilers (Sun ONE Studio, Forte Developer, Sun WorkShop, SunPRO)
+     compiler puts out 0 instead of the address in N_SO stabs.  Starting with
+     SunPRO 3.0, the compiler does this for N_FUN stabs too.  */
+  set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
+
   /* The Sun compilers also do "globalization"; see the comment in
      sparc_sol2_static_transform_name for more information.  */
   set_gdbarch_static_transform_name
diff -urNp gdb-orig/gdb/sparc-sol2-tdep.c gdb-head/gdb/sparc-sol2-tdep.c
--- gdb-orig/gdb/sparc-sol2-tdep.c	2007-10-05 17:55:08.041966753 +0200
+++ gdb-head/gdb/sparc-sol2-tdep.c	2007-10-05 17:55:13.925049475 +0200
@@ -206,6 +206,11 @@ sparc32_sol2_init_abi (struct gdbarch_in
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
 
+  /* The Sun compilers (Sun ONE Studio, Forte Developer, Sun WorkShop, SunPRO)
+     compiler puts out 0 instead of the address in N_SO stabs.  Starting with
+     SunPRO 3.0, the compiler does this for N_FUN stabs too.  */
+  set_gdbarch_sofun_address_maybe_missing (gdbarch, 1);
+
   /* The Sun compilers also do "globalization"; see the comment in
      sparc_sol2_static_transform_name for more information.  */
   set_gdbarch_static_transform_name
diff -urNp gdb-orig/gdb/symmisc.c gdb-head/gdb/symmisc.c
--- gdb-orig/gdb/symmisc.c	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/symmisc.c	2007-10-05 17:55:13.931048610 +0200
@@ -356,10 +356,8 @@ dump_msymbols (struct objfile *objfile, 
 	{
 	  fprintf_filtered (outfile, "  %s", SYMBOL_DEMANGLED_NAME (msymbol));
 	}
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
       if (msymbol->filename)
 	fprintf_filtered (outfile, "  %s", msymbol->filename);
-#endif
       fputs_filtered ("\n", outfile);
     }
   if (objfile->minimal_symbol_count != index)
diff -urNp gdb-orig/gdb/symtab.h gdb-head/gdb/symtab.h
--- gdb-orig/gdb/symtab.h	2007-10-05 14:54:47.000000000 +0200
+++ gdb-head/gdb/symtab.h	2007-10-05 17:55:13.937047746 +0200
@@ -345,10 +345,8 @@ struct minimal_symbol
 
   unsigned long size;
 
-#ifdef SOFUN_ADDRESS_MAYBE_MISSING
   /* Which source file is this symbol in?  Only relevant for mst_file_*.  */
   char *filename;
-#endif
 
   /* Classification type for this minimal symbol.  */
 
-- 
  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]