diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc index 86a5f059b85dc6e48612861a5c4c18669be59a4c..1d96df49feac3258206e7c88972094975f6ea1e3 100644 --- a/gcc/config/s390/s390.cc +++ b/gcc/config/s390/s390.cc @@ -8585,7 +8585,7 @@ print_operand_address (FILE *file, rtx addr) 'E': print opcode suffix for branch on index instruction. 'G': print the size of the operand in bytes. 'J': print tls_load/tls_gdcall/tls_ldcall suffix - 'K': print @PLT suffix for call targets and load address values. + 'K': print @PLT suffix for branch targets; do not use with larl. 'M': print the second word of a TImode operand. 'N': print the second word of a DImode operand. 'O': print only the displacement of a memory reference or address. @@ -8854,19 +8854,9 @@ print_operand (FILE *file, rtx x, int code) call even static functions via PLT. ld will optimize @PLT away for normal code, and keep it for patches. - Do not indiscriminately add @PLT in 31-bit mode due to the %r12 - restriction, use UNSPEC_PLT31 instead. - @PLT only makes sense for functions, data is taken care of by - -mno-pic-data-is-text-relative. - - Adding @PLT interferes with handling of weak symbols in non-PIC code, - since their addresses are loaded with larl, which then always produces - a non-NULL result, so skip them here as well. */ - if (TARGET_64BIT - && GET_CODE (x) == SYMBOL_REF - && SYMBOL_REF_FUNCTION_P (x) - && !(SYMBOL_REF_WEAK (x) && !flag_pic)) + -mno-pic-data-is-text-relative. */ + if (GET_CODE (x) == SYMBOL_REF && SYMBOL_REF_FUNCTION_P (x)) fprintf (file, "@PLT"); return; } diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index c164ea72c78b7eb96d696d19cf082748079165fe..9d4958033873c9164f1100e08547d61ec65b4ecb 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -2001,7 +2001,7 @@ vlgvg\t%0,%v1,0 vleg\t%v0,%1,0 vsteg\t%v1,%0,0 - larl\t%0,%1%K1" + larl\t%0,%1" [(set_attr "op_type" "RI,RI,RI,RI,RI,RIL,RIL,RIL,RRE,RRE,RRE,RXY,RIL,RRE,RXY, RXY,RR,RX,RXY,RX,RXY,RIL,SIL,*,*,RS,RS,VRI,VRR,VRS,VRS, VRX,VRX,RIL") @@ -2390,7 +2390,7 @@ (match_operand:SI 1 "larl_operand" "X"))] "!TARGET_64BIT && !FP_REG_P (operands[0])" - "larl\t%0,%1%K1" + "larl\t%0,%1" [(set_attr "op_type" "RIL") (set_attr "type" "larl") (set_attr "z10prop" "z10_fwd_A1") @@ -11735,7 +11735,7 @@ [(set (match_operand 0 "register_operand" "=a") (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_MAIN_BASE))] "GET_MODE (operands[0]) == Pmode" - "larl\t%0,%1%K1" + "larl\t%0,%1" [(set_attr "op_type" "RIL") (set_attr "type" "larl") (set_attr "z10prop" "z10_fwd_A1") @@ -11755,7 +11755,7 @@ [(set (match_operand 0 "register_operand" "=a") (unspec [(label_ref (match_operand 1 "" ""))] UNSPEC_RELOAD_BASE))] "GET_MODE (operands[0]) == Pmode" - "larl\t%0,%1%K1" + "larl\t%0,%1" [(set_attr "op_type" "RIL") (set_attr "type" "larl") (set_attr "z10prop" "z10_fwd_A1")]) diff --git a/gcc/testsuite/gcc.target/s390/call-z10-pic-nodatarel.c b/gcc/testsuite/gcc.target/s390/call-z10-pic-nodatarel.c index 49984614bc6f718ada64283c41a96ffe13a82575..6df0c75584f4b710bf077df3a2e35941373ed752 100644 --- a/gcc/testsuite/gcc.target/s390/call-z10-pic-nodatarel.c +++ b/gcc/testsuite/gcc.target/s390/call-z10-pic-nodatarel.c @@ -7,10 +7,8 @@ /* { dg-final { scan-assembler {lgrl\t%r2,foo@GOTENT\n} { target lp64 } } } */ /* { dg-final { scan-assembler {lrl\t%r2,foo@GOTENT\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */ /* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */ /* { dg-final { scan-assembler {lgrl\t%r2,fooweak@GOTENT\n} { target lp64 } } } */ diff --git a/gcc/testsuite/gcc.target/s390/call-z10-pic.c b/gcc/testsuite/gcc.target/s390/call-z10-pic.c index 210c56cc4cad0a30539948cbc8c4281232306459..30145d5b760878c9dbeee26f1cad56f647074d32 100644 --- a/gcc/testsuite/gcc.target/s390/call-z10-pic.c +++ b/gcc/testsuite/gcc.target/s390/call-z10-pic.c @@ -7,10 +7,8 @@ /* { dg-final { scan-assembler {lgrl\t%r2,foo@GOTENT\n} { target lp64 } } } */ /* { dg-final { scan-assembler {lrl\t%r2,foo@GOTENT\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */ /* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */ /* { dg-final { scan-assembler {lgrl\t%r2,fooweak@GOTENT\n} { target lp64 } } } */ diff --git a/gcc/testsuite/gcc.target/s390/call-z10.c b/gcc/testsuite/gcc.target/s390/call-z10.c index 2d7dc735df4aa39338b25d89d7179c41935b9c00..d4eab4ff89fc342bdba731b15f8d9c90ace7b150 100644 --- a/gcc/testsuite/gcc.target/s390/call-z10.c +++ b/gcc/testsuite/gcc.target/s390/call-z10.c @@ -3,17 +3,13 @@ #include "call.h" -/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foo\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foo@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foo\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foo\n} } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak\n} } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */ /* { dg-final { scan-assembler {larl\t%r2,fooweak\n} } } */ /* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} { target lp64 } } } */ diff --git a/gcc/testsuite/gcc.target/s390/call-z9-pic-nodatarel.c b/gcc/testsuite/gcc.target/s390/call-z9-pic-nodatarel.c index b1ae318d3e99427f6fc254c7847466dbb5833242..fe515bf1903d310061a45e3299fddb8083a71683 100644 --- a/gcc/testsuite/gcc.target/s390/call-z9-pic-nodatarel.c +++ b/gcc/testsuite/gcc.target/s390/call-z9-pic-nodatarel.c @@ -6,10 +6,8 @@ /* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */ /* { dg-final { scan-assembler {larl\t%r\d+,foo@GOTENT\n} } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */ /* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */ /* { dg-final { scan-assembler {larl\t%r\d+,fooweak@GOTENT\n} } } */ diff --git a/gcc/testsuite/gcc.target/s390/call-z9-pic.c b/gcc/testsuite/gcc.target/s390/call-z9-pic.c index a89e78d8df8e5a356c2d163ac003b58e633cf0ea..43e1c2f7cb38c298c65b73a30d78d3fb7c3a0ccb 100644 --- a/gcc/testsuite/gcc.target/s390/call-z9-pic.c +++ b/gcc/testsuite/gcc.target/s390/call-z9-pic.c @@ -6,10 +6,8 @@ /* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */ /* { dg-final { scan-assembler {larl\t%r\d+,foo@GOTENT\n} } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */ /* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */ /* { dg-final { scan-assembler {larl\t%r\d+,fooweak@GOTENT\n} } } */ diff --git a/gcc/testsuite/gcc.target/s390/call-z9.c b/gcc/testsuite/gcc.target/s390/call-z9.c index 21d035aecb6b065af2cc7398a41a02b53c91fc4f..b755f33498a3b0e43b0268c1aadfe8ce1adeccea 100644 --- a/gcc/testsuite/gcc.target/s390/call-z9.c +++ b/gcc/testsuite/gcc.target/s390/call-z9.c @@ -3,17 +3,13 @@ #include "call.h" -/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foo\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foo@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foo\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foo@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foo\n} } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic\n} { target { ! lp64 } } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic@PLT\n} { target lp64 } } } */ -/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} { target { ! lp64 } } } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,foostatic@PLT\n} } } */ +/* { dg-final { scan-assembler {larl\t%r2,foostatic\n} } } */ -/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak\n} } } */ +/* { dg-final { scan-assembler {brasl\t%r\d+,fooweak@PLT\n} } } */ /* { dg-final { scan-assembler {larl\t%r2,fooweak\n} } } */ /* { dg-final { scan-assembler {foos:\n\t.quad\tfoo\n\t.quad\tfoostatic\n\t.quad\tfooweak\n} { target lp64 } } } */