From: Julian Lettner Date: Thu, 24 Jan 2019 18:04:21 +0000 (+0000) Subject: Revert "[Sanitizers] UBSan unreachable incompatible with ASan in the presence of... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=21974a4a75f162156194116c41ae4855fc5238da;p=clang Revert "[Sanitizers] UBSan unreachable incompatible with ASan in the presence of `noreturn` calls" This reverts commit cea84ab93aeb079a358ab1c8aeba6d9140ef8b47. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@352069 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/CodeGen/CGCall.cpp b/lib/CodeGen/CGCall.cpp index bebefe5384..a650493c5b 100644 --- a/lib/CodeGen/CGCall.cpp +++ b/lib/CodeGen/CGCall.cpp @@ -4401,16 +4401,12 @@ RValue CodeGenFunction::EmitCall(const CGFunctionInfo &CallInfo, 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); diff --git a/test/CodeGenCXX/ubsan-unreachable.cpp b/test/CodeGenCXX/ubsan-unreachable.cpp index 9ef613e630..32a78048cf 100644 --- a/test/CodeGenCXX/ubsan-unreachable.cpp +++ b/test/CodeGenCXX/ubsan-unreachable.cpp @@ -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