/* Shared code to pre-read a stab (dbx-style), when building a psymtab.
- Copyright 1986, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 1998
+ Copyright 1986, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995,
+ 1996, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
This file is part of GDB.
switch (CUR_SYMBOL_TYPE)
{
+ static struct complaint function_outside_compilation_unit = {
+ "function `%s' appears to be defined outside of all compilation units", 0, 0
+ };
char *p;
/*
* Standard, external, non-debugger, symbols
case N_SO:
{
- unsigned long valu;
+ CORE_ADDR valu;
static int prev_so_symnum = -10;
static int first_so_symnum;
char *p;
/* See if this is an end of function stab. */
if (pst && CUR_SYMBOL_TYPE == N_FUN && *namestring == '\000')
{
- unsigned long valu;
+ CORE_ADDR valu;
/* It's value is the size (in bytes) of the function for
function relative stabs, or the address of the function's
continue;
case 'f':
+ if (! pst)
+ {
+ int name_len = p - namestring;
+ char *name = xmalloc (name_len + 1);
+ memcpy (name, namestring, name_len);
+ name[name_len] = '\0';
+ complain (&function_outside_compilation_unit, name);
+ xfree (name);
+ }
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
#ifdef DBXREAD_ONLY
/* Kludges for ELF/STABS with Sun ACC */
#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 (pst && textlow_not_set)
+ if (CUR_SYMBOL_VALUE == ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile)))
{
- pst->textlow =
+ CORE_ADDR minsym_valu =
find_stab_function_addr (namestring, pst->filename, objfile);
+ /* find_stab_function_addr will return 0 if the minimal
+ symbol wasn't found. (Unfortunately, this might also
+ be a valid address.) Anyway, if it *does* return 0,
+ it is likely that the value was set correctly to begin
+ with... */
+ if (minsym_valu != 0)
+ CUR_SYMBOL_VALUE = minsym_valu;
+ }
+ if (pst && textlow_not_set)
+ {
+ pst->textlow = CUR_SYMBOL_VALUE;
textlow_not_set = 0;
}
#endif
the bounds created by N_SO symbols. If that's the case
use the address of this function as the low bound for
the partial symbol table. */
- if (textlow_not_set
- || (CUR_SYMBOL_VALUE < pst->textlow
- && CUR_SYMBOL_VALUE
- != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))))
+ if (pst
+ && (textlow_not_set
+ || (CUR_SYMBOL_VALUE < pst->textlow
+ && (CUR_SYMBOL_VALUE
+ != ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile))))))
{
pst->textlow = CUR_SYMBOL_VALUE;
textlow_not_set = 0;
are put into the global psymtab like one would expect.
They're also in the minimal symbol table. */
case 'F':
+ if (! pst)
+ {
+ int name_len = p - namestring;
+ char *name = xmalloc (name_len + 1);
+ memcpy (name, namestring, name_len);
+ name[name_len] = '\0';
+ complain (&function_outside_compilation_unit, name);
+ xfree (name);
+ }
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
#ifdef DBXREAD_ONLY
/* Kludges for ELF/STABS with Sun ACC */
value for the bottom of the text seg in those cases. */
if (CUR_SYMBOL_VALUE == ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile)))
- CUR_SYMBOL_VALUE =
- find_stab_function_addr (namestring, pst->filename, objfile);
+ {
+ CORE_ADDR minsym_valu =
+ find_stab_function_addr (namestring, pst->filename, objfile);
+ /* find_stab_function_addr will return 0 if the minimal
+ symbol wasn't found. (Unfortunately, this might also
+ be a valid address.) Anyway, if it *does* return 0,
+ it is likely that the value was set correctly to begin
+ with... */
+ if (minsym_valu != 0)
+ CUR_SYMBOL_VALUE = minsym_valu;
+ }
if (pst && textlow_not_set)
{
pst->textlow = CUR_SYMBOL_VALUE;
the bounds created by N_SO symbols. If that's the case
use the address of this function as the low bound for
the partial symbol table. */
- if (textlow_not_set
- || (CUR_SYMBOL_VALUE < pst->textlow
- && CUR_SYMBOL_VALUE
- != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))))
+ if (pst
+ && (textlow_not_set
+ || (CUR_SYMBOL_VALUE < pst->textlow
+ && (CUR_SYMBOL_VALUE
+ != ANOFFSET (objfile->section_offsets,
+ SECT_OFF_TEXT (objfile))))))
{
pst->textlow = CUR_SYMBOL_VALUE;
textlow_not_set = 0;