Remove global call sets: function.c
authorRichard Sandiford <richard.sandiford@arm.com>
Mon, 30 Sep 2019 16:20:41 +0000 (16:20 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Mon, 30 Sep 2019 16:20:41 +0000 (16:20 +0000)
Whatever the rights and wrongs of the way aggregate_value_p
handles call-preserved registers, it's a de facto part of the ABI,
so we shouldn't change it.  The patch simply extends the current
approach to whatever call-preserved set the function happens to
be using.

2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>

gcc/
* function.c (aggregate_value_p): Work out which ABI the
function is using before testing which registers are at least
partly preserved by a call.

From-SVN: r276322

gcc/ChangeLog
gcc/function.c

index 138f3f0c0bc9684c440c6f957cf36fe505cb0f05..9d8b083d539c3d247952e191bed64a4fc192ab7e 100644 (file)
@@ -1,3 +1,9 @@
+2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
+
+       * function.c (aggregate_value_p): Work out which ABI the
+       function is using before testing which registers are at least
+       partly preserved by a call.
+
 2019-09-30  Richard Sandiford  <richard.sandiford@arm.com>
 
        * early-remat.c: Include regs.h and function-abi.h.
index c3aa6a5e9c595f313cf738cc665119290dd8d231..a1c76a4dd7a84554f746c6ab99717cfe54ed0390 100644 (file)
@@ -2120,10 +2120,17 @@ aggregate_value_p (const_tree exp, const_tree fntype)
   if (!REG_P (reg))
     return 0;
 
+  /* Use the default ABI if the type of the function isn't known.
+     The scheme for handling interoperability between different ABIs
+     requires us to be able to tell when we're calling a function with
+     a nondefault ABI.  */
+  const predefined_function_abi &abi = (fntype
+                                       ? fntype_abi (fntype)
+                                       : default_function_abi);
   regno = REGNO (reg);
   nregs = hard_regno_nregs (regno, TYPE_MODE (type));
   for (i = 0; i < nregs; i++)
-    if (! call_used_or_fixed_reg_p (regno + i))
+    if (!fixed_regs[regno + i] && !abi.clobbers_full_reg_p (regno + i))
       return 1;
 
   return 0;