Commit 1f81953b by Iain Sandoe

re PR c++/46904 (g++.dg/tree-prof/(indir-call-prof.C|inline_mismatch_args.C)…

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
parent 308e6f3a
2010-12-20 Iain Sandoe <iains@gcc.gnu.org>
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.
2010-12-20 Ralf Wildenhues <Ralf.Wildenhues@gmx.de> 2010-12-20 Ralf Wildenhues <Ralf.Wildenhues@gmx.de>
* doc/cppopts.texi: Use @var when appropriate. * doc/cppopts.texi: Use @var when appropriate.
...@@ -34,6 +34,24 @@ DEF_SECTION (text_unlikely_coal_section, SECTION_CODE|SECTION_NO_ANCHOR, ...@@ -34,6 +34,24 @@ DEF_SECTION (text_unlikely_coal_section, SECTION_CODE|SECTION_NO_ANCHOR,
".section __TEXT,__text_unlikely_coal," ".section __TEXT,__text_unlikely_coal,"
"coalesced,pure_instructions", 0) "coalesced,pure_instructions", 0)
DEF_SECTION (text_hot_section, SECTION_CODE,
".section __TEXT,__text_hot,regular,pure_instructions", 0)
DEF_SECTION (text_cold_section, SECTION_CODE,
".section __TEXT,__text_cold,regular,pure_instructions", 0)
DEF_SECTION (text_startup_section, SECTION_CODE,
".section __TEXT,__text_startup,regular,pure_instructions", 0)
DEF_SECTION (text_exit_section, SECTION_CODE,
".section __TEXT,__text_exit,regular,pure_instructions", 0)
DEF_SECTION (text_hot_coal_section, SECTION_CODE,
".section __TEXT,__text_hot_coal,coalesced,pure_instructions", 0)
DEF_SECTION (text_cold_coal_section, SECTION_CODE,
".section __TEXT,__text_cold_coal,coalesced,pure_instructions", 0)
DEF_SECTION (text_startup_coal_section, SECTION_CODE,
".section __TEXT,__text_stt_coal,coalesced,pure_instructions", 0)
DEF_SECTION (text_exit_coal_section, SECTION_CODE,
".section __TEXT,__text_exit_coal,coalesced,pure_instructions", 0)
/* const */ /* const */
DEF_SECTION (const_section, 0, ".const", 0) DEF_SECTION (const_section, 0, ".const", 0)
DEF_SECTION (const_coal_section, SECTION_NO_ANCHOR, DEF_SECTION (const_coal_section, SECTION_NO_ANCHOR,
......
...@@ -90,6 +90,9 @@ int darwin_emit_branch_islands = false; ...@@ -90,6 +90,9 @@ int darwin_emit_branch_islands = false;
functions). */ functions). */
int darwin_running_cxx; int darwin_running_cxx;
/* Some code-gen now depends on OS major version numbers (at least). */
int generating_for_darwin_version ;
/* Section names. */ /* Section names. */
section * darwin_sections[NUM_DARWIN_SECTIONS]; section * darwin_sections[NUM_DARWIN_SECTIONS];
...@@ -1145,19 +1148,6 @@ darwin_mark_decl_preserved (const char *name) ...@@ -1145,19 +1148,6 @@ darwin_mark_decl_preserved (const char *name)
} }
static section * 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) darwin_rodata_section (int weak, bool zsize)
{ {
return (weak return (weak
...@@ -1267,17 +1257,7 @@ machopic_select_section (tree decl, ...@@ -1267,17 +1257,7 @@ machopic_select_section (tree decl,
switch (categorize_decl_for_section (decl, reloc)) switch (categorize_decl_for_section (decl, reloc))
{ {
case SECCAT_TEXT: case SECCAT_TEXT:
{ gcc_unreachable ();
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);
}
break; break;
case SECCAT_RODATA: case SECCAT_RODATA:
...@@ -1684,12 +1664,37 @@ darwin_handle_weak_import_attribute (tree *node, tree name, ...@@ -1684,12 +1664,37 @@ darwin_handle_weak_import_attribute (tree *node, tree name,
void void
darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty) darwin_emit_unwind_label (FILE *file, tree decl, int for_eh, int empty)
{ {
char *lab; char *lab ;
char buf[32];
if (! for_eh) 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; 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)) if (TREE_PUBLIC (decl))
{ {
...@@ -2551,21 +2556,61 @@ darwin_kextabi_p (void) { ...@@ -2551,21 +2556,61 @@ darwin_kextabi_p (void) {
void void
darwin_override_options (void) darwin_override_options (void)
{ {
bool darwin9plus = (darwin_macosx_version_min /* Keep track of which (major) version we're generating code for. */
&& strverscmp (darwin_macosx_version_min, "10.5") >= 0); 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 /* Don't emit DWARF3/4 unless specifically selected. This is a
workaround for tool bugs. */ workaround for tool bugs. */
if (!global_options_set.x_dwarf_strict) if (!global_options_set.x_dwarf_strict)
dwarf_strict = 1; dwarf_strict = 1;
/* Disable -freorder-blocks-and-partition for darwin_emit_unwind_label. */ /* FIXME: Darwin cannot support multiple function sections until (a) the new code
if (flag_reorder_blocks_and_partition atoms created have a proper start label and (b) there are suitable pubnames
&& (targetm.asm_out.emit_unwind_label == darwin_emit_unwind_label)) 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, inform (input_location,
"-freorder-blocks-and-partition does not work with exceptions " "-freorder-blocks-and-partition does not work with exceptions "
"on this architecture"); "on this architecture");
flag_reorder_blocks_and_partition = 0; flag_reorder_blocks_and_partition = 0;
flag_reorder_blocks = 1; flag_reorder_blocks = 1;
} }
...@@ -2590,7 +2635,7 @@ darwin_override_options (void) ...@@ -2590,7 +2635,7 @@ darwin_override_options (void)
} }
if (flag_var_tracking if (flag_var_tracking
&& darwin9plus && (generating_for_darwin_version >= 9)
&& debug_info_level >= DINFO_LEVEL_NORMAL && debug_info_level >= DINFO_LEVEL_NORMAL
&& debug_hooks->var_location != do_nothing_debug_hooks.var_location) && debug_hooks->var_location != do_nothing_debug_hooks.var_location)
flag_var_tracking_uninit = 1; flag_var_tracking_uninit = 1;
...@@ -2608,7 +2653,7 @@ darwin_override_options (void) ...@@ -2608,7 +2653,7 @@ darwin_override_options (void)
} }
/* It is assumed that branch island stubs are needed for earlier systems. */ /* 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; darwin_emit_branch_islands = true;
else else
emit_aligned_common = true; /* Later systems can support aligned common. */ emit_aligned_common = true; /* Later systems can support aligned common. */
...@@ -2968,33 +3013,56 @@ section * ...@@ -2968,33 +3013,56 @@ section *
darwin_function_section (tree decl, enum node_frequency freq, darwin_function_section (tree decl, enum node_frequency freq,
bool startup, bool exit) 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) 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 /* Startup code should go to startup subsection unless it is
unlikely executed (this happens especially with function splitting 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) if (startup && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
return get_named_text_section return (weak)
(decl, "__TEXT,__startup,regular,pure_instructions", "_startup"); ? darwin_sections[text_startup_coal_section]
: darwin_sections[text_startup_section];
/* Similarly for exit. */ /* Similarly for exit. */
if (exit && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED) if (exit && freq != NODE_FREQUENCY_UNLIKELY_EXECUTED)
return get_named_text_section (decl, return (weak)
"__TEXT,__exit,regular,pure_instructions", ? darwin_sections[text_exit_coal_section]
"_exit"); : darwin_sections[text_exit_section];
/* Group cold functions together, similarly for hot code. */ /* Group cold functions together, similarly for hot code. */
switch (freq) switch (freq)
{ {
case NODE_FREQUENCY_UNLIKELY_EXECUTED: case NODE_FREQUENCY_UNLIKELY_EXECUTED:
return get_named_text_section return (weak)
(decl, ? darwin_sections[text_cold_coal_section]
"__TEXT,__unlikely,regular,pure_instructions", "_unlikely"); : darwin_sections[text_cold_section];
break;
case NODE_FREQUENCY_HOT: case NODE_FREQUENCY_HOT:
return get_named_text_section return (weak)
(decl, "__TEXT,__hot,regular,pure_instructions", "_hot"); ? darwin_sections[text_hot_coal_section]
: darwin_sections[text_hot_section];
break;
default: default:
return NULL; return (weak)
? darwin_sections[text_coal_section]
: text_section;
break;
} }
} }
......
...@@ -669,7 +669,7 @@ extern GTY(()) section * darwin_sections[NUM_DARWIN_SECTIONS]; ...@@ -669,7 +669,7 @@ extern GTY(()) section * darwin_sections[NUM_DARWIN_SECTIONS];
#undef TARGET_ASM_SELECT_SECTION #undef TARGET_ASM_SELECT_SECTION
#define TARGET_ASM_SELECT_SECTION machopic_select_section #define TARGET_ASM_SELECT_SECTION machopic_select_section
#define USE_SELECT_SECTION_FOR_FUNCTIONS
#undef TARGET_ASM_FUNCTION_SECTION #undef TARGET_ASM_FUNCTION_SECTION
#define TARGET_ASM_FUNCTION_SECTION darwin_function_section #define TARGET_ASM_FUNCTION_SECTION darwin_function_section
......
...@@ -23,8 +23,3 @@ unwinder in libSystem is fixed to digest new epilog unwinding notes. */ ...@@ -23,8 +23,3 @@ unwinder in libSystem is fixed to digest new epilog unwinding notes. */
#undef LIB_SPEC #undef LIB_SPEC
#define LIB_SPEC "%{!static:-no_compact_unwind -lSystem}" #define LIB_SPEC "%{!static:-no_compact_unwind -lSystem}"
/* Unwind labels are no longer required in darwin10. */
#undef TARGET_ASM_EMIT_UNWIND_LABEL
#define TARGET_ASM_EMIT_UNWIND_LABEL default_emit_unwind_label
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment