aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/darwin.c
diff options
context:
space:
mode:
authorIain Sandoe <iains@gcc.gnu.org>2010-12-20 10:01:02 +0000
committerIain Sandoe <iains@gcc.gnu.org>2010-12-20 10:01:02 +0000
commit1f81953bf40331cc3822dd64fb0085cdcfe42e40 (patch)
tree66092cda5751ac5a0efe044ef1182237e52e7f58 /gcc/config/darwin.c
parent308e6f3a18de9e221825ef8b3eefa5c94a3ec853 (diff)
downloadgcc-1f81953bf40331cc3822dd64fb0085cdcfe42e40.zip
gcc-1f81953bf40331cc3822dd64fb0085cdcfe42e40.tar.gz
gcc-1f81953bf40331cc3822dd64fb0085cdcfe42e40.tar.bz2
re PR c++/46904 (g++.dg/tree-prof/(indir-call-prof.C|inline_mismatch_args.C) fail on powerpc-apple-darwin9)
PR c++/46904 PR middle-end/46916 PR target/46950 * config/darwin.c (generating_for_darwin_version): New var. (darwin_text_section): Remove. (darwin_rodata_section): Do not check function section here. (darwin_emit_unwind_label): Do not emit for Darwin >= 9. Emit distinct labels for successive calls for the same decl. (darwin_override_options): Set generating_for_darwin_version. Add FIXME and disable -freorder-blocks-and-partition. Suppress automatic asynchronous unwind tables for m32. Switch off -freorder-blocks-and-partition when unwind tables will be generated. Update to use generating_for_darwin_version. (darwin_function_section): Check for cases that need to be placed in coalesced sections. * config/darwin-sections.def: Define hot, cold, startup and exit sections for both coalesced and regular code. * config/darwin.h (USE_SELECT_SECTION_FOR_FUNCTIONS): Delete. * config/darwin10.h (TARGET_ASM_EMIT_UNWIND_LABEL): Delete. From-SVN: r168083
Diffstat (limited to 'gcc/config/darwin.c')
-rw-r--r--gcc/config/darwin.c168
1 files changed, 118 insertions, 50 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c
index 8ae6409..d9185db 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -90,6 +90,9 @@ int darwin_emit_branch_islands = false;
functions). */
int darwin_running_cxx;
+/* Some code-gen now depends on OS major version numbers (at least). */
+int generating_for_darwin_version ;
+
/* Section names. */
section * darwin_sections[NUM_DARWIN_SECTIONS];
@@ -1145,19 +1148,6 @@ darwin_mark_decl_preserved (const char *name)
}
static section *
-darwin_text_section (int reloc, int weak)
-{
- if (reloc)
- return (weak
- ? darwin_sections[text_unlikely_coal_section]
- : unlikely_text_section ());
- else
- return (weak
- ? darwin_sections[text_coal_section]
- : text_section);
-}
-
-static section *
darwin_rodata_section (int weak, bool zsize)
{
return (weak
@@ -1267,17 +1257,7 @@ machopic_select_section (tree decl,
switch (categorize_decl_for_section (decl, reloc))
{
case SECCAT_TEXT:
- {
- struct cgraph_node *node;
- if (decl && TREE_CODE (decl) == FUNCTION_DECL
- && (node = cgraph_get_node (decl)) != NULL)
- base_section = darwin_function_section (decl,
- node->frequency,
- node->only_called_at_startup,
- node->only_called_at_exit);
- if (!base_section)
- base_section = darwin_text_section (reloc, weak);
- }
+ gcc_unreachable ();
break;
case SECCAT_RODATA:
@@ -1684,12 +1664,37 @@ darwin_handle_weak_import_attribute (tree *node, tree name,
void
darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty)
{
- char *lab;
-
- if (! for_eh)
+ char *lab ;
+ char buf[32];
+ static int invok_count = 0;
+ static tree last_fun_decl = NULL_TREE;
+
+ /* We use the linker to emit the .eh labels for Darwin 9 and above. */
+ if (! for_eh || generating_for_darwin_version >= 9)
return;
- lab = concat (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), ".eh", NULL);
+ /* FIXME: This only works when the eh for all sections of a function is
+ emitted at the same time. If that changes, we would need to use a lookup
+ table of some form to determine what to do. Also, we should emit the
+ unadorned label for the partition containing the public label for a
+ function. This is of limited use, probably, since we do not currently
+ enable partitioning. */
+ strcpy (buf, ".eh");
+ if (decl && TREE_CODE (decl) == FUNCTION_DECL)
+ {
+ if (decl == last_fun_decl)
+ {
+ invok_count++;
+ snprintf (buf, 31, "$$part$$%d.eh", invok_count);
+ }
+ else
+ {
+ last_fun_decl = decl;
+ invok_count = 0;
+ }
+ }
+
+ lab = concat (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)), buf, NULL);
if (TREE_PUBLIC (decl))
{
@@ -2551,21 +2556,61 @@ darwin_kextabi_p (void) {
void
darwin_override_options (void)
{
- bool darwin9plus = (darwin_macosx_version_min
- && strverscmp (darwin_macosx_version_min, "10.5") >= 0);
+ /* Keep track of which (major) version we're generating code for. */
+ if (darwin_macosx_version_min)
+ {
+ if (strverscmp (darwin_macosx_version_min, "10.6") >= 0)
+ generating_for_darwin_version = 10;
+ else if (strverscmp (darwin_macosx_version_min, "10.5") >= 0)
+ generating_for_darwin_version = 9;
+
+ /* Earlier versions are not specifically accounted, until required. */
+ }
/* Don't emit DWARF3/4 unless specifically selected. This is a
workaround for tool bugs. */
if (!global_options_set.x_dwarf_strict)
dwarf_strict = 1;
- /* Disable -freorder-blocks-and-partition for darwin_emit_unwind_label. */
- if (flag_reorder_blocks_and_partition
- && (targetm.asm_out.emit_unwind_label == darwin_emit_unwind_label))
+ /* FIXME: Darwin cannot support multiple function sections until (a) the new code
+ atoms created have a proper start label and (b) there are suitable pubnames
+ emitted. This applies to all current Darwin versions (OSX <= 10.6.5). */
+ if (global_options.x_flag_reorder_blocks_and_partition)
+ {
+ inform (input_location,
+ "-freorder-blocks-and-partition is currently disabled for this "
+ "platform");
+ flag_reorder_blocks_and_partition = 0;
+ flag_reorder_blocks = 1;
+ }
+
+ /* Do not allow unwind tables to be generated by default for m32.
+ fnon-call-exceptions will override this, regardless of what we do. */
+ if (generating_for_darwin_version < 10
+ && !global_options_set.x_flag_asynchronous_unwind_tables
+ && !TARGET_64BIT)
+ global_options.x_flag_asynchronous_unwind_tables = 0;
+
+ /* Disable -freorder-blocks-and-partition when unwind tables are being emitted
+ for Darwin < 10 (OSX 10.6).
+ The strategy is, "Unless the User has specifically set/unset an unwind flag
+ we will switch off -freorder-blocks-and-partition when unwind tables will be
+ generated". If the User specifically sets flags... we assume (s)he knows
+ why... */
+ if (generating_for_darwin_version < 10
+ && global_options_set.x_flag_reorder_blocks_and_partition
+ && ((global_options.x_flag_exceptions /* User, c++, java */
+ && !global_options_set.x_flag_exceptions) /* User specified... */
+ || (global_options.x_flag_unwind_tables
+ && !global_options_set.x_flag_unwind_tables)
+ || (global_options.x_flag_non_call_exceptions
+ && !global_options_set.x_flag_non_call_exceptions)
+ || (global_options.x_flag_asynchronous_unwind_tables
+ && !global_options_set.x_flag_asynchronous_unwind_tables)))
{
inform (input_location,
- "-freorder-blocks-and-partition does not work with exceptions "
- "on this architecture");
+ "-freorder-blocks-and-partition does not work with exceptions "
+ "on this architecture");
flag_reorder_blocks_and_partition = 0;
flag_reorder_blocks = 1;
}
@@ -2590,7 +2635,7 @@ darwin_override_options (void)
}
if (flag_var_tracking
- && darwin9plus
+ && (generating_for_darwin_version >= 9)
&& debug_info_level >= DINFO_LEVEL_NORMAL
&& debug_hooks->var_location != do_nothing_debug_hooks.var_location)
flag_var_tracking_uninit = 1;
@@ -2608,7 +2653,7 @@ darwin_override_options (void)
}
/* It is assumed that branch island stubs are needed for earlier systems. */
- if (!darwin9plus)
+ if (generating_for_darwin_version < 9)
darwin_emit_branch_islands = true;
else
emit_aligned_common = true; /* Later systems can support aligned common. */
@@ -2968,33 +3013,56 @@ section *
darwin_function_section (tree decl, enum node_frequency freq,
bool startup, bool exit)
{
+ /* Decide if we need to put this in a coalescable section. */
+ bool weak = (decl
+ && DECL_WEAK (decl)
+ && (!DECL_ATTRIBUTES (decl)
+ || !lookup_attribute ("weak_import",
+ DECL_ATTRIBUTES (decl))));
+
+ /* If there is a specified section name, we should not be trying to
+ override. */
+ 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 NULL;
+ return (weak)
+ ? darwin_sections[text_coal_section]
+ : text_section;
+
/* Startup code should go to startup subsection unless it is
unlikely executed (this happens especially with function splitting
- where we can split away unnecesary parts of static constructors. */
+ where we can split away unnecesary parts of static constructors). */
if (startup && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
- return get_named_text_section
- (decl, "__TEXT,__startup,regular,pure_instructions", "_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 get_named_text_section (decl,
- "__TEXT,__exit,regular,pure_instructions",
- "_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 get_named_text_section
- (decl,
- "__TEXT,__unlikely,regular,pure_instructions", "_unlikely");
+ return (weak)
+ ? darwin_sections[text_cold_coal_section]
+ : darwin_sections[text_cold_section];
+ break;
case NODE_FREQUENCY_HOT:
- return get_named_text_section
- (decl, "__TEXT,__hot,regular,pure_instructions", "_hot");
+ return (weak)
+ ? darwin_sections[text_hot_coal_section]
+ : darwin_sections[text_hot_section];
+ break;
default:
- return NULL;
+ return (weak)
+ ? darwin_sections[text_coal_section]
+ : text_section;
+ break;
}
}