IBM Z: Define NO_PROFILE_COUNTERS

s390 glibc does not need counters in the .data section, since it stores
edge hits in its own data structure.  Therefore counters only waste
space and confuse diffing tools (e.g. kpatch), so don't generate them.

gcc/ChangeLog:

	* config/s390/s390.c (s390_function_profiler): Ignore labelno
	parameter.
	* config/s390/s390.h (NO_PROFILE_COUNTERS): Define.

gcc/testsuite/ChangeLog:

	* gcc.target/s390/mnop-mcount-m31-mzarch.c: Adapt to the new
	prologue size.
	* gcc.target/s390/mnop-mcount-m64.c: Likewise.
This commit is contained in:
Ilya Leoshkevich 2021-06-17 14:18:17 +02:00
parent 82ab149276
commit a1c1b7a888
4 changed files with 20 additions and 28 deletions

View File

@ -13110,33 +13110,25 @@ output_asm_nops (const char *user, int hw)
} }
} }
/* Output assembler code to FILE to increment profiler label # LABELNO /* Output assembler code to FILE to call a profiler hook. */
for profiling a function entry. */
void void
s390_function_profiler (FILE *file, int labelno) s390_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
{ {
rtx op[8]; rtx op[4];
char label[128];
ASM_GENERATE_INTERNAL_LABEL (label, "LP", labelno);
fprintf (file, "# function profiler \n"); fprintf (file, "# function profiler \n");
op[0] = gen_rtx_REG (Pmode, RETURN_REGNUM); op[0] = gen_rtx_REG (Pmode, RETURN_REGNUM);
op[1] = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM); op[1] = gen_rtx_REG (Pmode, STACK_POINTER_REGNUM);
op[1] = gen_rtx_MEM (Pmode, plus_constant (Pmode, op[1], UNITS_PER_LONG)); op[1] = gen_rtx_MEM (Pmode, plus_constant (Pmode, op[1], UNITS_PER_LONG));
op[7] = GEN_INT (UNITS_PER_LONG); op[3] = GEN_INT (UNITS_PER_LONG);
op[2] = gen_rtx_REG (Pmode, 1); op[2] = gen_rtx_SYMBOL_REF (Pmode, flag_fentry ? "__fentry__" : "_mcount");
op[3] = gen_rtx_SYMBOL_REF (Pmode, label);
SYMBOL_REF_FLAGS (op[3]) = SYMBOL_FLAG_LOCAL;
op[4] = gen_rtx_SYMBOL_REF (Pmode, flag_fentry ? "__fentry__" : "_mcount");
if (flag_pic) if (flag_pic)
{ {
op[4] = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op[4]), UNSPEC_PLT); op[2] = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, op[2]), UNSPEC_PLT);
op[4] = gen_rtx_CONST (Pmode, op[4]); op[2] = gen_rtx_CONST (Pmode, op[2]);
} }
if (flag_record_mcount) if (flag_record_mcount)
@ -13150,20 +13142,19 @@ s390_function_profiler (FILE *file, int labelno)
warning (OPT_Wcannot_profile, "nested functions cannot be profiled " warning (OPT_Wcannot_profile, "nested functions cannot be profiled "
"with %<-mfentry%> on s390"); "with %<-mfentry%> on s390");
else else
output_asm_insn ("brasl\t0,%4", op); output_asm_insn ("brasl\t0,%2", op);
} }
else if (TARGET_64BIT) else if (TARGET_64BIT)
{ {
if (flag_nop_mcount) if (flag_nop_mcount)
output_asm_nops ("-mnop-mcount", /* stg */ 3 + /* larl */ 3 + output_asm_nops ("-mnop-mcount", /* stg */ 3 + /* brasl */ 3 +
/* brasl */ 3 + /* lg */ 3); /* lg */ 3);
else else
{ {
output_asm_insn ("stg\t%0,%1", op); output_asm_insn ("stg\t%0,%1", op);
if (flag_dwarf2_cfi_asm) if (flag_dwarf2_cfi_asm)
output_asm_insn (".cfi_rel_offset\t%0,%7", op); output_asm_insn (".cfi_rel_offset\t%0,%3", op);
output_asm_insn ("larl\t%2,%3", op); output_asm_insn ("brasl\t%0,%2", op);
output_asm_insn ("brasl\t%0,%4", op);
output_asm_insn ("lg\t%0,%1", op); output_asm_insn ("lg\t%0,%1", op);
if (flag_dwarf2_cfi_asm) if (flag_dwarf2_cfi_asm)
output_asm_insn (".cfi_restore\t%0", op); output_asm_insn (".cfi_restore\t%0", op);
@ -13172,15 +13163,14 @@ s390_function_profiler (FILE *file, int labelno)
else else
{ {
if (flag_nop_mcount) if (flag_nop_mcount)
output_asm_nops ("-mnop-mcount", /* st */ 2 + /* larl */ 3 + output_asm_nops ("-mnop-mcount", /* st */ 2 + /* brasl */ 3 +
/* brasl */ 3 + /* l */ 2); /* l */ 2);
else else
{ {
output_asm_insn ("st\t%0,%1", op); output_asm_insn ("st\t%0,%1", op);
if (flag_dwarf2_cfi_asm) if (flag_dwarf2_cfi_asm)
output_asm_insn (".cfi_rel_offset\t%0,%7", op); output_asm_insn (".cfi_rel_offset\t%0,%3", op);
output_asm_insn ("larl\t%2,%3", op); output_asm_insn ("brasl\t%0,%2", op);
output_asm_insn ("brasl\t%0,%4", op);
output_asm_insn ("l\t%0,%1", op); output_asm_insn ("l\t%0,%1", op);
if (flag_dwarf2_cfi_asm) if (flag_dwarf2_cfi_asm)
output_asm_insn (".cfi_restore\t%0", op); output_asm_insn (".cfi_restore\t%0", op);

View File

@ -787,6 +787,8 @@ CUMULATIVE_ARGS;
#define PROFILE_BEFORE_PROLOGUE 1 #define PROFILE_BEFORE_PROLOGUE 1
#define NO_PROFILE_COUNTERS 1
/* Trampolines for nested functions. */ /* Trampolines for nested functions. */

View File

@ -4,5 +4,5 @@
void void
profileme (void) profileme (void)
{ {
/* { dg-final { scan-assembler "NOPs for -mnop-mcount \\(10 halfwords\\)\n.*brcl\t0,0\n.*brcl\t0,0\n.*brcl\t0,0\n.*bcr\t0,0" } } */ /* { dg-final { scan-assembler "NOPs for -mnop-mcount \\(7 halfwords\\)\n.*brcl\t0,0\n.*brcl\t0,0\n.*bcr\t0,0" } } */
} }

View File

@ -4,5 +4,5 @@
void void
profileme (void) profileme (void)
{ {
/* { dg-final { scan-assembler "NOPs for -mnop-mcount \\(12 halfwords\\)\n.*brcl\t0,0\n.*brcl\t0,0\n.*brcl\t0,0\n.*brcl\t0,0" } } */ /* { dg-final { scan-assembler "NOPs for -mnop-mcount \\(9 halfwords\\)\n.*brcl\t0,0\n.*brcl\t0,0\n.*brcl\t0,0" } } */
} }