I noticed that we were repeating the same long test in lots of places and factored it out into a separate function. I'm not attached to the name.

Tested x86_64-pc-linux-gnu, OK for trunk?
commit 5a5f850a4d40a25cc3b1fc0120e844b1ac3f3eb0
Author: Jason Merrill <ja...@redhat.com>
Date:   Wed Jan 7 17:29:36 2015 -0500

    gcc/
    	* ubsan.c (do_ubsan_in_current_function): New.
    	(pass_ubsan::gate): Use it.
    	* ubsan.h: Declare it.
    	* convert.c (convert_to_integer): Use it.
    gcc/c-family/
    	* c-ubsan.c (ubsan_maybe_instrument_array_ref): Use
    	do_ubsan_in_current_function.
    	(ubsan_maybe_instrument_reference_or_call): Likewise.
    	* c-ubsan.h: Declare it.
    gcc/cp/
    	* cp-gimplify.c (cp_genericize): Use do_ubsan_in_current_function.
    	* decl.c (compute_array_index_type): Likewise.
    	* init.c (build_vec_init): Likewise.
    	* typeck.c (cp_build_binary_op): Likewise.

diff --git a/gcc/c-family/c-ubsan.c b/gcc/c-family/c-ubsan.c
index f2db494..c195c7f 100644
--- a/gcc/c-family/c-ubsan.c
+++ b/gcc/c-family/c-ubsan.c
@@ -364,9 +364,7 @@ void
 ubsan_maybe_instrument_array_ref (tree *expr_p, bool ignore_off_by_one)
 {
   if (!ubsan_array_ref_instrumented_p (*expr_p)
-      && current_function_decl != NULL_TREE
-      && !lookup_attribute ("no_sanitize_undefined",
-			    DECL_ATTRIBUTES (current_function_decl)))
+      && do_ubsan_in_current_function ())
     {
       tree op0 = TREE_OPERAND (*expr_p, 0);
       tree op1 = TREE_OPERAND (*expr_p, 1);
@@ -386,9 +384,7 @@ static tree
 ubsan_maybe_instrument_reference_or_call (location_t loc, tree op, tree ptype,
 					  enum ubsan_null_ckind ckind)
 {
-  if (current_function_decl == NULL_TREE
-      || lookup_attribute ("no_sanitize_undefined",
-			   DECL_ATTRIBUTES (current_function_decl)))
+  if (!do_ubsan_in_current_function ())
     return NULL_TREE;
 
   tree type = TREE_TYPE (ptype);
diff --git a/gcc/c-family/c-ubsan.h b/gcc/c-family/c-ubsan.h
index b1fe5f1..fb379c8 100644
--- a/gcc/c-family/c-ubsan.h
+++ b/gcc/c-family/c-ubsan.h
@@ -31,4 +31,7 @@ extern void ubsan_maybe_instrument_array_ref (tree *, bool);
 extern void ubsan_maybe_instrument_reference (tree);
 extern void ubsan_maybe_instrument_member_call (tree, bool);
 
+/* Declare this here as well as in ubsan.h. */
+extern bool do_ubsan_in_current_function (void);
+
 #endif  /* GCC_C_UBSAN_H  */
diff --git a/gcc/convert.c b/gcc/convert.c
index 0491986..fc1b93c 100644
--- a/gcc/convert.c
+++ b/gcc/convert.c
@@ -885,9 +885,7 @@ convert_to_integer (tree type, tree expr)
 
     case REAL_TYPE:
       if (flag_sanitize & SANITIZE_FLOAT_CAST
-	  && current_function_decl != NULL_TREE
-	  && !lookup_attribute ("no_sanitize_undefined",
-				DECL_ATTRIBUTES (current_function_decl)))
+	  && do_ubsan_in_current_function ())
 	{
 	  expr = save_expr (expr);
 	  tree check = ubsan_instrument_float_cast (loc, type, expr, expr);
diff --git a/gcc/cp/cp-gimplify.c b/gcc/cp/cp-gimplify.c
index a23076f..33dce29 100644
--- a/gcc/cp/cp-gimplify.c
+++ b/gcc/cp/cp-gimplify.c
@@ -1350,9 +1350,7 @@ cp_genericize (tree fndecl)
   cp_genericize_tree (&DECL_SAVED_TREE (fndecl));
 
   if (flag_sanitize & SANITIZE_RETURN
-      && current_function_decl != NULL_TREE
-      && !lookup_attribute ("no_sanitize_undefined",
-			    DECL_ATTRIBUTES (current_function_decl)))
+      && do_ubsan_in_current_function ())
     cp_ubsan_maybe_instrument_return (fndecl);
 
   /* Do everything else.  */
diff --git a/gcc/cp/decl.c b/gcc/cp/decl.c
index 2fea106..c0fc009 100644
--- a/gcc/cp/decl.c
+++ b/gcc/cp/decl.c
@@ -8602,10 +8602,7 @@ compute_array_index_type (tree name, tree size, tsubst_flags_t complain)
 	  stabilize_vla_size (itype);
 
 	  if (flag_sanitize & SANITIZE_VLA
-	      && current_function_decl != NULL_TREE
-	      && !lookup_attribute ("no_sanitize_undefined",
-				    DECL_ATTRIBUTES
-				    (current_function_decl)))
+	      && do_ubsan_in_current_function ())
 	    {
 	      /* We have to add 1 -- in the ubsan routine we generate
 		 LE_EXPR rather than LT_EXPR.  */
diff --git a/gcc/cp/init.c b/gcc/cp/init.c
index 6f32492..3bd470b 100644
--- a/gcc/cp/init.c
+++ b/gcc/cp/init.c
@@ -3575,10 +3575,7 @@ build_vec_init (tree base, tree maxindex, tree init,
 	      /* Don't check an array new when -fno-exceptions.  */
 	    }
 	  else if (flag_sanitize & SANITIZE_BOUNDS
-		   && current_function_decl
-		   && !lookup_attribute ("no_sanitize_undefined",
-					 DECL_ATTRIBUTES
-					 (current_function_decl)))
+		   && do_ubsan_in_current_function ())
 	    {
 	      /* Make sure the last element of the initializer is in bounds. */
 	      finish_expr_stmt
diff --git a/gcc/cp/typeck.c b/gcc/cp/typeck.c
index b4af8b0..fb0ffd1 100644
--- a/gcc/cp/typeck.c
+++ b/gcc/cp/typeck.c
@@ -4973,9 +4973,7 @@ cp_build_binary_op (location_t location,
   if ((flag_sanitize & (SANITIZE_SHIFT | SANITIZE_DIVIDE
 			| SANITIZE_FLOAT_DIVIDE))
       && !processing_template_decl
-      && current_function_decl != 0
-      && !lookup_attribute ("no_sanitize_undefined",
-			    DECL_ATTRIBUTES (current_function_decl))
+      && do_ubsan_in_current_function ()
       && (doing_div_or_mod || doing_shift))
     {
       /* OP0 and/or OP1 might have side-effects.  */
diff --git a/gcc/ubsan.c b/gcc/ubsan.c
index 5c9355a..7dae967 100644
--- a/gcc/ubsan.c
+++ b/gcc/ubsan.c
@@ -1648,6 +1648,16 @@ instrument_object_size (gimple_stmt_iterator *gsi, bool is_lhs)
   gsi_insert_before (gsi, g, GSI_SAME_STMT);
 }
 
+/* True if we want to play UBSan games in the current function.  */
+
+bool
+do_ubsan_in_current_function ()
+{
+  return (current_function_decl != NULL_TREE
+	  && !lookup_attribute ("no_sanitize_undefined",
+				DECL_ATTRIBUTES (current_function_decl)));
+}
+
 namespace {
 
 const pass_data pass_data_ubsan =
@@ -1679,9 +1689,7 @@ public:
 			      | SANITIZE_NONNULL_ATTRIBUTE
 			      | SANITIZE_RETURNS_NONNULL_ATTRIBUTE
 			      | SANITIZE_OBJECT_SIZE)
-	     && current_function_decl != NULL_TREE
-	     && !lookup_attribute ("no_sanitize_undefined",
-				   DECL_ATTRIBUTES (current_function_decl));
+	&& do_ubsan_in_current_function ();
     }
 
   virtual unsigned int execute (function *);
diff --git a/gcc/ubsan.h b/gcc/ubsan.h
index 5d9d909..9b8a59b 100644
--- a/gcc/ubsan.h
+++ b/gcc/ubsan.h
@@ -38,6 +38,7 @@ enum ubsan_print_style {
   UBSAN_PRINT_ARRAY
 };
 
+extern bool do_ubsan_in_current_function (void);
 extern bool ubsan_expand_bounds_ifn (gimple_stmt_iterator *);
 extern bool ubsan_expand_null_ifn (gimple_stmt_iterator *);
 extern bool ubsan_expand_objsize_ifn (gimple_stmt_iterator *);

Reply via email to