From 48b2f1a26ed3d08be49f3b389643a089e0af9668 Mon Sep 17 00:00:00 2001 From: ienkovich Date: Tue, 9 Dec 2014 08:00:52 +0000 Subject: [PATCH] gcc/ * lto/lto-partition.c (privatize_symbol_name): Correctly privatize instrumentation clones. gcc/testsuite/ * 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@218508 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 5 +++++ gcc/lto/lto-partition.c | 33 ++++++++++++++++++++--------- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gcc.dg/lto/chkp-privatize_0.c | 18 ++++++++++++++++ gcc/testsuite/gcc.dg/lto/chkp-privatize_1.c | 8 +++++++ gcc/testsuite/gcc.dg/lto/lto.exp | 1 + 6 files changed, 61 insertions(+), 10 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/lto/chkp-privatize_0.c create mode 100644 gcc/testsuite/gcc.dg/lto/chkp-privatize_1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index eba4f99..5ca9424 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2014-12-09 Ilya Enkovich + * lto/lto-partition.c (privatize_symbol_name): Correctly + privatize instrumentation clones. + +2014-12-09 Ilya Enkovich + * lto-cgraph.c (input_cgraph_1): Don't break existing instrumentation clone references. * lto/lto-symtab.c (lto_cgraph_replace_node): Redirect 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 (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 (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/ChangeLog b/gcc/testsuite/ChangeLog index 1b1e7d5..31f740d 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,11 @@ 2014-12-09 Ilya Enkovich + * 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. + +2014-12-09 Ilya Enkovich + PR bootstrap/63995 * g++.dg/dg.exp: Add mpx-dg.exp. * g++.dg/pr63995-1.C: New. 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 -- 2.7.4