diff options
author | Joel Brobecker <brobecker@gnat.com> | 2003-01-03 15:29:29 +0000 |
---|---|---|
committer | Joel Brobecker <brobecker@gnat.com> | 2003-01-03 15:29:29 +0000 |
commit | bbbdd5cc7bbcd8ec7bfd353f76522df228ea39b0 (patch) | |
tree | fcd27450d36024668fe99651c8a957c3f988c8fc /gdb/mdebugread.c | |
parent | 290d4669e95c8a664eb224a0c0445e1032c40c1e (diff) | |
download | gdb-bbbdd5cc7bbcd8ec7bfd353f76522df228ea39b0.tar.gz |
(parse_symbol): Skip stProc entries which storage class is not scText.
These do not define "real" procedures.
(parse_partial_symbols): Likewise.
Fixes [C102-001].
Diffstat (limited to 'gdb/mdebugread.c')
-rw-r--r-- | gdb/mdebugread.c | 77 |
1 files changed, 55 insertions, 22 deletions
diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c index b5a15c38d7d..92557d28bff 100644 --- a/gdb/mdebugread.c +++ b/gdb/mdebugread.c @@ -751,6 +751,33 @@ parse_symbol (SYMR *sh, union aux_ext *ax, char *ext_sh, int bigend, case stProc: /* Procedure, usually goes into global block */ case stStaticProc: /* Static procedure, goes into current block */ + /* Make sure this is a "real" procedure. Otherwise, skip it. */ + if (sh->st == stProc && sh->sc != scText) + { + char *ext_tsym = ext_sh; + int keep_counting = 1; + SYMR tsym; + + while (keep_counting) + { + ext_tsym += external_sym_size; + (*swap_sym_in) (cur_bfd, ext_tsym, &tsym); + count++; + switch (tsym.st) + { + case stParam: + break; + case stEnd: + keep_counting = 0; + break; + default: + complaint (&symfile_complaints, + "unknown symbol type 0x%x", sh->st); + break; + } + } + break; + } s = new_symbol (name); SYMBOL_NAMESPACE (s) = VAR_NAMESPACE; SYMBOL_CLASS (s) = LOC_BLOCK; @@ -3323,6 +3350,34 @@ parse_partial_symbols (struct objfile *objfile) /* FALLTHROUGH */ case stProc: + /* Ignore all parameter symbol records. */ + if (sh.index >= hdr->iauxMax) + { + /* Should not happen, but does when cross-compiling + with the MIPS compiler. FIXME -- pull later. */ + index_complaint (name); + new_sdx = cur_sdx + 1; /* Don't skip at all */ + } + else + new_sdx = AUX_GET_ISYM (fh->fBigendian, + (debug_info->external_aux + + fh->iauxBase + + sh.index)); + + if (new_sdx <= cur_sdx) + { + /* This should not happen either... FIXME. */ + complaint (&symfile_complaints, + "bad proc end in aux found from symbol %s", + name); + new_sdx = cur_sdx + 1; /* Don't skip backward */ + } + + /* Make sure that this stProc entry represents a "real" + procedure. If not, ignore it. */ + if (sh.st == stProc && sh.sc != scText) + goto skip; + /* Usually there is a local and a global stProc symbol for a function. This means that the function name has already been entered into the mimimal symbol table @@ -3345,30 +3400,8 @@ parse_partial_symbols (struct objfile *objfile) &objfile->static_psymbols, 0, sh.value, psymtab_language, objfile); - /* Skip over procedure to next one. */ - if (sh.index >= hdr->iauxMax) - { - /* Should not happen, but does when cross-compiling - with the MIPS compiler. FIXME -- pull later. */ - index_complaint (name); - new_sdx = cur_sdx + 1; /* Don't skip at all */ - } - else - new_sdx = AUX_GET_ISYM (fh->fBigendian, - (debug_info->external_aux - + fh->iauxBase - + sh.index)); procaddr = sh.value; - if (new_sdx <= cur_sdx) - { - /* This should not happen either... FIXME. */ - complaint (&symfile_complaints, - "bad proc end in aux found from symbol %s", - name); - new_sdx = cur_sdx + 1; /* Don't skip backward */ - } - cur_sdx = new_sdx; (*swap_sym_in) (cur_bfd, ((char *) debug_info->external_sym |