From 09927bb00b0bd8103615274d8c908495d4ff04c0 Mon Sep 17 00:00:00 2001 From: Michael Meissner Date: Thu, 23 Jul 1992 19:43:08 +0000 Subject: [PATCH] entered into RCS From-SVN: r1675 --- gcc/mips-tfile.c | 54 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 48 insertions(+), 6 deletions(-) diff --git a/gcc/mips-tfile.c b/gcc/mips-tfile.c index 93275e09f5f0..58d01cd52e7d 100644 --- a/gcc/mips-tfile.c +++ b/gcc/mips-tfile.c @@ -3729,16 +3729,37 @@ parse_stabs_common (string_start, string_end, rest) else { SYMR *sym_ptr; - shash_t *shash_ptr = hash_string (p, - strlen (p) - 1, - &orig_str_hash[0], - (symint_t *)0); + shash_t *shash_ptr; + const char *start, *end_p1; + + start = p; + if ((end_p1 = strchr (start, '+')) == (char *)0) + { + if ((end_p1 = strchr (start, '-')) == (char *)0) + end_p1 = start + strlen(start) - 1; + } + + shash_ptr = hash_string (start, + end_p1 - start, + &orig_str_hash[0], + (symint_t *)0); if (shash_ptr == (shash_t *)0 || (sym_ptr = shash_ptr->sym_ptr) == (SYMR *)0) { - error ("Illegal .stabs/.stabn directive, value not found"); - return; + shash_ptr = hash_string (start, + end_p1 - start, + &ext_str_hash[0], + (symint_t *)0); + + if (shash_ptr == (shash_t *)0 + || shash_ptr->esym_ptr == (EXTR *)0) + { + error ("Illegal .stabs/.stabn directive, value not found"); + return; + } + else + sym_ptr = &(shash_ptr->esym_ptr->asym); } /* Traditionally, N_LBRAC and N_RBRAC are *not* relocated. */ @@ -3753,6 +3774,27 @@ parse_stabs_common (string_start, string_end, rest) st = (st_t) sym_ptr->st; } value = sym_ptr->value; + + ch = *end_p1++; + if (ch != '\n') + { + if (((!isdigit (*end_p1)) && (*end_p1 != '-')) + || ((ch != '+') && (ch != '-'))) + { + error ("Illegal .stabs/.stabn directive, badly formed value"); + return; + } + if (ch == '+') + value += strtol (end_p1, &p, 0); + else if (ch == '-') + value -= strtol (end_p1, &p, 0); + + if (*p != '\n') + { + error ("Illegal .stabs/.stabn directive, stuff after numeric value"); + return; + } + } } code = MIPS_MARK_STAB(code); } -- 2.43.5