#ifndef SET_NAMESTRING_PREFIX
#define SET_NAMESTRING_PREFIX(prefix) SET_NAMESTRING()
#endif
switch (CUR_SYMBOL_TYPE)
{
char *p;
case N_TEXT | N_EXT:
case N_NBTEXT | N_EXT:
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
goto record_it;
case N_DATA | N_EXT:
case N_NBDATA | N_EXT:
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
goto record_it;
case N_BSS:
case N_BSS | N_EXT:
case N_NBBSS | N_EXT:
case N_SETV | N_EXT:
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_BSS (objfile));
goto record_it;
case N_ABS | N_EXT:
record_it:
#ifdef DBXREAD_ONLY
SET_NAMESTRING_PREFIX (prefix);
bss_ext_symbol:
record_minimal_symbol (namestring, CUR_SYMBOL_VALUE,
CUR_SYMBOL_TYPE, objfile);
#endif
continue;
case N_NBTEXT:
case N_FN:
case N_FN_SEQ:
case N_TEXT:
#ifdef DBXREAD_ONLY
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
SET_NAMESTRING_PREFIX (prefix);
if ((namestring[0] == '-' && namestring[1] == 'l')
|| (namestring[(nsl = strlen (namestring)) - 1] == 'o'
&& namestring[nsl - 2] == '.'))
{
if (objfile->ei.entry_point < CUR_SYMBOL_VALUE &&
objfile->ei.entry_point >= last_o_file_start)
{
objfile->ei.entry_file_lowpc = last_o_file_start;
objfile->ei.entry_file_highpc = CUR_SYMBOL_VALUE;
}
if (past_first_source_file && pst
&& CUR_SYMBOL_VALUE >= pst->textlow)
{
END_PSYMTAB (pst, psymtab_include_list, includes_used,
symnum * symbol_size,
CUR_SYMBOL_VALUE > pst->texthigh
? CUR_SYMBOL_VALUE : pst->texthigh,
dependency_list, dependencies_used, textlow_not_set);
pst = (struct partial_symtab *) 0;
includes_used = 0;
dependencies_used = 0;
}
else
past_first_source_file = 1;
last_o_file_start = CUR_SYMBOL_VALUE;
}
else
goto record_it;
#endif
continue;
case N_DATA:
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
goto record_it;
case N_UNDF | N_EXT:
#ifdef DBXREAD_ONLY
if (CUR_SYMBOL_VALUE != 0)
{
CORE_ADDR reladdr;
SET_NAMESTRING_PREFIX (prefix);
if (target_lookup_symbol (namestring, &reladdr))
{
continue;
}
CUR_SYMBOL_TYPE ^= (N_BSS ^ N_UNDF);
CUR_SYMBOL_VALUE = reladdr;
goto bss_ext_symbol;
}
#endif
continue;
case N_UNDF:
#ifdef DBXREAD_ONLY
if (processing_acc_compilation && CUR_SYMBOL_STRX == 1)
{
past_first_source_file = 1;
file_string_table_offset = next_file_string_table_offset;
next_file_string_table_offset =
file_string_table_offset + CUR_SYMBOL_VALUE;
if (next_file_string_table_offset < file_string_table_offset)
error ("string table offset backs up at %d", symnum);
continue;
}
#endif
continue;
case N_ABS:
case N_NBDATA:
case N_NBBSS:
continue;
case N_INDR:
case N_INDR | N_EXT:
case N_SETA:
case N_SETA | N_EXT:
case N_SETT:
case N_SETT | N_EXT:
case N_SETD:
case N_SETD | N_EXT:
case N_SETB:
case N_SETB | N_EXT:
case N_SETV:
continue;
case N_SO:
{
unsigned long valu;
static int prev_so_symnum = -10;
static int first_so_symnum;
char *p;
int prev_textlow_not_set;
valu = CUR_SYMBOL_VALUE + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
prev_textlow_not_set = textlow_not_set;
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
if (CUR_SYMBOL_VALUE == 0)
{
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)
{
first_so_symnum = symnum;
if (pst)
{
END_PSYMTAB (pst, psymtab_include_list, includes_used,
symnum * symbol_size,
valu > pst->texthigh ? valu : pst->texthigh,
dependency_list, dependencies_used,
prev_textlow_not_set);
pst = (struct partial_symtab *) 0;
includes_used = 0;
dependencies_used = 0;
}
}
prev_so_symnum = symnum;
SET_NAMESTRING ();
if (*namestring == '\000')
continue;
p = strrchr (namestring, '/');
if (p && *(p + 1) == '\000')
continue;
if (!pst)
pst = START_PSYMTAB (objfile,
namestring, valu,
first_so_symnum * symbol_size,
objfile->global_psymbols.next,
objfile->static_psymbols.next);
continue;
}
case N_BINCL:
{
#ifdef DBXREAD_ONLY
enum language tmp_language;
SET_NAMESTRING ();
tmp_language = deduce_language_from_filename (namestring);
if (tmp_language != language_unknown
&& (tmp_language != language_c
|| psymtab_language != language_cplus))
psymtab_language = tmp_language;
if (pst == NULL)
{
complain (&unclaimed_bincl_complaint, namestring, symnum);
continue;
}
add_bincl_to_list (pst, namestring, CUR_SYMBOL_VALUE);
goto record_include_file;
#else
continue;
#endif
}
case N_SOL:
{
enum language tmp_language;
SET_NAMESTRING ();
tmp_language = deduce_language_from_filename (namestring);
if (tmp_language != language_unknown
&& (tmp_language != language_c
|| psymtab_language != language_cplus))
psymtab_language = tmp_language;
if (pst && STREQ (namestring, pst->filename))
continue;
{
register int i;
for (i = 0; i < includes_used; i++)
if (STREQ (namestring, psymtab_include_list[i]))
{
i = -1;
break;
}
if (i == -1)
continue;
}
#ifdef DBXREAD_ONLY
record_include_file:
#endif
psymtab_include_list[includes_used++] = namestring;
if (includes_used >= includes_allocated)
{
char **orig = psymtab_include_list;
psymtab_include_list = (char **)
alloca ((includes_allocated *= 2) *
sizeof (char *));
memcpy ((PTR) psymtab_include_list, (PTR) orig,
includes_used * sizeof (char *));
}
continue;
}
case N_LSYM:
case N_STSYM:
case N_LCSYM:
case N_ROSYM:
case N_NBSTS:
case N_NBLCS:
break;
case N_FUN:
case N_GSYM:
case N_PC:
case N_M2C:
case N_SCOPE:
SET_NAMESTRING_PREFIX (prefix);
#ifdef DBXREAD_ONLY
if (pst && CUR_SYMBOL_TYPE == N_FUN && *namestring == '\000')
{
unsigned long valu;
valu = CUR_SYMBOL_VALUE + last_function_start;
if (pst->texthigh == 0 || valu > pst->texthigh)
pst->texthigh = valu;
break;
}
#endif
p = (char *) stabsread_objc_colon (namestring);
if (!p)
continue;
switch (p[1])
{
case 'S':
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
#ifdef STATIC_TRANSFORM_NAME
namestring = STATIC_TRANSFORM_NAME (namestring);
#endif
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_STATIC,
&objfile->static_psymbols,
0, CUR_SYMBOL_VALUE,
psymtab_language, objfile);
continue;
case 'G':
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_DATA (objfile));
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_STATIC,
&objfile->global_psymbols,
0, CUR_SYMBOL_VALUE,
psymtab_language, objfile);
continue;
case 'T':
if (p >= namestring + 2
|| (p == namestring + 1
&& namestring[0] != ' '))
{
add_psymbol_to_list (namestring, p - namestring,
STRUCT_NAMESPACE, LOC_TYPEDEF,
&objfile->static_psymbols,
CUR_SYMBOL_VALUE, 0,
psymtab_language, objfile);
if (p[2] == 't')
{
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_TYPEDEF,
&objfile->static_psymbols,
CUR_SYMBOL_VALUE, 0,
psymtab_language, objfile);
p += 1;
}
else if ((psymtab_language == language_cplus)
|| (psymtab_language == language_objc))
{
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_TYPEDEF,
&objfile->static_psymbols,
CUR_SYMBOL_VALUE, 0,
psymtab_language, objfile);
}
}
goto check_enum;
case 't':
if (p != namestring)
{
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_TYPEDEF,
&objfile->static_psymbols,
CUR_SYMBOL_VALUE, 0,
psymtab_language, objfile);
}
check_enum:
p += 2;
while ((*p >= '0' && *p <= '9')
|| *p == '(' || *p == ',' || *p == ')'
|| *p == '=')
p++;
if (*p++ == 'e')
{
if (*p == '-')
{
while (*p != ':')
p++;
p++;
}
while (*p && *p != ';' && *p != ',')
{
char *q;
if (*p == '\\' || (*p == '?' && p[1] == '\0'))
p = next_symbol_text (objfile);
for (q = p; *q && *q != ':'; q++)
;
add_psymbol_to_list (p, q - p,
VAR_NAMESPACE, LOC_CONST,
&objfile->static_psymbols, 0,
0, psymtab_language, objfile);
p = q;
while (*p && *p != ',')
p++;
if (*p)
p++;
}
}
continue;
case 'c':
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_CONST,
&objfile->static_psymbols, CUR_SYMBOL_VALUE,
0, psymtab_language, objfile);
continue;
case 'f':
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
#ifdef DBXREAD_ONLY
last_function_name = namestring;
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
if (pst && textlow_not_set)
{
pst->textlow =
find_stab_function_addr (namestring, pst->filename, objfile);
textlow_not_set = 0;
}
#endif
last_function_start = CUR_SYMBOL_VALUE;
if (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;
}
#endif
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_BLOCK,
&objfile->static_psymbols,
0, CUR_SYMBOL_VALUE,
psymtab_language, objfile);
continue;
case 'F':
CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
#ifdef DBXREAD_ONLY
last_function_name = namestring;
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
if (CUR_SYMBOL_VALUE == ANOFFSET (objfile->section_offsets,
SECT_OFF_TEXT (objfile)))
CUR_SYMBOL_VALUE =
find_stab_function_addr (namestring, pst->filename, objfile);
if (pst && textlow_not_set)
{
pst->textlow = CUR_SYMBOL_VALUE;
textlow_not_set = 0;
}
#endif
last_function_start = CUR_SYMBOL_VALUE;
if (textlow_not_set
|| (pst && 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;
}
#endif
add_psymbol_to_list (namestring, p - namestring,
VAR_NAMESPACE, LOC_BLOCK,
&objfile->global_psymbols,
0, CUR_SYMBOL_VALUE,
psymtab_language, objfile);
continue;
case 'V':
case '(':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '-':
case '#':
case 'Z':
case 'P':
continue;
case ':':
continue;
default:
complain (&unknown_symchar_complaint, p[1]);
continue;
}
case N_EXCL:
#ifdef DBXREAD_ONLY
SET_NAMESTRING ();
{
struct partial_symtab *needed_pst =
find_corresponding_bincl_psymtab (namestring, CUR_SYMBOL_VALUE);
if (needed_pst == pst)
continue;
if (needed_pst)
{
int i;
int found = 0;
for (i = 0; i < dependencies_used; i++)
if (dependency_list[i] == needed_pst)
{
found = 1;
break;
}
if (found)
continue;
dependency_list[dependencies_used++] = needed_pst;
if (dependencies_used >= dependencies_allocated)
{
struct partial_symtab **orig = dependency_list;
dependency_list =
(struct partial_symtab **)
alloca ((dependencies_allocated *= 2)
* sizeof (struct partial_symtab *));
memcpy ((PTR) dependency_list, (PTR) orig,
(dependencies_used
* sizeof (struct partial_symtab *)));
#ifdef DEBUG_INFO
fprintf_unfiltered (gdb_stderr, "Had to reallocate dependency list.\n");
fprintf_unfiltered (gdb_stderr, "New dependencies allocated: %d\n",
dependencies_allocated);
#endif
}
}
}
#endif
continue;
case N_ENDM:
#ifdef SOFUN_ADDRESS_MAYBE_MISSING
if (pst)
{
END_PSYMTAB (pst, psymtab_include_list, includes_used,
symnum * symbol_size,
(CORE_ADDR) 0,
dependency_list, dependencies_used, textlow_not_set);
pst = (struct partial_symtab *) 0;
includes_used = 0;
dependencies_used = 0;
}
#endif
continue;
case N_RBRAC:
#ifdef HANDLE_RBRAC
HANDLE_RBRAC (CUR_SYMBOL_VALUE);
continue;
#endif
case N_EINCL:
case N_DSLINE:
case N_BSLINE:
case N_SSYM:
case N_ENTRY:
case N_MAIN:
case N_CATCH:
case N_EHDECL:
case N_LENG:
case N_BCOMM:
case N_ECOMM:
case N_ECOML:
case N_FNAME:
case N_SLINE:
case N_RSYM:
case N_PSYM:
case N_LBRAC:
case N_NSYMS:
case N_DEFD:
case N_ALIAS:
case N_OBJ:
case N_OPT:
case N_BNSYM:
case N_ENSYM:
continue;
default:
complain (&unknown_symtype_complaint,
local_hex_string (CUR_SYMBOL_TYPE));
continue;
}