sanitizer.def: Add comment about importance of ordering of BUILT_IN_ASAN_REPORT*...
authorJakub Jelinek <jakub@redhat.com>
Tue, 11 Dec 2012 10:28:35 +0000 (11:28 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 11 Dec 2012 10:28:35 +0000 (11:28 +0100)
* sanitizer.def: Add comment about importance of ordering of
BUILT_IN_ASAN_REPORT* builtins.
* cfgcleanup.c (old_insns_match_p): Don't cross-jump __asan_report_*
builtins.

From-SVN: r194391

gcc/ChangeLog
gcc/cfgcleanup.c
gcc/sanitizer.def

index b670ba5d812052e36f9089c46fec0c6da4a83b7b..e4f49f09230c8294769d48c6403e536e9d7e1a34 100644 (file)
@@ -1,5 +1,10 @@
 2012-12-11  Jakub Jelinek  <jakub@redhat.com>
 
+       * sanitizer.def: Add comment about importance of ordering of
+       BUILT_IN_ASAN_REPORT* builtins.
+       * cfgcleanup.c (old_insns_match_p): Don't cross-jump __asan_report_*
+       builtins.
+
        * sanitizer.def (BUILT_IN_ASAN_HANDLE_NO_RETURN): New builtin.
        * asan.c (instrument_builtin_call): Change is_gimple_builtin_call
        gcc_assert to gcc_checking_assert.
index 94267b6e15da0816d5a4197db13e357fa623dc6f..5d142e9e4656c9ce2787b45aa91ffb99f5998a38 100644 (file)
@@ -1138,6 +1138,28 @@ old_insns_match_p (int mode ATTRIBUTE_UNUSED, rtx i1, rtx i2)
                        CALL_INSN_FUNCTION_USAGE (i2))
          || SIBLING_CALL_P (i1) != SIBLING_CALL_P (i2))
        return dir_none;
+
+      /* For address sanitizer, never crossjump __asan_report_* builtins,
+        otherwise errors might be reported on incorrect lines.  */
+      if (flag_asan)
+       {
+         rtx call = get_call_rtx_from (i1);
+         if (call && GET_CODE (XEXP (XEXP (call, 0), 0)) == SYMBOL_REF)
+           {
+             rtx symbol = XEXP (XEXP (call, 0), 0);
+             if (SYMBOL_REF_DECL (symbol)
+                 && TREE_CODE (SYMBOL_REF_DECL (symbol)) == FUNCTION_DECL)
+               {
+                 if ((DECL_BUILT_IN_CLASS (SYMBOL_REF_DECL (symbol))
+                      == BUILT_IN_NORMAL)
+                     && DECL_FUNCTION_CODE (SYMBOL_REF_DECL (symbol))
+                        >= BUILT_IN_ASAN_REPORT_LOAD1
+                     && DECL_FUNCTION_CODE (SYMBOL_REF_DECL (symbol))
+                        <= BUILT_IN_ASAN_REPORT_STORE16)
+                   return dir_none;
+               }
+           }
+       }
     }
 
 #ifdef STACK_REGS
index 0e5a9cb5724ba9d78e3672cfc99a723aa9998bc2..fee8f13ab4fbb1bc0ebc5c8e7d4616a88f6ecd08 100644 (file)
@@ -29,6 +29,8 @@ along with GCC; see the file COPYING3.  If not see
 /* Address Sanitizer */
 DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_INIT, "__asan_init",
                      BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST)
+/* Do not reorder the BUILT_IN_ASAN_REPORT* builtins, e.g. cfgcleanup.c
+   relies on this order.  */
 DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_LOAD1, "__asan_report_load1",
                      BT_FN_VOID_PTR, ATTR_NORETURN_NOTHROW_LEAF_LIST)
 DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REPORT_LOAD2, "__asan_report_load2",