/* Shared code to pre-read a stab (dbx-style), when building a psymtab.
- Copyright (C) 1986-1991 Free Software Foundation, Inc.
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992 Free Software Foundation,
+ Inc.
This file is part of GDB.
* Standard, external, non-debugger, symbols
*/
-#ifdef DBXREAD_ONLY
case N_TEXT | N_EXT:
case N_NBTEXT | N_EXT:
- case N_NBDATA | N_EXT:
- case N_NBBSS | N_EXT:
- case N_SETV | N_EXT:
- case N_ABS | N_EXT:
+ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
+ goto record_it;
+
case N_DATA | N_EXT:
- case N_BSS | N_EXT:
+ case N_NBDATA | N_EXT:
+ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
+ goto record_it;
- CUR_SYMBOL_VALUE += addr; /* Relocate */
+ case N_BSS | N_EXT:
+ case N_NBBSS | N_EXT:
+ case N_SETV | N_EXT: /* FIXME, is this in BSS? */
+ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_BSS);
+ goto record_it;
+ case N_ABS | N_EXT:
+ record_it:
+#ifdef DBXREAD_ONLY
SET_NAMESTRING();
bss_ext_symbol:
- record_misc_function (namestring, CUR_SYMBOL_VALUE,
- CUR_SYMBOL_TYPE); /* Always */
-
+ record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
+ CUR_SYMBOL_TYPE, objfile); /* Always */
+#endif /* DBXREAD_ONLY */
continue;
/* Standard, local, non-debugger, symbols */
case N_FN:
case N_FN_SEQ:
case N_TEXT:
- CUR_SYMBOL_VALUE += addr; /* Relocate */
+#ifdef DBXREAD_ONLY
+ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_TEXT);
SET_NAMESTRING();
if ((namestring[0] == '-' && namestring[1] == 'l')
|| (namestring [(nsl = strlen (namestring)) - 1] == 'o'
- && namestring [nsl - 2] == '.'))
+ && namestring [nsl - 2] == '.')
+#ifdef hp9000s800
+ /* some cooperation from gcc to get around ld stupidity */
+ || (namestring[0] == 'e' && !strcmp (namestring, "end_file."))
+#endif
+ )
{
- if (entry_point < CUR_SYMBOL_VALUE
- && entry_point >= last_o_file_start
- && addr == 0) /* FIXME nogood nomore */
+#ifndef hp9000s800
+ if (objfile -> ei.entry_point < CUR_SYMBOL_VALUE &&
+ objfile -> ei.entry_point >= last_o_file_start)
{
- startup_file_start = last_o_file_start;
- startup_file_end = CUR_SYMBOL_VALUE;
+ objfile -> ei.entry_file_lowpc = last_o_file_start;
+ objfile -> ei.entry_file_highpc = CUR_SYMBOL_VALUE;
}
+#endif
if (past_first_source_file && pst
/* The gould NP1 uses low values for .o and -l symbols
which are not the address. */
- && CUR_SYMBOL_VALUE > pst->textlow)
+ && CUR_SYMBOL_VALUE >= pst->textlow)
{
END_PSYMTAB (pst, psymtab_include_list, includes_used,
symnum * symbol_size, CUR_SYMBOL_VALUE,
past_first_source_file = 1;
last_o_file_start = CUR_SYMBOL_VALUE;
}
+#endif /* DBXREAD_ONLY */
continue;
case N_DATA:
- CUR_SYMBOL_VALUE += addr; /* Relocate */
+#ifdef DBXREAD_ONLY
+ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
SET_NAMESTRING ();
/* Check for __DYNAMIC, which is used by Sun shared libraries.
Record it even if it's local, not global, so we can find it.
if ((namestring[8] == 'C' && (strcmp ("__DYNAMIC", namestring) == 0))
|| VTBL_PREFIX_P ((namestring+HASH_OFFSET)))
{
- /* Not really a function here, but... */
- record_misc_function (namestring, CUR_SYMBOL_VALUE,
- CUR_SYMBOL_TYPE); /* Always */
- }
+ record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
+ CUR_SYMBOL_TYPE, objfile); /* Always */
+ }
+#endif /* DBXREAD_ONLY */
continue;
case N_UNDF | N_EXT:
+#ifdef DBXREAD_ONLY
if (CUR_SYMBOL_VALUE != 0) {
/* This is a "Fortran COMMON" symbol. See if the target
environment knows where it has been relocated to. */
CUR_SYMBOL_VALUE = reladdr;
goto bss_ext_symbol;
}
+#endif /* DBXREAD_ONLY */
continue; /* Just undefined, not COMMON */
-#endif
+
+ case N_UNDF:
+#ifdef DBXREAD_ONLY
+ if (processing_acc_compilation && bufp->n_strx == 1) {
+ /* Deal with relative offsets in the string table
+ used in ELF+STAB under Solaris. If we want to use the
+ n_strx field, which contains the name of the file,
+ we must adjust file_string_table_offset *before* calling
+ SET_NAMESTRING(). */
+ past_first_source_file = 1;
+ file_string_table_offset = next_file_string_table_offset;
+ next_file_string_table_offset =
+ file_string_table_offset + bufp->n_value;
+ if (next_file_string_table_offset < file_string_table_offset)
+ error ("string table offset backs up at %d", symnum);
+ /* FIXME -- replace error() with complaint. */
+ continue;
+ }
+#endif /* DBXREAD_ONLY */
+ continue;
/* Lots of symbol types we can just ignore. */
- case N_UNDF:
case N_ABS:
case N_BSS:
case N_NBDATA:
case N_SO: {
unsigned long valu = CUR_SYMBOL_VALUE;
- /* Symbol number of the first symbol of this file (i.e. the N_SO
- if there is just one, or the first if we have a pair). */
- int first_symnum = symnum;
+ static int prev_so_symnum = -10;
+ static int first_so_symnum;
+ char *p;
+ past_first_source_file = 1;
+
+ if (prev_so_symnum != symnum - 1)
+ { /* Here if prev stab wasn't N_SO */
+ first_so_symnum = symnum;
+
+ if (pst)
+ {
+ END_PSYMTAB (pst, psymtab_include_list, includes_used,
+ symnum * symbol_size, valu,
+ dependency_list, dependencies_used);
+ pst = (struct partial_symtab *) 0;
+ includes_used = 0;
+ dependencies_used = 0;
+ }
+ }
+
+ prev_so_symnum = symnum;
+
/* End the current partial symtab and start a new one */
SET_NAMESTRING();
- /* Peek at the next symbol. If it is also an N_SO, the
- first one just indicates the directory. */
- CHECK_SECOND_N_SO();
- valu += addr; /* Relocate */
+ valu += ANOFFSET (section_offsets, SECT_OFF_TEXT);
- if (pst && past_first_source_file)
- {
- END_PSYMTAB (pst, psymtab_include_list, includes_used,
- first_symnum * symbol_size, valu,
- dependency_list, dependencies_used);
- pst = (struct partial_symtab *) 0;
- includes_used = 0;
- dependencies_used = 0;
- }
- else
- past_first_source_file = 1;
+ /* Some compilers (including gcc) emit a pair of initial N_SOs.
+ The first one is a directory name; the second the file name.
+ If pst exists, is empty, and has a filename ending in '/',
+ we assume the previous N_SO was a directory name. */
+
+ p = strrchr (namestring, '/');
+ if (p && *(p+1) == '\000')
+ continue; /* Simply ignore directory name SOs */
+
+ /* Some other compilers (C++ ones in particular) emit useless
+ SOs for non-existant .c files. We ignore all subsequent SOs that
+ immediately follow the first. */
- pst = START_PSYMTAB (objfile, addr,
- namestring, valu,
- first_symnum * symbol_size,
- global_psymbols.next, static_psymbols.next);
+ if (!pst)
+ pst = START_PSYMTAB (objfile, section_offsets,
+ namestring, valu,
+ first_so_symnum * symbol_size,
+ objfile -> global_psymbols.next,
+ objfile -> static_psymbols.next);
continue;
}
-#ifdef DBXREAD_ONLY
case N_BINCL:
+#ifdef DBXREAD_ONLY
/* Add this bincl to the bincl_list for future EXCLs. No
need to save the string; it'll be around until
read_dbx_symtab function returns */
psymtab_include_list = (char **)
alloca ((includes_allocated *= 2) *
sizeof (char *));
- bcopy (orig, psymtab_include_list,
- includes_used * sizeof (char *));
+ memcpy ((PTR)psymtab_include_list, (PTR)orig,
+ includes_used * sizeof (char *));
}
+#endif /* DBXREAD_ONLY */
continue;
-#endif
case N_SOL:
/* Mark down an include file in the current psymtab */
psymtab_include_list = (char **)
alloca ((includes_allocated *= 2) *
sizeof (char *));
- bcopy (orig, psymtab_include_list,
- includes_used * sizeof (char *));
+ memcpy ((PTR)psymtab_include_list, (PTR)orig,
+ includes_used * sizeof (char *));
}
continue;
+
case N_LSYM: /* Typedef or automatic variable. */
case N_STSYM: /* Data seg var -- static */
case N_LCSYM: /* BSS " */
+ case N_ROSYM: /* Read-only data seg var -- static. */
case N_NBSTS: /* Gould nobase. */
case N_NBLCS: /* symbols. */
switch (p[1])
{
case 'T':
- ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
- STRUCT_NAMESPACE, LOC_TYPEDEF,
- static_psymbols, CUR_SYMBOL_VALUE);
- if (p[2] == 't')
+ if (p != namestring) /* a name is there, not just :T... */
{
- /* Also a typedef with the same name. */
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
- VAR_NAMESPACE, LOC_TYPEDEF,
- static_psymbols, CUR_SYMBOL_VALUE);
- p += 1;
+ STRUCT_NAMESPACE, LOC_TYPEDEF,
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
+ if (p[2] == 't')
+ {
+ /* Also a typedef with the same name. */
+ ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
+ VAR_NAMESPACE, LOC_TYPEDEF,
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
+ p += 1;
+ }
}
goto check_enum;
case 't':
- ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
- VAR_NAMESPACE, LOC_TYPEDEF,
- static_psymbols, CUR_SYMBOL_VALUE);
+ if (p != namestring) /* a name is there, not just :T... */
+ {
+ ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
+ VAR_NAMESPACE, LOC_TYPEDEF,
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
+ }
check_enum:
-#ifdef DBXREAD_ONLY
/* If this is an enumerated type, we need to
add all the enum constants to the partial symbol
table. This does not cover enums without names, e.g.
enum constants in psymtabs, just in symtabs. */
ADD_PSYMBOL_TO_LIST (p, q - p,
VAR_NAMESPACE, LOC_CONST,
- static_psymbols, 0);
+ objfile->static_psymbols, 0);
/* Point past the name. */
p = q;
/* Skip over the value. */
p++;
}
}
-#endif
continue;
case 'c':
/* Constant, e.g. from "const" in Pascal. */
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_CONST,
- static_psymbols, CUR_SYMBOL_VALUE);
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
continue;
default:
/* Skip if the thing following the : is
case N_FUN:
case N_GSYM: /* Global (extern) variable; can be
- data or bss (sigh). */
+ data or bss (sigh FIXME). */
/* Following may probably be ignored; I'll leave them here
for now (until I do Pascal and Modula 2 extensions). */
case 'c':
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_CONST,
- static_psymbols, CUR_SYMBOL_VALUE);
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
continue;
case 'S':
- CUR_SYMBOL_VALUE += addr; /* Relocate */
+ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_STATIC,
- static_psymbols, CUR_SYMBOL_VALUE);
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
continue;
case 'G':
- CUR_SYMBOL_VALUE += addr; /* Relocate */
+ CUR_SYMBOL_VALUE += ANOFFSET (section_offsets, SECT_OFF_DATA);
/* The addresses in these entries are reported to be
wrong. See the code that reads 'G's for symtabs. */
ADD_PSYMBOL_ADDR_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_STATIC,
- global_psymbols, CUR_SYMBOL_VALUE);
+ objfile->global_psymbols, CUR_SYMBOL_VALUE);
continue;
case 't':
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_TYPEDEF,
- static_psymbols, CUR_SYMBOL_VALUE);
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
continue;
case 'f':
+#ifdef DBXREAD_ONLY
+ /* Kludges for ELF/STABS with Sun ACC */
+ last_function_name = namestring;
+ if (pst->textlow == 0)
+ pst->textlow = CUR_SYMBOL_VALUE;
+#if 0
+ if (startup_file_end == 0)
+ startup_file_end = CUR_SYMBOL_VALUE;
+#endif
+ /* End kludge. */
+#endif /* DBXREAD_ONLY */
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_BLOCK,
- static_psymbols, CUR_SYMBOL_VALUE);
+ objfile->static_psymbols, CUR_SYMBOL_VALUE);
continue;
/* Global functions were ignored here, but now they
FIXME, why did it used to ignore these? That broke
"i fun" on these functions. */
case 'F':
+#ifdef DBXREAD_ONLY
+ /* Kludges for ELF/STABS with Sun ACC */
+ last_function_name = namestring;
+ if (pst->textlow == 0)
+ pst->textlow = CUR_SYMBOL_VALUE;
+#if 0
+ if (startup_file_end == 0)
+ startup_file_end = CUR_SYMBOL_VALUE;
+#endif
+ /* End kludge. */
+#endif /* DBXREAD_ONLY */
ADD_PSYMBOL_TO_LIST (namestring, p - namestring,
VAR_NAMESPACE, LOC_BLOCK,
- global_psymbols, CUR_SYMBOL_VALUE);
+ objfile->global_psymbols, CUR_SYMBOL_VALUE);
continue;
/* Two things show up here (hopefully); static symbols of
continue;
}
-#ifdef DBXREAD_ONLY
case N_EXCL:
+#ifdef DBXREAD_ONLY
SET_NAMESTRING();
(struct partial_symtab **)
alloca ((dependencies_allocated *= 2)
* sizeof (struct partial_symtab *));
- bcopy (orig, dependency_list,
+ memcpy ((PTR)dependency_list, (PTR)orig,
(dependencies_used
* sizeof (struct partial_symtab *)));
#ifdef DEBUG_INFO
error ("Invalid symbol data: \"repeated\" header file not previously seen, at symtab pos %d.",
symnum);
}
+#endif /* DBXREAD_ONLY */
continue;
-#endif
case N_RBRAC:
#ifdef HANDLE_RBRAC
HANDLE_RBRAC(CUR_SYMBOL_VALUE);
+ continue;
#endif
case N_EINCL:
case N_DSLINE:
case N_LBRAC:
case N_NSYMS: /* Ultrix 4.0: symbol count */
case N_DEFD: /* GNU Modula-2 */
+
+ case N_OBJ: /* useless types from Solaris */
+ case N_OPT:
+ case N_ENDM:
/* These symbols aren't interesting; don't worry about them */
continue;
default:
-#ifdef DBXREAD_ONLY
/* If we haven't found it yet, ignore it. It's probably some
new type we don't know about yet. */
complain (&unknown_symtype_complaint, local_hex_string(CUR_SYMBOL_TYPE));
-#endif
continue;
}