aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog13
-rw-r--r--gcc/bb-reorder.c3
-rw-r--r--gcc/c-family/c-attribs.c2
-rw-r--r--gcc/final.c2
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c45
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c44
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c45
-rw-r--r--gcc/toplev.c5
-rw-r--r--gcc/toplev.h5
10 files changed, 154 insertions, 16 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9b04621..bd70d4e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,16 @@
+2016-11-16 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gcc/bb-reorder.c: Remove 'toplev.h' include.
+ (pass_partition_blocks::gate): No longer check
+ user_defined_section_attribute, instead check the function decl
+ for a section attribute.
+ * gcc/c-family/c-attribs.c (handle_section_attribute): No longer
+ set user_defined_section_attribute.
+ * gcc/final.c (rest_of_handle_final): Likewise.
+ * gcc/toplev.c: Remove definition of user_defined_section_attribute.
+ * gcc/toplev.h: Remove declaration of
+ user_defined_section_attribute.
+
2016-11-16 Maciej W. Rozycki <macro@imgtec.com>
* config/mips/mips.md (casesi_internal_mips16_<mode>):
diff --git a/gcc/bb-reorder.c b/gcc/bb-reorder.c
index 85bc569..e51ec08 100644
--- a/gcc/bb-reorder.c
+++ b/gcc/bb-reorder.c
@@ -107,7 +107,6 @@
#include "output.h"
#include "expr.h"
#include "params.h"
-#include "toplev.h" /* user_defined_section_attribute */
#include "tree-pass.h"
#include "cfgrtl.h"
#include "cfganal.h"
@@ -2894,7 +2893,7 @@ pass_partition_blocks::gate (function *fun)
we are going to omit the reordering. */
&& optimize_function_for_speed_p (fun)
&& !DECL_COMDAT_GROUP (current_function_decl)
- && !user_defined_section_attribute);
+ && !lookup_attribute ("section", DECL_ATTRIBUTES (fun->decl)));
}
unsigned
diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
index 925f1b2..964efe9 100644
--- a/gcc/c-family/c-attribs.c
+++ b/gcc/c-family/c-attribs.c
@@ -1438,8 +1438,6 @@ handle_section_attribute (tree *node, tree ARG_UNUSED (name), tree args,
goto fail;
}
- user_defined_section_attribute = true;
-
if (!VAR_OR_FUNCTION_DECL_P (decl))
{
error ("section attribute not allowed for %q+D", *node);
diff --git a/gcc/final.c b/gcc/final.c
index 5709d0e..d3a53c3 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -4484,8 +4484,6 @@ rest_of_handle_final (void)
assemble_end_function (current_function_decl, fnname);
- user_defined_section_attribute = false;
-
/* Free up reg info memory. */
free_reg_info ();
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3707e7c..8958f86 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2016-11-16 Andrew Burgess <andrew.burgess@embecosm.com>
+
+ * gcc.dg/tree-prof/section-attr-1.c: New file.
+ * gcc.dg/tree-prof/section-attr-2.c: New file.
+ * gcc.dg/tree-prof/section-attr-3.c: New file.
+
2016-11-16 Maciej W. Rozycki <macro@imgtec.com>
* gcc.target/mips/code-readable-4.c (dg-final): Expect `dla'
diff --git a/gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c b/gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c
new file mode 100644
index 0000000..ee6662e
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/section-attr-1.c
@@ -0,0 +1,45 @@
+/* Checks for a bug where a function with a section attribute would prevent
+ all later functions from being partitioned into hot and cold blocks. */
+/* { dg-require-effective-target freorder } */
+/* { dg-options "-O2 -fno-profile-reorder-functions -freorder-blocks-and-partition -save-temps" } */
+
+#define SIZE 10000
+
+#define NOINLINE __attribute__((noinline)) __attribute__ ((noclone))
+
+const char *sarr[SIZE];
+const char *buf_hot;
+const char *buf_cold;
+
+void foo (int path);
+
+__attribute__((section(".text")))
+int
+main (int argc, char *argv[])
+{
+ int i;
+ buf_hot = "hello";
+ buf_cold = "world";
+ for (i = 0; i < 1000000; i++)
+ foo (argc);
+ return 0;
+}
+
+
+void NOINLINE
+foo (int path)
+{
+ int i;
+ if (path)
+ {
+ for (i = 0; i < SIZE; i++)
+ sarr[i] = buf_hot;
+ }
+ else
+ {
+ for (i = 0; i < SIZE; i++)
+ sarr[i] = buf_cold;
+ }
+}
+
+/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold\.0" { target *-*-linux* *-*-gnu* } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c b/gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c
new file mode 100644
index 0000000..898a395
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/section-attr-2.c
@@ -0,0 +1,44 @@
+/* Checks for a bug where static data with a section attribute within a
+ function would stop the function being partitioned into hot and cold
+ blocks. */
+/* { dg-require-effective-target freorder } */
+/* { dg-options "-O2 -fno-profile-reorder-functions -freorder-blocks-and-partition -save-temps" } */
+
+#define SIZE 10000
+
+#define NOINLINE __attribute__((noinline)) __attribute__ ((noclone))
+
+const char *sarr[SIZE];
+const char *buf_hot;
+const char *buf_cold;
+
+void foo (int path);
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ buf_hot = "hello";
+ buf_cold = "world";
+ for (i = 0; i < 1000000; i++)
+ foo (argc);
+ return 0;
+}
+
+void NOINLINE
+foo (int path)
+{
+ static int i __attribute__((section(".data")));
+ if (path)
+ {
+ for (i = 0; i < SIZE; i++)
+ sarr[i] = buf_hot;
+ }
+ else
+ {
+ for (i = 0; i < SIZE; i++)
+ sarr[i] = buf_cold;
+ }
+}
+
+/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold\.0" { target *-*-linux* *-*-gnu* } } } */
diff --git a/gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c b/gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c
new file mode 100644
index 0000000..36829dc
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-prof/section-attr-3.c
@@ -0,0 +1,45 @@
+/* Checks for a bug where static data with a section attribute within a
+ function would stop the function being partitioned into hot and cold
+ blocks. */
+/* { dg-require-effective-target freorder } */
+/* { dg-options "-O2 -fno-profile-reorder-functions -freorder-blocks-and-partition -save-temps" } */
+
+#define SIZE 10000
+
+#define NOINLINE __attribute__((noinline)) __attribute__ ((noclone))
+
+const char *sarr[SIZE];
+const char *buf_hot __attribute__ ((section (".data")));
+const char *buf_cold;
+
+void foo (int path);
+
+int
+main (int argc, char *argv[])
+{
+ int i;
+ buf_hot = "hello";
+ buf_cold = "world";
+ for (i = 0; i < 1000000; i++)
+ foo (argc);
+ return 0;
+}
+
+
+void NOINLINE
+foo (int path)
+{
+ int i;
+ if (path)
+ {
+ for (i = 0; i < SIZE; i++)
+ sarr[i] = buf_hot;
+ }
+ else
+ {
+ for (i = 0; i < SIZE; i++)
+ sarr[i] = buf_cold;
+ }
+}
+
+/* { dg-final-use { scan-assembler "\.section\[\t \]*\.text\.unlikely\[\\n\\r\]+\[\t \]*\.size\[\t \]*foo\.cold\.0" { target *-*-linux* *-*-gnu* } } } */
diff --git a/gcc/toplev.c b/gcc/toplev.c
index 59b84eb..d43234a 100644
--- a/gcc/toplev.c
+++ b/gcc/toplev.c
@@ -151,11 +151,6 @@ HOST_WIDE_INT random_seed;
the support provided depends on the backend. */
rtx stack_limit_rtx;
-/* True if the user has tagged the function with the 'section'
- attribute. */
-
-bool user_defined_section_attribute = false;
-
struct target_flag_state default_target_flag_state;
#if SWITCHABLE_TARGET
struct target_flag_state *this_target_flag_state = &default_target_flag_state;
diff --git a/gcc/toplev.h b/gcc/toplev.h
index 06923cf..f62a172 100644
--- a/gcc/toplev.h
+++ b/gcc/toplev.h
@@ -74,11 +74,6 @@ extern void target_reinit (void);
/* A unique local time stamp, might be zero if none is available. */
extern unsigned local_tick;
-/* True if the user has tagged the function with the 'section'
- attribute. */
-
-extern bool user_defined_section_attribute;
-
/* See toplev.c. */
extern int flag_rerun_cse_after_global_opts;