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


Hello,

this is the current version of the patch to remove SOFUN_ADDRESS_MAYBE_MISSING.
The only changes are adaptions to latest mailine, and doco changes as 
discussed with Eli.  Eli, is this version OK now?

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:

	* gdbarch.texi (Target Conditionals): Remove documentation of
	SOFUN_ADDRESS_MAYBE_MISSING, replaced by ...
	(Compiler Characteristics): ... documentation of
	set_gdbarch_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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/i386/i386sol2.mt	2007-10-15 16:29:50.345891195 +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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/i386/linux.mt	2007-10-15 16:29:50.349890619 +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-15 16:29:24.952693332 +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-12 18:24:58.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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/powerpc/linux.mt	2007-10-15 16:29:50.372887306 +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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/powerpc/nbsd.mt	2007-10-15 16:29:50.376886730 +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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/powerpc/obsd.mt	2007-10-15 16:29:50.379886298 +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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/powerpc/ppc-eabi.mt	2007-10-15 16:29:50.383885722 +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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/powerpc/ppc-sim.mt	2007-10-15 16:29:50.387885146 +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-12 18:24:58.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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/sparc/sol2-64.mt	2007-10-15 16:29:50.394884138 +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-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/config/sparc/sol2.mt	2007-10-15 16:29:50.398883562 +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-15 16:29:24.955692899 +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-15 16:29:24.966691315 +0200
+++ gdb-head/gdb/dbxread.c	2007-10-15 16:29:50.413881401 +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);
@@ -3081,12 +3076,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);
@@ -3100,7 +3095,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-15 16:21:24.960979000 +0200
+++ gdb-head/gdb/doc/gdbint.texinfo	2007-10-15 16:32:10.718945225 +0200
@@ -3264,6 +3264,38 @@ See @file{mips-tdep.c}.  It does not do 
 @node Compiler Characteristics
 @section Compiler Characteristics
 
+@item set_gdbarch_sofun_address_maybe_missing (@var{gdbarch}, @var{set})
+@findex set_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.
+
+Calling @code{set_gdbarch_sofun_address_maybe_missing} with a non-zero
+argument @var{set} 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.
+
+In this case, @value{GDBN} assumes two things:
+
+@itemize @bullet
+@item
+@code{N_FUN} stabs have an address of zero.  Instead of using those
+addresses, you should find the address where the function starts by
+taking the function name from the stab, and then looking that up in the
+minsyms (the linker/assembler symbol table).  In other words, the stab
+has the name, and the linker/assembler symbol table is the only place
+that carries the address.
+
+@item
+@code{N_SO} stabs have an address of zero, too.  You just look at the
+@code{N_FUN} stabs that appear before and after the @code{N_SO} stab, and
+guess the starting and ending addresses of the compilation unit from them.
+@end itemize
+
 @node Target Conditionals
 @section Target Conditionals
 
@@ -3825,38 +3857,6 @@ 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
-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
-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:
-
-@itemize @bullet
-@item
-@code{N_FUN} stabs have an address of zero.  Instead, you should find the
-addresses where the function starts by taking the function name from
-the stab, and then looking that up in the minsyms (the
-linker/assembler symbol table).  In other words, the stab has the
-name, and the linker/assembler symbol table is the only place that carries
-the address.
-
-@item
-@code{N_SO} stabs have an address of zero, too.  You just look at the
-@code{N_FUN} stabs that appear before and after the @code{N_SO} stab,
-and guess the starting and ending addresses of the compilation unit from
-them.
-@end itemize
-
 @item int gdbarch_pc_regnum (@var{gdbarch})
 @findex gdbarch_pc_regnum
 If the program counter is kept in a register, then let this function return
diff -urNp gdb-orig/gdb/elfread.c gdb-head/gdb/elfread.c
--- gdb-orig/gdb/elfread.c	2007-10-12 18:24:58.000000000 +0200
+++ gdb-head/gdb/elfread.c	2007-10-15 16:29:50.456875209 +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-15 16:29:25.021683394 +0200
+++ gdb-head/gdb/gdbarch.c	2007-10-15 16:29:50.482871464 +0200
@@ -228,6 +228,7 @@ struct gdbarch
   gdbarch_overlay_update_ftype *overlay_update;
   gdbarch_core_read_description_ftype *core_read_description;
   gdbarch_static_transform_name_ftype *static_transform_name;
+  int sofun_address_maybe_missing;
 };
 
 
@@ -348,6 +349,7 @@ struct gdbarch startup_gdbarch =
   0,  /* overlay_update */
   0,  /* core_read_description */
   0,  /* static_transform_name */
+  0,  /* sofun_address_maybe_missing */
   /* startup_gdbarch() */
 };
 
@@ -593,6 +595,7 @@ verify_gdbarch (struct gdbarch *current_
   /* Skip verify of overlay_update, has predicate */
   /* Skip verify of core_read_description, 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)
@@ -978,6 +981,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,
@@ -2964,6 +2970,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-15 16:29:25.060677777 +0200
+++ gdb-head/gdb/gdbarch.h	2007-10-15 16:29:50.499869016 +0200
@@ -672,6 +672,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-15 16:29:25.105671296 +0200
+++ gdb-head/gdb/gdbarch.sh	2007-10-15 16:29:50.518866279 +0200
@@ -641,6 +641,8 @@ M::const struct target_desc *:core_read_
 
 # 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-12 18:24:59.000000000 +0200
+++ gdb-head/gdb/i386-linux-tdep.c	2007-10-15 16:29:50.523865559 +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-15 16:29:25.110670576 +0200
+++ gdb-head/gdb/i386-sol2-tdep.c	2007-10-15 16:29:50.527864983 +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-15 16:29:25.166662510 +0200
+++ gdb-head/gdb/mdebugread.c	2007-10-15 16:29:50.539863255 +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-12 18:24:59.000000000 +0200
+++ gdb-head/gdb/minsyms.c	2007-10-15 16:29:50.545862390 +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-12 18:24:59.000000000 +0200
+++ gdb-head/gdb/rs6000-tdep.c	2007-10-15 16:29:50.556860806 +0200
@@ -3740,6 +3740,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-15 16:29:25.206656749 +0200
+++ gdb-head/gdb/sparc64-sol2-tdep.c	2007-10-15 16:29:50.561860086 +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-15 16:29:25.210656173 +0200
+++ gdb-head/gdb/sparc-sol2-tdep.c	2007-10-15 16:29:50.565859510 +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-12 18:24:59.000000000 +0200
+++ gdb-head/gdb/symmisc.c	2007-10-15 16:29:50.571858646 +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-12 18:24:59.000000000 +0200
+++ gdb-head/gdb/symtab.h	2007-10-15 16:29:50.577857782 +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]