S/390: Hotpatching fixes.

2015-03-02  Dominik Vogt  <vogt@linux.vnet.ibm.com>

	    * config/s390/s390.c (s390_reorg): Move code to output nops after label
	    to s390_reorg ().
	    (s390_asm_output_function_label): Likewise.
	    * config/s390/s390.c (s390_asm_output_function_label):
	    Fix function label alignment with -mhtopatch.
	    * config/s390/s390.md ("unspecv"): New values UNSPECV_NOP_2_BYTE,
	    UNSPECV_NOP_4_BYTE and UNSPECV_NOP_6_BYTE
	    ("nop_2_byte"): New define_insn.
	    ("nop_4_byte"): Likewise.
	    ("nop_6_byte"): Likewise.
	    * doc/extend.texi (hotpatch): hotpatch attribute doc fixes.
	    * doc/invoke.texi (-mhotpatch): -mhotpatch doc fixes.

2015-03-02  Dominik Vogt  <vogt@linux.vnet.ibm.com>

	    * gcc.target/s390/hotpatch-21.c: New test for hotpatch alignment.
	    * gcc.target/s390/hotpatch-22.c: Likewise.
	    * gcc.target/s390/hotpatch-23.c: Likewise.
	    * gcc.target/s390/hotpatch-24.c: Likewise.
	    * gcc.target/s390/hotpatch-2.c: Also check hotpatch alignment.
	    * gcc.target/s390/hotpatch-1.c: Update expected output.
	    * gcc.target/s390/hotpatch-2.c: Likewise.
	    * gcc.target/s390/hotpatch-3.c: Likewise.
	    * gcc.target/s390/hotpatch-4.c: Likewise.
	    * gcc.target/s390/hotpatch-5.c: Likewise.
	    * gcc.target/s390/hotpatch-6.c: Likewise.
	    * gcc.target/s390/hotpatch-7.c: Likewise.
	    * gcc.target/s390/hotpatch-8.c: Likewise.
	    * gcc.target/s390/hotpatch-9.c: Likewise.
	    * gcc.target/s390/hotpatch-10.c: Likewise.
	    * gcc.target/s390/hotpatch-11.c: Likewise.
	    * gcc.target/s390/hotpatch-12.c: Likewise.
	    * gcc.target/s390/hotpatch-13.c: Likewise.
	    * gcc.target/s390/hotpatch-14.c: Likewise.
	    * gcc.target/s390/hotpatch-15.c: Likewise.
	    * gcc.target/s390/hotpatch-16.c: Likewise.
	    * gcc.target/s390/hotpatch-17.c: Likewise.
	    * gcc.target/s390/hotpatch-18.c: Likewise.
	    * gcc.target/s390/hotpatch-19.c: Likewise.

From-SVN: r221381
This commit is contained in:
Dominik Vogt 2015-03-12 11:13:40 +00:00 committed by Andreas Krebbel
parent 58b387e61f
commit f8af0e3050
28 changed files with 186 additions and 46 deletions

View File

@ -1,3 +1,18 @@
2015-03-12 Dominik Vogt <vogt@linux.vnet.ibm.com>
* config/s390/s390.c (s390_reorg): Move code to output nops after label
to s390_reorg ().
(s390_asm_output_function_label): Likewise.
* config/s390/s390.c (s390_asm_output_function_label):
Fix function label alignment with -mhtopatch.
* config/s390/s390.md ("unspecv"): New values UNSPECV_NOP_2_BYTE,
UNSPECV_NOP_4_BYTE and UNSPECV_NOP_6_BYTE
("nop_2_byte"): New define_insn.
("nop_4_byte"): Likewise.
("nop_6_byte"): Likewise.
* doc/extend.texi (hotpatch): hotpatch attribute doc fixes.
* doc/invoke.texi (-mhotpatch): -mhotpatch doc fixes.
2015-03-12 Ilya Enkovich <ilya.enkovich@intel.com>
PR target/65103

View File

