]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: function.c (assign_parms): Use all.reg_parm_stack_space instead of re-evalu...
authorBill Schmidt <wschmidt@linux.vnet.ibm.com>
Fri, 4 Apr 2014 14:09:23 +0000 (14:09 +0000)
committerWilliam Schmidt <wschmidt@gcc.gnu.org>
Fri, 4 Apr 2014 14:09:23 +0000 (14:09 +0000)
[gcc]

2014-04-04  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>

Backport from mainline r204798:

2013-11-14  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
    Alan Modra  <amodra@gmail.com>

* function.c (assign_parms): Use all.reg_parm_stack_space instead
of re-evaluating REG_PARM_STACK_SPACE target macro.
(locate_and_pad_parm): New parameter REG_PARM_STACK_SPACE.  Use it
instead of evaluating target macro REG_PARM_STACK_SPACE every time.
(assign_parm_find_entry_rtl): Update call.
* calls.c (initialize_argument_information): Update call.
(emit_library_call_value_1): Likewise.
* expr.h (locate_and_pad_parm): Update prototype.

Backport from mainline r204797:

2013-11-14  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>

* calls.c (store_unaligned_arguments_into_pseudos): Skip PARALLEL
arguments.

Backport from mainline r197003:

2013-03-23  Eric Botcazou  <ebotcazou@adacore.com>

* calls.c (expand_call): Add missing guard to code handling return
of non-BLKmode structures in MSB.
* function.c (expand_function_end): Likewise.

From-SVN: r209096

gcc/ChangeLog
gcc/calls.c
gcc/expr.h
gcc/function.c

index 7d46686609d2e7a03df5f4581632924f7a3d9f30..8670588e215e13afc6c8b6cdf8c9d5ea618e2b31 100644 (file)
@@ -1,3 +1,35 @@
+2014-04-04  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
+
+       ELFv2 ABI Call Support
+       Backport from mainline r204798:
+
+       2013-11-14  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+                   Alan Modra  <amodra@gmail.com>
+
+       * function.c (assign_parms): Use all.reg_parm_stack_space instead
+       of re-evaluating REG_PARM_STACK_SPACE target macro.
+       (locate_and_pad_parm): New parameter REG_PARM_STACK_SPACE.  Use it
+       instead of evaluating target macro REG_PARM_STACK_SPACE every time.
+       (assign_parm_find_entry_rtl): Update call.
+       * calls.c (initialize_argument_information): Update call.
+       (emit_library_call_value_1): Likewise.
+       * expr.h (locate_and_pad_parm): Update prototype.
+
+       Backport from mainline r204797:
+
+       2013-11-14  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+       * calls.c (store_unaligned_arguments_into_pseudos): Skip PARALLEL
+       arguments.
+
+       Backport from mainline r197003:
+
+       2013-03-23  Eric Botcazou  <ebotcazou@adacore.com>
+
+       * calls.c (expand_call): Add missing guard to code handling return
+       of non-BLKmode structures in MSB.
+       * function.c (expand_function_end): Likewise.
+
 2014-04-04  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
 
        Backport from mainline r201750.
index dd034b40099270d315e26501f124ed751df8dc47..bf0ba306b6615cd038a1f164e0f4a450c8b8ca9c 100644 (file)
@@ -983,6 +983,7 @@ store_unaligned_arguments_into_pseudos (struct arg_data *args, int num_actuals)
 
   for (i = 0; i < num_actuals; i++)
     if (args[i].reg != 0 && ! args[i].pass_on_stack
+       && GET_CODE (args[i].reg) != PARALLEL
        && args[i].mode == BLKmode
        && MEM_P (args[i].value)
        && (MEM_ALIGN (args[i].value)
@@ -1327,6 +1328,7 @@ initialize_argument_information (int num_actuals ATTRIBUTE_UNUSED,
 #else
                             args[i].reg != 0,
 #endif
+                            reg_parm_stack_space,
                             args[i].pass_on_stack ? 0 : args[i].partial,
                             fndecl, args_size, &args[i].locate);
 #ifdef BLOCK_REG_PADDING
@@ -3171,7 +3173,9 @@ expand_call (tree exp, rtx target, int ignore)
         group load/store machinery below.  */
       if (!structure_value_addr
          && !pcc_struct_value
+         && TYPE_MODE (rettype) != VOIDmode
          && TYPE_MODE (rettype) != BLKmode
+         && REG_P (valreg)
          && targetm.calls.return_in_msb (rettype))
        {
          if (shift_return_value (TYPE_MODE (rettype), false, valreg))
@@ -3734,7 +3738,8 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
 #else
                           argvec[count].reg != 0,
 #endif
-                          0, NULL_TREE, &args_size, &argvec[count].locate);
+                          reg_parm_stack_space, 0,
+                          NULL_TREE, &args_size, &argvec[count].locate);
 
       if (argvec[count].reg == 0 || argvec[count].partial != 0
          || reg_parm_stack_space > 0)
@@ -3821,7 +3826,7 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value,
 #else
                               argvec[count].reg != 0,
 #endif
-                              argvec[count].partial,
+                              reg_parm_stack_space, argvec[count].partial,
                               NULL_TREE, &args_size, &argvec[count].locate);
          args_size.constant += argvec[count].locate.size.constant;
          gcc_assert (!argvec[count].locate.size.var);
