opts.c (finish_options): If -fsplit-stack, disable implicit -forder-blocks-and-partition.
authorIan Lance Taylor <iant@golang.org>
Fri, 9 Jun 2017 18:44:28 +0000 (18:44 +0000)
committerIan Lance Taylor <ian@gcc.gnu.org>
Fri, 9 Jun 2017 18:44:28 +0000 (18:44 +0000)
gcc/:
* opts.c (finish_options): If -fsplit-stack, disable implicit
-forder-blocks-and-partition.
* doc/invoke.texi (Optimize Options): Document that when using
-fsplit-stack -forder-blocks-and-partition is not implicitly
enabled.
gcc/go/:
* go-lang.c (go_langhook_post_options): If -fsplit-stack is turned
on, disable implicit -forder-blocks-and-partition.
gcc/testsuite/:
* gcc.dg/tree-prof/split-1.c: New test.

From-SVN: r249071

gcc/ChangeLog
gcc/doc/invoke.texi
gcc/go/ChangeLog
gcc/go/go-lang.c
gcc/opts.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-prof/split-1.c [new file with mode: 0644]

index 866f3ab2c9f5c02f3dfea5eab93b6336488ce871..9cbae2a09efd9c237ac4495403fd70341b48c101 100644 (file)
@@ -1,3 +1,11 @@
+2017-06-9  Ian Lance Taylor  <iant@golang.org>
+
+       * opts.c (finish_options): If -fsplit-stack, disable implicit
+       -forder-blocks-and-partition.
+       * doc/invoke.texi (Optimize Options): Document that when using
+       -fsplit-stack -forder-blocks-and-partition is not implicitly
+       enabled.
+
 2017-06-09  Jan Hubicka  <hubicka@ucw.cz>
 
        * builtin-attrs.def (ATTR_NORETURN_NOTHROW_LEAF_COLD_LIST,
index c1168823af7765d5e8dddefd86f3cc4e1ad3863b..5d416490d49f976be9cd60ad77cee713d5c2412f 100644 (file)
@@ -8656,7 +8656,9 @@ paging and cache locality performance.
 This optimization is automatically turned off in the presence of
 exception handling, for linkonce sections, for functions with a user-defined
 section attribute and on any architecture that does not support named
-sections.
+sections.  When @option{-fsplit-stack} is used this option is not
+enabled by default (to avoid linker errors), but may be enabled
+explicitly (if using a working linker).
 
 Enabled for x86 at levels @option{-O2}, @option{-O3}.
 
index 59b4e6eeb6bb6977efddd5ecf4a96a8b8c9621be..ac0dbe3f99d6a29ff4c350fdf361cb86990718ef 100644 (file)
@@ -1,3 +1,8 @@
+2017-06-09  Ian Lance Taylor  <iant@golang.org>
+
+       * go-lang.c (go_langhook_post_options): If -fsplit-stack is turned
+       on, disable implicit -forder-blocks-and-partition.
+
 2017-05-12  Than McIntosh  <thanm@google.com>
 
        * go-gcc.cc (Gcc_backend::call_expression): Add caller parameter.
index 780d73799e6cf162b1eb575faf7e63043fbea765..09e4fea09a5d4e3766cee575adc74496175b3a2e 100644 (file)
@@ -304,6 +304,15 @@ go_langhook_post_options (const char **pfilename ATTRIBUTE_UNUSED)
       && targetm_common.supports_split_stack (false, &global_options))
     global_options.x_flag_split_stack = 1;
 
+  /* If stack splitting is turned on, and the user did not explicitly
+     request function partitioning, turn off partitioning, as it
+     confuses the linker when trying to handle partitioned split-stack
+     code that calls a non-split-stack function.  */
+  if (global_options.x_flag_split_stack
+      && global_options.x_flag_reorder_blocks_and_partition
+      && !global_options_set.x_flag_reorder_blocks_and_partition)
+    global_options.x_flag_reorder_blocks_and_partition = 0;
+
   /* Returning false means that the backend should be used.  */
   return false;
 }
index ac409f404aa9319f3b3db550192c86d4329aa6d0..5ec99807f227118fe698f0c41c18dcdcf9c7acec 100644 (file)
@@ -863,6 +863,16 @@ finish_options (struct gcc_options *opts, struct gcc_options *opts_set,
       opts->x_flag_reorder_blocks = 1;
     }
 
+  /* If stack splitting is turned on, and the user did not explicitly
+     request function partitioning, turn off partitioning, as it
+     confuses the linker when trying to handle partitioned split-stack
+     code that calls a non-split-stack functions.  But if partitioning
+     was turned on explicitly just hope for the best.  */
+  if (opts->x_flag_split_stack
+      && opts->x_flag_reorder_blocks_and_partition
+      && !opts_set->x_flag_reorder_blocks_and_partition)
+    opts->x_flag_reorder_blocks_and_partition = 0;
+
   if (opts->x_flag_reorder_blocks_and_partition
       && !opts_set->x_flag_reorder_functions)
     opts->x_flag_reorder_functions = 1;
index 8a1c361fbedee002f66c0c474e171b98828eee5f..05a5827dca7a4535a2dfc59e24308aaecb260565 100644 (file)
@@ -1,3 +1,7 @@
+2017-06-09  Ian Lance Taylor  <iant@golang.org>
+
+       * gcc.dg/tree-prof/split-1.c: New test.
+
 2017-06-09  Jan Hubicka  <hubicka@ucw.cz>
 
        * gcc.dg/predict-14.c: Avoid cold function detection.
diff --git a/gcc/testsuite/gcc.dg/tree-prof/split-1.c b/gcc/testsuite/gcc.dg/tree-prof/split-1.c
new file mode 100644 (file)
index 0000000..a42fccf
--- /dev/null
@@ -0,0 +1,41 @@
+/* Test case that we don't get a link-time error when using
+   -fsplit-stack with -freorder-blocks-and-partition.  */
+/* { dg-require-effective-target freorder } */
+/* { dg-options "-O2 -fsplit-stack" } */
+
+extern unsigned int sleep (unsigned int);
+
+#define SIZE 10000
+
+const char *sarr[SIZE];
+const char *buf_hot;
+const char *buf_cold;
+
+__attribute__((noinline))
+void 
+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;
+      sleep (0);
+    }
+}
+
+int
+main (int argc, char *argv[])
+{
+  int i;
+  buf_hot =  "hello";
+  buf_cold = "world";
+  for (i = 0; i < 1000000; i++)
+    foo (argc);
+  return 0;
+}