diff mbox series

[2/3] S/390: Implement -mrecord-mcount

Message ID 20180716074807.43653-3-iii@linux.ibm.com
State New
Headers show
Series [1/3] S/390: Implement -mfentry | expand

Commit Message

Ilya Leoshkevich July 16, 2018, 7:48 a.m. UTC
This is the counterpart of the i386 feature introduced by
39a5a6a4: Add direct support for Linux kernel __fentry__ patching.

        * gcc/config/s390/s390.c (s390_function_profiler): Generate
        __mcount_loc section.
        * gcc/config/s390/s390.opt: Add the new option.
        * gcc/testsuite/gcc.target/s390/mrecord-mcount.c:
        New testcase.
---
 gcc/config/s390/s390.c                         | 10 ++++++++++
 gcc/config/s390/s390.opt                       |  4 ++++
 gcc/testsuite/gcc.target/s390/mrecord-mcount.c | 10 ++++++++++
 3 files changed, 24 insertions(+)
 create mode 100644 gcc/testsuite/gcc.target/s390/mrecord-mcount.c

Comments

Andreas Krebbel July 16, 2018, 2:42 p.m. UTC | #1
On 07/16/2018 09:48 AM, Ilya Leoshkevich wrote:
> This is the counterpart of the i386 feature introduced by
> 39a5a6a4: Add direct support for Linux kernel __fentry__ patching.
> 
>         * gcc/config/s390/s390.c (s390_function_profiler): Generate
>         __mcount_loc section.
>         * gcc/config/s390/s390.opt: Add the new option.
>         * gcc/testsuite/gcc.target/s390/mrecord-mcount.c:
>         New testcase.

Applied. Thanks!

Andreas
diff mbox series

Patch

diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c
index 3a406b955a0..600501c1e27 100644
--- a/gcc/config/s390/s390.c
+++ b/gcc/config/s390/s390.c
@@ -13151,6 +13151,9 @@  s390_function_profiler (FILE *file, int labelno)
       op[4] = gen_rtx_CONST (Pmode, op[4]);
     }
 
+  if (flag_record_mcount)
+    fprintf (file, "1:\n");
+
   if (flag_fentry)
     {
       if (cfun->static_chain_decl)
@@ -13204,6 +13207,13 @@  s390_function_profiler (FILE *file, int labelno)
       output_asm_insn ("basr\t%0,%0", op);
       output_asm_insn ("l\t%0,%1", op);
     }
+
+  if (flag_record_mcount)
+    {
+      fprintf (file, "\t.section __mcount_loc, \"a\",@progbits\n");
+      fprintf (file, "\t.%s 1b\n", TARGET_64BIT ? "quad" : "long");
+      fprintf (file, "\t.previous\n");
+    }
 }
 
 /* Encode symbol attributes (local vs. global, tls model) of a SYMBOL_REF
diff --git a/gcc/config/s390/s390.opt b/gcc/config/s390/s390.opt
index 59e97d031b4..9a3ed651450 100644
--- a/gcc/config/s390/s390.opt
+++ b/gcc/config/s390/s390.opt
@@ -298,3 +298,7 @@  mfentry
 Target Report Var(flag_fentry)
 Emit profiling counter call at function entry before prologue. The compiled
 code will require a 64-bit CPU and glibc 2.29 or newer to run.
+
+mrecord-mcount
+Target Report Var(flag_record_mcount)
+Generate __mcount_loc section with all _mcount and __fentry__ calls.
diff --git a/gcc/testsuite/gcc.target/s390/mrecord-mcount.c b/gcc/testsuite/gcc.target/s390/mrecord-mcount.c
new file mode 100644
index 00000000000..d8a23ffdca4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/mrecord-mcount.c
@@ -0,0 +1,10 @@ 
+/* { dg-do compile } */
+/* { dg-options "-pg -mrecord-mcount" } */
+
+void
+profileme (void)
+{
+  /* { dg-final { scan-assembler ".section __mcount_loc, \"a\",@progbits" } } */
+  /* { dg-final { scan-assembler ".quad 1b" } } */
+  /* { dg-final { scan-assembler ".previous" } } */
+}