diff mbox

[CHKP,PR,middle-end/66567] Fix internal compiler error: in assign_parms

Message ID 20150618100421.GB28183@msticlxl57.ims.intel.com
State New
Headers show

Commit Message

Ilya Enkovich June 18, 2015, 10:04 a.m. UTC
Hi,

Currently instrumentation clone may be requested for a function which cannot be cloned and a thunk is created in such case.  Thunk creation is bogus and cause original node and a clone to share arguments list (including bounds args).  I don't think such thunks are actually useful and therefore restrict their creation.  Also fix function pointers instrumentation to skip not instrumentable functions.  Bootstrapped and regtested for x86_64-unknown-linux-gnu.  Applied to trunk.  Is it OK for gcc-5-branch?

Thanks,
Ilya
--
gcc/

2015-06-18  Ilya Enkovich  <enkovich.gnu@gmail.com>

	PR middle-end/66567
	* ipa-chkp.c (chkp_maybe_create_clone): Require
	functions to be instrumentable.
	* tree-chkp.c (chkp_replace_function_pointer): Use
	chkp_instrumentable_p instead of attribute check.

gcc/testsuite/

2015-06-18  Ilya Enkovich  <enkovich.gnu@gmail.com>

	PR middle-end/66567
	* gcc.target/i386/mpx/pr66567.c: New test.
diff mbox

Patch

diff --git a/gcc/ipa-chkp.c b/gcc/ipa-chkp.c
index f3d7c73..c5e7147 100644
--- a/gcc/ipa-chkp.c
+++ b/gcc/ipa-chkp.c
@@ -565,25 +565,10 @@  chkp_maybe_create_clone (tree fndecl)
 
       if (gimple_has_body_p (fndecl))
 	{
-	  /* If function will not be instrumented, then it's instrumented
-	     version is a thunk for the original.  */
-	  if (!chkp_instrumentable_p (fndecl))
-	    {
-	      clone->remove_callees ();
-	      clone->remove_all_references ();
-	      clone->thunk.thunk_p = true;
-	      clone->thunk.add_pointer_bounds_args = true;
-	      clone->create_edge (node, NULL, 0, CGRAPH_FREQ_BASE);
-	      /* Thunk shouldn't be a cdtor.  */
-	      DECL_STATIC_CONSTRUCTOR (clone->decl) = 0;
-	      DECL_STATIC_DESTRUCTOR (clone->decl) = 0;
-	    }
-	  else
-	    {
-	      tree_function_versioning (fndecl, new_decl, NULL, false,
-					NULL, false, NULL, NULL);
-	      clone->lowered = true;
-	    }
+	  gcc_assert (chkp_instrumentable_p (fndecl));
+	  tree_function_versioning (fndecl, new_decl, NULL, false,
+				    NULL, false, NULL, NULL);
+	  clone->lowered = true;
 	}
 
       /* New params are inserted after versioning because it
diff --git a/gcc/testsuite/gcc.target/i386/mpx/pr66567.c b/gcc/testsuite/gcc.target/i386/mpx/pr66567.c
new file mode 100644
index 0000000..5a7e2f2
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/mpx/pr66567.c
@@ -0,0 +1,16 @@ 
+/* { dg-do compile } */
+/* { dg-options "-fcheck-pointer-bounds -mmpx" } */
+
+void  (*b) ();
+
+void fn1 (const int *p1)
+{
+  static void *a = &&conv_1234_123C;
+ conv_1234_123C:
+  ;
+}
+
+void fn2 ()
+{
+  b = fn1;
+}
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index 8edef48..e2612bd 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -4090,7 +4090,7 @@  chkp_replace_function_pointer (tree *op, int *walk_subtrees,
 			       void *data ATTRIBUTE_UNUSED)
 {
   if (TREE_CODE (*op) == FUNCTION_DECL
-      && !lookup_attribute ("bnd_legacy", DECL_ATTRIBUTES (*op))
+      && chkp_instrumentable_p (*op)
       && (DECL_BUILT_IN_CLASS (*op) == NOT_BUILT_IN
 	  /* For builtins we replace pointers only for selected
 	     function and functions having definitions.  */