Hi!

This patch fixes

-FAIL: g++.dg/asan/asan_test.C  -O2  AddressSanitizer_LongJmpTest execution test
-FAIL: g++.dg/asan/asan_test.C  -O2  AddressSanitizer_BuiltinLongJmpTest 
execution test
-FAIL: g++.dg/asan/asan_test.C  -O2  AddressSanitizer_SigLongJmpTest execution 
test

(both x86_64 and i686), and also fixes the clone-test-1.c testcase that
succeeded only because it had dg-shouldfail when it should have.

Unfortunately, it also regresses

+FAIL: g++.dg/asan/asan_test.C  -O2  AddressSanitizer_PthreadExitTest execution 
test

but that looks like a library problem to me:

AddressSanitizer CHECK failed: ../../../../../libsanitizer/asan/asan_rtl.cc:271 
"((curr_thread)) != (0)" (0x0, 0x0)

Ok for trunk?

2012-12-05  Jakub Jelinek  <ja...@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 ().

        * c-c++-common/asan/clone-test-1.c: Remove bogus dg-shouldfail.

--- gcc/sanitizer.def.jj        2012-12-05 09:38:01.000000000 +0100
+++ gcc/sanitizer.def   2012-12-05 15:26:38.361427060 +0100
@@ -57,6 +57,9 @@ DEF_SANITIZER_BUILTIN(BUILT_IN_ASAN_REGI
 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", 
--- gcc/asan.c.jj       2012-12-05 08:25:50.000000000 +0100
+++ gcc/asan.c  2012-12-05 15:30:56.069890542 +0100
@@ -1031,7 +1031,7 @@ instrument_builtin_call (gimple_stmt_ite
 {
   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);
@@ -1351,8 +1351,29 @@ instrument_assignment (gimple_stmt_itera
 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;
 }
 
--- gcc/testsuite/c-c++-common/asan/clone-test-1.c.jj   2012-12-05 
11:04:12.000000000 +0100
+++ gcc/testsuite/c-c++-common/asan/clone-test-1.c      2012-12-05 
15:41:51.386230638 +0100
@@ -4,7 +4,6 @@
 /* { dg-do run { target { *-*-linux* } } } */
 /* { dg-require-effective-target clone } */
 /* { dg-options "-D_GNU_SOURCE" } */
-/* { dg-shouldfail "asan" } */
 
 #include <stdio.h>
 #include <stdlib.h>

        Jakub

Reply via email to