2015-06-01 Jakub Jelinek * gcc.target/s390/hotpatch-compile-15.c: Remove dg-prune-output directives. (hp3, hp4): Add inline keyword. * gcc.target/s390/hotpatch-19.c: Remove dg-prune-output directive. (hp2): Add inline keyword. * gcc.target/s390/hotpatch-19.c: Remove dg-prune-output directives. (hp2): Add inline keyword. 2015-05-29 Dominik Vogt PR target/66215 * config/s390/s390.c (s390_reorg): Fix placement of post-label NOPs with -mhotpatch=. * gcc.target/s390/hotpatch-1.c: Remove optimization options from dg-options. * 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-17.c: Likewise. * gcc.target/s390/hotpatch-18.c: Likewise. * gcc.target/s390/hotpatch-20.c: Likewise. * gcc.target/s390/hotpatch-21.c: Likewise. * 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: Likewise. Adjust scan-assembler to check for the exact nops too. * 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-14.c: Likewise. * gcc.target/s390/hotpatch-15.c: Likewise. * gcc.target/s390/hotpatch-16.c: Likewise. * gcc.target/s390/hotpatch-19.c: Likewise. * gcc.target/s390/hotpatch-25.c: Likewise. Remove scan-assembler-times counting number of .align directives. * gcc.target/s390/hotpatch-13.c: Remove optimization options from dg-options. Remove scan-assembler-times counting number of .align directives. * gcc.target/s390/hotpatch-26.c: New file. * gcc.target/s390/hotpatch-27.c: New file. * gcc.target/s390/hotpatch-28.c: New file. * gcc.target/s390/s390.exp: Run hotpatch-*.c tests as torture tests using -Os -O0 -O1 -O2 -O3 options. 2015-03-31 Dominik Vogt * config/s390/s390.c (s390_function_num_hotpatch_hw): Allow hotpatching nested functions. (s390_reorg): Adapt to new signature of s390_function_num_hotpatch_hw. (s390_asm_output_function_label): Adapt to new signature of s390_function_num_hotpatch_hw Optimise the code generating assembler output. Add comments to assembler file. * gcc.target/s390/hotpatch-25.c: New test. * gcc.target/s390/hotpatch-1.c: Update test. * gcc.target/s390/hotpatch-10.c: Update test. * gcc.target/s390/hotpatch-11.c: Update test. * gcc.target/s390/hotpatch-12.c: Update test. * gcc.target/s390/hotpatch-13.c: Update test. * gcc.target/s390/hotpatch-14.c: Update test. * gcc.target/s390/hotpatch-15.c: Update test. * gcc.target/s390/hotpatch-16.c: Update test. * gcc.target/s390/hotpatch-17.c: Update test. * gcc.target/s390/hotpatch-18.c: Update test. * gcc.target/s390/hotpatch-19.c: Update test. * gcc.target/s390/hotpatch-2.c: Update test. * gcc.target/s390/hotpatch-21.c: Update test. * gcc.target/s390/hotpatch-22.c: Update test. * gcc.target/s390/hotpatch-23.c: Update test. * gcc.target/s390/hotpatch-24.c: Update test. * gcc.target/s390/hotpatch-3.c: Update test. * gcc.target/s390/hotpatch-4.c: Update test. * gcc.target/s390/hotpatch-5.c: Update test. * gcc.target/s390/hotpatch-6.c: Update test. * gcc.target/s390/hotpatch-7.c: Update test. * gcc.target/s390/hotpatch-8.c: Update test. * gcc.target/s390/hotpatch-9.c: Update test. * gcc.target/s390/hotpatch-compile-16.c: Update test. 2015-03-12 Dominik Vogt * 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. * 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-02-27 Andreas Krebbel * gcc.target/s390/hotpatch-8.c: Likewise. * gcc.target/s390/hotpatch-9.c: Likewise. 2015-02-23 Andreas Krebbel * gcc.target/s390/hotpatch-1.c: Remove --save-temps option. * gcc.target/s390/hotpatch-10.c: Remove --save-temps option. * gcc.target/s390/hotpatch-11.c: Remove --save-temps option. * gcc.target/s390/hotpatch-12.c: Remove --save-temps option. * gcc.target/s390/hotpatch-13.c: Remove --save-temps option. * gcc.target/s390/hotpatch-14.c: Remove --save-temps option. * gcc.target/s390/hotpatch-15.c: Remove --save-temps option. * gcc.target/s390/hotpatch-16.c: Remove --save-temps option. * gcc.target/s390/hotpatch-17.c: Remove --save-temps option. * gcc.target/s390/hotpatch-18.c: Remove --save-temps option. * gcc.target/s390/hotpatch-19.c: Remove --save-temps option. * gcc.target/s390/hotpatch-2.c: Remove --save-temps option. * gcc.target/s390/hotpatch-20.c: Remove --save-temps option. * gcc.target/s390/hotpatch-3.c: Remove --save-temps option. * gcc.target/s390/hotpatch-4.c: Remove --save-temps option. * gcc.target/s390/hotpatch-5.c: Remove --save-temps option. * gcc.target/s390/hotpatch-6.c: Remove --save-temps option. * gcc.target/s390/hotpatch-7.c: Remove --save-temps option. * gcc.target/s390/hotpatch-8.c: Remove --save-temps option. * gcc.target/s390/hotpatch-9.c: Remove --save-temps option. * gcc.target/s390/htm-nofloat-1.c: Cleanup --save-temps files. * gcc.target/s390/hotpatch-8.c: Add -march=g5. * gcc.target/s390/hotpatch-9.c: Add -march=g5. * gcc.target/s390/hotpatch-compile-1.c: Fix error message. * gcc.target/s390/hotpatch-compile-10.c: Likewise. * gcc.target/s390/hotpatch-compile-11.c: Likewise. * gcc.target/s390/hotpatch-compile-12.c: Likewise. * gcc.target/s390/hotpatch-compile-13.c: Likewise. * gcc.target/s390/hotpatch-compile-14.c: Likewise. * gcc.target/s390/hotpatch-compile-2.c: Likewise. * gcc.target/s390/hotpatch-compile-3.c: Likewise. * gcc.target/s390/hotpatch-compile-4.c: Likewise. * gcc.target/s390/hotpatch-compile-5.c: Likewise. * gcc.target/s390/hotpatch-compile-6.c: Likewise. * gcc.target/s390/hotpatch-compile-7.c: Likewise. * gcc.target/s390/hotpatch-compile-8.c: Likewise. * gcc.target/s390/hotpatch-compile-9.c: Likewise. 2015-01-27 Dominik Vogt * doc/extend.texi: s/390: Update documentation of hotpatch attribute. * doc/invoke.texi (-mhotpatch): s/390: Update documentation of -mhotpatch= option. * config/s390/s390.opt (mhotpatch): s/390: Remove -mhotpatch and -mno-hotpatch options. Change syntax of -mhotpatch= option. * config/s390/s390.c (s390_hotpatch_trampoline_halfwords_default): Renamed. (s390_hotpatch_trampoline_halfwords_max): Renamed. (s390_hotpatch_hw_max): New name. (s390_hotpatch_trampoline_halfwords): Renamed. (s390_hotpatch_hw_before_label): New name. (get_hotpatch_attribute): Removed. (s390_hotpatch_hw_after_label): New name. (s390_handle_hotpatch_attribute): Add second parameter to hotpatch attribute. (s390_attribute_table): Ditto. (s390_function_num_hotpatch_trampoline_halfwords): Renamed. (s390_function_num_hotpatch_hw): New name. Remove special handling of inline functions and hotpatching. Return number of nops before and after the function label. (s390_can_inline_p): Removed. (s390_asm_output_function_label): Emit a configurable number of nops after the function label. (s390_option_override): Update -mhotpatch= syntax and remove -mhotpatch. (TARGET_CAN_INLINE_P) Removed. (TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P): New. * gcc/testsuite/gcc.target/s390/hotpatch-13.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-14.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-15.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-16.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-17.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-18.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-19.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-20.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-10.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-11.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-12.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-13.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-14.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-15.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-16.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-compile-9.c: New testcase. * gcc/testsuite/gcc.target/s390/hotpatch-1.c: Testcase adjusted to new -mhotpatch. * gcc/testsuite/gcc.target/s390/hotpatch-10.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-11.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-12.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-2.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-3.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-4.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-5.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-6.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-7.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-8.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-9.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-1.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-2.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-3.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-4.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-5.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-6.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-7.c: Likewise. * gcc/testsuite/gcc.target/s390/hotpatch-compile-8.c: Likewise. 2014-09-09 Nick Clifton * doc/invoke.texi (S/390 and zSeries Options): Remove superfluous word from the 2014-02-13 Dominik Vogt * config/s390/s390.c (s390_asm_output_function_label): Fix crash caused by bad second argument to warning_at() with -mhotpatch and nested functions (e.g. with gfortran). 2013-12-19 Dominik Vogt Andreas Krebbel * config/s390/s390.c (s390_hotpatch_trampoline_halfwords_default): New constant (s390_hotpatch_trampoline_halfwords_max): New constant (s390_hotpatch_trampoline_halfwords): New static variable (get_hotpatch_attribute): New function (s390_handle_hotpatch_attribute): New function (s390_attribute_table): New target specific attribute table to implement the hotpatch attribute (s390_option_override): Parse hotpatch options (s390_function_num_hotpatch_trampoline_halfwords): New function (s390_can_inline_p): Implement target hook to suppress hotpatching for explicitly inlined functions (s390_asm_output_function_label): Generate hotpatch prologue (TARGET_ATTRIBUTE_TABLE): Define to implement target attribute table (TARGET_CAN_INLINE_P): Define to implement target hook * config/s390/s390.opt (mhotpatch): New options -mhotpatch, -mhotpatch= * config/s390/s390-protos.h (s390_asm_output_function_label): Add prototype * config/s390/s390.h (ASM_OUTPUT_FUNCTION_LABEL): Target specific function label generation for hotpatching (FUNCTION_BOUNDARY): Align functions to eight bytes * doc/extend.texi: Document hotpatch attribute * doc/invoke.texi: Document -mhotpatch option * gcc/testsuite/gcc.target/s390/hotpatch-1.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-2.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-3.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-4.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-5.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-6.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-7.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-8.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-9.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-10.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-11.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-12.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-compile-1.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-compile-2.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-compile-3.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-compile-4.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-compile-5.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-compile-6.c: New test * gcc/testsuite/gcc.target/s390/hotpatch-compile-7.c: New test --- gcc/config/s390/s390-protos.h.jj 2015-03-26 15:31:42.452623041 +0100 +++ gcc/config/s390/s390-protos.h 2015-03-26 16:25:08.308263197 +0100 @@ -119,6 +119,7 @@ extern bool s390_legitimate_address_with extern bool s390_decompose_shift_count (rtx, rtx *, HOST_WIDE_INT *); extern int s390_branch_condition_mask (rtx); extern int s390_compare_and_branch_condition_mask (rtx); +extern void s390_asm_declare_function_name (FILE *, const char *, tree); #endif /* RTX_CODE */ --- gcc/config/s390/s390.c.jj 2015-03-26 15:31:42.500622260 +0100 +++ gcc/config/s390/s390.c 2015-05-29 19:01:39.211229395 +0200 @@ -393,6 +393,63 @@ struct machine_function GTY(()) bytes on a z10 (or higher) CPU. */ #define PREDICT_DISTANCE (TARGET_Z10 ? 384 : 2048) +static const int s390_hotpatch_hw_max = 1000000; +static int s390_hotpatch_hw_before_label = 0; +static int s390_hotpatch_hw_after_label = 0; + +/* Check whether the hotpatch attribute is applied to a function and, if it has + an argument, the argument is valid. */ + +static tree +s390_handle_hotpatch_attribute (tree *node, tree name, tree args, + int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) +{ + tree expr; + tree expr2; + int err; + + if (TREE_CODE (*node) != FUNCTION_DECL) + { + warning (OPT_Wattributes, "%qE attribute only applies to functions", + name); + *no_add_attrs = true; + } + if (args != NULL && TREE_CHAIN (args) != NULL) + { + expr = TREE_VALUE (args); + expr2 = TREE_VALUE (TREE_CHAIN (args)); + } + if (args == NULL || TREE_CHAIN (args) == NULL) + err = 1; + else if (TREE_CODE (expr) != INTEGER_CST + || !INTEGRAL_TYPE_P (TREE_TYPE (expr)) + || TREE_INT_CST_HIGH (expr) != 0 + || TREE_INT_CST_LOW (expr) > (unsigned int) s390_hotpatch_hw_max) + err = 1; + else if (TREE_CODE (expr2) != INTEGER_CST + || !INTEGRAL_TYPE_P (TREE_TYPE (expr2)) + || TREE_INT_CST_HIGH (expr2) != 0 + || TREE_INT_CST_LOW (expr2) > (unsigned int) s390_hotpatch_hw_max) + err = 1; + else + err = 0; + if (err) + { + error ("requested %qE attribute is not a comma separated pair of" + " non-negative integer constants or too large (max. %d)", name, + s390_hotpatch_hw_max); + *no_add_attrs = true; + } + + return NULL_TREE; +} + +static const struct attribute_spec s390_attribute_table[] = { + { "hotpatch", 2, 2, true, false, false, s390_handle_hotpatch_attribute }, + /* End element. */ + { NULL, 0, 0, false, false, false, NULL } +}; + static enum machine_mode s390_libgcc_cmp_return_mode (void) { @@ -1557,6 +1614,22 @@ s390_handle_arch_option (const char *arg return false; } +/* If ARG is a non-negative integer made up solely of digits, return its + value, otherwise return -1. */ +static int +s390_integral_argument (const char *arg) +{ + const char *p = arg; + + while (*p && ISDIGIT (*p)) + p++; + + if (*p == '\0') + return atoi (arg); + + return -1; +} + /* Implement TARGET_HANDLE_OPTION. */ static bool @@ -1587,6 +1660,46 @@ s390_handle_option (size_t code, const c case OPT_mwarn_framesize_: return sscanf (arg, HOST_WIDE_INT_PRINT_DEC, &s390_warn_framesize) == 1; + case OPT_mhotpatch_: + { + int val1; + int val2; + char s[256]; + char *t; + + strncpy (s, arg, 256); + s[255] = 0; + t = strchr (s, ','); + if (t != NULL) + { + *t = 0; + t++; + val1 = s390_integral_argument (s); + val2 = s390_integral_argument (t); + } + else + { + val1 = -1; + val2 = -1; + } + if (val1 == -1 || val2 == -1) + { + /* argument is not a plain number */ + error ("arguments to %qs should be non-negative integers", + "-mhotpatch=n,m"); + return true; + } + else if (val1 > s390_hotpatch_hw_max || val2 > s390_hotpatch_hw_max) + { + error ("argument to %qs is too large (max. %d)", + "-mhotpatch=n,m", s390_hotpatch_hw_max); + return true; + } + s390_hotpatch_hw_before_label = val1; + s390_hotpatch_hw_after_label = val2; + return true; + } + default: return true; } @@ -4995,6 +5108,88 @@ get_some_local_dynamic_name (void) gcc_unreachable (); } +/* Assigns the number of NOP halfwords to be emitted before and after the + function label to *HW_BEFORE and *HW_AFTER. Both pointers must not be NULL. + If hotpatching is disabled for the function, the values are set to zero. +*/ + +static void +s390_function_num_hotpatch_hw (tree decl, + int *hw_before, + int *hw_after) +{ + tree attr; + + attr = lookup_attribute ("hotpatch", DECL_ATTRIBUTES (decl)); + + /* Handle the arguments of the hotpatch attribute. The values + specified via attribute might override the cmdline argument + values. */ + if (attr) + { + tree args = TREE_VALUE (attr); + + *hw_before = TREE_INT_CST_LOW (TREE_VALUE (args)); + *hw_after = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args))); + } + else + { + /* Use the values specified by the cmdline arguments. */ + *hw_before = s390_hotpatch_hw_before_label; + *hw_after = s390_hotpatch_hw_after_label; + } +} + +/* Write the extra assembler code needed to declare a function properly. */ + +void +s390_asm_declare_function_name (FILE *asm_out_file, const char *fname, + tree decl) +{ + int hw_before, hw_after; + + s390_function_num_hotpatch_hw (decl, &hw_before, &hw_after); + if (hw_before > 0) + { + unsigned int function_alignment; + int i; + + /* Add a trampoline code area before the function label and initialize it + with two-byte nop instructions. This area can be overwritten with code + that jumps to a patched version of the function. */ + asm_fprintf (asm_out_file, "\tnopr\t%%r7" + "\t# pre-label NOPs for hotpatch (%d halfwords)\n", + hw_before); + for (i = 1; i < hw_before; i++) + fputs ("\tnopr\t%r7\n", asm_out_file); + + /* Note: The function label must be aligned so that (a) the bytes of the + following nop do not cross a cacheline boundary, and (b) a jump address + (eight bytes for 64 bit targets, 4 bytes for 32 bit targets) can be + stored directly before the label without crossing a cacheline + boundary. All this is necessary to make sure the trampoline code can + be changed atomically. + This alignment is done automatically using the FOUNCTION_BOUNDARY, but + if there are NOPs before the function label, the alignment is placed + before them. So it is necessary to duplicate the alignment after the + NOPs. */ + function_alignment = MAX (8, DECL_ALIGN (decl) / BITS_PER_UNIT); + if (! DECL_USER_ALIGN (decl)) + function_alignment = MAX (function_alignment, + (unsigned int) align_functions); + fputs ("\t# alignment for hotpatch\n", asm_out_file); + ASM_OUTPUT_ALIGN (asm_out_file, floor_log2 (function_alignment)); + } + + ASM_OUTPUT_TYPE_DIRECTIVE (asm_out_file, fname, "function"); + ASM_DECLARE_RESULT (asm_out_file, DECL_RESULT (decl)); + ASM_OUTPUT_LABEL (asm_out_file, fname); + if (hw_after > 0) + asm_fprintf (asm_out_file, + "\t# post-label NOPs for hotpatch (%d halfwords)\n", + hw_after); +} + /* Output machine-dependent UNSPECs occurring in address constant X in assembler syntax to stdio stream FILE. Returns true if the constant X could be recognized, false otherwise. */ @@ -10033,6 +10228,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. */ @@ -10166,6 +10362,46 @@ 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; + + /* Insert NOPs for hotpatching. */ + for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) + /* Emit NOPs + 1. inside the area covered by debug information to allow setting + breakpoints at the NOPs, + 2. before any insn which results in an asm instruction, + 3. before in-function labels to avoid jumping to the NOPs, for + example as part of a loop, + 4. before any barrier in case the function is completely empty + (__builtin_unreachable ()) and has neither internal labels nor + active insns. + */ + if (active_insn_p (insn) || BARRIER_P (insn) || LABEL_P (insn)) + break; + /* Output a series of NOPs before the first active insn. */ + while (insn && hw_after > 0) + { + if (hw_after >= 3 && TARGET_CPU_ZARCH) + { + emit_insn_before (gen_nop_6_byte (), insn); + hw_after -= 3; + } + else if (hw_after >= 2) + { + emit_insn_before (gen_nop_4_byte (), insn); + hw_after -= 2; + } + else + { + emit_insn_before (gen_nop_2_byte (), insn); + hw_after -= 1; + } + } + } } /* Return true if INSN is a fp load insn writing register REGNO. */ @@ -10470,6 +10706,12 @@ s390_loop_unroll_adjust (unsigned nunrol #undef TARGET_LOOP_UNROLL_ADJUST #define TARGET_LOOP_UNROLL_ADJUST s390_loop_unroll_adjust +#undef TARGET_ATTRIBUTE_TABLE +#define TARGET_ATTRIBUTE_TABLE s390_attribute_table + +#undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P +#define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-s390.h" --- gcc/config/s390/s390.h.jj 2015-03-26 15:31:42.522621902 +0100 +++ gcc/config/s390/s390.h 2015-03-26 16:25:08.311263148 +0100 @@ -992,6 +992,9 @@ do { \ fputc ('\n', (FILE)); \ } while (0) +#undef ASM_DECLARE_FUNCTION_NAME +#define ASM_DECLARE_FUNCTION_NAME(FILE, NAME, DECL) \ + s390_asm_declare_function_name (FILE, NAME, DECL) /* Miscellaneous parameters. */ --- gcc/config/s390/s390.md.jj 2014-05-15 12:37:42.671166637 +0200 +++ gcc/config/s390/s390.md 2015-03-26 16:51:39.448482853 +0100 @@ -138,6 +138,11 @@ (define_constants ; Atomic Support (UNSPECV_CAS 700) (UNSPECV_ATOMIC_OP 701) + + ; Hotpatching (unremovable NOPs) + (UNSPECV_NOP_2_BYTE 800) + (UNSPECV_NOP_4_BYTE 801) + (UNSPECV_NOP_6_BYTE 802) ]) ;; @@ -8813,6 +8818,26 @@ (define_insn "nop1" "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). --- gcc/config/s390/s390.opt.jj 2015-03-26 15:31:42.685619252 +0100 +++ gcc/config/s390/s390.opt 2015-03-26 16:25:08.312263132 +0100 @@ -54,6 +54,16 @@ mhard-float Target Report RejectNegative Negative(msoft-float) InverseMask(SOFT_FLOAT, HARD_FLOAT) Enable hardware floating point +mhotpatch= +Target RejectNegative Report Joined Var(s390_hotpatch_string) +Takes two non-negative integer numbers separated by a comma. +Prepend the function label with the number of two-byte Nop +instructions indicated by the first. Append Nop instructions +covering the number of halfwords indicated by the second after the +label. Nop instructions of the largest possible size are used +(six, four or two bytes), beginning with the largest possible +size. Using 0 for both values disables hotpatching. + mlong-double-128 Target Report RejectNegative Negative(mlong-double-64) Mask(LONG_DOUBLE_128) Use 128-bit long double --- gcc/doc/extend.texi.jj 2015-03-26 15:31:42.406623789 +0100 +++ gcc/doc/extend.texi 2015-03-26 16:25:08.316263067 +0100 @@ -2395,6 +2395,20 @@ then be sure to write this declaration i This attribute is ignored for R8C target. +@item hotpatch (@var{halfwords-before-function-label},@var{halfwords-after-function-label}) +@cindex @code{hotpatch} attribute + +On S/390 System z targets, you can use this function attribute to +make GCC generate a ``hot-patching'' function prologue. If the +@option{-mhotpatch=} command-line option is used at the same time, +the @code{hotpatch} attribute takes precedence. The first of the +two arguments specifies the number of halfwords to be added before +the function label. A second argument can be used to specify the +number of halfwords to be added after the function label. For +both arguments the maximum allowed value is 1000000. + +If both arguments are zero, hotpatching is disabled. + @item interrupt @cindex interrupt handler functions Use this attribute on the ARM, AVR, CRX, M32C, M32R/D, m68k, --- gcc/doc/invoke.texi.jj 2015-03-26 15:31:42.371624358 +0100 +++ gcc/doc/invoke.texi 2015-03-26 16:32:09.561432439 +0100 @@ -768,7 +768,8 @@ See RS/6000 and PowerPC Options. -msmall-exec -mno-small-exec -mmvcle -mno-mvcle @gol -m64 -m31 -mdebug -mno-debug -mesa -mzarch @gol -mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd @gol --mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard} +-mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard @gol +-mhotpatch=@var{halfwords},@var{halfwords}} @emph{Score Options} @gccoptlist{-meb -mel @gol @@ -14889,6 +14890,21 @@ values have to be exact powers of 2 and In order to be efficient the extra code makes the assumption that the stack starts at an address aligned to the value given by @var{stack-size}. The @var{stack-guard} option can only be used in conjunction with @var{stack-size}. + +@item -mhotpatch=@var{pre-halfwords},@var{post-halfwords} +@opindex mhotpatch +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 +the label, 2 * @var{post-halfwords} bytes are appended, using the +largest NOP like instructions the architecture allows (maximum +1000000). + +If both arguments are zero, hotpatching is disabled. + +This option can be overridden for individual functions with the +@code{hotpatch} attribute. @end table @node Score Options --- gcc/testsuite/gcc.target/s390/hotpatch-1.c.jj 2015-03-26 16:25:08.321262986 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-1.c 2015-05-29 19:01:39.202229533 +0200 @@ -0,0 +1,19 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler-not "post-label NOPs" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-10.c.jj 2015-03-26 16:25:08.321262986 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-10.c 2015-05-29 19:01:39.207229456 +0200 @@ -0,0 +1,19 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,0" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler-not "post-label NOPs" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-11.c.jj 2015-03-26 16:25:08.321262986 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-11.c 2015-05-29 19:01:39.204229502 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=1,0" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label.*(1 halfwords)" } } */ +/* { dg-final { scan-assembler-not "post-label NOPs" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-12.c.jj 2015-03-26 16:25:08.321262986 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-12.c 2015-05-29 19:01:39.208229441 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=999,0" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label.*(999 halfwords)" } } */ +/* { dg-final { scan-assembler-not "post-label NOPs" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 999 } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-13.c.jj 2015-03-26 16:25:08.321262986 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-13.c 2015-05-29 19:01:39.204229502 +0200 @@ -0,0 +1,20 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch" } */ + +#include + +__attribute__ ((hotpatch(1,0))) +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label.*(1 halfwords)" } } */ +/* { dg-final { scan-assembler-not "post-label NOPs" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-14.c.jj 2015-03-26 16:25:08.322262970 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-14.c 2015-05-29 19:01:39.208229441 +0200 @@ -0,0 +1,20 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch" } */ + +#include + +__attribute__ ((hotpatch(0,2))) +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-15.c.jj 2015-03-26 16:25:08.322262970 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-15.c 2015-05-29 19:01:39.204229502 +0200 @@ -0,0 +1,19 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch" } */ + +#include + +__attribute__ ((hotpatch(1,2))) +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label.*(1 halfwords)" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-16.c.jj 2015-03-26 16:25:08.322262970 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-16.c 2015-05-29 19:01:38.781235985 +0200 @@ -0,0 +1,19 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,0" } */ + +#include + +__attribute__ ((hotpatch(1,2))) +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label.*(1 halfwords)" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-17.c.jj 2015-03-26 16:25:08.322262970 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-17.c 2015-05-29 19:01:39.205229487 +0200 @@ -0,0 +1,20 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=1,2" } */ + +#include + +__attribute__ ((hotpatch(0,0))) +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler-not "post-label NOPs" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-18.c.jj 2015-03-26 16:25:08.323262954 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-18.c 2015-05-29 19:01:38.782235970 +0200 @@ -0,0 +1,19 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=1,2 -mhotpatch=0,0" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler-not "post-label NOPs" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-19.c.jj 2015-03-26 16:25:08.323262954 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-19.c 2015-06-01 13:10:09.554981201 +0200 @@ -0,0 +1,24 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=1,2" } */ + +#include + +__attribute__ ((always_inline)) +static inline void hp2(void) +{ + printf("hello, world!\n"); +} + +void hp1(void) +{ + hp2(); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label.*(1 halfwords)" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-2.c.jj 2015-03-26 16:25:08.323262954 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-2.c 2015-05-29 19:01:39.206229472 +0200 @@ -0,0 +1,19 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,1" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(1 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nopr\t" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-20.c.jj 2015-03-26 16:25:08.323262954 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-20.c 2015-06-01 13:10:09.555981186 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch" } */ + +#include + +__attribute__ ((hotpatch(1,2))) +__attribute__ ((always_inline)) +static inline void hp2(void) +{ + printf("hello, world!\n"); +} + +void hp1(void) +{ + hp2(); +} --- gcc/testsuite/gcc.target/s390/hotpatch-21.c.jj 2015-03-26 16:32:09.590431968 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-21.c 2015-05-29 19:01:39.201229548 +0200 @@ -0,0 +1,14 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,1" } */ + +#include + +void __attribute__ ((aligned(512))) hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-22.c.jj 2015-03-26 16:32:09.594431904 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-22.c 2015-05-29 19:01:39.205229487 +0200 @@ -0,0 +1,14 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,1 -falign-functions=1024" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-23.c.jj 2015-03-26 16:32:09.591431952 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-23.c 2015-05-29 19:01:39.202229533 +0200 @@ -0,0 +1,14 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,1 -falign-functions=4096" } */ + +#include + +void __attribute__ ((aligned(2048))) hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-24.c.jj 2015-03-26 16:32:09.594431904 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-24.c 2015-05-29 19:01:39.206229472 +0200 @@ -0,0 +1,14 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,1 -falign-functions=2048" } */ + +#include + +void __attribute__ ((aligned(4096))) hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-25.c.jj 2015-05-29 18:52:06.537006787 +0200 +++ gcc/testsuite/gcc.target/s390/hotpatch-25.c 2015-05-29 19:01:39.202229533 +0200 @@ -0,0 +1,32 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch" } */ + +typedef long (*fn_t)(void); + +__attribute__ ((hotpatch(1,2))) +fn_t outer(void) +{ + __attribute__ ((hotpatch(4,8))) + long nested1(void) + { + __attribute__ ((hotpatch(16,32))) + long nested2(void) + { + return 2; + } + return (long)(void *)nested2; + } + + return nested1; +} + +/* { dg-final { scan-assembler "pre-label.*(1 halfwords)" } } */ +/* { dg-final { scan-assembler "pre-label.*(4 halfwords)" } } */ +/* { dg-final { scan-assembler "pre-label.*(16 halfwords)" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nopr\t" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(8 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(32 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-times "alignment for hotpatch" 3 } } */ +/* { dg-final { scan-assembler "nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-26.c.jj 2015-05-29 19:11:03.831575445 +0200 +++ gcc/testsuite/gcc.target/s390/hotpatch-26.c 2015-05-29 19:01:39.206229472 +0200 @@ -0,0 +1,17 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=1,2" } */ + +__attribute__ ((noreturn)) void hp1(void) +{ + __builtin_unreachable (); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-27.c.jj 2015-05-29 19:11:03.831575445 +0200 +++ gcc/testsuite/gcc.target/s390/hotpatch-27.c 2015-05-29 19:01:39.202229533 +0200 @@ -0,0 +1,17 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=1,2" } */ + +__attribute__ ((noreturn)) void hp3(void) +{ + __builtin_unreachable (); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-28.c.jj 2015-05-29 19:11:03.831575445 +0200 +++ gcc/testsuite/gcc.target/s390/hotpatch-28.c 2015-05-29 19:01:39.206229472 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=1,2" } */ + +void hp1 (volatile unsigned int *i) +{ + for (;;) + (*i)++; +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-3.c.jj 2015-03-26 16:25:08.323262954 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-3.c 2015-05-29 19:01:39.203229518 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,2" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-4.c.jj 2015-03-26 16:25:08.324262937 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-4.c 2015-05-29 19:01:39.207229456 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,3" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(3 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-times "brcl\t0, 0" 1 } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-5.c.jj 2015-03-26 16:25:08.324262937 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-5.c 2015-05-29 19:01:39.203229518 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,4" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(4 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-times "brcl\t0, 0" 1 } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-6.c.jj 2015-03-26 16:25:08.324262937 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-6.c 2015-05-29 19:01:39.207229456 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,5" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(5 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-times "brcl\t0, 0" 1 } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-7.c.jj 2015-03-26 16:25:08.324262937 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-7.c 2015-05-29 19:01:39.203229518 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-mzarch -mhotpatch=0,6" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(6 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-not "nop\t0" } } */ +/* { dg-final { scan-assembler-times "brcl\t0, 0" 2 } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-8.c.jj 2015-03-26 16:25:08.324262937 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-8.c 2015-05-29 19:01:39.207229456 +0200 @@ -0,0 +1,19 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile { target { ! lp64 } } } */ +/* { dg-options "-mesa -march=g5 -mhotpatch=0,3" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(3 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ +/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ +/* { dg-final { scan-assembler-not "alignment for hotpatch" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-9.c.jj 2015-03-26 16:25:08.325262921 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-9.c 2015-05-29 19:01:39.203229518 +0200 @@ -0,0 +1,18 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile { target { ! lp64 } } } */ +/* { dg-options "-mesa -march=g5 -mhotpatch=0,4" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +/* Check number of occurences of certain instructions. */ +/* { dg-final { scan-assembler-not "pre-label NOPs" } } */ +/* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(4 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nop\t0" } } */ +/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ +/* { dg-final { scan-assembler-times "nop\t0" 2 } } */ +/* { dg-final { scan-assembler-not "brcl\t0, 0" } } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-1.c.jj 2015-03-26 16:25:08.325262921 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-1.c 2015-03-26 16:25:08.325262921 +0100 @@ -0,0 +1,5 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=-1,0" } */ +/* { dg-error "arguments to .-mhotpatch=n,m. should be non-negative integers" "" { target *-*-* } 0 } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-10.c.jj 2015-03-26 16:25:08.325262921 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-10.c 2015-03-26 16:25:08.325262921 +0100 @@ -0,0 +1,10 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +__attribute__((hotpatch(0,0,0))) +int main (void) +{/* { dg-error "wrong number of arguments specified" } */ + return 0; +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-11.c.jj 2015-03-26 16:25:08.325262921 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-11.c 2015-03-26 16:25:08.325262921 +0100 @@ -0,0 +1,12 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +int a; + +__attribute__((hotpatch(a,0))) +int main (void) +{ /* { dg-error "attribute is not a comma separated pair of non-negative integer constants or too large" } */ + return 0; +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-12.c.jj 2015-03-26 16:25:08.326262905 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-12.c 2015-03-26 16:25:08.326262905 +0100 @@ -0,0 +1,12 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +int a; + +__attribute__((hotpatch(0,a))) +int main (void) +{ /* { dg-error "attribute is not a comma separated pair of non-negative integer constants or too large" } */ + return 0; +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-13.c.jj 2015-03-26 16:25:08.326262905 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-13.c 2015-03-26 16:25:08.326262905 +0100 @@ -0,0 +1,29 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=1000000,1000000" } */ + +#include + +void hp1(void) +{ + printf("hello, world!\n"); +} + +__attribute__ ((hotpatch(1000000,1000000))) +void hp2(void) +{ + printf("hello, world!\n"); +} + +__attribute__ ((hotpatch(1000001,1000000))) +void hp3(void) +{ /* { dg-error " requested .hotpatch. attribute is not a comma separated pair" } */ + printf("hello, world!\n"); +} + +__attribute__ ((hotpatch(1000000,1000001))) +void hp4(void) +{ /* { dg-error " requested .hotpatch. attribute is not a comma separated pair" } */ + printf("hello, world!\n"); +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-14.c.jj 2015-03-26 16:25:08.326262905 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-14.c 2015-03-26 16:25:08.326262905 +0100 @@ -0,0 +1,11 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=1000001,1000000" } */ + +viod main(void) +{ + return 0; +} + +/* { dg-error "argument to .-mhotpatch=n,m. is too large" "" { target *-*-* } 0 } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-15.c.jj 2015-03-26 16:25:08.326262905 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-15.c 2015-06-01 13:10:09.554981201 +0200 @@ -0,0 +1,40 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +#include + +__attribute__ ((hotpatch(1,2))) +static void hp1(void) +{ + printf("hello, world!\n"); +} + +__attribute__ ((hotpatch(1,2))) +static inline void hp2(void) +{ + printf("hello, world!\n"); +} + +__attribute__ ((hotpatch(0,0))) +__attribute__ ((always_inline)) +static inline void hp3(void) +{ + printf("hello, world!\n"); +} + +__attribute__ ((hotpatch(1,2))) +__attribute__ ((always_inline)) +static inline void hp4(void) +{ + printf("hello, world!\n"); +} + +void main(void) +{ + hp1(); + hp2(); + hp3(); + hp4(); +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-16.c.jj 2015-03-26 16:25:08.326262905 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-16.c 2015-05-29 18:50:03.740888886 +0200 @@ -0,0 +1,24 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +typedef int (*fn_t)(void); + +fn_t hp1(void) +{ + __attribute__((hotpatch(0,0))) + int nested1(void) + { return 1; } + + return nested1; +} + +fn_t hp2(void) +{ + __attribute__ ((hotpatch(1,2))) + int nested2(void) + { return 2; } + + return nested2; +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-2.c.jj 2015-03-26 16:25:08.327262889 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-2.c 2015-03-26 16:25:08.327262889 +0100 @@ -0,0 +1,5 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=0,-1" } */ +/* { dg-error "arguments to .-mhotpatch=n,m. should be non-negative integers" "" { target *-*-* } 0 } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-3.c.jj 2015-03-26 16:25:08.327262889 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-3.c 2015-03-26 16:25:08.327262889 +0100 @@ -0,0 +1,5 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=0" } */ +/* { dg-error "arguments to .-mhotpatch=n,m. should be non-negative integers" "" { target *-*-* } 0 } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-4.c.jj 2015-03-26 16:25:08.327262889 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-4.c 2015-03-26 16:25:08.327262889 +0100 @@ -0,0 +1,5 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=0,0,0" } */ +/* { dg-error "arguments to .-mhotpatch=n,m. should be non-negative integers" "" { target *-*-* } 0 } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-5.c.jj 2015-03-26 16:25:08.327262889 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-5.c 2015-03-26 16:25:08.327262889 +0100 @@ -0,0 +1,5 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=a,0" } */ +/* { dg-error "arguments to .-mhotpatch=n,m. should be non-negative integers" "" { target *-*-* } 0 } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-6.c.jj 2015-03-26 16:25:08.328262873 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-6.c 2015-03-26 16:25:08.328262873 +0100 @@ -0,0 +1,5 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch -mhotpatch=0,a" } */ +/* { dg-error "arguments to .-mhotpatch=n,m. should be non-negative integers" "" { target *-*-* } 0 } */ --- gcc/testsuite/gcc.target/s390/hotpatch-compile-7.c.jj 2015-03-26 16:25:08.328262873 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-7.c 2015-03-26 16:25:08.328262873 +0100 @@ -0,0 +1,10 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +__attribute__((hotpatch(-1,0))) +int main (void) +{/* { dg-error "attribute is not a comma separated pair of non-negative integer constants or too large" } */ + return 0; +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-8.c.jj 2015-03-26 16:25:08.328262873 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-8.c 2015-03-26 16:25:08.328262873 +0100 @@ -0,0 +1,10 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +__attribute__((hotpatch(0,-1))) +int main (void) +{/* { dg-error "attribute is not a comma separated pair of non-negative integer constants or too large" } */ + return 0; +} --- gcc/testsuite/gcc.target/s390/hotpatch-compile-9.c.jj 2015-03-26 16:25:08.328262873 +0100 +++ gcc/testsuite/gcc.target/s390/hotpatch-compile-9.c 2015-03-26 16:25:08.328262873 +0100 @@ -0,0 +1,10 @@ +/* Functional tests for the function hotpatching feature. */ + +/* { dg-do compile } */ +/* { dg-options "-O3 -mzarch" } */ + +__attribute__((hotpatch(0))) +int main (void) +{/* { dg-error "wrong number of arguments specified" } */ + return 0; +} --- gcc/testsuite/gcc.target/s390/s390.exp.jj 2015-05-29 19:01:39.000000000 +0200 +++ gcc/testsuite/gcc.target/s390/s390.exp 2015-06-11 16:15:59.183085886 +0200 @@ -33,9 +33,18 @@ if ![info exists DEFAULT_CFLAGS] then { # Initialize `dg'. dg-init +set hotpatch_tests $srcdir/$subdir/hotpatch-\[0-9\]*.c + # Main loop. -dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cS\]]] \ - "" $DEFAULT_CFLAGS +dg-runtest [lsort [prune [glob -nocomplain $srcdir/$subdir/*.\[cS\]] \ + $hotpatch_tests]] "" $DEFAULT_CFLAGS + +# Additional hotpatch torture tests. +torture-init +set HOTPATCH_TEST_OPTS [list -Os -O0 -O1 -O2 -O3] +set-torture-options $HOTPATCH_TEST_OPTS +gcc-dg-runtest [lsort [glob -nocomplain $hotpatch_tests]] $DEFAULT_CFLAGS +torture-finish # All done. dg-finish