Author: yln Date: Thu Jan 24 10:04:21 2019 New Revision: 352069 URL: http://llvm.org/viewvc/llvm-project?rev=352069&view=rev Log: Revert "[Sanitizers] UBSan unreachable incompatible with ASan in the presence of `noreturn` calls"
This reverts commit cea84ab93aeb079a358ab1c8aeba6d9140ef8b47. Modified: cfe/trunk/lib/CodeGen/CGCall.cpp cfe/trunk/test/CodeGenCXX/ubsan-unreachable.cpp Modified: cfe/trunk/lib/CodeGen/CGCall.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGCall.cpp?rev=352069&r1=352068&r2=352069&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGCall.cpp (original) +++ cfe/trunk/lib/CodeGen/CGCall.cpp Thu Jan 24 10:04:21 2019 @@ -4401,16 +4401,12 @@ RValue CodeGenFunction::EmitCall(const C if (UnusedReturnSizePtr) PopCleanupBlock(); - // Replace the noreturn attribute to better diagnose unreachable UB. + // Strip away the noreturn attribute to better diagnose unreachable UB. if (SanOpts.has(SanitizerKind::Unreachable)) { - // Also remove from function since CS.hasFnAttr(..) also checks attributes - // of the called function. if (auto *F = CS.getCalledFunction()) F->removeFnAttr(llvm::Attribute::NoReturn); CS.removeAttribute(llvm::AttributeList::FunctionIndex, llvm::Attribute::NoReturn); - CS.addAttribute(llvm::AttributeList::FunctionIndex, - llvm::Attribute::ExpectNoReturn); } EmitUnreachable(Loc); Modified: cfe/trunk/test/CodeGenCXX/ubsan-unreachable.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/ubsan-unreachable.cpp?rev=352069&r1=352068&r2=352069&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/ubsan-unreachable.cpp (original) +++ cfe/trunk/test/CodeGenCXX/ubsan-unreachable.cpp Thu Jan 24 10:04:21 2019 @@ -2,35 +2,38 @@ extern void __attribute__((noreturn)) abort(); -// CHECK-LABEL: define void @_Z14calls_noreturnv() +// CHECK-LABEL: define void @_Z14calls_noreturnv void calls_noreturn() { - // CHECK: call void @_Z5abortv() [[CALL_SITE_ATTR:#[0-9]+]] abort(); + // Check that there are no attributes on the call site. + // CHECK-NOT: call void @_Z5abortv{{.*}}# + // CHECK: __ubsan_handle_builtin_unreachable // CHECK: unreachable } struct A { - // CHECK: declare void @_Z5abortv() [[EXTERN_FN_ATTR:#[0-9]+]] + // CHECK: declare void @_Z5abortv{{.*}} [[ABORT_ATTR:#[0-9]+]] // CHECK-LABEL: define linkonce_odr void @_ZN1A5call1Ev void call1() { - // CHECK: call void @_ZN1A16does_not_return2Ev({{.*}}) [[CALL_SITE_ATTR]] + // CHECK-NOT: call void @_ZN1A16does_not_return2Ev{{.*}}# does_not_return2(); // CHECK: __ubsan_handle_builtin_unreachable // CHECK: unreachable } - // Test static members. Checks are below after `struct A` scope ends. + // Test static members. static void __attribute__((noreturn)) does_not_return1() { + // CHECK-NOT: call void @_Z5abortv{{.*}}# abort(); } // CHECK-LABEL: define linkonce_odr void @_ZN1A5call2Ev void call2() { - // CHECK: call void @_ZN1A16does_not_return1Ev() [[CALL_SITE_ATTR]] + // CHECK-NOT: call void @_ZN1A16does_not_return1Ev{{.*}}# does_not_return1(); // CHECK: __ubsan_handle_builtin_unreachable @@ -43,18 +46,18 @@ struct A { // CHECK-LABEL: define linkonce_odr void @_ZN1A5call3Ev void call3() { MemFn MF = &A::does_not_return2; - // CHECK: call void %{{[0-9]+\(.*}}) [[CALL_SITE_ATTR]] (this->*MF)(); + // CHECK-NOT: call void %{{.*}}# // CHECK: __ubsan_handle_builtin_unreachable // CHECK: unreachable } // Test regular members. // CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return2Ev({{.*}}) - // CHECK-SAME: [[USER_FN_ATTR:#[0-9]+]] + // CHECK-SAME: [[DOES_NOT_RETURN_ATTR:#[0-9]+]] void __attribute__((noreturn)) does_not_return2() { - // CHECK: call void @_Z5abortv() [[CALL_SITE_ATTR]] + // CHECK-NOT: call void @_Z5abortv(){{.*}}# abort(); // CHECK: call void @__ubsan_handle_builtin_unreachable @@ -65,9 +68,7 @@ struct A { } }; -// CHECK-LABEL: define linkonce_odr void @_ZN1A16does_not_return1Ev() -// CHECK-SAME: [[USER_FN_ATTR]] -// CHECK: call void @_Z5abortv() [[CALL_SITE_ATTR]] +// CHECK: define linkonce_odr void @_ZN1A16does_not_return1Ev() [[DOES_NOT_RETURN_ATTR]] void force_irgen() { A a; @@ -76,9 +77,5 @@ void force_irgen() { a.call3(); } -// 1) 'noreturn' should be removed from functions and call sites -// 2) 'expect_noreturn' added to call sites -// CHECK-LABEL: attributes -// CHECK: [[USER_FN_ATTR]] = { {{.*[^noreturn].*}} } -// CHECK: [[EXTERN_FN_ATTR]] = { {{.*[^noreturn].*}} } -// CHECK: [[CALL_SITE_ATTR]] = { expect_noreturn } +// CHECK-NOT: [[ABORT_ATTR]] = {{[^}]+}}noreturn +// CHECK-NOT: [[DOES_NOT_RETURN_ATTR]] = {{[^}]+}}noreturn _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits