rs6000, darwin - fix bootstrap.
authorIain Sandoe <iain@sandoe.co.uk>
Wed, 12 Dec 2018 08:42:28 +0000 (08:42 +0000)
committerIain Sandoe <iains@gcc.gnu.org>
Wed, 12 Dec 2018 08:42:28 +0000 (08:42 +0000)
Recent changes to the lowerings for call handling in rs6000
have broken bootstrap for powerpc-darwin.  This patch modifies
the calls to handle Darwin asa subset, a subsequent patch will
split Darwin out.

2018-12-12  Iain Sandoe  <iain@sandoe.co.uk>

* config/rs6000/darwin.md (call_indirect_nonlocal_darwin64): Remove.
(call_nonlocal_darwin64): Remove.
(call_value_indirect_nonlocal_darwin64): Remove.
(call_value_nonlocal_darwin64): Remove.
* config/rs6000/rs6000.c (rs6000_call_template_1): Handle Darwin with
the same asm output as AIX/ELFv2.  (rs6000_call_sysv): Preserve the
CALL_LONG flag when needed for Darwin.
* config/rs6000/rs6000.md (define expand “call”): Expand Darwin as
per sysv.
(define_expand “call_value”): Likewise.
(define_expand “sibcall”): Likewise.
(define_expand “sibcall_value”): Likewise.
(call_indirect_nonlocal_sysv): Mark the clobber mode P.
(call_nonlocal_sysv): Likewise.
(call_nonlocal_sysv_secure): Likewise.
(call_value_indirect_nonlocal_sysv): Likewise.
(call_value_nonlocal_sysv): Likewise.
(call_value_nonlocal_sysv_secure): Likewise.
(call_local64): Mark the clobber DI.
(call_value_local64): Likewise.

From-SVN: r267046

gcc/ChangeLog
gcc/config/rs6000/darwin.md
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.md

index 566f560667f1b8ec65553533b6258b70bf172fb0..2fba17e1ffc0f23fc2152089500338bfb4cf9b17 100644 (file)
@@ -1,3 +1,26 @@
+2018-12-12  Iain Sandoe  <iain@sandoe.co.uk>
+
+       * config/rs6000/darwin.md (call_indirect_nonlocal_darwin64): Remove.
+       (call_nonlocal_darwin64): Remove.
+       (call_value_indirect_nonlocal_darwin64): Remove.
+       (call_value_nonlocal_darwin64): Remove.
+       * config/rs6000/rs6000.c (rs6000_call_template_1): Handle Darwin with
+       the same asm output as AIX/ELFv2.  (rs6000_call_sysv): Preserve the
+       CALL_LONG flag when needed for Darwin.
+       * config/rs6000/rs6000.md (define expand “call”): Expand Darwin as
+       per sysv.
+       (define_expand “call_value”): Likewise.
+       (define_expand “sibcall”): Likewise.
+       (define_expand “sibcall_value”): Likewise.
+       (call_indirect_nonlocal_sysv): Mark the clobber mode P.
+       (call_nonlocal_sysv): Likewise.
+       (call_nonlocal_sysv_secure): Likewise.
+       (call_value_indirect_nonlocal_sysv): Likewise.
+       (call_value_nonlocal_sysv): Likewise.
+       (call_value_nonlocal_sysv_secure): Likewise.
+       (call_local64): Mark the clobber DI.
+       (call_value_local64): Likewise.
+
 2018-12-11  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/88444
index a1c07702d6ff1207041eef25ed4e705985081d18..ff8062c1100f9fd74d509a9f8eb13cf2a2c325c4 100644 (file)
@@ -300,66 +300,6 @@ You should have received a copy of the GNU General Public License
   "addis %0,%1,ha16(%2-%3)\n\taddi %0,%0,lo16(%2-%3)"
   [(set_attr "length" "8")])
 
