aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2012-12-11 11:28:35 +0100
committerJakub Jelinek <jakub@gcc.gnu.org>2012-12-11 11:28:35 +0100
commit68a9738af04f4c9fdf37aa48cf16b535eef16c46 (patch)
tree007614e41453c6215b782fce18607934e878b4f2 /gcc
parent2b2571c99c923e306bd322533baac4ed4a3b603c (diff)
downloadgcc-68a9738af04f4c9fdf37aa48cf16b535eef16c46.zip
gcc-68a9738af04f4c9fdf37aa48cf16b535eef16c46.tar.gz
gcc-68a9738af04f4c9fdf37aa48cf16b535eef16c46.tar.bz2
sanitizer.def: Add comment about importance of ordering of BUILT_IN_ASAN_REPORT* builtins.
* 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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/cfgcleanup.c22
-rw-r--r--gcc/sanitizer.def2
3 files changed, 29 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b670ba5..e4f49f0 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index 94267b6e..5d142e9 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -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
diff --git a/gcc/sanitizer.def b/gcc/sanitizer.def
index 0e5a9cb..fee8f13 100644
--- a/gcc/sanitizer.def
+++ b/gcc/sanitizer.def
@@ -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",