re PR libmudflap/40778 (Mudflap instrumentation missing in cloned function.)

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: r183307
This commit is contained in:
Jakub Jelinek 2012-01-19 19:58:02 +01:00 committed by Jakub Jelinek
parent dc2c7a529b
commit 58b3ebf2df
4 changed files with 51 additions and 7 deletions

View File

@ -1,5 +1,10 @@
2012-01-19 Jakub Jelinek <jakub@redhat.com> 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.
PR target/51876 PR target/51876
* config/arm/neon.md (*neon_vswp<mode>): Fix up operand * config/arm/neon.md (*neon_vswp<mode>): Fix up operand
numbers in the insn pattern. numbers in the insn pattern.

View File

@ -1,5 +1,5 @@
/* Mudflap: narrow-pointer bounds-checking by tree rewriting. /* Mudflap: narrow-pointer bounds-checking by tree rewriting.
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012
Free Software Foundation, Inc. Free Software Foundation, Inc.
Contributed by Frank Ch. Eigler <fche@redhat.com> Contributed by Frank Ch. Eigler <fche@redhat.com>
and Graydon Hoare <graydon@redhat.com> and Graydon Hoare <graydon@redhat.com>
@ -69,6 +69,13 @@ static tree mx_xfn_xform_decls (gimple_stmt_iterator *, bool *,
static gimple_seq mx_register_decls (tree, gimple_seq, location_t); static gimple_seq mx_register_decls (tree, gimple_seq, location_t);
static unsigned int execute_mudflap_function_decls (void); 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. */ /* Some generally helpful functions for mudflap instrumentation. */
@ -412,8 +419,8 @@ execute_mudflap_function_ops (void)
/* Don't instrument functions such as the synthetic constructor /* Don't instrument functions such as the synthetic constructor
built during mudflap_finish_file. */ built during mudflap_finish_file. */
if (mf_marked_p (current_function_decl) || if (mf_marked_p (current_function_decl)
DECL_ARTIFICIAL (current_function_decl)) || mf_artificial (current_function_decl))
return 0; return 0;
push_gimplify_context (&gctx); push_gimplify_context (&gctx);
@ -994,8 +1001,8 @@ execute_mudflap_function_decls (void)
/* Don't instrument functions such as the synthetic constructor /* Don't instrument functions such as the synthetic constructor
built during mudflap_finish_file. */ built during mudflap_finish_file. */
if (mf_marked_p (current_function_decl) || if (mf_marked_p (current_function_decl)
DECL_ARTIFICIAL (current_function_decl)) || mf_artificial (current_function_decl))
return 0; return 0;
push_gimplify_context (&gctx); push_gimplify_context (&gctx);
@ -1078,7 +1085,7 @@ mx_register_decls (tree decl, gimple_seq seq, location_t location)
/* Add the __mf_register call at the current appending point. */ /* Add the __mf_register call at the current appending point. */
if (gsi_end_p (initially_stmts)) if (gsi_end_p (initially_stmts))
{ {
if (!DECL_ARTIFICIAL (decl)) if (!mf_artificial (decl))
warning (OPT_Wmudflap, warning (OPT_Wmudflap,
"mudflap cannot track %qE in stub function", "mudflap cannot track %qE in stub function",
DECL_NAME (decl)); DECL_NAME (decl));
@ -1249,7 +1256,7 @@ mudflap_enqueue_decl (tree obj)
during mudflap_finish_file (). That would confuse the user, during mudflap_finish_file (). That would confuse the user,
since the text would refer to variables that don't show up in the since the text would refer to variables that don't show up in the
user's source code. */ 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; return;
VEC_safe_push (tree, gc, deferred_static_decls, obj); VEC_safe_push (tree, gc, deferred_static_decls, obj);

View File

@ -1,3 +1,8 @@
2012-01-19 Jakub Jelinek <jakub@redhat.com>
PR libmudflap/40778
* testsuite/libmudflap.c/fail68-frag.c: New test.
2012-01-01 Jakub Jelinek <jakub@redhat.com> 2012-01-01 Jakub Jelinek <jakub@redhat.com>
* mf-runtime.c (__mf_usage): Update copyright notice dates. * mf-runtime.c (__mf_usage): Update copyright notice dates.

View File

@ -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 *-*-* } } */