diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 12 | ||||
-rw-r--r-- | gcc/config/elfos.h | 27 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 28 | ||||
-rw-r--r-- | gcc/final.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c | 4 | ||||
-rw-r--r-- | gcc/varasm.c | 8 |
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) |