Fix PR gdb/709
authorDaniel Jacobowitz <drow@false.org>
Wed, 18 Sep 2002 15:43:47 +0000 (15:43 +0000)
committerDaniel Jacobowitz <drow@false.org>
Wed, 18 Sep 2002 15:43:47 +0000 (15:43 +0000)
        * values.c (value_static_field): Call read_var_value.

gdb/ChangeLog
gdb/values.c

index 441bc14c03bf787e88b812c7d5a5b1f1404ff98b..31ee3ec344be15b04e8b00260c81b1cc13a8b7b4 100644 (file)
@@ -1,3 +1,8 @@
+2002-09-18  Daniel Jacobowitz  <drow@mvista.com>
+
+       Fix PR gdb/709
+       * values.c (value_static_field): Call read_var_value.
+
 2002-09-18  Andrew Cagney  <ac131313@redhat.com>
 
        * valops.c (hand_function_call): Align the initial stack pointer
index a0c9794bced153b210c405c22aaa11f95e51377d..c943f28fa462f1fcf6501be0869788103e02a528 100644 (file)
@@ -800,25 +800,19 @@ unpack_pointer (struct type *type, char *valaddr)
 struct value *
 value_static_field (struct type *type, int fieldno)
 {
-  CORE_ADDR addr;
-  asection *sect;
+  struct value *retval;
+
   if (TYPE_FIELD_STATIC_HAS_ADDR (type, fieldno))
     {
-      addr = TYPE_FIELD_STATIC_PHYSADDR (type, fieldno);
-      sect = NULL;
+      retval = value_at (TYPE_FIELD_TYPE (type, fieldno),
+                        TYPE_FIELD_STATIC_PHYSADDR (type, fieldno),
+                        NULL);
     }
   else
     {
       char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, fieldno);
       struct symbol *sym = lookup_symbol (phys_name, 0, VAR_NAMESPACE, 0, NULL);
-      /* In some cases (involving uninitalized, unreferenced static
-        const integral members), g++ -gdwarf-2 can emit debugging
-        information giving rise to symbols whose SYMBOL_CLASS is
-        LOC_UNRESOLVED.  In that case, do a minimal symbol lookup.
-        If it returns a useful value, then the symbol was defined
-        elsewhere, so we use that information.  Otherwise, return
-        NULL. */
-      if (sym == NULL || SYMBOL_CLASS (sym) == LOC_UNRESOLVED)
+      if (sym == NULL)
        {
          /* With some compilers, e.g. HP aCC, static data members are reported
             as non-debuggable symbols */
@@ -827,27 +821,25 @@ value_static_field (struct type *type, int fieldno)
            return NULL;
          else
            {
-             addr = SYMBOL_VALUE_ADDRESS (msym);
-             sect = SYMBOL_BFD_SECTION (msym);
+             retval = value_at (TYPE_FIELD_TYPE (type, fieldno),
+                                SYMBOL_VALUE_ADDRESS (msym),
+                                SYMBOL_BFD_SECTION (msym));
            }
        }
       else
        {
-         /* Anything static that isn't a constant, has an address */
-         if (SYMBOL_CLASS (sym) != LOC_CONST)
-           {
-             addr = SYMBOL_VALUE_ADDRESS (sym);
-             sect = SYMBOL_BFD_SECTION (sym);
-           }
-         /* However, static const's do not, the value is already known.  */
-         else
-           {
-             return value_from_longest (TYPE_FIELD_TYPE (type, fieldno), SYMBOL_VALUE (sym));
-           }
+         /* SYM should never have a SYMBOL_CLASS which will require
+            read_var_value to use the FRAME parameter.  */
+         if (symbol_read_needs_frame (sym))
+           warning ("static field's value depends on the current "
+                    "frame - bad debug info?");
+         retval = read_var_value (sym, NULL);
        }
-      SET_FIELD_PHYSADDR (TYPE_FIELD (type, fieldno), addr);
+      if (retval && VALUE_LVAL (retval) == lval_memory)
+       SET_FIELD_PHYSADDR (TYPE_FIELD (type, fieldno),
+                           VALUE_ADDRESS (retval));
     }
-  return value_at (TYPE_FIELD_TYPE (type, fieldno), addr, sect);
+  return retval;
 }
 
 /* Change the enclosing type of a value object VAL to NEW_ENCL_TYPE.