* stabsread.c (define_symbol): Only combine a p/r pair into a
authorJim Kingdon <jkingdon@engr.sgi.com>
Sat, 25 Dec 1993 19:50:45 +0000 (19:50 +0000)
committerJim Kingdon <jkingdon@engr.sgi.com>
Sat, 25 Dec 1993 19:50:45 +0000 (19:50 +0000)
LOC_REGPARM if REG_STRUCT_HAS_ADDR.

gdb/ChangeLog
gdb/stabsread.c

index 7ea8c77c973d967a5cc8ea874fb032edee7bdadd..0b832f5f687b72532d18a892119e28f9e3892b85 100644 (file)
@@ -1,3 +1,8 @@
+Sat Dec 25 13:39:21 1993  Jim Kingdon  (kingdon@lioth.cygnus.com)
+
+       * stabsread.c (define_symbol): Only combine a p/r pair into a
+       LOC_REGPARM if REG_STRUCT_HAS_ADDR.
+
 Sat Dec 25 09:50:29 1993  Peter Schauer  (pes@regent.e-technik.tu-muenchen.de)
 
        * valops.c (value_struct_elt): Check for (value)-1 return from
index 23df33391c9fc01f7333f80065990d96b67b9d88..4b97a608fe30354ab7013d3561cad63ea4d959b2 100644 (file)
@@ -450,6 +450,10 @@ read_type_number (pp, typenums)
 
 static char *type_synonym_name;
 
+#if !defined (REG_STRUCT_HAS_ADDR)
+#define REG_STRUCT_HAS_ADDR(gcc_p) 0
+#endif
+
 /* ARGSUSED */
 struct symbol *
 define_symbol (valu, string, desc, type, objfile)
@@ -925,16 +929,27 @@ define_symbol (valu, string, desc, type, objfile)
          SYMBOL_VALUE (sym) = SP_REGNUM;  /* Known safe, though useless */
        }
       SYMBOL_NAMESPACE (sym) = VAR_NAMESPACE;
-      if (within_function)
+      if (within_function
+         && REG_STRUCT_HAS_ADDR (processing_gcc_compilation)
+         && (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT
+             || TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION))
        {
          /* Sun cc uses a pair of symbols, one 'p' and one 'r' with the same
             name to represent an argument passed in a register.
             GCC uses 'P' for the same case.  So if we find such a symbol pair
             we combine it into one 'P' symbol.
+
+            But we only do this in the REG_STRUCT_HAS_ADDR case, so that
+            we can still get information about what is going on with the
+            stack (VAX for computing args_printed, possible future changes
+            to use stack slots instead of saved registers in backtraces,
+            etc.).
+            
             Note that this code illegally combines
-              main(argc) int argc; { register int argc = 1; }
+              main(argc) struct foo argc; { register struct foo argc; }
             but this case is considered pathological and causes a warning
             from a decent compiler.  */
+
          if (local_symbols
              && local_symbols->nsyms > 0)
            {
@@ -1123,13 +1138,9 @@ define_symbol (valu, string, desc, type, objfile)
      If REG_STRUCT_HAS_ADDR yields non-zero we have to convert LOC_REGPARM
      to LOC_REGPARM_ADDR for structures and unions.  */
 
-#if !defined (REG_STRUCT_HAS_ADDR)
-#define REG_STRUCT_HAS_ADDR(gcc_p) 0
-#endif
-
   if (SYMBOL_CLASS (sym) == LOC_REGPARM
       && REG_STRUCT_HAS_ADDR (processing_gcc_compilation)
-      && (   (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
+      && ((TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
          || (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_UNION)))
     SYMBOL_CLASS (sym) = LOC_REGPARM_ADDR;
 
This page took 0.0381 seconds and 4 git commands to generate.