This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, CHKP] Fix instrumentation clones privatization


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.enkovich@intel.com>

	* lto/lto-partition.c (privatize_symbol_name): Correctly
	privatize instrumentation clones.

gcc/testsuite/

2014-12-02  Ilya Enkovich  <ilya.enkovich@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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]