-(define_insn "*call_indirect_nonlocal_darwin64"
-  [(call (mem:SI (match_operand:DI 0 "register_operand" "c,*l,c,*l"))
-        (match_operand 1))
-   (use (match_operand:SI 2 "immediate_operand" "O,O,n,n"))
-   (clobber (reg:SI LR_REGNO))]
-  "DEFAULT_ABI == ABI_DARWIN && TARGET_64BIT"
-{
-  return "b%T0l";
-}
-  [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
-   (set_attr "length" "4,4,8,8")])
-
-(define_insn "*call_nonlocal_darwin64"
-  [(call (mem:SI (match_operand:DI 0 "symbol_ref_operand" "s,s"))
-        (match_operand 1))
-   (use (match_operand:SI 2 "immediate_operand" "O,n"))
-   (clobber (reg:SI LR_REGNO))]
-  "(DEFAULT_ABI == ABI_DARWIN)
-   && (INTVAL (operands[2]) & CALL_LONG) == 0"
-{
-#if TARGET_MACHO
-  return output_call(insn, operands, 0, 2);
-#else
-  gcc_unreachable ();
-#endif
-}
-  [(set_attr "type" "branch,branch")
-   (set_attr "length" "4,8")])
-
-(define_insn "*call_value_indirect_nonlocal_darwin64"
-  [(set (match_operand 0 "" "")
-       (call (mem:SI (match_operand:DI 1 "register_operand" "c,*l,c,*l"))
-             (match_operand 2)))
-   (use (match_operand:SI 3 "immediate_operand" "O,O,n,n"))
-   (clobber (reg:SI LR_REGNO))]
-  "DEFAULT_ABI == ABI_DARWIN"
-{
-  return "b%T1l";
-}
-  [(set_attr "type" "jmpreg,jmpreg,jmpreg,jmpreg")
-   (set_attr "length" "4,4,8,8")])
-
-(define_insn "*call_value_nonlocal_darwin64"
-  [(set (match_operand 0 "" "")
-       (call (mem:SI (match_operand:DI 1 "symbol_ref_operand" "s,s"))
-             (match_operand 2)))
-   (use (match_operand:SI 3 "immediate_operand" "O,n"))
-   (clobber (reg:SI LR_REGNO))]
-  "(DEFAULT_ABI == ABI_DARWIN)
-   && (INTVAL (operands[3]) & CALL_LONG) == 0"
-{
-#if TARGET_MACHO
-  return output_call(insn, operands, 1, 3);
-#else
-  gcc_unreachable ();
-#endif
-}
-  [(set_attr "type" "branch,branch")
-   (set_attr "length" "4,8")])
-
 (define_expand "reload_macho_picbase"
   [(set (reg:SI LR_REGNO)
         (unspec [(match_operand 0 "")]
index 448d4a319344b3889bffa5cca11cba6ec8674f99..5c7207598b6788559d8fef433aca411f5ce8ab83 100644 (file)
@@ -21534,7 +21534,8 @@ rs6000_call_template_1 (rtx *operands, unsigned int funop, bool sibcall)
            ? "+32768" : ""));
 
   static char str[32];  /* 2 spare */
-  if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
+  if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2
+      || DEFAULT_ABI == ABI_DARWIN)
     sprintf (str, "b%s %s%s%s", sibcall ? "" : "l", z, arg,
             sibcall ? "" : "\n\tnop");
   else if (DEFAULT_ABI == ABI_V4)
@@ -37958,6 +37959,7 @@ rs6000_call_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
 
   /* Handle longcall attributes.  */
   if ((INTVAL (cookie) & CALL_LONG) != 0
+      && DEFAULT_ABI != ABI_DARWIN /* Darwin does it's own thing.  */
       && GET_CODE (func_desc) == SYMBOL_REF)
     {
       func = rs6000_longcall_ref (func_desc, tlsarg);
@@ -37998,8 +38000,13 @@ rs6000_call_sysv (rtx value, rtx func_desc, rtx tlsarg, rtx cookie)
   if (value != NULL_RTX)
     call[0] = gen_rtx_SET (value, call[0]);
 
-  unsigned int mask = CALL_V4_SET_FP_ARGS | CALL_V4_CLEAR_FP_ARGS;
-  call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie) & mask));
+  if (DEFAULT_ABI == ABI_DARWIN && TARGET_32BIT)
+    call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie)));
+  else
+    {
+      unsigned int mask = CALL_V4_SET_FP_ARGS | CALL_V4_CLEAR_FP_ARGS;
+      call[1] = gen_rtx_USE (VOIDmode, GEN_INT (INTVAL (cookie) & mask));
+    }
 
   call[2] = gen_rtx_CLOBBER (VOIDmode, gen_rtx_REG (Pmode, LR_REGNO));
 
index 18987cd720723391f2aeca04d1762675defd704d..fa77e45145912b4f5f6e377f9ff89fc50593a5d8 100644 (file)
 })
 \f
 ;; Call and call_value insns
