* [Patch, ppc/darwin 1/2] Fix bootstrap.
@ 2018-12-03 1:27 Iain Sandoe
2018-12-03 6:18 ` Alan Modra
0 siblings, 1 reply; 4+ messages in thread
From: Iain Sandoe @ 2018-12-03 1:27 UTC (permalink / raw)
To: GCC-patches; +Cc: Segher Boessenkool, Alan Modra
Hi,
Recent changes to the lowerings for call handling in rs6000 have broken bootstrap for powerpc-darwin.
I’m proposing two patches;
1. the minimal fix to bootstrap - which I believe also fixes some possible typos in the patterns for sysv.
2. a second patch that brings Darwin into line with Alan’s recent change, and makes it hopefully clearer what can be done if/when we retire the mlongcall optimisation that is used for older Darwin versions.
===
The first patch makes Darwin share the sysv lowering, up until late in the process when we still use the macho_call_template. This means we need to preserve the CALL_LONG flag for Darwin.
In order to match this for Darwin64, the sysv patterns needed the clobber mode to follow that of the pattern. It seems that this might be a typo - since it’s not obvious how it would work for powerpc64 sysv as things stand (AIX and ELFv2 already follow the mode).
OK for trunk / comments?
Iain
gcc/
* 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_insn “call_indirect_nonlocal_sysv”):
adjust clobber to take mode P. (call_nonlocal_sysv_secure): Likewise.
(call_value_indirect_nonlocal_sysv): Likewise. (call_value_nonlocal_sysv): Likewise.
(define_expand “sibcall”): Treat Darwin the same way as sysv.
From 38ea0dbe42816b4c464b64b68b5fd5140b1a8dea Mon Sep 17 00:00:00 2001
From: Iain Sandoe <iain@sandoe.co.uk>
Date: Fri, 30 Nov 2018 09:10:43 +0000
Subject: [PATCH] [PATCH,PPC] Fix up revised call handling for Darwin.
---
gcc/config/rs6000/darwin.md | 60 -------------------------------------
gcc/config/rs6000/rs6000.c | 13 ++++++--
gcc/config/rs6000/rs6000.md | 19 ++++++------
3 files changed, 20 insertions(+), 72 deletions(-)
diff --git a/gcc/config/rs6000/darwin.md b/gcc/config/rs6000/darwin.md
index a1c07702d6..ff8062c110 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 03b983b6d6..bce968516c 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -21513,7 +21513,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)
@@ -37937,6 +37938,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);
@@ -37977,8 +37979,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 797d5c32e6..d684bed3ae 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -10266,6 +10266,7 @@
})
\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 ""))
@@ -10288,7 +10289,7 @@
DONE;
}
- if (DEFAULT_ABI == ABI_V4)
+ if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
{
rs6000_call_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
DONE;
@@ -10321,7 +10322,7 @@
DONE;
}
- if (DEFAULT_ABI == ABI_V4)
+ if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
{
rs6000_call_sysv (operands[0], operands[1], operands[2], operands[3]);
DONE;
@@ -10423,7 +10424,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 +10452,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 +10488,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 +10509,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 +10538,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))"
@@ -10765,7 +10766,7 @@
DONE;
}
- if (DEFAULT_ABI == ABI_V4)
+ if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
{
rs6000_sibcall_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
DONE;
@@ -10796,7 +10797,7 @@
DONE;
}
- if (DEFAULT_ABI == ABI_V4)
+ if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
{
rs6000_sibcall_sysv (operands[0], operands[1], operands[2], operands[3]);
DONE;
--
2.17.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Patch, ppc/darwin 1/2] Fix bootstrap.
2018-12-03 1:27 [Patch, ppc/darwin 1/2] Fix bootstrap Iain Sandoe
@ 2018-12-03 6:18 ` Alan Modra
2018-12-03 19:14 ` Iain Sandoe
0 siblings, 1 reply; 4+ messages in thread
From: Alan Modra @ 2018-12-03 6:18 UTC (permalink / raw)
To: Iain Sandoe; +Cc: GCC-patches, Segher Boessenkool
On Mon, Dec 03, 2018 at 01:26:48AM +0000, Iain Sandoe wrote:
> Hi,
>
> Recent changes to the lowerings for call handling in rs6000 have broken bootstrap for powerpc-darwin.
>
> Iâm proposing two patches;
> 1. the minimal fix to bootstrap - which I believe also fixes some possible typos in the patterns for sysv.
Sorry for the breakage..
> 2. a second patch that brings Darwin into line with Alanâs recent change, and makes it hopefully clearer what can be done if/when we retire the mlongcall optimisation that is used for older Darwin versions.
>
> ===
>
> The first patch makes Darwin share the sysv lowering, up until late in the process when we still use the macho_call_template. This means we need to preserve the CALL_LONG flag for Darwin.
>
> In order to match this for Darwin64, the sysv patterns needed the clobber mode to follow that of the pattern. It seems that this might be a typo - since itâs not obvious how it would work for powerpc64 sysv as things stand (AIX and ELFv2 already follow the mode).
Hmm, yes, and I think there may be some more modes to fix.
call_local64, call_value_local64, call_nonlocal_sysv splitter,
call_value_nonlocal_sysv splitter, call_value_nonlocal_sysv_secure.
> ;; 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 ""))
> @@ -10288,7 +10289,7 @@
> DONE;
> }
>
> - if (DEFAULT_ABI == ABI_V4)
> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
Better yet, replace this line with "else" and tidy a little. There's
some dead code and the "DONE" can move out of the conditional blocks.
> {
> rs6000_call_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
> DONE;
> @@ -10321,7 +10322,7 @@
> DONE;
> }
>
> - if (DEFAULT_ABI == ABI_V4)
> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
Similarly here,
> @@ -10765,7 +10766,7 @@
> DONE;
> }
>
> - if (DEFAULT_ABI == ABI_V4)
> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
and here,
> {
> rs6000_sibcall_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
> DONE;
> @@ -10796,7 +10797,7 @@
> DONE;
> }
>
> - if (DEFAULT_ABI == ABI_V4)
> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
and here.
> {
> rs6000_sibcall_sysv (operands[0], operands[1], operands[2], operands[3]);
> DONE;
> --
> 2.17.1
>
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Patch, ppc/darwin 1/2] Fix bootstrap.
2018-12-03 6:18 ` Alan Modra
@ 2018-12-03 19:14 ` Iain Sandoe
2018-12-04 5:33 ` Alan Modra
0 siblings, 1 reply; 4+ messages in thread
From: Iain Sandoe @ 2018-12-03 19:14 UTC (permalink / raw)
To: Alan Modra; +Cc: GCC-patches, Segher Boessenkool
[-- Attachment #1: Type: text/plain, Size: 2525 bytes --]
> On 3 Dec 2018, at 06:18, Alan Modra <amodra@gmail.com> wrote:
>
> On Mon, Dec 03, 2018 at 01:26:48AM +0000, Iain Sandoe wrote:
>> The first patch makes Darwin share the sysv lowering, up until late in the process when we still use the macho_call_template. This means we need to preserve the CALL_LONG flag for Darwin.
>>
>> In order to match this for Darwin64, the sysv patterns needed the clobber mode to follow that of the pattern. It seems that this might be a typo - since it’s not obvious how it would work for powerpc64 sysv as things stand (AIX and ELFv2 already follow the mode).
>
> Hmm, yes, and I think there may be some more modes to fix.
> call_local64, call_value_local64, call_nonlocal_sysv splitter,
> call_value_nonlocal_sysv splitter, call_value_nonlocal_sysv_secure.
I’m slightly twitchy about patches I can’t fully test ..
… but
>
>> ;; 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 ""))
>> @@ -10288,7 +10289,7 @@
>> DONE;
>> }
>>
>> - if (DEFAULT_ABI == ABI_V4)
>> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
>
> Better yet, replace this line with "else" and tidy a little. There's
> some dead code and the "DONE" can move out of the conditional blocks.
>
>> {
>> rs6000_call_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
>> DONE;
>
>
>> @@ -10321,7 +10322,7 @@
>> DONE;
>> }
>>
>> - if (DEFAULT_ABI == ABI_V4)
>> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
>
> Similarly here,
>
>> @@ -10765,7 +10766,7 @@
>> DONE;
>> }
>>
>> - if (DEFAULT_ABI == ABI_V4)
>> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
>
> and here,
>
>> {
>> rs6000_sibcall_sysv (NULL_RTX, operands[0], operands[1], operands[2]);
>> DONE;
>> @@ -10796,7 +10797,7 @@
>> DONE;
>> }
>>
>> - if (DEFAULT_ABI == ABI_V4)
>> + if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_DARWIN)
>
> and here.
>
>> {
>> rs6000_sibcall_sysv (operands[0], operands[1], operands[2], operands[3]);
>> DONE;
>> --
>> 2.17.1
those are nice tidyups - done. as attached..
bootstrapped w/out issues on gcc110 (Darwin will take a longer to regstrap)..
Iain
>>
>
> --
> Alan Modra
> Australia Development Lab, IBM
[-- Attachment #2: darwin-ppc-calls-1-of-2-v2.txt --]
[-- Type: text/plain, Size: 10435 bytes --]
From 3e9b487495807f1ba5c6709785536176b6540fd1 Mon Sep 17 00:00:00 2001
From: Iain Sandoe <iain@sandoe.co.uk>
Date: Fri, 30 Nov 2018 09:10:43 +0000
Subject: [PATCH] [PATCH,PPC] Fix up revised call handling for Darwin.
---
gcc/config/rs6000/darwin.md | 60 -----------------------------
gcc/config/rs6000/rs6000.c | 13 +++++--
gcc/config/rs6000/rs6000.md | 75 +++++++++++++------------------------
3 files changed, 35 insertions(+), 113 deletions(-)
diff --git a/gcc/config/rs6000/darwin.md b/gcc/config/rs6000/darwin.md
index a1c07702d6..ff8062c110 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 03b983b6d6..bce968516c 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -21513,7 +21513,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)
@@ -37937,6 +37938,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);
@@ -37977,8 +37979,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 797d5c32e6..f84b09b35a 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -10266,6 +10266,7 @@
})
\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 ""))
@@ -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.17.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [Patch, ppc/darwin 1/2] Fix bootstrap.
2018-12-03 19:14 ` Iain Sandoe
@ 2018-12-04 5:33 ` Alan Modra
0 siblings, 0 replies; 4+ messages in thread
From: Alan Modra @ 2018-12-04 5:33 UTC (permalink / raw)
To: Iain Sandoe; +Cc: GCC-patches, Segher Boessenkool
On Mon, Dec 03, 2018 at 07:14:36PM +0000, Iain Sandoe wrote:
>
> > On 3 Dec 2018, at 06:18, Alan Modra <amodra@gmail.com> wrote:
> >
> > On Mon, Dec 03, 2018 at 01:26:48AM +0000, Iain Sandoe wrote:
>
> >> The first patch makes Darwin share the sysv lowering, up until late in the process when we still use the macho_call_template. This means we need to preserve the CALL_LONG flag for Darwin.
> >>
> >> In order to match this for Darwin64, the sysv patterns needed the clobber mode to follow that of the pattern. It seems that this might be a typo - since itâs not obvious how it would work for powerpc64 sysv as things stand (AIX and ELFv2 already follow the mode).
> >
> > Hmm, yes, and I think there may be some more modes to fix.
> > call_local64, call_value_local64, call_nonlocal_sysv splitter,
> > call_value_nonlocal_sysv splitter, call_value_nonlocal_sysv_secure.
>
> Iâm slightly twitchy about patches I canât fully test ..
I'm running a powerpc64-linux -m64/-m32 regression test now. If
anything turns up I'll let you know.
--
Alan Modra
Australia Development Lab, IBM
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2018-12-04 5:33 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-12-03 1:27 [Patch, ppc/darwin 1/2] Fix bootstrap Iain Sandoe
2018-12-03 6:18 ` Alan Modra
2018-12-03 19:14 ` Iain Sandoe
2018-12-04 5:33 ` Alan Modra
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).