2002-08-19 David Carlton <carlton@math.stanford.edu>
authorDavid Carlton <carlton@bactrian.org>
Mon, 19 Aug 2002 23:19:53 +0000 (23:19 +0000)
committerDavid Carlton <carlton@bactrian.org>
Mon, 19 Aug 2002 23:19:53 +0000 (23:19 +0000)
* valops.c (search_struct_field): Change error message to treat
return value of 0 from value_static_field as meaning that field is
optimized out.
(value_struct_elt_for_reference): Ditto.
* values.c (value_static_field): Treat an unresolved location the
same as a nonexistent symbol.  Fix PR gdb/635.

gdb/ChangeLog
gdb/valops.c
gdb/values.c

index 1a46bc66e8cea981ba1021f3ceefa58077fb34f2..b384e94f4f7a902411bdfd5303f9f43d16c2c1a4 100644 (file)
@@ -1,5 +1,11 @@
 2002-08-19  David Carlton  <carlton@math.stanford.edu>
 
+       * valops.c (search_struct_field): Change error message to treat
+       return value of 0 from value_static_field as meaning that field is
+       optimized out.
+       (value_struct_elt_for_reference): Ditto.
+       * values.c (value_static_field): Treat an unresolved location the
+       same as a nonexistent symbol.  Fix PR gdb/635.
        * gnu-v2-abi.c (gnuv2_value_rtti_type): Eliminate test for being
        enclosed.  Fix PR gdb/574.
        * MAINTAINERS: Add self to Write After Approval list.
index 1d0039f32f7852b2b450f73bb868801713185d79..d7c889fc4e7881baeaa4d0f8d1f893133bb22862 100644 (file)
@@ -2054,11 +2054,18 @@ search_struct_field (char *name, struct value *arg1, int offset,
          {
            struct value *v;
            if (TYPE_FIELD_STATIC (type, i))
-             v = value_static_field (type, i);
+             {
+               v = value_static_field (type, i);
+               if (v == 0)
+                 error ("field %s is nonexistent or has been optimised out",
+                        name);
+             }
            else
-             v = value_primitive_field (arg1, offset, i, type);
-           if (v == 0)
-             error ("there is no field named %s", name);
+             {
+               v = value_primitive_field (arg1, offset, i, type);
+               if (v == 0)
+                 error ("there is no field named %s", name);
+             }
            return v;
          }
 
@@ -3043,7 +3050,7 @@ value_struct_elt_for_reference (struct type *domain, int offset,
            {
              v = value_static_field (t, i);
              if (v == NULL)
-               error ("Internal error: could not find static variable %s",
+               error ("static field %s has been optimized out",
                       name);
              return v;
            }
index debea40b828ca1d0d7cb7f052467f6dd23eb9aca..6e07c90ed8187f035566c60b56420f6a3f7e58f1 100644 (file)
@@ -793,7 +793,9 @@ unpack_pointer (struct type *type, char *valaddr)
 }
 
 \f
-/* Get the value of the FIELDN'th field (which must be static) of TYPE. */
+/* Get the value of the FIELDN'th field (which must be static) of
+   TYPE.  Return NULL if the field doesn't exist or has been
+   optimized out. */
 
 struct value *
 value_static_field (struct type *type, int fieldno)
@@ -809,7 +811,14 @@ value_static_field (struct type *type, int fieldno)
     {
       char *phys_name = TYPE_FIELD_STATIC_PHYSNAME (type, fieldno);
       struct symbol *sym = lookup_symbol (phys_name, 0, VAR_NAMESPACE, 0, NULL);
-      if (sym == 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)
        {
          /* With some compilers, e.g. HP aCC, static data members are reported
             as non-debuggable symbols */