index 15fcb471d8d5836d7e2c96e6c4dbbfcdded16b38..98c9daeda9c3575dd1d0b9c6349f9337c483f28c 100644 (file)
@@ -521,8 +521,8 @@ extern rtx expand_divmod (int, enum tree_code, enum machine_mode, rtx, rtx,
                          rtx, int);
 #endif
 
-extern void locate_and_pad_parm (enum machine_mode, tree, int, int, tree,
-                                struct args_size *,
+extern void locate_and_pad_parm (enum machine_mode, tree, int, int, int,
+                                tree, struct args_size *,
                                 struct locate_and_pad_arg_data *);
 
 /* Return the CODE_LABEL rtx for a LABEL_DECL, creating it if necessary.  */
index 80720cb6b8f9884454b5a77a3b81ca9a75940d20..bc04dcb9d8d748abb6f2345cbdf4d61e28935013 100644 (file)
@@ -2507,6 +2507,7 @@ assign_parm_find_entry_rtl (struct assign_parm_data_all *all,
     }
 
   locate_and_pad_parm (data->promoted_mode, data->passed_type, in_regs,
+                      all->reg_parm_stack_space,
                       entry_parm ? data->partial : 0, current_function_decl,
                       &all->stack_args_size, &data->locate);
 
@@ -3485,11 +3486,7 @@ assign_parms (tree fndecl)
   /* Adjust function incoming argument size for alignment and
      minimum length.  */
 
-#ifdef REG_PARM_STACK_SPACE
-  crtl->args.size = MAX (crtl->args.size,
-                                   REG_PARM_STACK_SPACE (fndecl));
-#endif
-
+  crtl->args.size = MAX (crtl->args.size, all.reg_parm_stack_space);
   crtl->args.size = CEIL_ROUND (crtl->args.size,
                                           PARM_BOUNDARY / BITS_PER_UNIT);
 
@@ -3693,6 +3690,9 @@ gimplify_parameters (void)
    IN_REGS is nonzero if the argument will be passed in registers.  It will
    never be set if REG_PARM_STACK_SPACE is not defined.
 
+   REG_PARM_STACK_SPACE is the number of bytes of stack space reserved
+   for arguments which are passed in registers.
+
    FNDECL is the function in which the argument was defined.
 
    There are two types of rounding that are done.  The first, controlled by
@@ -3713,19 +3713,16 @@ gimplify_parameters (void)
 
 void
 locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
-                    int partial, tree fndecl ATTRIBUTE_UNUSED,
+                    int reg_parm_stack_space, int partial,
+                    tree fndecl ATTRIBUTE_UNUSED,
                     struct args_size *initial_offset_ptr,
                     struct locate_and_pad_arg_data *locate)
 {
   tree sizetree;
   enum direction where_pad;
   unsigned int boundary, round_boundary;
-  int reg_parm_stack_space = 0;
   int part_size_in_regs;
 
-#ifdef REG_PARM_STACK_SPACE
-  reg_parm_stack_space = REG_PARM_STACK_SPACE (fndecl);
-
   /* If we have found a stack parm before we reach the end of the
      area reserved for registers, skip that area.  */
   if (! in_regs)
@@ -3743,7 +3740,6 @@ locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
            initial_offset_ptr->constant = reg_parm_stack_space;
        }
     }
-#endif /* REG_PARM_STACK_SPACE */
 
   part_size_in_regs = (reg_parm_stack_space == 0 ? partial : 0);
 
@@ -3806,11 +3802,7 @@ locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
 
   locate->slot_offset.constant += part_size_in_regs;
 
-  if (!in_regs
-#ifdef REG_PARM_STACK_SPACE
-      || REG_PARM_STACK_SPACE (fndecl) > 0
-#endif
-     )
+  if (!in_regs || reg_parm_stack_space > 0)
     pad_to_arg_alignment (&locate->slot_offset, boundary,
                          &locate->alignment_pad);
 
@@ -3830,11 +3822,7 @@ locate_and_pad_parm (enum machine_mode passed_mode, tree type, int in_regs,
     pad_below (&locate->offset, passed_mode, sizetree);
 
 #else /* !ARGS_GROW_DOWNWARD */
-  if (!in_regs
-#ifdef REG_PARM_STACK_SPACE
-      || REG_PARM_STACK_SPACE (fndecl) > 0
-#endif
-      )
+  if (!in_regs || reg_parm_stack_space > 0)
     pad_to_arg_alignment (initial_offset_ptr, boundary,
                          &locate->alignment_pad);
   locate->slot_offset = *initial_offset_ptr;
@@ -5093,6 +5081,7 @@ expand_function_end (void)
             amount.  BLKmode results are handled using the group load/store
             machinery.  */
          if (TYPE_MODE (TREE_TYPE (decl_result)) != BLKmode
+             && REG_P (real_decl_rtl)
              && targetm.calls.return_in_msb (TREE_TYPE (decl_result)))
            {
              emit_move_insn (gen_rtx_REG (GET_MODE (decl_rtl),