]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport: re PR libmudflap/40778 (Mudflap instrumentation missing in cloned function.)
authorJakub Jelinek <jakub@redhat.com>
Thu, 9 Feb 2012 21:38:13 +0000 (22:38 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 9 Feb 2012 21:38:13 +0000 (22:38 +0100)
Backported from mainline
2012-01-19  Jakub Jelinek  <jakub@redhat.com>

PR libmudflap/40778
* tree-mudflap.c (mf_artificial): New function.
(execute_mudflap_function_ops, execute_mudflap_function_decls,
mx_register_decls, mudflap_enqueue_decl): Use it.

* testsuite/libmudflap.c/fail68-frag.c: New test.

From-SVN: r184073

gcc/ChangeLog
gcc/tree-mudflap.c
libmudflap/ChangeLog
libmudflap/testsuite/libmudflap.c/fail68-frag.c [new file with mode: 0644]

index fe4c69ef8ae9663bd3e801886a1d4fe14b06ca2d..eaa27374ff7e3d18bf54ef2d488f4ef198002393 100644 (file)
@@ -1,6 +1,13 @@
 2012-02-09  Jakub Jelinek  <jakub@redhat.com>
 
        Backported from mainline
+       2012-01-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libmudflap/40778
+       * tree-mudflap.c (mf_artificial): New function.
+       (execute_mudflap_function_ops, execute_mudflap_function_decls,
+       mx_register_decls, mudflap_enqueue_decl): Use it.
+
        2012-01-05  Jakub Jelinek  <jakub@redhat.com>
 
        PR rtl-optimization/51767
index 590f7c358d9a57f43d80e0a21ef025acc0f98e6f..89b7b459b5662712d4e6051a8c727fa3affd1552 100644 (file)
@@ -72,6 +72,13 @@ static tree mx_xfn_xform_decls (gimple_stmt_iterator *, bool *,
 static gimple_seq mx_register_decls (tree, gimple_seq, location_t);
 static unsigned int execute_mudflap_function_decls (void);
 
+/* Return true if DECL is artificial stub that shouldn't be instrumented by
+   mf.  We should instrument clones of non-artificial functions.  */
+static inline bool
+mf_artificial (const_tree decl)
+{
+  return DECL_ARTIFICIAL (DECL_ORIGIN (decl));
+}
 
 /* ------------------------------------------------------------------------ */
 /* Some generally helpful functions for mudflap instrumentation.  */
@@ -437,8 +444,8 @@ execute_mudflap_function_ops (void)
 
   /* Don't instrument functions such as the synthetic constructor
      built during mudflap_finish_file.  */
-  if (mf_marked_p (current_function_decl) ||
-      DECL_ARTIFICIAL (current_function_decl))
+  if (mf_marked_p (current_function_decl)
+      || mf_artificial (current_function_decl))
     return 0;
 
   push_gimplify_context (&gctx);
@@ -1026,8 +1033,8 @@ execute_mudflap_function_decls (void)
 
   /* Don't instrument functions such as the synthetic constructor
      built during mudflap_finish_file.  */
-  if (mf_marked_p (current_function_decl) ||
-      DECL_ARTIFICIAL (current_function_decl))
+  if (mf_marked_p (current_function_decl)
+      || mf_artificial (current_function_decl))
     return 0;
 
   push_gimplify_context (&gctx);
@@ -1109,7 +1116,7 @@ mx_register_decls (tree decl, gimple_seq seq, location_t location)
           /* Add the __mf_register call at the current appending point.  */
           if (gsi_end_p (initially_stmts))
            {
-             if (!DECL_ARTIFICIAL (decl))
+             if (!mf_artificial (decl))
                warning (OPT_Wmudflap,
                         "mudflap cannot track %qE in stub function",
                         DECL_NAME (decl));
@@ -1280,7 +1287,7 @@ mudflap_enqueue_decl (tree obj)
      during mudflap_finish_file ().  That would confuse the user,
      since the text would refer to variables that don't show up in the
      user's source code.  */
-  if (DECL_P (obj) && DECL_EXTERNAL (obj) && DECL_ARTIFICIAL (obj))
+  if (DECL_P (obj) && DECL_EXTERNAL (obj) && mf_artificial (obj))
     return;
 
   VEC_safe_push (tree, gc, deferred_static_decls, obj);
index 4a12de85a852bec382f7983fc657edaefee9f639..fc7dd2003baa8c67ab989c9d38ded9cf3873ba2b 100644 (file)
@@ -1,3 +1,11 @@
+2012-02-09  Jakub Jelinek  <jakub@redhat.com>
+
+       Backported from mainline
+       2012-01-19  Jakub Jelinek  <jakub@redhat.com>
+
+       PR libmudflap/40778
+       * testsuite/libmudflap.c/fail68-frag.c: New test.
+
 2011-04-28  Release Manager
 
        * GCC 4.5.3 released.
diff --git a/libmudflap/testsuite/libmudflap.c/fail68-frag.c b/libmudflap/testsuite/libmudflap.c/fail68-frag.c
new file mode 100644 (file)
index 0000000..7b2f8cf
--- /dev/null
@@ -0,0 +1,27 @@
+/* PR libmudflap/40778 */
+
+char p[32];
+static int j;
+
+__attribute__((noinline))
+static void foo (int i)
+{
+  if (j++ == 0)
+    p[i + 4] = 12;
+  else
+    p[i - 4] = 13;
+}
+
+int
+main ()
+{
+  foo (30);
+  foo (30);
+  foo (30);
+  return 0;
+}
+
+/* { dg-output "mudflap violation 1.*" } */
+/* { dg-output "Nearby object 1.*" } */
+/* { dg-output "mudflap object.*name.*p" } */
+/* { dg-do run { xfail *-*-* } } */