+2012-12-11 Jakub Jelinek <jakub@redhat.com>
+
+ * 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 <rguenther@suse.de>
PR other/54324
{
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);
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;
}
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",