@ -5295,6 +5295,7 @@ s390_asm_output_function_label (FILE *asm_out_file, const char *fname,
if (hotpatch_p)
{
unsigned int function_alignment;
int i;
/* Add a trampoline code area before the function label and initialize it
@ -5308,34 +5309,14 @@ s390_asm_output_function_label (FILE *asm_out_file, const char *fname,
stored directly before the label without crossing a cacheline
boundary. All this is necessary to make sure the trampoline code can
be changed atomically. */
function_alignment = MAX (8, DECL_ALIGN (decl) / BITS_PER_UNIT);
if (! DECL_USER_ALIGN (decl))
function_alignment = MAX (function_alignment,
(unsigned int) align_functions);
ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (function_alignment));
}
ASM_OUTPUT_LABEL (asm_out_file, fname);
/* Output a series of NOPs after the function label. */
if (hotpatch_p)
{
while (hw_after > 0)
{
if (hw_after >= 3 && TARGET_CPU_ZARCH)
{
asm_fprintf (asm_out_file, "\tbrcl\t\t0,0\n");
hw_after -= 3;
}
else if (hw_after >= 2)
{
gcc_assert (hw_after == 2 || !TARGET_CPU_ZARCH);
asm_fprintf (asm_out_file, "\tnop\t0\n");
hw_after -= 2;
}
else
{
gcc_assert (hw_after == 1);
asm_fprintf (asm_out_file, "\tnopr\t%%r7\n");
hw_after -= 1;
}
}
}
}
/* Output machine-dependent UNSPECs occurring in address constant X
@ -11368,6 +11349,7 @@ static void
s390_reorg (void)
{
bool pool_overflow = false;
int hw_before, hw_after;
/* Make sure all splits have been performed; splits after
machine_dependent_reorg might confuse insn length counts. */
@ -11503,6 +11485,40 @@ s390_reorg (void)
if (insn_added_p)
shorten_branches (get_insns ());
}
s390_function_num_hotpatch_hw (current_function_decl, &hw_before, &hw_after);
if (hw_after > 0)
{
rtx_insn *insn;
/* Inject nops for hotpatching. */
for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
{
if (NOTE_P (insn) && NOTE_KIND (insn) == NOTE_INSN_FUNCTION_BEG)
break;
}
gcc_assert (insn);
/* Output a series of NOPs after the NOTE_INSN_FUNCTION_BEG. */
while (hw_after > 0)
{
if (hw_after >= 3 && TARGET_CPU_ZARCH)
{
insn = emit_insn_after (gen_nop_6_byte (), insn);
hw_after -= 3;
}
else if (hw_after >= 2)
{
insn = emit_insn_after (gen_nop_4_byte (), insn);
hw_after -= 2;
}
else
{
insn = emit_insn_after (gen_nop_2_byte (), insn);
hw_after -= 1;
}
}
gcc_assert (hw_after == 0);
}
}
/* Return true if INSN is a fp load insn writing register REGNO. */

View File

@ -153,6 +153,11 @@
UNSPECV_CAS
UNSPECV_ATOMIC_OP
; Hotpatching (unremovable NOPs)
UNSPECV_NOP_2_BYTE
UNSPECV_NOP_4_BYTE
UNSPECV_NOP_6_BYTE
; Transactional Execution support
UNSPECV_TBEGIN
UNSPECV_TBEGIN_TDB
@ -9705,6 +9710,26 @@
"lr\t1,1"
[(set_attr "op_type" "RR")])
;;- Undeletable nops (used for hotpatching)
(define_insn "nop_2_byte"
[(unspec_volatile [(const_int 0)] UNSPECV_NOP_2_BYTE)]
""
"nopr\t%%r7"
[(set_attr "op_type" "RR")])
(define_insn "nop_4_byte"
[(unspec_volatile [(const_int 0)] UNSPECV_NOP_4_BYTE)]
""
"nop\t0"
[(set_attr "op_type" "RX")])
(define_insn "nop_6_byte"
[(unspec_volatile [(const_int 0)] UNSPECV_NOP_6_BYTE)]
"TARGET_CPU_ZARCH"
"brcl\t0, 0"
[(set_attr "op_type" "RIL")])
;
; Special literal pool access instruction pattern(s).

View File

