aboutsummaryrefslogtreecommitdiff
path: root/gcc/varasm.c
diff options
context:
space:
mode:
authorCaroline Tice <ctice@apple.com>2005-05-16 21:37:01 +0000
committerCaroline Tice <ctice@apple.com>2005-05-16 21:37:01 +0000
commita776cec736833999001d4b79e722e044f3f155f2 (patch)
treee341ea5046d53daf979967bc128d37281b462f43 /gcc/varasm.c
parent0caa07066e3a87882eadb3aa1c7448a5b5624794 (diff)
2005-05-16 Caroline Tice <ctice@apple.com>
* bb-reorder.c (verify_hot_cold_block_grouping): Replace internal_error with gcc_assert. * dwarf2out.c (dwarf2out_switch_text_section): Likewise. * function.h (struct function): Remove space between "*" and struct field names. * varasm.c (initialize_cold_section_name): Add gcc_assert; modify to use alloca. (unlikely_text_section): Add check for flag_function_sections. (assemble_start_function): Move call to resolve_section, so it comes before first call to unlikely_text_section. (assemble_end_function): Add test and call to function_section if appropriate. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@99796 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/varasm.c')
-rw-r--r--gcc/varasm.c53
1 files changed, 24 insertions, 29 deletions
diff --git a/gcc/varasm.c b/gcc/varasm.c
index bc0597efab5..1f51e2e9478 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -179,34 +179,23 @@ initialize_cold_section_name (void)
const char *name;
const char *stripped_name;
char *buffer;
- int len;
- if (cfun
- && current_function_decl)
+ gcc_assert (cfun && current_function_decl);
+ if (cfun->unlikely_text_section_name)
+ return;
+
+ if (flag_function_sections && DECL_SECTION_NAME (current_function_decl))
{
- if (!cfun->unlikely_text_section_name)
- {
- if (flag_function_sections
- && DECL_SECTION_NAME (current_function_decl))
- {
- name = xstrdup (TREE_STRING_POINTER (DECL_SECTION_NAME
- (current_function_decl)));
- stripped_name = targetm.strip_name_encoding (name);
- len = strlen (stripped_name);
- buffer = (char *) xmalloc (len + 10);
- sprintf (buffer, "%s%s", stripped_name, "_unlikely");
- cfun->unlikely_text_section_name = ggc_strdup (buffer);
- free (buffer);
- free ((char *) name);
- }
- else
- cfun->unlikely_text_section_name =
- UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
- }
+ name = alloca (TREE_STRING_LENGTH (DECL_SECTION_NAME
+ (current_function_decl)));
+ strcpy ((char *) name, TREE_STRING_POINTER (DECL_SECTION_NAME
+ (current_function_decl)));
+ stripped_name = targetm.strip_name_encoding (name);
+ buffer = ACONCAT ((stripped_name, "_unlikely", NULL));
+ cfun->unlikely_text_section_name = ggc_strdup (buffer);
}
else
- internal_error
- ("initialize_cold_section_name called without valid current_function_decl.");
+ cfun->unlikely_text_section_name = UNLIKELY_EXECUTED_TEXT_SECTION_NAME;
}
/* Tell assembler to switch to text section. */
@@ -232,9 +221,11 @@ unlikely_text_section (void)
if (!cfun->unlikely_text_section_name)
initialize_cold_section_name ();
- if ((in_section != in_unlikely_executed_text)
- && (in_section != in_named
- || strcmp (in_named_name, cfun->unlikely_text_section_name) != 0))
+ if (flag_function_sections
+ || ((in_section != in_unlikely_executed_text)
+ && (in_section != in_named
+ || (strcmp (in_named_name, cfun->unlikely_text_section_name)
+ != 0))))
{
named_section (NULL_TREE, cfun->unlikely_text_section_name, 0);
in_section = in_unlikely_executed_text;
@@ -1267,6 +1258,8 @@ assemble_start_function (tree decl, const char *fnname)
if (CONSTANT_POOL_BEFORE_FUNCTION)
output_constant_pool (fnname, decl);
+ resolve_unique_section (decl, 0, flag_function_sections);
+
/* Make sure the not and cold text (code) sections are properly
aligned. This is necessary here in the case where the function
has both hot and cold sections, because we don't want to re-set
@@ -1320,7 +1313,6 @@ assemble_start_function (tree decl, const char *fnname)
}
last_text_section = no_section;
- resolve_unique_section (decl, 0, flag_function_sections);
/* Switch to the correct text section for the start of the function. */
@@ -1406,7 +1398,10 @@ assemble_end_function (tree decl, const char *fnname)
save_text_section = in_section;
unlikely_text_section ();
ASM_OUTPUT_LABEL (asm_out_file, cfun->cold_section_end_label);
- text_section ();
+ if (first_function_block_is_cold)
+ text_section ();
+ else
+ function_section (decl);
ASM_OUTPUT_LABEL (asm_out_file, cfun->hot_section_end_label);
if (save_text_section == in_unlikely_executed_text)
unlikely_text_section ();