From: Fred Fish Date: Wed, 15 Jan 1992 06:42:32 +0000 (+0000) Subject: Changes to fix bug with static variables within function scopes. X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=a5bd5ba617f30b7f5588bf1364fa2bb2658bf11b;p=deliverable%2Fbinutils-gdb.git Changes to fix bug with static variables within function scopes. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index af85e1933c..ff9b7bc745 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,12 @@ +Tue Jan 14 22:34:00 1992 Fred Fish (fnf at cygnus.com) + + * dwarfread.c (locval): Add offreg flag to indicate location + values that are computed off a base register. + + * dwarfread.c (new_symbol): Rework TAG_global_variable and + TAG_local_variable cases to account for static variables + within function scopes. + Tue Jan 14 12:28:52 1992 Stu Grossman (grossman at cygnus.com) * inflow.c: remove #include . Not necessary, and diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c index 366149a7db..b170ff74cd 100644 --- a/gdb/dwarfread.c +++ b/gdb/dwarfread.c @@ -186,6 +186,7 @@ static char *dbbase; /* Base pointer to dwarf info */ static int dbroff; /* Relative offset from start of .debug section */ static char *lnbase; /* Base pointer to line section */ static int isreg; /* Kludge to identify register variables */ +static int offreg; /* Kludge to identify basereg references */ static CORE_ADDR baseaddr; /* Add to each symbol value */ @@ -1737,6 +1738,7 @@ DEFUN(locval, (loc), char *loc) stacki = 0; stack[stacki] = 0; isreg = 0; + offreg = 0; for (loc += sizeof (short); loc < end; loc += sizeof (long)) { switch (*loc++) { @@ -1752,6 +1754,7 @@ DEFUN(locval, (loc), char *loc) case OP_BASEREG: /* push value of register (number) */ /* Actually, we compute the value as if register has 0 */ + offreg = 1; (void) memcpy (®no, loc, sizeof (long)); if (regno == R_FP) { @@ -2443,30 +2446,26 @@ DEFUN(new_symbol, (dip), struct dieinfo *dip) } break; case TAG_global_variable: - case TAG_local_variable: if (dip -> at_location != NULL) { SYMBOL_VALUE (sym) = locval (dip -> at_location); - } - if (dip -> dietag == TAG_global_variable) - { add_symbol_to_list (sym, &global_symbols); SYMBOL_CLASS (sym) = LOC_STATIC; SYMBOL_VALUE (sym) += baseaddr; } - else + break; + case TAG_local_variable: + if (dip -> at_location != NULL) { + SYMBOL_VALUE (sym) = locval (dip -> at_location); add_symbol_to_list (sym, list_in_scope); - if (context_stack_depth > 0) + if (isreg) + { + SYMBOL_CLASS (sym) = LOC_REGISTER; + } + else if (offreg) { - if (isreg) - { - SYMBOL_CLASS (sym) = LOC_REGISTER; - } - else - { - SYMBOL_CLASS (sym) = LOC_LOCAL; - } + SYMBOL_CLASS (sym) = LOC_LOCAL; } else {