From 6c77972738e8a6abac2b716a1b14c459b4c51240 Mon Sep 17 00:00:00 2001 From: Ilya Enkovich Date: Tue, 9 Dec 2014 08:00:52 +0000 Subject: [PATCH] lto-partition.c (privatize_symbol_name): Correctly privatize instrumentation clones. 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. From-SVN: r218508 --- 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 eba4f993e5f..5ca94246784 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/lto/lto-partition.c b/gcc/lto/lto-partition.c index 65f0582cf6b..809a4937b66 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 1b1e7d5e959..31f740dba87 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +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 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 00000000000..4c899e864de --- /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 00000000000..db39e7fa9ef --- /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 25862978bda..797c02f9e6c 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.30.2