@ -20216,9 +20216,9 @@ The @var{stack-guard} option can only be used in conjunction with @var{stack-siz
If the hotpatch option is enabled, a ``hot-patching'' function
prologue is generated for all functions in the compilation unit.
The funtion label is prepended with the given number of two-byte
Nop instructions (@var{pre-halfwords}, maximum 1000000). After
NOP instructions (@var{pre-halfwords}, maximum 1000000). After
the label, 2 * @var{post-halfwords} bytes are appended, using the
larges nop like instructions the architecture allows (maximum
largest NOP like instructions the architecture allows (maximum
1000000).
If both arguments are zero, hotpatching is disabled.

View File

@ -1,3 +1,30 @@
2015-03-12 Dominik Vogt <vogt@linux.vnet.ibm.com>
* gcc.target/s390/hotpatch-21.c: New test for hotpatch alignment.
* gcc.target/s390/hotpatch-22.c: Likewise.
* gcc.target/s390/hotpatch-23.c: Likewise.
* gcc.target/s390/hotpatch-24.c: Likewise.
* gcc.target/s390/hotpatch-2.c: Also check hotpatch alignment.
* gcc.target/s390/hotpatch-1.c: Update expected output.
* gcc.target/s390/hotpatch-2.c: Likewise.
* gcc.target/s390/hotpatch-3.c: Likewise.
* gcc.target/s390/hotpatch-4.c: Likewise.
* gcc.target/s390/hotpatch-5.c: Likewise.
* gcc.target/s390/hotpatch-6.c: Likewise.
* gcc.target/s390/hotpatch-7.c: Likewise.
* gcc.target/s390/hotpatch-8.c: Likewise.
* gcc.target/s390/hotpatch-9.c: Likewise.
* gcc.target/s390/hotpatch-10.c: Likewise.
* gcc.target/s390/hotpatch-11.c: Likewise.
* gcc.target/s390/hotpatch-12.c: Likewise.
* gcc.target/s390/hotpatch-13.c: Likewise.
* gcc.target/s390/hotpatch-14.c: Likewise.
* gcc.target/s390/hotpatch-15.c: Likewise.
* gcc.target/s390/hotpatch-16.c: Likewise.
* gcc.target/s390/hotpatch-17.c: Likewise.
* gcc.target/s390/hotpatch-18.c: Likewise.
* gcc.target/s390/hotpatch-19.c: Likewise.
2015-03-12 Ilya Enkovich <ilya.enkovich@intel.com>
PR target/65103

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 999 } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -14,4 +14,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -14,4 +14,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -14,4 +14,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -14,4 +14,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -14,4 +14,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -20,4 +20,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -13,4 +13,5 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */
/* { dg-final { scan-assembler-times "\.align\t8" 2 } } */

View File

@ -0,0 +1,14 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=0,1" } */
#include <stdio.h>
void __attribute__ ((aligned(512))) hp1(void)
{
printf("hello, world!\n");
}
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "\.align\t512" 2 } } */

View File

@ -0,0 +1,14 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=0,1 -falign-functions=1024" } */
#include <stdio.h>
void hp1(void)
{
printf("hello, world!\n");
}
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "\.align\t1024" 2 } } */

View File

@ -0,0 +1,14 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=0,1 -falign-functions=4096" } */
#include <stdio.h>
void __attribute__ ((aligned(2048))) hp1(void)
{
printf("hello, world!\n");
}
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "\.align\t2048" 2 } } */

View File

@ -0,0 +1,14 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=0,1 -falign-functions=2048" } */
#include <stdio.h>
void __attribute__ ((aligned(4096))) hp1(void)
{
printf("hello, world!\n");
}
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "\.align\t4096" 2 } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 1 } } */
/* { dg-final { scan-assembler-times "brcl\t0, 0" 1 } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 1 } } */
/* { dg-final { scan-assembler-times "brcl\t0, 0" 1 } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 1 } } */
/* { dg-final { scan-assembler-times "brcl\t0, 0" 1 } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 2 } } */
/* { dg-final { scan-assembler-times "brcl\t0, 0" 2 } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */

View File

@ -13,4 +13,4 @@ void hp1(void)
/* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 2 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */
/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */