From 2b2571c99c923e306bd322533baac4ed4a3b603c Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 11 Dec 2012 11:26:56 +0100 Subject: [PATCH] sanitizer.def (BUILT_IN_ASAN_HANDLE_NO_RETURN): New builtin. * 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. (maybe_instrument_call): Imit __builtin___asan_handle_no_return () before noreturn calls other than __builtin_trap () and __builtin_unreachable (). * c-c++-common/asan/clone-test-1.c: Remove bogus dg-shouldfail. From-SVN: r194390 --- gcc/ChangeLog | 9 +++++++++ gcc/asan.c | 27 ++++++++++++++++++++++++--- gcc/sanitizer.def | 3 +++ 3 files changed, 36 insertions(+), 3 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index db3b60f03e0..b670ba5d812 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-12-11 Jakub Jelinek + + * 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. + (maybe_instrument_call): Imit __builtin___asan_handle_no_return () + before noreturn calls other than __builtin_trap () and + __builtin_unreachable (). + 2012-12-11 Richard Biener PR other/54324 diff --git a/gcc/asan.c b/gcc/asan.c index 6c8ef187189..87d08d54901 100644 --- a/gcc/asan.c +++ b/gcc/asan.c @@ -1072,7 +1072,7 @@ instrument_builtin_call (gimple_stmt_iterator *iter) { gimple call = gsi_stmt (*iter); - gcc_assert (is_gimple_builtin_call (call)); + gcc_checking_assert (is_gimple_builtin_call (call)); tree callee = gimple_call_fndecl (call); location_t loc = gimple_location (call); @@ -1392,8 +1392,29 @@ instrument_assignment (gimple_stmt_iterator *iter) static bool maybe_instrument_call (gimple_stmt_iterator *iter) { - if (is_gimple_builtin_call (gsi_stmt (*iter))) - return instrument_builtin_call (iter); + gimple stmt = gsi_stmt (*iter); + bool is_builtin = is_gimple_builtin_call (stmt); + if (is_builtin + && instrument_builtin_call (iter)) + return true; + if (gimple_call_noreturn_p (stmt)) + { + if (is_builtin) + { + tree callee = gimple_call_fndecl (stmt); + switch (DECL_FUNCTION_CODE (callee)) + { + case BUILT_IN_UNREACHABLE: + case BUILT_IN_TRAP: + /* Don't instrument these. */ + return false; + } + } + tree decl = builtin_decl_implicit (BUILT_IN_ASAN_HANDLE_NO_RETURN); + gimple g = gimple_build_call (decl, 0); + gimple_set_location (g, gimple_location (stmt)); + gsi_insert_before (iter, g, GSI_SAME_STMT); + } return false; } diff --git a/gcc/sanitizer.def b/gcc/sanitizer.def index 1739e7aa73c..0e5a9cb5724 100644 --- a/gcc/sanitizer.def +++ b/gcc/sanitizer.def @@ -55,6 +55,9 @@ DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REGISTER_GLOBALS, DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_UNREGISTER_GLOBALS, "__asan_unregister_globals", BT_FN_VOID_PTR_PTRMODE, ATTR_NOTHROW_LEAF_LIST) +DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_HANDLE_NO_RETURN, + "__asan_handle_no_return", + BT_FN_VOID, ATTR_NOTHROW_LEAF_LIST) /* Thread Sanitizer */ DEF_SANITIZER_BUILTIN(BUILT_IN_TSAN_INIT, "__tsan_init", -- 2.30.2