This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[rfc/rft] [3/3] Remove stabs target macros: SOFUN_ADDRESS_MAYBE_MISSING
- From: "Ulrich Weigand" <uweigand at de dot ibm dot com>
- To: gdb-patches at sourceware dot org
- Date: Fri, 5 Oct 2007 20:06:20 +0200 (CEST)
- Subject: [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