diff mbox

[committed,Darwin] fix pr bootstrap/59541

Message ID E6144E68-E75D-44A8-A948-6BFDE893AAD9@codesourcery.com
State New
Headers show

Commit Message

Iain Sandoe Jan. 5, 2014, 9:49 p.m. UTC
I've applied the attached patch as r206348 to fix this bootstrap problem after discussion with Honza last week on irc.
Thanks to Dominique for helping with testing across the platform variants.

Happy New Year!
Iain

gcc:

	PR bootstrap/59541
	* config/darwin.c (darwin_function_section): Adjust return values to
	correspond to optimisation changes made in r206070.
diff mbox

Patch

Index: gcc/config/darwin.c
===================================================================
--- gcc/config/darwin.c	(revision 206346)
+++ gcc/config/darwin.c	(working copy)
@@ -3611,57 +3611,36 @@ 
   if (decl && DECL_SECTION_NAME (decl) != NULL_TREE)
     return get_named_section (decl, NULL, 0);
 
-  /* Default when there is no function re-ordering.  */
-  if (!flag_reorder_functions)
-    return (weak)
-	    ? darwin_sections[text_coal_section]
-	    : text_section;
+  /* We always put unlikely executed stuff in the cold section.  */
+  if (freq == NODE_FREQUENCY_UNLIKELY_EXECUTED)
+    return (weak) ? darwin_sections[text_cold_coal_section]
+		  : darwin_sections[text_cold_section];
 
-  /* Startup code should go to startup subsection unless it is
-     unlikely executed (this happens especially with function splitting
-     where we can split away unnecessary parts of static constructors).  */
-  if (startup && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
-  {
-    /* If we do have a profile or(and) LTO phase is executed, we do not need
-       these ELF section.  */
-    if (!in_lto_p || !flag_profile_values)
-      return (weak)
-	      ? darwin_sections[text_startup_coal_section]
-	      : darwin_sections[text_startup_section];
-    else
-      return text_section;
-  }
+  /* If we have LTO *and* feedback information, then let LTO handle
+     the function ordering, it makes a better job (for normal, hot,
+     startup and exit - hence the bailout for cold above).  */
+  if (in_lto_p && flag_profile_values)
+    goto default_function_sections;
 
+  /* Non-cold startup code should go to startup subsection.  */
+  if (startup)
+    return (weak) ? darwin_sections[text_startup_coal_section]
+		  : darwin_sections[text_startup_section];
+
   /* Similarly for exit.  */
-  if (exit && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
-    return (weak)
-	    ? darwin_sections[text_exit_coal_section]
-	    : darwin_sections[text_exit_section];
+  if (exit)
+    return (weak) ? darwin_sections[text_exit_coal_section]
+		  : darwin_sections[text_exit_section];
 
-  /* Group cold functions together, similarly for hot code.  */
-  switch (freq)
-    {
-      case NODE_FREQUENCY_UNLIKELY_EXECUTED:
-	return (weak)
-		? darwin_sections[text_cold_coal_section]
-		: darwin_sections[text_cold_section];
-	break;
-      case NODE_FREQUENCY_HOT:
-      {
-        /* If we do have a profile or(and) LTO phase is executed, we do not need
-           these ELF section.  */
-        if (!in_lto_p || !flag_profile_values)
-          return (weak)
-                  ? darwin_sections[text_hot_coal_section]
-                  : darwin_sections[text_hot_section];
-        break;
-      }
-      default:
-	return (weak)
-		? darwin_sections[text_coal_section]
+  /* Place hot code.  */
+  if (freq == NODE_FREQUENCY_HOT)
+    return (weak) ? darwin_sections[text_hot_coal_section]
+		  : darwin_sections[text_hot_section];
+
+  /* Otherwise, default to the 'normal' non-reordered sections.  */
+default_function_sections:
+  return (weak) ? darwin_sections[text_coal_section]
 		: text_section;
-	break;
-    }
 }
 
 /* When a function is partitioned between sections, we need to insert a label