diff options
author | Sriraman Tallam <tmsriram@google.com> | 2013-11-19 22:12:21 +0000 |
---|---|---|
committer | Sriraman Tallam <tmsriram@gcc.gnu.org> | 2013-11-19 22:12:21 +0000 |
commit | 2ae367c1e7081c2ec9a47267551d197002e79b23 (patch) | |
tree | c5c102bd1f2db820f1d57fb913fc67020e0bbb34 | |
parent | 50875e80e1ed5ba34bf4342571530b7ad516af1b (diff) | |
download | gcc-2ae367c1e7081c2ec9a47267551d197002e79b23.zip gcc-2ae367c1e7081c2ec9a47267551d197002e79b23.tar.gz gcc-2ae367c1e7081c2ec9a47267551d197002e79b23.tar.bz2 |
Emit a label for the split cold function part.
Emit a label for the split cold function part. Label name is formed by
suffixing the original function name with "cold".
Patch tested for bootstrap on all default languages on x86_64 and
regression testsuite checked for parity with RUNTESTFLAGS -m32 and m64.
From-SVN: r205057
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/final.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c | 36 |
4 files changed, 55 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f06ccfb..9c79ee9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-11-19 Sriraman Tallam <tmsriram@google.com> + + * final.c (final_scan_insn): Emit a label for the split + cold function part. Label name is formed by suffixing + the original function name with "cold". + 2013-11-19 David Malcolm <dmalcolm@redhat.com> * basic-block.h (ENTRY_BLOCK_PTR_FOR_FUNCTION): Rename macro to... diff --git a/gcc/final.c b/gcc/final.c index f2adde9..2ab6a4d 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -2168,6 +2168,15 @@ final_scan_insn (rtx insn, FILE *file, int optimize_p ATTRIBUTE_UNUSED, targetm.asm_out.function_switched_text_sections (asm_out_file, current_function_decl, in_cold_section_p); + /* Emit a label for the split cold section. Form label name by + suffixing "cold" to the original function's name. */ + if (in_cold_section_p) + { + tree cold_function_name + = clone_function_name (current_function_decl, "cold"); + ASM_OUTPUT_LABEL (asm_out_file, + IDENTIFIER_POINTER (cold_function_name)); + } break; case NOTE_INSN_BASIC_BLOCK: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7235aaf..190b2c4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-11-19 Sriraman Tallam <tmsriram@google.com> + + * gcc.dg/tree-prof/cold_partition_label.c: New testcase. + 2013-11-19 Ulrich Weigand <Ulrich.Weigand@de.ibm.com> * gcc.target/powerpc/ppc64-abi-2.c (MAKE_SLOT): New macro to diff --git a/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c b/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c new file mode 100644 index 0000000..9dc7566 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-prof/cold_partition_label.c @@ -0,0 +1,36 @@ +/* Test case to check if function foo gets split and the cold function + gets a label. */ +/* { dg-require-effective-target freorder } */ +/* { dg-options "-O2 -freorder-blocks-and-partition --save-temps" } */ + +#define SIZE 10000 + +const char *sarr[SIZE]; +const char *buf_hot; +const char *buf_cold; + +__attribute__((noinline)) +void +foo (int path) +{ + int i; + if (path) + { + for (i = 0; i < SIZE; i++) + sarr[i] = buf_hot; + } + else + { + for (i = 0; i < SIZE; i++) + sarr[i] = buf_cold; + } +} + +int +main (int argc, char *argv[]) +{ + buf_hot = "hello"; + buf_cold = "world"; + foo (argc); + return 0; +} |