aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog9
-rw-r--r--gdb/dwarfread.c27
2 files changed, 22 insertions, 14 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index af85e19..ff9b7bc 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 <sys/dir.h>. Not necessary, and
diff --git a/gdb/dwarfread.c b/gdb/dwarfread.c
index 366149a..b170ff7 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 (&regno, 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
{