extend.texi: s/390: Update documentation of hotpatch attribute.

2015-01-27  Dominik Vogt  <vogt@linux.vnet.ibm.com>

        * 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.

2015-01-27  Dominik Vogt  <vogt@linux.vnet.ibm.com>

	* 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.

From-SVN: r220171
This commit is contained in:
Dominik Vogt 2015-01-27 15:26:16 +00:00 committed by Andreas Krebbel
parent 096e8448ca
commit 94091f43bd
42 changed files with 602 additions and 404 deletions

View File

@ -1,3 +1,32 @@
2015-01-27 Dominik Vogt <vogt@linux.vnet.ibm.com>
* 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.
2015-01-27 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com> 2015-01-27 Ramana Radhakrishnan <ramana.radhakrishnan@arm.com>
Jiong Wang <jiong.wang@arm.com> Jiong Wang <jiong.wang@arm.com>

View File

@ -460,24 +460,9 @@ struct GTY(()) machine_function
bytes on a z10 (or higher) CPU. */ bytes on a z10 (or higher) CPU. */
#define PREDICT_DISTANCE (TARGET_Z10 ? 384 : 2048) #define PREDICT_DISTANCE (TARGET_Z10 ? 384 : 2048)
static const int s390_hotpatch_trampoline_halfwords_default = 12; static const int s390_hotpatch_hw_max = 1000000;
static const int s390_hotpatch_trampoline_halfwords_max = 1000000; static int s390_hotpatch_hw_before_label = 0;
static int s390_hotpatch_trampoline_halfwords = -1; static int s390_hotpatch_hw_after_label = 0;
/* Return the argument of the given hotpatch attribute or the default value if
no argument is present. */
static inline int
get_hotpatch_attribute (tree hotpatch_attr)
{
const_tree args;
args = TREE_VALUE (hotpatch_attr);
return (args) ?
TREE_INT_CST_LOW (TREE_VALUE (args)):
s390_hotpatch_trampoline_halfwords_default;
}
/* Check whether the hotpatch attribute is applied to a function and, if it has /* Check whether the hotpatch attribute is applied to a function and, if it has
an argument, the argument is valid. */ an argument, the argument is valid. */
@ -486,32 +471,46 @@ static tree
s390_handle_hotpatch_attribute (tree *node, tree name, tree args, s390_handle_hotpatch_attribute (tree *node, tree name, tree args,
int flags ATTRIBUTE_UNUSED, bool *no_add_attrs) int flags ATTRIBUTE_UNUSED, bool *no_add_attrs)
{ {
tree expr;
tree expr2;
int err;
if (TREE_CODE (*node) != FUNCTION_DECL) if (TREE_CODE (*node) != FUNCTION_DECL)
{ {
warning (OPT_Wattributes, "%qE attribute only applies to functions", warning (OPT_Wattributes, "%qE attribute only applies to functions",
name); name);
*no_add_attrs = true; *no_add_attrs = true;
} }
else if (args) if (args != NULL && TREE_CHAIN (args) != NULL)
{ {
tree expr = TREE_VALUE (args); expr = TREE_VALUE (args);
expr2 = TREE_VALUE (TREE_CHAIN (args));
if (TREE_CODE (expr) != INTEGER_CST }
|| !INTEGRAL_TYPE_P (TREE_TYPE (expr)) if (args == NULL || TREE_CHAIN (args) == NULL)
|| wi::gtu_p (expr, s390_hotpatch_trampoline_halfwords_max)) err = 1;
{ else if (TREE_CODE (expr) != INTEGER_CST
error ("requested %qE attribute is not a non-negative integer" || !INTEGRAL_TYPE_P (TREE_TYPE (expr))
" constant or too large (max. %d)", name, || wi::gtu_p (expr, s390_hotpatch_hw_max))
s390_hotpatch_trampoline_halfwords_max); err = 1;
*no_add_attrs = true; else if (TREE_CODE (expr2) != INTEGER_CST
} || !INTEGRAL_TYPE_P (TREE_TYPE (expr2))
|| wi::gtu_p (expr2, 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; return NULL_TREE;
} }
static const struct attribute_spec s390_attribute_table[] = { static const struct attribute_spec s390_attribute_table[] = {
{ "hotpatch", 0, 1, true, false, false, s390_handle_hotpatch_attribute, false { "hotpatch", 2, 2, true, false, false, s390_handle_hotpatch_attribute, false
}, },
/* End element. */ /* End element. */
{ NULL, 0, 0, false, false, false, NULL, false } { NULL, 0, 0, false, false, false, NULL, false }
@ -5235,53 +5234,51 @@ print_shift_count_operand (FILE *file, rtx op)
fprintf (file, "(%s)", reg_names[REGNO (base)]); fprintf (file, "(%s)", reg_names[REGNO (base)]);
} }
/* Returns -1 if the function should not be made hotpatchable. Otherwise it /* Returns false if the function should not be made hotpatchable.
returns a number >= 0 that is the desired size of the hotpatch trampoline Otherwise it assigns the number of NOP halfwords to be emitted
in halfwords. */ before and after the function label to hw_before and hw_after.
Both must not be NULL. */
static int s390_function_num_hotpatch_trampoline_halfwords (tree decl, static bool
bool do_warn) s390_function_num_hotpatch_hw (tree decl,
int *hw_before,
int *hw_after)
{ {
tree attr; tree attr;
if (DECL_DECLARED_INLINE_P (decl) *hw_before = 0;
|| DECL_ARTIFICIAL (decl) *hw_after = 0;
|| MAIN_NAME_P (DECL_NAME (decl)))
{
/* - Explicitly inlined functions cannot be hotpatched.
- Artificial functions need not be hotpatched.
- Making the main function hotpatchable is useless. */
return -1;
}
attr = lookup_attribute ("hotpatch", DECL_ATTRIBUTES (decl)); attr = lookup_attribute ("hotpatch", DECL_ATTRIBUTES (decl));
if (attr || s390_hotpatch_trampoline_halfwords >= 0)
/* Handle the arguments of the hotpatch attribute. The values
specified via attribute might override the cmdline argument
values. */
if (attr)
{ {
if (lookup_attribute ("always_inline", DECL_ATTRIBUTES (decl))) tree args = TREE_VALUE (attr);
{
if (do_warn) *hw_before = TREE_INT_CST_LOW (TREE_VALUE (args));
warning (OPT_Wattributes, "function %qE with the %qs attribute" *hw_after = TREE_INT_CST_LOW (TREE_VALUE (TREE_CHAIN (args)));
" is not hotpatchable", DECL_NAME (decl), "always_inline"); }
return -1; else
} {
else /* Use the values specified by the cmdline arguments. */
{ *hw_before = s390_hotpatch_hw_before_label;
return (attr) ? *hw_after = s390_hotpatch_hw_after_label;
get_hotpatch_attribute (attr) : s390_hotpatch_trampoline_halfwords;
}
} }
return -1; if (*hw_before == 0 && *hw_after == 0)
}
/* Hook to determine if one function can safely inline another. */
static bool
s390_can_inline_p (tree caller, tree callee)
{
if (s390_function_num_hotpatch_trampoline_halfwords (callee, false) >= 0)
return false; return false;
return default_target_can_inline_p (caller, callee); if (decl_function_context (decl) != NULL_TREE)
{
warning_at (DECL_SOURCE_LOCATION (decl), OPT_mhotpatch_,
"hotpatching is not compatible with nested functions");
return false;
}
return true;
} }
/* Write the extra assembler code needed to declare a function properly. */ /* Write the extra assembler code needed to declare a function properly. */
@ -5290,29 +5287,20 @@ void
s390_asm_output_function_label (FILE *asm_out_file, const char *fname, s390_asm_output_function_label (FILE *asm_out_file, const char *fname,
tree decl) tree decl)
{ {
int hotpatch_trampoline_halfwords = -1; int hw_before, hw_after;
bool hotpatch_p = (decl
? s390_function_num_hotpatch_hw (decl,
&hw_before, &hw_after)
: false);
if (decl) if (hotpatch_p)
{
hotpatch_trampoline_halfwords =
s390_function_num_hotpatch_trampoline_halfwords (decl, true);
if (hotpatch_trampoline_halfwords >= 0
&& decl_function_context (decl) != NULL_TREE)
{
warning_at (DECL_SOURCE_LOCATION (decl), OPT_mhotpatch,
"hotpatching is not compatible with nested functions");
hotpatch_trampoline_halfwords = -1;
}
}
if (hotpatch_trampoline_halfwords > 0)
{ {
int i; int i;
/* Add a trampoline code area before the function label and initialize it /* Add a trampoline code area before the function label and initialize it
with two-byte nop instructions. This area can be overwritten with code with two-byte nop instructions. This area can be overwritten with code
that jumps to a patched version of the function. */ that jumps to a patched version of the function. */
for (i = 0; i < hotpatch_trampoline_halfwords; i++) for (i = 0; i < hw_before; i++)
asm_fprintf (asm_out_file, "\tnopr\t%%r7\n"); asm_fprintf (asm_out_file, "\tnopr\t%%r7\n");
/* Note: The function label must be aligned so that (a) the bytes of the /* 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 following nop do not cross a cacheline boundary, and (b) a jump address
@ -5324,10 +5312,30 @@ s390_asm_output_function_label (FILE *asm_out_file, const char *fname,
ASM_OUTPUT_LABEL (asm_out_file, fname); ASM_OUTPUT_LABEL (asm_out_file, fname);
/* Output a four-byte nop if hotpatching is enabled. This can be overwritten /* Output a series of NOPs after the function label. */
atomically with a relative backwards jump to the trampoline area. */ if (hotpatch_p)
if (hotpatch_trampoline_halfwords >= 0) {
asm_fprintf (asm_out_file, "\tnop\t0\n"); 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 /* Output machine-dependent UNSPECs occurring in address constant X
@ -11842,29 +11850,44 @@ s390_option_override (void)
{ {
switch (opt->opt_index) switch (opt->opt_index)
{ {
case OPT_mhotpatch:
s390_hotpatch_trampoline_halfwords = (opt->value) ?
s390_hotpatch_trampoline_halfwords_default : -1;
break;
case OPT_mhotpatch_: case OPT_mhotpatch_:
{ {
int val; int val1;
int val2;
char s[256];
char *t;
val = integral_argument (opt->arg); strncpy (s, opt->arg, 256);
if (val == -1) s[255] = 0;
t = strchr (s, ',');
if (t != NULL)
{
*t = 0;
t++;
val1 = integral_argument (s);
val2 = integral_argument (t);
}
else
{
val1 = -1;
val2 = -1;
}
if (val1 == -1 || val2 == -1)
{ {
/* argument is not a plain number */ /* argument is not a plain number */
error ("argument to %qs should be a non-negative integer", error ("arguments to %qs should be non-negative integers",
"-mhotpatch="); "-mhotpatch=n,m");
break; break;
} }
else if (val > s390_hotpatch_trampoline_halfwords_max) else if (val1 > s390_hotpatch_hw_max
|| val2 > s390_hotpatch_hw_max)
{ {
error ("argument to %qs is too large (max. %d)", error ("argument to %qs is too large (max. %d)",
"-mhotpatch=", s390_hotpatch_trampoline_halfwords_max); "-mhotpatch=n,m", s390_hotpatch_hw_max);
break; break;
} }
s390_hotpatch_trampoline_halfwords = val; s390_hotpatch_hw_before_label = val1;
s390_hotpatch_hw_after_label = val2;
break; break;
} }
default: default:
@ -12249,8 +12272,8 @@ s390_use_by_pieces_infrastructure_p (unsigned HOST_WIDE_INT size,
#undef TARGET_ATTRIBUTE_TABLE #undef TARGET_ATTRIBUTE_TABLE
#define TARGET_ATTRIBUTE_TABLE s390_attribute_table #define TARGET_ATTRIBUTE_TABLE s390_attribute_table
#undef TARGET_CAN_INLINE_P #undef TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P
#define TARGET_CAN_INLINE_P s390_can_inline_p #define TARGET_FUNCTION_ATTRIBUTE_INLINABLE_P hook_bool_const_tree_true
#undef TARGET_SET_UP_BY_PROLOGUE #undef TARGET_SET_UP_BY_PROLOGUE
#define TARGET_SET_UP_BY_PROLOGUE s300_set_up_by_prologue #define TARGET_SET_UP_BY_PROLOGUE s300_set_up_by_prologue

View File

@ -96,13 +96,15 @@ mhard-float
Target Report RejectNegative Negative(msoft-float) InverseMask(SOFT_FLOAT, HARD_FLOAT) Target Report RejectNegative Negative(msoft-float) InverseMask(SOFT_FLOAT, HARD_FLOAT)
Enable hardware floating point Enable hardware floating point
mhotpatch
Target Report Var(s390_deferred_options) Defer
Prepend the function label with 12 two-byte Nop instructions, and add a four byte Nop instruction after the label for hotpatching.
mhotpatch= mhotpatch=
Target RejectNegative Report Joined Var(s390_deferred_options) Defer Target RejectNegative Report Joined Var(s390_deferred_options) Defer
Prepend the function label with the given number of two-byte Nop instructions, and add a four byte Nop instruction after the label for hotpatching. 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 mlong-double-128
Target Report RejectNegative Negative(mlong-double-64) Mask(LONG_DOUBLE_128) Target Report RejectNegative Negative(mlong-double-64) Mask(LONG_DOUBLE_128)

View File

@ -3376,16 +3376,19 @@ this function attribute to make GCC generate the ``hot-patching'' function
prologue used in Win32 API functions in Microsoft Windows XP Service Pack 2 prologue used in Win32 API functions in Microsoft Windows XP Service Pack 2
and newer. and newer.
@item hotpatch [(@var{prologue-halfwords})] @item hotpatch (@var{halfwords-before-function-label},@var{halfwords-after-function-label})
@cindex @code{hotpatch} attribute @cindex @code{hotpatch} attribute
On S/390 System z targets, you can use this function attribute to On S/390 System z targets, you can use this function attribute to
make GCC generate a ``hot-patching'' function prologue. The make GCC generate a ``hot-patching'' function prologue. If the
@code{hotpatch} has no effect on funtions that are explicitly @option{-mhotpatch=} command-line option is used at the same time,
inline. If the @option{-mhotpatch} or @option{-mno-hotpatch} the @code{hotpatch} attribute takes precedence. The first of the
command-line option is used at the same time, the @code{hotpatch} two arguments specifies the number of halfwords to be added before
attribute takes precedence. If an argument is given, the maximum the function label. A second argument can be used to specify the
allowed value is 1000000. number of halfwords to be added after the function label. For
both arguments the maximum allowed value is 1000000.
If both ar guments are zero, hotpatching is disabled.
@item naked @item naked
@cindex function without a prologue/epilogue code @cindex function without a prologue/epilogue code

View File

@ -976,7 +976,7 @@ See RS/6000 and PowerPC Options.
-m64 -m31 -mdebug -mno-debug -mesa -mzarch @gol -m64 -m31 -mdebug -mno-debug -mesa -mzarch @gol
-mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd @gol -mtpf-trace -mno-tpf-trace -mfused-madd -mno-fused-madd @gol
-mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard @gol -mwarn-framesize -mwarn-dynamicstack -mstack-size -mstack-guard @gol
-mhotpatch[=@var{halfwords}] -mno-hotpatch} -mhotpatch=@var{halfwords},@var{halfwords}}
@emph{Score Options} @emph{Score Options}
@gccoptlist{-meb -mel @gol @gccoptlist{-meb -mel @gol
@ -21201,17 +21201,17 @@ In order to be efficient the extra code makes the assumption that the stack star
at an address aligned to the value given by @var{stack-size}. 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}. The @var{stack-guard} option can only be used in conjunction with @var{stack-size}.
@item -mhotpatch[=@var{halfwords}] @item -mhotpatch=@var{pre-halfwords},@var{post-halfwords}
@itemx -mno-hotpatch
@opindex mhotpatch @opindex mhotpatch
If the hotpatch option is enabled, a ``hot-patching'' function If the hotpatch option is enabled, a ``hot-patching'' function
prologue is generated for all functions in the compilation unit. prologue is generated for all functions in the compilation unit.
The funtion label is prepended with the given number of two-byte The funtion label is prepended with the given number of two-byte
Nop instructions (@var{halfwords}, maximum 1000000) or 12 Nop Nop instructions (@var{pre-halfwords}, maximum 1000000). After
instructions if no argument is present. Functions with a the label, 2 * @var{post-halfwords} bytes are appended, using the
hot-patching prologue are never inlined automatically, and a larges nop like instructions the architecture allows (maximum
hot-patching prologue is never generated for functions 1000000).
that are explicitly inline.
If both arguments are zero, hotpatching is disabled.
This option can be overridden for individual functions with the This option can be overridden for individual functions with the
@code{hotpatch} attribute. @code{hotpatch} attribute.

View File

@ -1,3 +1,44 @@
2015-01-27 Dominik Vogt <vogt@linux.vnet.ibm.com>
* 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.
2015-01-27 Jiong Wang <jiong.wang@arm.com> 2015-01-27 Jiong Wang <jiong.wang@arm.com>
* gcc.dg/long_branch.c: New testcase. * gcc.dg/long_branch.c: New testcase.

View File

@ -1,7 +1,7 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch --save-temps" } */ /* { dg-options "-O3 -mzarch --save-temps" } */
#include <stdio.h> #include <stdio.h>
@ -10,11 +10,7 @@ void hp1(void)
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 12 } } */ /* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -1,21 +1,16 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mno-hotpatch --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,0 --save-temps" } */
#include <stdio.h> #include <stdio.h>
__attribute__ ((hotpatch(2)))
void hp1(void) void hp1(void)
{ {
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 2 } } */ /* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -1,7 +1,7 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch -mno-hotpatch --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=1,0 --save-temps" } */
#include <stdio.h> #include <stdio.h>
@ -10,11 +10,7 @@ void hp1(void)
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ /* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -1,7 +1,7 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mno-hotpatch -mhotpatch=1 --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=999,0 --save-temps" } */
#include <stdio.h> #include <stdio.h>
@ -10,11 +10,7 @@ void hp1(void)
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ /* { dg-final { scan-assembler-times "nopr\t%r7" 999 } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -0,0 +1,17 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch --save-temps" } */
#include <stdio.h>
__attribute__ ((hotpatch(1,0)))
void hp1(void)
{
printf("hello, world!\n");
}
/* 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" } } */

View File

@ -0,0 +1,17 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch --save-temps" } */
#include <stdio.h>
__attribute__ ((hotpatch(0,2)))
void hp1(void)
{
printf("hello, world!\n");
}
/* 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" } } */

View File

@ -0,0 +1,17 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch --save-temps" } */
#include <stdio.h>
__attribute__ ((hotpatch(1,2)))
void hp1(void)
{
printf("hello, world!\n");
}
/* 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" } } */

View File

@ -0,0 +1,17 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=0,0 --save-temps" } */
#include <stdio.h>
__attribute__ ((hotpatch(1,2)))
void hp1(void)
{
printf("hello, world!\n");
}
/* 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" } } */

View File

@ -0,0 +1,17 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1,2 --save-temps" } */
#include <stdio.h>
__attribute__ ((hotpatch(0,0)))
void hp1(void)
{
printf("hello, world!\n");
}
/* 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" } } */

View File

@ -0,0 +1,16 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1,2 -mhotpatch=0,0 --save-temps" } */
#include <stdio.h>
void hp1(void)
{
printf("hello, world!\n");
}
/* 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" } } */

View File

@ -0,0 +1,23 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1,2 --save-temps" } */
#include <stdio.h>
/* { dg-prune-output "always_inline function might not be inlinable" } */
__attribute__ ((always_inline))
static void hp2(void)
{
printf("hello, world!\n");
}
void hp1(void)
{
hp2();
}
/* 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" } } */

View File

@ -1,7 +1,7 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1 --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,1 --save-temps" } */
#include <stdio.h> #include <stdio.h>
@ -10,11 +10,7 @@ void hp1(void)
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ /* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -0,0 +1,20 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch --save-temps" } */
#include <stdio.h>
/* { dg-prune-output "always_inline function might not be inlinable" } */
__attribute__ ((hotpatch(1,2)))
__attribute__ ((always_inline))
static void hp2(void)
{
printf("hello, world!\n");
}
/* { dg-prune-output "called from here" } */
void hp1(void)
{
hp2();
}

View File

@ -1,7 +1,7 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=0 --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,2 --save-temps" } */
#include <stdio.h> #include <stdio.h>
@ -10,11 +10,7 @@ void hp1(void)
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ /* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -1,26 +1,16 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,3 --save-temps" } */
#include <stdio.h> #include <stdio.h>
inline void hp1(void) void hp1(void)
{ {
printf("hello, world!\n"); printf("hello, world!\n");
} }
__attribute__ ((always_inline))
void hp2(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp2' with the 'always_inline' attribute is not hotpatchable" } */
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ /* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 1 } } */

View File

@ -1,21 +1,16 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,4 --save-temps" } */
#include <stdio.h> #include <stdio.h>
__attribute__ ((hotpatch))
void hp1(void) void hp1(void)
{ {
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 12 } } */ /* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 1 } } */

View File

@ -1,21 +1,16 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,5 --save-temps" } */
#include <stdio.h> #include <stdio.h>
__attribute__ ((hotpatch(1)))
void hp1(void) void hp1(void)
{ {
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */ /* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 1 } } */

View File

@ -1,21 +1,16 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch --save-temps" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,6 --save-temps" } */
#include <stdio.h> #include <stdio.h>
__attribute__ ((hotpatch(0)))
void hp1(void) void hp1(void)
{ {
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ /* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-not "nop\t0" } } */
/* { dg-final { scan-assembler-times "brcl\t\t0,0" 2 } } */

View File

@ -1,28 +1,16 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch --save-temps" } */ /* { dg-options "-O3 -mesa -m31 -mhotpatch=0,3 --save-temps" } */
#include <stdio.h> #include <stdio.h>
__attribute__ ((hotpatch)) void hp1(void)
inline void hp1(void)
{ {
printf("hello, world!\n"); printf("hello, world!\n");
} }
__attribute__ ((hotpatch))
__attribute__ ((always_inline))
void hp2(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp2' with the 'always_inline' attribute is not hotpatchable" } */
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-not "nopr\t%r7" } } */ /* { dg-final { scan-assembler-times "nopr\t%r7" 1 } } */
/* { dg-final { scan-assembler-not "nop\t0" } } */ /* { dg-final { scan-assembler-times "nop\t0" 1 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -1,21 +1,16 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1 --save-temps" } */ /* { dg-options "-O3 -mesa -m31 -mhotpatch=0,4 --save-temps" } */
#include <stdio.h> #include <stdio.h>
__attribute__ ((hotpatch(2)))
void hp1(void) void hp1(void)
{ {
printf("hello, world!\n"); printf("hello, world!\n");
} }
int main (void)
{
return 0;
}
/* Check number of occurences of certain instructions. */ /* Check number of occurences of certain instructions. */
/* { dg-final { scan-assembler-times "nopr\t%r7" 2 } } */ /* { dg-final { scan-assembler-not "nopr\t%r7" } } */
/* { dg-final { scan-assembler-times "nop\t0" 1 } } */ /* { dg-final { scan-assembler-times "nop\t0" 2 } } */
/* { dg-final { scan-assembler-not "brcl\t\t0,0" } } */

View File

@ -1,27 +1,11 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch" } */ /* { dg-options "-O3 -mzarch -mhotpatch=-1,0" } */
#include <stdio.h>
void hp1(void)
{
printf("hello, world!\n");
}
inline void hp2(void)
{
printf("hello, world!\n");
}
__attribute__ ((always_inline))
void hp3(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp3' with the 'always_inline' attribute is not hotpatchable" } */
int main (void) int main (void)
{ {
return 0; return 0;
} }
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -0,0 +1,12 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch" } */
__attribute__((hotpatch(0,0,0)))
int main (void)
{
return 0;
}
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -0,0 +1,12 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch" } */
__attribute__((hotpatch(a,0)))
int main (void)
{
return 0;
}
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -0,0 +1,12 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch" } */
__attribute__((hotpatch(0,a)))
int main (void)
{
return 0;
}
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -0,0 +1,29 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1000000,1000000" } */
#include <stdio.h>
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");
}

View File

@ -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-excess-errors "argument to '-mhotpatch=n,m' is too large" } */

View File

@ -0,0 +1,43 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch" } */
/* { dg-prune-output "always_inline function might not be inlinable" } */
/* { dg-prune-output "called from here" } */
#include <stdio.h>
__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 void hp3(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch(1,2)))
__attribute__ ((always_inline))
static void hp4(void)
{
printf("hello, world!\n");
}
void main(void)
{
hp1();
hp2();
hp3();
hp4();
}

View File

@ -0,0 +1,24 @@
/* A warning will be issued when requesting hotpatching on a nested function. */
/* { 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) /* { dg-warning "hotpatching is not compatible with nested functions" } */
{ return 2; }
return nested2;
}

View File

@ -1,27 +1,11 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=0" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,-1" } */
#include <stdio.h>
void hp1(void)
{
printf("hello, world!\n");
}
inline void hp2(void)
{
printf("hello, world!\n");
}
__attribute__ ((always_inline))
void hp3(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp3' with the 'always_inline' attribute is not hotpatchable" } */
int main (void) int main (void)
{ {
return 0; return 0;
} }
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -1,27 +1,11 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0" } */
#include <stdio.h>
void hp1(void)
{
printf("hello, world!\n");
}
inline void hp2(void)
{
printf("hello, world!\n");
}
__attribute__ ((always_inline))
void hp3(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp3' with the 'always_inline' attribute is not hotpatchable" } */
int main (void) int main (void)
{ {
return 0; return 0;
} }
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -1,7 +1,7 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=-1" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,0,0" } */
int main (void) int main (void)
{ {

View File

@ -1,28 +1,11 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1000000" } */ /* { dg-options "-O3 -mzarch -mhotpatch=a,0" } */
#include <stdio.h>
void hp1(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch(1000000)))
void hp2(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch(1000001)))
void hp3(void)
{ /* { dg-error "requested 'hotpatch' attribute is not a non-negative integer constant or too large .max. 1000000." } */
printf("hello, world!\n");
}
int main (void) int main (void)
{ {
return 0; return 0;
} }
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -1,11 +1,11 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch=1000001" } */ /* { dg-options "-O3 -mzarch -mhotpatch=0,a" } */
int main (void) int main (void)
{ {
return 0; return 0;
} }
/* { dg-excess-errors "argument to '-mhotpatch=' is too large .max. 1000000." } */ /* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -1,68 +1,12 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mno-hotpatch" } */ /* { dg-options "-O3 -mzarch" } */
#include <stdio.h>
__attribute__ ((hotpatch))
void hp1(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch))
inline void hp2(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch))
__attribute__ ((always_inline))
void hp3(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp3' with the 'always_inline' attribute is not hotpatchable" } */
__attribute__ ((hotpatch(0)))
void hp4(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch(0)))
inline void hp5(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch(0)))
__attribute__ ((always_inline))
void hp6(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp6' with the 'always_inline' attribute is not hotpatchable" } */
__attribute__ ((hotpatch(1)))
void hp7(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch(1)))
inline void hp8(void)
{
printf("hello, world!\n");
}
__attribute__ ((hotpatch(1)))
__attribute__ ((always_inline))
void hp9(void) /* { dg-warning "always_inline function might not be inlinable" } */
{
printf("hello, world!\n");
} /* { dg-warning "function 'hp9' with the 'always_inline' attribute is not hotpatchable" } */
__attribute__((hotpatch(-1,0)))
int main (void) int main (void)
{ {
return 0; return 0;
} }
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -1,23 +1,12 @@
/* Functional tests for the function hotpatching feature. */ /* Functional tests for the function hotpatching feature. */
/* { dg-do run } */ /* { dg-do compile } */
/* { dg-options "-O3 -mzarch -mhotpatch" } */ /* { dg-options "-O3 -mzarch" } */
#include <stdio.h>
int hp1(void)
{
int nested1(void) /* { dg-warning "hotpatching is not compatible with nested functions" } */
{ return 1; }
__attribute__ ((hotpatch))
int nested2(void) /* { dg-warning "hotpatching is not compatible with nested functions" } */
{ return 1; }
return nested1() - nested2();
}
__attribute__((hotpatch(0,-1)))
int main (void) int main (void)
{ {
return hp1(); return 0;
} }
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */

View File

@ -0,0 +1,12 @@
/* Functional tests for the function hotpatching feature. */
/* { dg-do compile } */
/* { dg-options "-O3 -mzarch" } */
__attribute__((hotpatch(0)))
int main (void)
{
return 0;
}
/* { dg-excess-errors "argument to '-mhotpatch=' should be a non-negative integer" } */