This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] i386: Insert ENDBR before the profiling counter call
- From: "H.J. Lu" <hjl dot tools at gmail dot com>
- To: Andi Kleen <ak at linux dot intel dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Igor Tsimbalist <igor dot v dot tsimbalist at intel dot com>, Uros Bizjak <ubizjak at gmail dot com>
- Date: Tue, 24 Oct 2017 10:58:06 -0700
- Subject: Re: [PATCH] i386: Insert ENDBR before the profiling counter call
- Authentication-results: sourceware.org; auth=none
- References: <20171024160405.GA13209@gmail.com> <873768xx47.fsf@linux.intel.com>
On Tue, Oct 24, 2017 at 10:40 AM, Andi Kleen <ak@linux.intel.com> wrote:
> "H.J. Lu" <hongjiu.lu@intel.com> writes:
>> --- /dev/null
>> +++ b/gcc/testsuite/gcc.target/i386/pr82699-4.c
>> @@ -0,0 +1,11 @@
>> +/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
>> +/* { dg-options "-O2 -fpic -fcf-protection -mcet -pg -mfentry -fasynchronous-unwind-tables" } */
>> +/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 }
>> } */
>
> Would add test cases for -mnop-mcount and -mrecord-mcount too
>
Here is the updated patch to add a testcase for -mnop-mcount -mrecord-mcount.
No other changes otherwise.
--
H.J.
From 9037eb213339b72b2ad6f927b301f1730ff0cb16 Mon Sep 17 00:00:00 2001
From: "H.J. Lu" <hjl.tools@gmail.com>
Date: Tue, 24 Oct 2017 08:47:19 -0700
Subject: [PATCH] i386: Insert ENDBR before the profiling counter call
ENDBR must be the first instruction of a function. This patch queues
ENDBR if we need to put the profiling counter call before the prologue
and generate ENDBR before the profiling counter call.
gcc/
PR target/82699
* config/i386/i386.c (rest_of_insert_endbranch): Set
endbr_queued_at_entrance to true and don't insert ENDBR if
x86_function_profiler will be called.
(x86_function_profiler): Insert ENDBR if endbr_queued_at_entrance
is true.
* config/i386/i386.h (machine_function): Add
endbr_queued_at_entrance.
gcc/testsuite/
PR target/82699
* gcc.target/i386/pr82699-1.c: New file.
* gcc.target/i386/pr82699-2.c: Likewise.
* gcc.target/i386/pr82699-3.c: Likewise.
* gcc.target/i386/pr82699-4.c: Likewise.
* gcc.target/i386/pr82699-5.c: Likewise.
* gcc.target/i386/pr82699-6.c: Likewise.
---
gcc/config/i386/i386.c | 18 ++++++++++++++----
gcc/config/i386/i386.h | 3 +++
gcc/testsuite/gcc.target/i386/pr82699-1.c | 11 +++++++++++
gcc/testsuite/gcc.target/i386/pr82699-2.c | 11 +++++++++++
gcc/testsuite/gcc.target/i386/pr82699-3.c | 11 +++++++++++
gcc/testsuite/gcc.target/i386/pr82699-4.c | 11 +++++++++++
gcc/testsuite/gcc.target/i386/pr82699-5.c | 11 +++++++++++
gcc/testsuite/gcc.target/i386/pr82699-6.c | 11 +++++++++++
8 files changed, 83 insertions(+), 4 deletions(-)
create mode 100644 gcc/testsuite/gcc.target/i386/pr82699-1.c
create mode 100644 gcc/testsuite/gcc.target/i386/pr82699-2.c
create mode 100644 gcc/testsuite/gcc.target/i386/pr82699-3.c
create mode 100644 gcc/testsuite/gcc.target/i386/pr82699-4.c
create mode 100644 gcc/testsuite/gcc.target/i386/pr82699-5.c
create mode 100644 gcc/testsuite/gcc.target/i386/pr82699-6.c
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index d2188ad6086..7974a915b38 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -2590,11 +2590,17 @@ rest_of_insert_endbranch (void)
TYPE_ATTRIBUTES (TREE_TYPE (cfun->decl)))
&& !cgraph_node::get (cfun->decl)->only_called_directly_p ())
{
- cet_eb = gen_nop_endbr ();
+ /* Queue ENDBR insertion to x86_function_profiler. */
+ if (crtl->profile && flag_fentry)
+ cfun->machine->endbr_queued_at_entrance = true;
+ else
+ {
+ cet_eb = gen_nop_endbr ();
- bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
- insn = BB_HEAD (bb);
- emit_insn_before (cet_eb, insn);
+ bb = ENTRY_BLOCK_PTR_FOR_FN (cfun)->next_bb;
+ insn = BB_HEAD (bb);
+ emit_insn_before (cet_eb, insn);
+ }
}
bb = 0;
@@ -40427,6 +40433,10 @@ x86_function_profiler (FILE *file, int labelno ATTRIBUTE_UNUSED)
{
const char *mcount_name = (flag_fentry ? MCOUNT_NAME_BEFORE_PROLOGUE
: MCOUNT_NAME);
+
+ if (cfun->machine->endbr_queued_at_entrance)
+ fprintf (file, "\t%s\n", TARGET_64BIT ? "endbr64" : "endbr32");
+
if (TARGET_64BIT)
{
#ifndef NO_PROFILE_COUNTERS
diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h
index 27fc9f08cc7..925557d32cb 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2581,6 +2581,9 @@ struct GTY(()) machine_function {
/* Nonzero if the function places outgoing arguments on stack. */
BOOL_BITFIELD outgoing_args_on_stack : 1;
+ /* If true, ENDBR is queued at function entrance. */
+ BOOL_BITFIELD endbr_queued_at_entrance : 1;
+
/* During prologue/epilogue generation, the current frame state.
Otherwise, the frame state at the end of the prologue. */
struct machine_frame_state fs;
diff --git a/gcc/testsuite/gcc.target/i386/pr82699-1.c b/gcc/testsuite/gcc.target/i386/pr82699-1.c
new file mode 100644
index 00000000000..4fc404753e8
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82699-1.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fno-pic -fcf-protection -mcet -pg -fasynchronous-unwind-tables" } */
+/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
+
+extern int bar (int);
+
+int
+foo (int i)
+{
+ return bar (i);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr82699-2.c b/gcc/testsuite/gcc.target/i386/pr82699-2.c
new file mode 100644
index 00000000000..4fb9cb9e68b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82699-2.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fno-pic -fcf-protection -mcet -pg -mfentry -fasynchronous-unwind-tables" } */
+/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
+
+extern int bar (int);
+
+int
+foo (int i)
+{
+ return bar (i);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr82699-3.c b/gcc/testsuite/gcc.target/i386/pr82699-3.c
new file mode 100644
index 00000000000..92d84ee4ab5
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82699-3.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fpic -fcf-protection -mcet -pg -fasynchronous-unwind-tables" } */
+/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
+
+extern int bar (int);
+
+int
+foo (int i)
+{
+ return bar (i);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr82699-4.c b/gcc/testsuite/gcc.target/i386/pr82699-4.c
new file mode 100644
index 00000000000..415ce3b913a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82699-4.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target { *-*-linux* && { ! ia32 } } } } */
+/* { dg-options "-O2 -fpic -fcf-protection -mcet -pg -mfentry -fasynchronous-unwind-tables" } */
+/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
+
+extern int bar (int);
+
+int
+foo (int i)
+{
+ return bar (i);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr82699-5.c b/gcc/testsuite/gcc.target/i386/pr82699-5.c
new file mode 100644
index 00000000000..c0820352ac2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82699-5.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fcf-protection -mcet -mfentry -fasynchronous-unwind-tables" } */
+/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
+
+extern int bar (int);
+
+int
+foo (int i)
+{
+ return bar (i);
+}
diff --git a/gcc/testsuite/gcc.target/i386/pr82699-6.c b/gcc/testsuite/gcc.target/i386/pr82699-6.c
new file mode 100644
index 00000000000..c142ccb12f6
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr82699-6.c
@@ -0,0 +1,11 @@
+/* { dg-do compile { target *-*-linux* } } */
+/* { dg-options "-O2 -fcf-protection -mcet -pg -mfentry -mrecord-mcount -mnop-mcount -fasynchronous-unwind-tables" } */
+/* { dg-final { scan-assembler-times {\t\.cfi_startproc\n\tendbr} 1 } } */
+
+extern int bar (int);
+
+int
+foo (int i)
+{
+ return bar (i);
+}
--
2.13.6