diff options
author | iains <iains@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-20 10:01:02 +0000 |
---|---|---|
committer | iains <iains@138bc75d-0d04-0410-961f-82ee72b054a4> | 2010-12-20 10:01:02 +0000 |
commit | 9e09909ddcc4fd558def2bd51928ff713443dc5a (patch) | |
tree | 66092cda5751ac5a0efe044ef1182237e52e7f58 /gcc/config/darwin.c | |
parent | 6fb3c31462ced0d422af294acb69381edb44edee (diff) | |
download | gcc-9e09909ddcc4fd558def2bd51928ff713443dc5a.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@168083 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/darwin.c')
-rw-r--r-- | gcc/config/darwin.c | 168 |
1 files changed, 118 insertions, 50 deletions
diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 8ae6409bcee..d9185dbeb76 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; } } |