Hi, Currently symbol names privatization doesn't work for instrumentation clones because clones assembler name is transparent alias and therefore alias target should be privatized instead. This patch does it. Bootstrapped and tested on x86_64-unknown-linux-gnu. OK for trunk?
Thanks, Ilya -- gcc/ 2014-12-02 Ilya Enkovich <ilya.enkov...@intel.com> * lto/lto-partition.c (privatize_symbol_name): Correctly privatize instrumentation clones. gcc/testsuite/ 2014-12-02 Ilya Enkovich <ilya.enkov...@intel.com> * gcc.dg/lto/lto.exp: Load mpx-dg.exp. * gcc.dg/lto/chkp-privatize_0.c: New. * gcc.dg/lto/chkp-privatize_1.c: New. diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 65f0582..809a493 100644 --- a/gcc/lto/lto-partition.c +++ b/gcc/lto/lto-partition.c @@ -787,8 +787,16 @@ static bool privatize_symbol_name (symtab_node *node) { tree decl = node->decl; - const char *name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); - cgraph_node *cnode; + cgraph_node *cnode = dyn_cast <cgraph_node *> (node); + const char *name; + + /* If we want to privatize instrumentation clone + then we need to change original function name + which is used via transparent alias chain. */ + if (cnode && cnode->instrumentation_clone) + decl = cnode->orig_decl; + + name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)); /* Our renaming machinery do not handle more than one change of assembler name. We should not need more than one anyway. */ @@ -821,15 +829,20 @@ privatize_symbol_name (symtab_node *node) (DECL_ASSEMBLER_NAME (decl))); /* We could change name which is a target of transparent alias chain of instrumented function name. Fix alias chain if so .*/ - if ((cnode = dyn_cast <cgraph_node *> (node)) - && !cnode->instrumentation_clone - && cnode->instrumented_version - && cnode->instrumented_version->orig_decl == decl) + if (cnode) { - tree iname = DECL_ASSEMBLER_NAME (cnode->instrumented_version->decl); - - gcc_assert (IDENTIFIER_TRANSPARENT_ALIAS (iname)); - TREE_CHAIN (iname) = DECL_ASSEMBLER_NAME (decl); + tree iname = NULL_TREE; + if (cnode->instrumentation_clone) + iname = DECL_ASSEMBLER_NAME (cnode->decl); + else if (cnode->instrumented_version + && cnode->instrumented_version->orig_decl == decl) + iname = DECL_ASSEMBLER_NAME (cnode->instrumented_version->decl); + + if (iname) + { + gcc_assert (IDENTIFIER_TRANSPARENT_ALIAS (iname)); + TREE_CHAIN (iname) = DECL_ASSEMBLER_NAME (decl); + } } if (symtab->dump_file) fprintf (symtab->dump_file, diff --git a/gcc/testsuite/gcc.dg/lto/chkp-privatize_0.c b/gcc/testsuite/gcc.dg/lto/chkp-privatize_0.c new file mode 100644 index 0000000..4c899e8 --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/chkp-privatize_0.c @@ -0,0 +1,18 @@ +/* { dg-lto-do link } */ +/* { dg-require-effective-target mpx { target { i?86-*-* x86_64-*-* } } } */ +/* { dg-lto-options { { -fPIC -flto -flto-partition=max -fcheck-pointer-bounds -mmpx } } } */ + +static int +__attribute__ ((noinline)) +func1 (int i) +{ + return i + 2; +} + +extern int func2 (int i); + +int +main (int argc, char **argv) +{ + return func1 (argc) + func2 (argc) + 1; +} diff --git a/gcc/testsuite/gcc.dg/lto/chkp-privatize_1.c b/gcc/testsuite/gcc.dg/lto/chkp-privatize_1.c new file mode 100644 index 0000000..db39e7f --- /dev/null +++ b/gcc/testsuite/gcc.dg/lto/chkp-privatize_1.c @@ -0,0 +1,8 @@ +int func1 = 10; + +int +func2 (int i) +{ + func1++; + return i + func1; +} diff --git a/gcc/testsuite/gcc.dg/lto/lto.exp b/gcc/testsuite/gcc.dg/lto/lto.exp index 2586297..797c02f 100644 --- a/gcc/testsuite/gcc.dg/lto/lto.exp +++ b/gcc/testsuite/gcc.dg/lto/lto.exp @@ -30,6 +30,7 @@ if $tracelevel then { # Load procedures from common libraries. load_lib standard.exp load_lib gcc.exp +load_lib mpx-dg.exp # Load the language-independent compabibility support procedures. load_lib lto.exp