* dbxread.c (process_one_symbol): Rather than having

BLOCK_ADDRESS_FUNCTION_RELATIVE a macro, make it a variable which
	is true if we are doing stabs-in-elf, false otherwise.
	config/sparc/tm-sun4sol2.h: Don't define it.
This commit is contained in:
Jim Kingdon 1993-06-11 21:53:49 +00:00
parent d146827310
commit 574dac8e6d
3 changed files with 69 additions and 57 deletions

View File

@ -1,3 +1,10 @@
Fri Jun 11 10:17:41 1993 Jim Kingdon (kingdon@cygnus.com)
* dbxread.c (process_one_symbol): Rather than having
BLOCK_ADDRESS_FUNCTION_RELATIVE a macro, make it a variable which
is true if we are doing stabs-in-elf, false otherwise.
config/sparc/tm-sun4sol2.h: Don't define it.
Fri Jun 11 13:33:40 1993 Ian Lance Taylor (ian@cygnus.com) Fri Jun 11 13:33:40 1993 Ian Lance Taylor (ian@cygnus.com)
* remote-mips.c (mips_send_packet): Don't print garbage character * remote-mips.c (mips_send_packet): Don't print garbage character

View File

@ -23,12 +23,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
#undef IN_SOLIB_TRAMPOLINE #undef IN_SOLIB_TRAMPOLINE
#define IN_SOLIB_TRAMPOLINE(pc, name) in_solib_trampoline((pc), (name)) #define IN_SOLIB_TRAMPOLINE(pc, name) in_solib_trampoline((pc), (name))
/* The values of N_SLINE, N_LBRAC, N_RBRAC symbols in .stab sections are
relative to the current function, rather than being absolute or
relative to the current N_SO. */
#define BLOCK_ADDRESS_FUNCTION_RELATIVE
/* Variables in the debug stabs occur after the N_LBRAC, not before it, /* Variables in the debug stabs occur after the N_LBRAC, not before it,
in code generated by Sun C. */ in code generated by Sun C. */

View File