+;; For the purposes of expanding calls, Darwin is very similar to SYSV.
 (define_expand "call"
   [(parallel [(call (mem:SI (match_operand 0 "address_operand"))
                    (match_operand 1 ""))
   operands[0] = XEXP (operands[0], 0);
 
   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
-    {
-      rs6000_call_aix (NULL_RTX, operands[0], operands[1], operands[2]);
-      DONE;
-    }
-
-  if (DEFAULT_ABI == ABI_V4)
-    {
-      rs6000_call_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
-      DONE;
-    }
+    rs6000_call_aix (NULL_RTX, operands[0], operands[1], operands[2]);
+  else
+    rs6000_call_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
 
-  if (GET_CODE (operands[0]) != SYMBOL_REF)
-    operands[0] = force_reg (Pmode, operands[0]);
+  DONE;
 })
 
 (define_expand "call_value"
   operands[1] = XEXP (operands[1], 0);
 
   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
-    {
-      rs6000_call_aix (operands[0], operands[1], operands[2], operands[3]);
-      DONE;
-    }
-
-  if (DEFAULT_ABI == ABI_V4)
-    {
-      rs6000_call_sysv (operands[0], operands[1], operands[2], operands[3]);
-      DONE;
-    }
+    rs6000_call_aix (operands[0], operands[1], operands[2], operands[3]);
+  else
+    rs6000_call_sysv (operands[0], operands[1], operands[2], operands[3]);
 
-  if (GET_CODE (operands[1]) != SYMBOL_REF)
-    operands[1] = force_reg (Pmode, operands[1]);
+  DONE;
 })
 
 ;; Call to function in current module.  No TOC pointer reload needed.
   [(call (mem:SI (match_operand:DI 0 "current_file_function_operand" "s,s"))
         (match_operand 1))
    (use (match_operand:SI 2 "immediate_operand" "O,n"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:DI LR_REGNO))]
   "TARGET_64BIT && (INTVAL (operands[2]) & CALL_LONG) == 0"
 {
   if (INTVAL (operands[2]) & CALL_V4_SET_FP_ARGS)
        (call (mem:SI (match_operand:DI 1 "current_file_function_operand" "s,s"))
              (match_operand 2)))
    (use (match_operand:SI 3 "immediate_operand" "O,n"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:DI LR_REGNO))]
   "TARGET_64BIT && (INTVAL (operands[3]) & CALL_LONG) == 0"
 {
   if (INTVAL (operands[3]) & CALL_V4_SET_FP_ARGS)
   [(call (mem:SI (match_operand:P 0 "indirect_call_operand" "c,*l,X"))
         (match_operand 1))
    (use (match_operand:SI 2 "immediate_operand" "n,n,n"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:P LR_REGNO))]
   "DEFAULT_ABI == ABI_V4
    || DEFAULT_ABI == ABI_DARWIN"
 {
   [(call (mem:SI (match_operand:P 0 "symbol_ref_operand" "s,s"))
         (match_operand 1))
    (use (match_operand:SI 2 "immediate_operand" "O,n"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:P LR_REGNO))]
   "(DEFAULT_ABI == ABI_DARWIN
    || (DEFAULT_ABI == ABI_V4
        && (INTVAL (operands[2]) & CALL_LONG) == 0))"
         (match_operand 1))
    (use (match_operand:SI 2 "immediate_operand" "O,n"))
    (use (match_operand:SI 3 "register_operand" "r,r"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:P LR_REGNO))]
   "(DEFAULT_ABI == ABI_V4
     && TARGET_SECURE_PLT && flag_pic && !SYMBOL_REF_LOCAL_P (operands[0])
     && (INTVAL (operands[2]) & CALL_LONG) == 0)"
        (call (mem:SI (match_operand:P 1 "indirect_call_operand" "c,*l,X"))
              (match_operand 2)))
    (use (match_operand:SI 3 "immediate_operand" "n,n,n"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:P LR_REGNO))]
   "DEFAULT_ABI == ABI_V4
    || DEFAULT_ABI == ABI_DARWIN"
 {
        (call (mem:SI (match_operand:P 1 "symbol_ref_operand" "s,s"))
              (match_operand 2)))
    (use (match_operand:SI 3 "immediate_operand" "O,n"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:P LR_REGNO))]
   "(DEFAULT_ABI == ABI_DARWIN
    || (DEFAULT_ABI == ABI_V4
        && (INTVAL (operands[3]) & CALL_LONG) == 0))"
              (match_operand 2)))
    (use (match_operand:SI 3 "immediate_operand" "O,n"))
    (use (match_operand:SI 4 "register_operand" "r,r"))
-   (clobber (reg:SI LR_REGNO))]
+   (clobber (reg:P LR_REGNO))]
   "(DEFAULT_ABI == ABI_V4
     && TARGET_SECURE_PLT && flag_pic && !SYMBOL_REF_LOCAL_P (operands[1])
     && (INTVAL (operands[3]) & CALL_LONG) == 0)"
   operands[0] = XEXP (operands[0], 0);
 
   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
-    {
-      rs6000_sibcall_aix (NULL_RTX, operands[0], operands[1], operands[2]);
-      DONE;
-    }
+    rs6000_sibcall_aix (NULL_RTX, operands[0], operands[1], operands[2]);
+  else
+    rs6000_sibcall_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
 
-  if (DEFAULT_ABI == ABI_V4)
-    {
-      rs6000_sibcall_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
-      DONE;
-    }
+  DONE;
 })
 
 (define_expand "sibcall_value"
   operands[1] = XEXP (operands[1], 0);
 
   if (DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_ELFv2)
-    {
-      rs6000_sibcall_aix (operands[0], operands[1], operands[2], operands[3]);
-      DONE;
-    }
+    rs6000_sibcall_aix (operands[0], operands[1], operands[2], operands[3]);
+  else
+    rs6000_sibcall_sysv (operands[0], operands[1], operands[2], operands[3]);
 
-  if (DEFAULT_ABI == ABI_V4)
-    {
-      rs6000_sibcall_sysv (operands[0], operands[1], operands[2], operands[3]);
-      DONE;
-    }
+  DONE;
 })
 
 (define_insn "*sibcall_local32"