ipa-chkp.h (chkp_wrap_function): New.
authorIlya Enkovich <ilya.enkovich@intel.com>
Fri, 15 May 2015 09:48:13 +0000 (09:48 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Fri, 15 May 2015 09:48:13 +0000 (09:48 +0000)
gcc/

* ipa-chkp.h (chkp_wrap_function): New.
* ipa-chkp.c (chkp_wrap_function): Remove 'static'.
(chkp_wrap_function_name): New.
(chkp_build_instrumented_fndecl): Use chkp_wrap_function_name
to get wrapper name.
* lto-cgraph.c: Include ipa-chkp.h.
(input_cgraph_1): Avoid alias chain for wrappers.

gcc/testsuite/

* gcc.dg/lto/chkp-wrap-asm-name_0.c: New.

From-SVN: r223216

gcc/ChangeLog
gcc/ipa-chkp.c
gcc/ipa-chkp.h
gcc/lto-cgraph.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/chkp-wrap-asm-name_0.c [new file with mode: 0644]

index f446b2944064708fa13cd6f78fc4e935554c8e49..c757522646c47969939815cef1a4e494df276fa0 100644 (file)
@@ -1,3 +1,13 @@
+2015-05-15  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       * ipa-chkp.h (chkp_wrap_function): New.
+       * ipa-chkp.c (chkp_wrap_function): Remove 'static'.
+       (chkp_wrap_function_name): New.
+       (chkp_build_instrumented_fndecl): Use chkp_wrap_function_name
+       to get wrapper name.
+       * lto-cgraph.c: Include ipa-chkp.h.
+       (input_cgraph_1): Avoid alias chain for wrappers.
+
 2015-05-15  Ilya Enkovich  <enkovich.gnu@gmail.com>
 
        PR middle-end/66134
index 23e08cbfc6f55a13657af0c84f23b7a4d2060441..ac5eb358a9545fa2ba94d3d45b80956a111fdccd 100644 (file)
@@ -104,7 +104,7 @@ along with GCC; see the file COPYING3.  If not see
 
 /* Return 1 calls to FNDECL should be replaced with
    a call to wrapper function.  */
-static bool
+bool
 chkp_wrap_function (tree fndecl)
 {
   if (!flag_chkp_use_wrappers)
@@ -139,6 +139,51 @@ chkp_wrap_function (tree fndecl)
   return false;
 }
 
+static const char *
+chkp_wrap_function_name (tree fndecl)
+{
+  gcc_assert (DECL_BUILT_IN_CLASS (fndecl) == BUILT_IN_NORMAL);
+
+  switch (DECL_FUNCTION_CODE (fndecl))
+    {
+    case BUILT_IN_STRLEN:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "strlen";
+    case BUILT_IN_STRCPY:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "strcpy";
+    case BUILT_IN_STRNCPY:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "strncpy";
+    case BUILT_IN_STPCPY:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "stpcpy";
+    case BUILT_IN_STPNCPY:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "stpncpy";
+    case BUILT_IN_STRCAT:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "strcat";
+    case BUILT_IN_STRNCAT:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "strncat";
+    case BUILT_IN_MEMCPY:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "memcpy";
+    case BUILT_IN_MEMPCPY:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "mempcpy";
+    case BUILT_IN_MEMSET:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "memset";
+    case BUILT_IN_MEMMOVE:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "memmove";
+    case BUILT_IN_BZERO:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "bzero";
+    case BUILT_IN_MALLOC:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "malloc";
+    case BUILT_IN_CALLOC:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "calloc";
+    case BUILT_IN_REALLOC:
+      return CHKP_WRAPPER_SYMBOL_PREFIX "realloc";
+
+    default:
+      gcc_unreachable ();
+    }
+
+  return "";
+}
+
 /* Build a clone of FNDECL with a modified name.  */
 
 static tree
@@ -164,9 +209,8 @@ chkp_build_instrumented_fndecl (tree fndecl)
      instrumented version.  */
   if (chkp_wrap_function(fndecl))
     {
-      s = CHKP_WRAPPER_SYMBOL_PREFIX;
-      s += IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (fndecl));
-      new_name = get_identifier (s.c_str ());
+      new_name = get_identifier (chkp_wrap_function_name (fndecl));
+      DECL_VISIBILITY (new_decl) = VISIBILITY_DEFAULT;
     }
   else
     {
index 6708fe9c56a00af89c16ce38d9b7fa163b8ba310..547487ea6bc27cde71856a33727d152231f16097 100644 (file)
@@ -24,5 +24,6 @@ extern tree chkp_copy_function_type_adding_bounds (tree orig_type);
 extern tree chkp_maybe_clone_builtin_fndecl (tree fndecl);
 extern cgraph_node *chkp_maybe_create_clone (tree fndecl);
 extern bool chkp_instrumentable_p (tree fndecl);
+extern bool chkp_wrap_function (tree fndecl);
 
 #endif /* GCC_IPA_CHKP_H */
index ac50e4bbd249ca154c86c1744b061ee3f4696277..b306c28d37bdcdfb51bf561471fd99777e7e42d5 100644 (file)
@@ -80,6 +80,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "pass_manager.h"
 #include "ipa-utils.h"
 #include "omp-low.h"
+#include "ipa-chkp.h"
 
 /* True when asm nodes has been output.  */
 bool asm_nodes_output = false;
@@ -1616,10 +1617,13 @@ input_cgraph_1 (struct lto_file_decl_data *file_data,
                    cnode->instrumented_version->instrumented_version = cnode;
                }
 
-             /* Restore decl names reference.  */
-             IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (cnode->decl)) = 1;
-             TREE_CHAIN (DECL_ASSEMBLER_NAME (cnode->decl))
-                 = DECL_ASSEMBLER_NAME (cnode->orig_decl);
+             /* Restore decl names reference except for wrapper functions.  */
+             if (!chkp_wrap_function (cnode->orig_decl))
+               {
+                 tree name = DECL_ASSEMBLER_NAME (cnode->decl);
+                 IDENTIFIER_TRANSPARENT_ALIAS (name) = 1;
+                 TREE_CHAIN (name) = DECL_ASSEMBLER_NAME (cnode->orig_decl);
+               }
            }
        }
 
index 9bd5b5ec72350abbba1a045ef06a2b85ccb959f0..a9361067c5ad3e9442645fe135e891c8678f75a3 100644 (file)
@@ -1,3 +1,7 @@
+2015-05-15  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       * gcc.dg/lto/chkp-wrap-asm-name_0.c: New.
+
 2015-05-15  Ilya Enkovich  <enkovich.gnu@gmail.com>
 
        PR middle-end/66134
diff --git a/gcc/testsuite/gcc.dg/lto/chkp-wrap-asm-name_0.c b/gcc/testsuite/gcc.dg/lto/chkp-wrap-asm-name_0.c
new file mode 100644 (file)
index 0000000..6611bdb
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-lto-do link } */
+/* { dg-require-effective-target mpx } */
+/* { dg-lto-options { { -O2 -flto -fcheck-pointer-bounds -mmpx } } } */
+
+typedef long unsigned int size_t;
+
+extern size_t strlen (const char *);
+extern __typeof (strlen) strlen __asm__ ("" "__hidden_strlen") __attribute__ ((visibility ("hidden")));
+
+size_t
+test1 (const char *p) { return strlen (p); }
+
+size_t
+test2 (const char *p) { return __builtin_strlen (p); }
+
+int
+main (int argc, const char **argv)
+{
+  return test1 (argv[0]) - test2 (argv[0]);
+}