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:
parent
096e8448ca
commit
94091f43bd
|
@ -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>
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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" } } */
|
|
@ -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" } } */
|
|
@ -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" } } */
|
|
@ -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" } } */
|
|
@ -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" } } */
|
|
@ -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" } } */
|
|
@ -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" } } */
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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();
|
||||||
|
}
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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 } } */
|
||||||
|
|
|
@ -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 } } */
|
||||||
|
|
|
@ -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 } } */
|
||||||
|
|
|
@ -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 } } */
|
||||||
|
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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" } } */
|
||||||
|
|
|
@ -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" } */
|
||||||
|
|
|
@ -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" } */
|
|
@ -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" } */
|
|
@ -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" } */
|
|
@ -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");
|
||||||
|
}
|
|
@ -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" } */
|
|
@ -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();
|
||||||
|
}
|
|
@ -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;
|
||||||
|
}
|
|
@ -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" } */
|
||||||
|
|
|
@ -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" } */
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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" } */
|
||||||
|
|
|
@ -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" } */
|
||||||
|
|
|
@ -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" } */
|
||||||
|
|
|
@ -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" } */
|
||||||
|
|
|
@ -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" } */
|
Loading…
Reference in New Issue