aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2018-09-24 17:20:58 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2018-09-24 10:20:58 -0700
commit708c728d4fe7a5e169833729b8c57d08258ce15d (patch)
treecc14a50725b71deb8e2c9e1582ed5578b1338180
parentc109362313623d83fe0a5194bceaf994cf0c6ce0 (diff)
downloadgcc-708c728d4fe7a5e169833729b8c57d08258ce15d.zip
gcc-708c728d4fe7a5e169833729b8c57d08258ce15d.tar.gz
gcc-708c728d4fe7a5e169833729b8c57d08258ce15d.tar.bz2
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. From-SVN: r264540
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config/i386/i386.c18
-rw-r--r--gcc/config/i386/i386.h3
-rw-r--r--gcc/testsuite/ChangeLog10
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82699-1.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82699-2.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82699-3.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82699-4.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82699-5.c11
-rw-r--r--gcc/testsuite/gcc.target/i386/pr82699-6.c11
10 files changed, 104 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 7a85aec..b3d14b9 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2018-09-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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.
+
2018-09-24 Ilya Leoshkevich <iii@linux.ibm.com>
* genattrtab.c (mk_attr_alt): Use alternative_mask.
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 6dd3130..052ca63 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -2593,11 +2593,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;
@@ -41203,6 +41209,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 2fa9f2d..e77dac7 100644
--- a/gcc/config/i386/i386.h
+++ b/gcc/config/i386/i386.h
@@ -2747,6 +2747,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;
+
/* The largest alignment, in bytes, of stack slot actually used. */
unsigned int max_used_stack_alignment;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6e76e50..b98b6eb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,13 @@
+2018-09-24 H.J. Lu <hongjiu.lu@intel.com>
+
+ 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.
+
2018-09-24 Thomas Koenig <tkoenig@gcc.gnu.org>
PR fortran/87401
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 0000000..272d079
--- /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 -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 0000000..07a4ccb
--- /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 -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 0000000..08fa0e7
--- /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 -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 0000000..3cc03db
--- /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 -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 0000000..e0fe018
--- /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 -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 0000000..cacf0ab
--- /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 -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);
+}