@ -212,9 +212,8 @@ init_header_files PARAMS ((void));
static struct pending * static struct pending *
copy_pending PARAMS ((struct pending *, int, struct pending *)); copy_pending PARAMS ((struct pending *, int, struct pending *));
static struct symtab * static void
read_ofile_symtab PARAMS ((struct objfile *, int, int, CORE_ADDR, int, read_ofile_symtab PARAMS ((struct partial_symtab *));
struct section_offsets *));
static void static void
dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *)); dbx_psymtab_to_symtab PARAMS ((struct partial_symtab *));
@ -1234,10 +1233,7 @@ dbx_psymtab_to_symtab_1 (pst)
/* Read in this file's symbols */ /* Read in this file's symbols */
bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET); bfd_seek (pst->objfile->obfd, SYMBOL_OFFSET (pst), L_SET);
pst->symtab = read_ofile_symtab (pst);
read_ofile_symtab (pst->objfile, LDSYMOFF(pst), LDSYMLEN(pst),
pst->textlow, pst->texthigh - pst->textlow,
pst->section_offsets);
sort_symtab_syms (pst->symtab); sort_symtab_syms (pst->symtab);
do_cleanups (old_chain); do_cleanups (old_chain);
@ -1291,26 +1287,11 @@ dbx_psymtab_to_symtab (pst)
} }
} }
/* Read in a defined section of a specific object file's symbols. /* Read in a defined section of a specific object file's symbols. */
DESC is the file descriptor for the file, positioned at the static void
beginning of the symtab read_ofile_symtab (pst)
SYM_OFFSET is the offset within the file of struct partial_symtab *pst;
the beginning of the symbols we want to read
SYM_SIZE is the size of the symbol info to read in.
TEXT_OFFSET is the beginning of the text segment we are reading symbols for
TEXT_SIZE is the size of the text segment read in.
SECTION_OFFSETS are the relocation offsets which get added to each symbol. */
static struct symtab *
read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
section_offsets)
struct objfile *objfile;
int sym_offset;
int sym_size;
CORE_ADDR text_offset;
int text_size;
struct section_offsets *section_offsets;
{ {
register char *namestring; register char *namestring;
register struct internal_nlist *bufp; register struct internal_nlist *bufp;
@ -1318,6 +1299,19 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
unsigned max_symnum; unsigned max_symnum;
register bfd *abfd; register bfd *abfd;
struct symtab *rtn; struct symtab *rtn;
struct objfile *objfile;
int sym_offset; /* Offset to start of symbols to read */
int sym_size; /* Size of symbols to read */
CORE_ADDR text_offset; /* Start of text segment for symbols */
int text_size; /* Size of text segment for symbols */
struct section_offsets *section_offsets;
objfile = pst->objfile;
sym_offset = LDSYMOFF(pst);
sym_size = LDSYMLEN(pst);
text_offset = pst->textlow;
text_size = pst->texthigh - pst->textlow;
section_offsets = pst->section_offsets;
current_objfile = objfile; current_objfile = objfile;
subfile_stack = NULL; subfile_stack = NULL;
@ -1443,10 +1437,11 @@ read_ofile_symtab (objfile, sym_offset, sym_size, text_offset, text_size,
if (last_source_start_addr == 0) if (last_source_start_addr == 0)
last_source_start_addr = text_offset; last_source_start_addr = text_offset;
rtn = end_symtab (text_offset + text_size, 0, 0, objfile, SECT_OFF_TEXT); pst->symtab = end_symtab (text_offset + text_size, 0, 0, objfile,
SECT_OFF_TEXT);
end_stabs (); end_stabs ();
return (rtn);
} }
/* This handles a single symbol from the symbol-file, building symbols /* This handles a single symbol from the symbol-file, building symbols
into a GDB symtab. It takes these arguments and an implicit argument. into a GDB symtab. It takes these arguments and an implicit argument.
@ -1485,11 +1480,20 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
static CORE_ADDR function_start_offset; static CORE_ADDR function_start_offset;
char *colon_pos; char *colon_pos;
#ifndef BLOCK_ADDRESS_FUNCTION_RELATIVE /* If this is nonzero, N_LBRAC, N_RBRAC, and N_SLINE entries are relative
/* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the to the function start address. */
function start address, so just use the text offset. */ int block_address_function_relative;
function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
#endif /* This is true for Solaris (and all other stabs-in-elf systems, hopefully,
since it would be silly to do things differently from Solaris), and
false for SunOS4 and other a.out file formats. */
block_address_function_relative =
0 == strncmp (bfd_get_target (objfile->obfd), "elf", 3);
if (!block_address_function_relative)
/* N_LBRAC, N_RBRAC and N_SLINE entries are not relative to the
function start address, so just use the text offset. */
function_start_offset = ANOFFSET (section_offsets, SECT_OFF_TEXT);
/* Something is wrong if we see real data before /* Something is wrong if we see real data before
seeing a source file name. */ seeing a source file name. */
@ -1541,14 +1545,13 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
last_pc_address = valu; /* Save for SunOS bug circumcision */ last_pc_address = valu; /* Save for SunOS bug circumcision */
#endif #endif
#ifdef BLOCK_ADDRESS_FUNCTION_RELATIVE if (block_address_function_relative)
/* On Solaris 2.0 compilers, the block addresses and N_SLINE's /* On Solaris 2.0 compilers, the block addresses and N_SLINE's
are relative to the start of the function. On normal systems, are relative to the start of the function. On normal systems,
and when using gcc on Solaris 2.0, these addresses are just and when using gcc on Solaris 2.0, these addresses are just
absolute, or relative to the N_SO, depending on absolute, or relative to the N_SO, depending on
BLOCK_ADDRESS_ABSOLUTE. */ BLOCK_ADDRESS_ABSOLUTE. */
function_start_offset = valu; function_start_offset = valu;
#endif
within_function = 1; within_function = 1;
if (context_stack_depth > 0) if (context_stack_depth > 0)
@ -1570,13 +1573,17 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
/* This "symbol" just indicates the start of an inner lexical /* This "symbol" just indicates the start of an inner lexical
context within a function. */ context within a function. */
#if defined(BLOCK_ADDRESS_ABSOLUTE) || defined(BLOCK_ADDRESS_FUNCTION_RELATIVE) #if defined(BLOCK_ADDRESS_ABSOLUTE)
/* Relocate for dynamic loading and Sun ELF acc fn-relative syms. */ /* Relocate for dynamic loading (?). */
valu += function_start_offset; valu += function_start_offset;
#else #else
/* On most machines, the block addresses are relative to the if (block_address_function_relative)
N_SO, the linker did not relocate them (sigh). */ /* Relocate for Sun ELF acc fn-relative syms. */
valu += last_source_start_addr; valu += function_start_offset;
else
/* On most machines, the block addresses are relative to the
N_SO, the linker did not relocate them (sigh). */
valu += last_source_start_addr;
#endif #endif
#ifndef SUN_FIXED_LBRAC_BUG #ifndef SUN_FIXED_LBRAC_BUG
@ -1593,13 +1600,17 @@ process_one_symbol (type, desc, valu, name, section_offsets, objfile)
/* This "symbol" just indicates the end of an inner lexical /* This "symbol" just indicates the end of an inner lexical
context that was started with N_LBRAC. */ context that was started with N_LBRAC. */
#if defined(BLOCK_ADDRESS_ABSOLUTE) || defined(BLOCK_ADDRESS_FUNCTION_RELATIVE) #if defined(BLOCK_ADDRESS_ABSOLUTE)
/* Relocate for dynamic loading and Sun ELF acc fn-relative syms. */ /* Relocate for dynamic loading (?). */
valu += function_start_offset; valu += function_start_offset;
#else #else
/* On most machines, the block addresses are relative to the if (block_address_function_relative)
N_SO, the linker did not relocate them (sigh). */ /* Relocate for Sun ELF acc fn-relative syms. */
valu += last_source_start_addr; valu += function_start_offset;
else
/* On most machines, the block addresses are relative to the
N_SO, the linker did not relocate them (sigh). */
valu += last_source_start_addr;
#endif #endif
new = pop_context(); new = pop_context();