aboutsummaryrefslogtreecommitdiff
path: root/gdb/mipsread.c
diff options
context:
space:
mode:
authorJim Kingdon <jkingdon@engr.sgi.com>1993-07-26 20:33:35 +0000
committerJim Kingdon <jkingdon@engr.sgi.com>1993-07-26 20:33:35 +0000
commit1c8961dd3583cfd12fdad01aa327050f73e9bf12 (patch)
tree624446ec3f7d83786f3b41baa68d5ceca619e73b /gdb/mipsread.c
parent8f22c1af216c0ea07f71fcd0e4e280ca85b3c23e (diff)
downloadfsf-binutils-gdb-1c8961dd3583cfd12fdad01aa327050f73e9bf12.zip
fsf-binutils-gdb-1c8961dd3583cfd12fdad01aa327050f73e9bf12.tar.gz
fsf-binutils-gdb-1c8961dd3583cfd12fdad01aa327050f73e9bf12.tar.bz2
* mipsread.c (parse_symbol): Put stStaticProc symbols in minimal
symbols as mst_file_text.
Diffstat (limited to 'gdb/mipsread.c')
-rw-r--r--gdb/mipsread.c77
1 files changed, 51 insertions, 26 deletions
diff --git a/gdb/mipsread.c b/gdb/mipsread.c
index da6f071..d9bd8a5 100644
--- a/gdb/mipsread.c
+++ b/gdb/mipsread.c
@@ -817,8 +817,14 @@ parse_symbol (sh, ax, ext_sh, bigend)
add_symbol (s, top_stack->cur_block);
break;
+ case stStaticProc:
+ /* I believe this is used only for file-local functions.
+ The comment in symconst.h ("load time only static procs") isn't
+ particularly clear on this point. */
+ prim_record_minimal_symbol (name, sh->value, mst_file_text);
+ /* FALLTHROUGH */
+
case stProc: /* Procedure, usually goes into global block */
- case stStaticProc: /* Static procedure, goes into current block */
s = new_symbol (name);
SYMBOL_NAMESPACE (s) = VAR_NAMESPACE;
SYMBOL_CLASS (s) = LOC_BLOCK;
@@ -922,11 +928,12 @@ parse_symbol (sh, ax, ext_sh, bigend)
ecoff_swap_sym_in (cur_bfd, ext_tsym, &tsym);
- if (tsym.st == stEnd)
- break;
-
- if (tsym.st == stMember)
+ switch (tsym.st)
{
+ case stEnd:
+ goto end_of_fields;
+
+ case stMember:
if (nfields == 0 && type_code == TYPE_CODE_UNDEF)
/* If the type of the member is Nil (or Void),
without qualifiers, assume the tag is an
@@ -945,29 +952,47 @@ parse_symbol (sh, ax, ext_sh, bigend)
nfields++;
if (tsym.value > max_value)
max_value = tsym.value;
+ break;
+
+ case stTypedef:
+ case stConstant:
+ case stStaticProc:
+ complain (&block_member_complaint, tsym.st);
+ /* These are said to show up in cfront-generated programs.
+ Apparently processing them like the following prevents
+ core dumps. */
+ /* FALLTHROUGH */
+
+ case stBlock:
+ case stUnion:
+ case stEnum:
+ case stStruct:
+ case stParsed:
+ {
+#if 0
+ /* This is a no-op; is it trying to tell us something
+ we should be checking? */
+ if (tsym.sc == scVariant); /*UNIMPLEMENTED*/
+#endif
+ if (tsym.index != 0)
+ {
+ /* This is something like a struct within a
+ struct. Skip over the fields of the inner
+ struct. The -1 is because the for loop will
+ increment ext_tsym. */
+ ext_tsym = (ecoff_data (cur_bfd)->external_sym
+ + cur_fdr->isymBase
+ + tsym.index
+ - 1);
+ }
+ }
+ break;
+
+ default:
+ complain (&block_member_complaint, tsym.st);
}
- else if (tsym.st == stBlock
- || tsym.st == stUnion
- || tsym.st == stEnum
- || tsym.st == stStruct
- || tsym.st == stParsed)
- {
- if (tsym.sc == scVariant); /*UNIMPLEMENTED*/
- if (tsym.index != 0)
- {
- /* This is something like a struct within a
- struct. Skip over the fields of the inner
- struct. The -1 is because the for loop will
- increment ext_tsym. */
- ext_tsym = (ecoff_data (cur_bfd)->external_sym
- + cur_fdr->isymBase
- + tsym.index
- - 1);
- }
- }
- else
- complain (&block_member_complaint, tsym.st);
}
+ end_of_fields:;
/* In an stBlock, there is no way to distinguish structs,
unions, and enums at this point. This is a bug in the