* stabsread.c (define_symbol): If REG_STRUCT_HAS_ADDR is non-zero,
authorPeter Schauer <Peter.Schauer@mytum.de>
Sun, 13 Oct 1996 18:40:26 +0000 (18:40 +0000)
committerPeter Schauer <Peter.Schauer@mytum.de>
Sun, 13 Oct 1996 18:40:26 +0000 (18:40 +0000)
follow typedefs before checking TYPE_CODE for structures and unions.

gdb/stabsread.c

index adc0a3640b18031ab6d225a59b0ce288353c6454..be312af7195bd72c33842980644dd0b6944dd27f 100644 (file)
@@ -1777,21 +1777,25 @@ define_symbol (valu, string, desc, type, objfile)
   /* When passing structures to a function, some systems sometimes pass
      the address in a register, not the structure itself. */
 
-  if (REG_STRUCT_HAS_ADDR (processing_gcc_compilation,
-                             SYMBOL_TYPE (sym))
-      && ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
-         || (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION)
-         || (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_BITSTRING)
-         || (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_SET)))
+  if (REG_STRUCT_HAS_ADDR (processing_gcc_compilation, SYMBOL_TYPE (sym))
+      && (SYMBOL_CLASS (sym) == LOC_REGPARM || SYMBOL_CLASS (sym) == LOC_ARG))
     {
-      /* If REG_STRUCT_HAS_ADDR yields non-zero we have to
-       convert LOC_REGPARM to LOC_REGPARM_ADDR for structures and unions. */
-      if (SYMBOL_CLASS (sym) == LOC_REGPARM)
-       SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
-      /* Likewise for converting LOC_ARG to LOC_REF_ARG (for the 7th and
-        subsequent arguments on the sparc, for example).  */
-      else if (SYMBOL_CLASS (sym) == LOC_ARG)
-       SYMBOL_CLASS (sym) = LOC_REF_ARG;
+      struct type *symbol_type = check_typedef (SYMBOL_TYPE (sym));
+
+      if ((TYPE_CODE (symbol_type) == TYPE_CODE_STRUCT)
+         || (TYPE_CODE (symbol_type) == TYPE_CODE_UNION)
+         || (TYPE_CODE (symbol_type) == TYPE_CODE_BITSTRING)
+         || (TYPE_CODE (symbol_type) == TYPE_CODE_SET))
+       {
+         /* If REG_STRUCT_HAS_ADDR yields non-zero we have to convert
+            LOC_REGPARM to LOC_REGPARM_ADDR for structures and unions. */
+         if (SYMBOL_CLASS (sym) == LOC_REGPARM)
+           SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
+         /* Likewise for converting LOC_ARG to LOC_REF_ARG (for the 7th
+            and subsequent arguments on the sparc, for example).  */
+         else if (SYMBOL_CLASS (sym) == LOC_ARG)
+           SYMBOL_CLASS (sym) = LOC_REF_ARG;
+       }
     }
 
   return sym;