aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorCaroline Tice <cmtice@google.com>2015-04-30 10:49:02 -0700
committerCaroline Tice <ctice@gcc.gnu.org>2015-04-30 10:49:02 -0700
commit11c3d0711a23e0cd776f205f718b826579f2623e (patch)
tree759784a887a9d386af425979450e9cb8697c4e43 /gcc
parentae9af49bd4d4f247eb5a1d179e207da899d101a6 (diff)
downloadgcc-11c3d0711a23e0cd776f205f718b826579f2623e.zip
gcc-11c3d0711a23e0cd776f205f718b826579f2623e.tar.gz
gcc-11c3d0711a23e0cd776f205f718b826579f2623e.tar.bz2
Define & use special macros to record the name & size of cold partitions.
Define & use special macros to record the name & size of cold partitions. (Fix PR 65929). gcc/ChangeLog PR 65929 * config/elfos.h (ASM_DECLARE_COLD_FUNCTION_NAME): New macro definition. (ASM_DECLARE_COLD_FUNCTION_SIZE): New macro definition. * doc/tm.texi.in (ASM_DECLARE_COLD_FUNCTION_NAME): Document new macro. (ASM_DECLARE_COLD_FUNCTION_SIZE): Document new macro. * final.c (final_scan_insn): Use ASM_DECLARE_COLD_FUNCTION_NAME instead of ASM_DECLARE_FUNCTION_NAME for cold partition name. * varasm.c (assemble_end_function): Use ASM_DECLARE_COLD_FUNCTION_SIZE instead of ASM_DECLARE_FUNCTION_SIZE for cold partition size. gcc/testsuite/ChangeLog: PR 65929 * gcc.dg/tree-prof/cold_partition_label.c: Only check for cold partition size on certain targets. From-SVN: r222643
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog12
-rw-r--r--gcc/config/elfos.h27
-rw-r--r--gcc/doc/tm.texi.in28
-rw-r--r--gcc/final.c9
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c4
-rw-r--r--gcc/varasm.c8
7 files changed, 84 insertions, 10 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9f5cab0..24ca2c2 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,15 @@
+2015-04-30 Caroline Tice <cmtice@google.com>
+
+ PR 65929
+ * config/elfos.h (ASM_DECLARE_COLD_FUNCTION_NAME): New macro definition.
+ (ASM_DECLARE_COLD_FUNCTION_SIZE): New macro definition.
+ * doc/tm.texi.in (ASM_DECLARE_COLD_FUNCTION_NAME): Document new macro.
+ (ASM_DECLARE_COLD_FUNCTION_SIZE): Document new macro.
+ * final.c (final_scan_insn): Use ASM_DECLARE_COLD_FUNCTION_NAME
+ instead of ASM_DECLARE_FUNCTION_NAME for cold partition name.
+ * varasm.c (assemble_end_function): Use ASM_DECLARE_COLD_FUNCTION_SIZE
+ instead of ASM_DECLARE_FUNCTION_SIZE for cold partition size.
+
2015-04-30 Marek Polacek <polacek@redhat.com>
* varasm.c (handle_cache_entry): Fix logic.
diff --git a/gcc/config/elfos.h b/gcc/config/elfos.h
index c3b9487..2224961 100644
--- a/gcc/config/elfos.h
+++ b/gcc/config/elfos.h
@@ -284,6 +284,22 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
while (0)
#endif
+/* Write the extra assembler code needed to declare the name of a
+ cold function partition properly. Some svr4 assemblers need to also
+ have something extra said about the function's return value. We
+ allow for that here. */
+
+#ifndef ASM_DECLARE_COLD_FUNCTION_NAME
+#define ASM_DECLARE_COLD_FUNCTION_NAME(FILE, NAME, DECL) \
+ do \
+ { \
+ ASM_OUTPUT_TYPE_DIRECTIVE (FILE, NAME, "function"); \
+ ASM_DECLARE_RESULT (FILE, DECL_RESULT (DECL)); \
+ ASM_OUTPUT_FUNCTION_LABEL (FILE, NAME, DECL); \
+ } \
+ while (0)
+#endif
+
/* Write the extra assembler code needed to declare an object properly. */
#ifdef HAVE_GAS_GNU_UNIQUE_OBJECT
@@ -358,6 +374,17 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
while (0)
#endif
+/* This is how to declare the size of a cold function partition. */
+#ifndef ASM_DECLARE_COLD_FUNCTION_SIZE
+#define ASM_DECLARE_COLD_FUNCTION_SIZE(FILE, FNAME, DECL) \
+ do \
+ { \
+ if (!flag_inhibit_size_directive) \
+ ASM_OUTPUT_MEASURED_SIZE (FILE, FNAME); \
+ } \
+ while (0)
+#endif
+
/* A table of bytes codes used by the ASM_OUTPUT_ASCII and
ASM_OUTPUT_LIMITED_STRING macros. Each byte in the table
corresponds to a particular byte value [0..255]. For any
diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in
index 6ff7aed..8680967 100644
--- a/gcc/doc/tm.texi.in
+++ b/gcc/doc/tm.texi.in
@@ -5574,6 +5574,34 @@ You may wish to use @code{ASM_OUTPUT_MEASURED_SIZE} in the definition
of this macro.
@end defmac
+@defmac ASM_DECLARE_COLD_FUNCTION_NAME (@var{stream}, @var{name}, @var{decl})
+A C statement (sans semicolon) to output to the stdio stream
+@var{stream} any text necessary for declaring the name @var{name} of a
+cold function partition which is being defined. This macro is responsible
+for outputting the label definition (perhaps using
+@code{ASM_OUTPUT_FUNCTION_LABEL}). The argument @var{decl} is the
+@code{FUNCTION_DECL} tree node representing the function.
+
+If this macro is not defined, then the cold partition name is defined in the
+usual manner as a label (by means of @code{ASM_OUTPUT_LABEL}).
+
+You may wish to use @code{ASM_OUTPUT_TYPE_DIRECTIVE} in the definition
+of this macro.
+@end defmac
+
+@defmac ASM_DECLARE_COLD_FUNCTION_SIZE (@var{stream}, @var{name}, @var{decl})
+A C statement (sans semicolon) to output to the stdio stream
+@var{stream} any text necessary for declaring the size of a cold function
+partition which is being defined. The argument @var{name} is the name of the
+cold partition of the function. The argument @var{decl} is the
+@code{FUNCTION_DECL} tree node representing the function.
+
+If this macro is not defined, then the partition size is not defined.
+
+You may wish to use @code{ASM_OUTPUT_MEASURED_SIZE} in the definition
+of this macro.
+@end defmac
+
@defmac ASM_DECLARE_OBJECT_NAME (@var{stream}, @var{name}, @var{decl})
A C statement (sans semicolon) to output to the stdio stream
@var{stream} any text necessary for declaring the name @var{name} of an
diff --git a/gcc/final.c b/gcc/final.c
index 968e525..2b9846e 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -2235,10 +2235,11 @@ final_scan_insn (rtx_insn *insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED,
{
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);
+#ifdef ASM_DECLARE_COLD_FUNCTION_NAME
+ ASM_DECLARE_COLD_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));
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b669784..00af2c4 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2015-04-30 Caroline Tice <cmtice@google.com>
+
+ PR 65929
+ * gcc.dg/tree-prof/cold_partition_label.c: Only check for cold
+ partition size on certain targets.
+
2015-04-30 Renlin Li <renlin.li@arm.com>
* gcc.target/aarch64/vect-reduc-or_1.c: New.
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 643707f..42a19ab 100644
--- a/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c
+++ b/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c
@@ -35,6 +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 { scan-assembler "foo\[._\]+cold\[\._\]+0" { target *-*-linux* *-*-gnu* } } } */
+/* { dg-final-use { scan-assembler "size\[ \ta-zA-Z0-0\]+foo\[._\]+cold\[\._\]+0" { target *-*-linux* *-*-gnu* } } } */
/* { dg-final-use { cleanup-saved-temps } } */
diff --git a/gcc/varasm.c b/gcc/varasm.c
index c2b35fd..62d5163 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -1864,11 +1864,11 @@ assemble_end_function (tree decl, const char *fnname ATTRIBUTE_UNUSED)
save_text_section = in_section;
switch_to_section (unlikely_text_section ());
-#ifdef ASM_DECLARE_FUNCTION_SIZE
+#ifdef ASM_DECLARE_COLD_FUNCTION_SIZE
if (cold_function_name != NULL_TREE)
- ASM_DECLARE_FUNCTION_SIZE (asm_out_file,
- IDENTIFIER_POINTER (cold_function_name),
- decl);
+ ASM_DECLARE_COLD_FUNCTION_SIZE (asm_out_file,
+ IDENTIFIER_POINTER (cold_function_name),
+ decl);
#endif
ASM_OUTPUT_LABEL (asm_out_file, crtl->subsections.cold_section_end_label);
if (first_function_block_is_cold)