From 66e30545db6ed4c1913e76d1085d0586ee6d055d Mon Sep 17 00:00:00 2001 From: Iain Sandoe Date: Wed, 12 Dec 2018 08:42:28 +0000 Subject: [PATCH] rs6000, darwin - fix bootstrap. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 * 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 | 23 ++++++++++++ gcc/config/rs6000/darwin.md | 60 ----------------------------- gcc/config/rs6000/rs6000.c | 13 +++++-- gcc/config/rs6000/rs6000.md | 75 +++++++++++++------------------------ 4 files changed, 58 insertions(+), 113 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 566f560667f..2fba17e1ffc 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,26 @@ +2018-12-12 Iain Sandoe + + * 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 PR tree-optimization/88444 diff --git a/gcc/config/rs6000/darwin.md b/gcc/config/rs6000/darwin.md index a1c07702d6f..ff8062c1100 100644 --- a/gcc/config/rs6000/darwin.md +++ b/gcc/config/rs6000/darwin.md @@ -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 "")] diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 448d4a31934..5c7207598b6 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -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)); diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 18987cd7207..fa77e451459 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -10266,6 +10266,7 @@ }) ;; 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 "")) @@ -10283,19 +10284,11 @@ 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" @@ -10316,19 +10309,11 @@ 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. @@ -10359,7 +10344,7 @@ [(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) @@ -10398,7 +10383,7 @@ (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) @@ -10423,7 +10408,7 @@ [(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" { @@ -10451,7 +10436,7 @@ [(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))" @@ -10487,7 +10472,7 @@ (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)" @@ -10508,7 +10493,7 @@ (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" { @@ -10537,7 +10522,7 @@ (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))" @@ -10575,7 +10560,7 @@ (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)" @@ -10760,16 +10745,11 @@ 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" @@ -10791,16 +10771,11 @@ 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" -- 2.30.2