expr.c (expand_expr): Handle when op0 is RETURN_DECL passed in multiple non-contiguou...
authorJakub Jelinek <jakub@redhat.com>
Wed, 8 Nov 2000 13:10:00 +0000 (14:10 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 8 Nov 2000 13:10:00 +0000 (14:10 +0100)
* expr.c (expand_expr) [ADDR_EXPR]: Handle when op0 is RETURN_DECL
passed in multiple non-contiguous locations.

From-SVN: r37316

gcc/ChangeLog
gcc/expr.c

index 67c8b208bc826ea917eb8faae21c9c6275f8ba01..053253f967434f03728aaa9efa3f44b1cb3f5f5c 100644 (file)
@@ -1,3 +1,8 @@
+2000-11-08  Jakub Jelinek  <jakub@redhat.com>
+
+       * expr.c (expand_expr) [ADDR_EXPR]: Handle when op0 is RETURN_DECL
+       passed in multiple non-contiguous locations.
+
 2000-11-08  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
        * README.gnat: Remove file.
index 22ed6ad31353e6817bddb3e4dc73a7d648e42587..b28db7f67b8cc3b8bd10b9d1239bbaab54422b3d 100644 (file)
@@ -8371,7 +8371,8 @@ expand_expr (exp, target, tmode, modifier)
            }
 
          else if (GET_CODE (op0) == REG || GET_CODE (op0) == SUBREG
-                  || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF)
+                  || GET_CODE (op0) == CONCAT || GET_CODE (op0) == ADDRESSOF
+                  || GET_CODE (op0) == PARALLEL)
            {
              /* If this object is in a register, it must be not
                 be BLKmode.  */
@@ -8379,7 +8380,14 @@ expand_expr (exp, target, tmode, modifier)
              rtx memloc = assign_temp (inner_type, 1, 1, 1);
 
              mark_temp_addr_taken (memloc);
-             emit_move_insn (memloc, op0);
+             if (GET_CODE (op0) == PARALLEL)
+               /* Handle calls that pass values in multiple non-contiguous
+                  locations.  The Irix 6 ABI has examples of this.  */
+               emit_group_store (memloc, op0,
+                                 int_size_in_bytes (inner_type),
+                                 TYPE_ALIGN (inner_type));
+             else
+               emit_move_insn (memloc, op0);
              op0 = memloc;
            }