aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaroline Tice <cmtice@google.com>2015-04-27 09:44:35 -0700
committerCaroline Tice <ctice@gcc.gnu.org>2015-04-27 09:44:35 -0700
commit16d710b164529c81929bcb8bb55eea1b758b070e (patch)
treedf19ff6f9889f28dc41876292756363a07ed31ca
parent0a48088a0b7339e8f1d000aee282cfb7e394938d (diff)
downloadgcc-16d710b164529c81929bcb8bb55eea1b758b070e.zip
gcc-16d710b164529c81929bcb8bb55eea1b758b070e.tar.gz
gcc-16d710b164529c81929bcb8bb55eea1b758b070e.tar.bz2
Give proper type and size to named cold partitions.
2015-04-27 Caroline Tice <cmtice@google.com> * final.c (final_scan_insn): Output cold_function_nmae as function type. * varasm.c (cold_function_name): Make gloval. (assemble_start_function): Re-set cold_function_name. (assemble_end_function): Output cold partition size. * varasm.h (cold_fun ction_name): Declare global. 2015-04-27 Caroline Tice <cmtice@google.com> * gcc.dg/tree-prof/cold_partition_label.c (main): Check for cold partition size. From-SVN: r222473
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/final.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c2
-rw-r--r--gcc/varasm.c12
-rw-r--r--gcc/varasm.h7
6 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3e2c8dd..b36391e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,12 @@
+2015-04-27 Caroline Tice <cmtice@google.com>
+
+ * final.c (final_scan_insn): Output cold_function_nmae as function
+ type.
+ * varasm.c (cold_function_name): Make gloval.
+ (assemble_start_function): Re-set cold_function_name.
+ (assemble_end_function): Output cold partition size.
+ * varasm.h (cold_fun ction_name): Declare global.
+
2015-04-27 Ilya Tocar <ilya.tocar@intel.com>
* config/i386/i386.h (EXT_REX_SSE_REG_P): New.
diff --git a/gcc/final.c b/gcc/final.c
index 231cfe5..968e525 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -2233,10 +2233,16 @@ final_scan_insn (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
suffixing "cold" to the original function's name. */
if (in_cold_section_p)
{
- tree cold_function_name
+ cold_function_name
= clone_function_name (current_function_decl, "cold");
+#ifdef ASM_DECLARE_FUNCTION_NAME
+ ASM_DECLARE_FUNCTION_NAME (asm_out_file,
+ IDENTIFIER_POINTER (cold_function_name),
+ current_function_decl);
+#else
ASM_OUTPUT_LABEL (asm_out_file,
IDENTIFIER_POINTER (cold_function_name));
+#endif
}
break;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 98aee26..21e4174 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2015-04-27 Caroline Tice <cmtice@google.com>
+
+ * gcc.dg/tree-prof/cold_partition_label.c (main): Check for cold
+ partition size.
+
2015-04-27 Peter Bergner <bergner@vnet.ibm.com>
PR target/64579
diff --git a/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c b/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c
index a03aad7..643707f 100644
--- a/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c
+++ b/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c
@@ -35,4 +35,6 @@ main (int argc, char *argv[])
return 0;
}
+/* { dg-final-use { scan-assembler "foo\[._\]+cold\[\._\]+0" } } */
+/* { dg-final-use { scan-assembler "size\[ \ta-zA-Z0-0\]+foo\[._\]+cold\[\._\]+0" } } */
/* { dg-final-use { cleanup-saved-temps } } */
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 1597de1..eab937f 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -187,6 +187,13 @@ section *in_section;
at the cold section. */
bool in_cold_section_p;
+/* The following global holds the "function name" for the code in the
+ cold section of a function, if hot/cold function splitting is enabled
+ and there was actually code that went into the cold section. A
+ pseudo function name is needed for the cold section of code for some
+ debugging tools that perform symbolization. */
+tree cold_function_name = NULL_TREE;
+
/* A linked list of all the unnamed sections. */
static GTY(()) section *unnamed_sections;
@@ -1719,6 +1726,7 @@ assemble_start_function (tree decl, const char *fnname)
ASM_GENERATE_INTERNAL_LABEL (tmp_label, "LCOLDE", const_labelno);
crtl->subsections.cold_section_end_label = ggc_strdup (tmp_label);
const_labelno++;
+ cold_function_name = NULL_TREE;
}
else
{
@@ -1856,6 +1864,10 @@ assemble_end_function (tree decl, const char *fnname ATTRIBUTE_UNUSED)
save_text_section = in_section;
switch_to_section (unlikely_text_section ());
+ if (cold_function_name != NULL_TREE)
+ ASM_DECLARE_FUNCTION_SIZE (asm_out_file,
+ IDENTIFIER_POINTER (cold_function_name),
+ decl);
ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_end_label);
if (first_function_block_is_cold)
switch_to_section (text_section);
diff --git a/gcc/varasm.h b/gcc/varasm.h
index d2dafb7..0d7d563 100644
--- a/gcc/varasm.h
+++ b/gcc/varasm.h
@@ -20,6 +20,13 @@ along with GCC; see the file COPYING3. If not see
#ifndef GCC_VARASM_H
#define GCC_VARASM_H
+/* The following global holds the "function name" for the code in the
+ cold section of a function, if hot/cold function splitting is enabled
+ and there was actually code that went into the cold section. A
+ pseudo function name is needed for the cold section of code for some
+ debugging tools that perform symbolization. */
+extern tree cold_function_name;
+
extern tree tree_output_constant_def (tree);
extern void make_decl_rtl (tree);
extern rtx make_decl_rtl_for_debug (tree);