[asan] when checking the noreturn attribute on the call, also check it on the callee

llvm-svn: 168861
This commit is contained in:
Kostya Serebryany 2012-11-29 08:57:20 +00:00
parent 99507e6c10
commit 633bf93fb8
2 changed files with 22 additions and 3 deletions

View File

@ -845,6 +845,14 @@ bool AddressSanitizer::maybeInsertAsanInitAtFunctionEntry(Function &F) {
return false;
}
// Check both the call and the callee for doesNotReturn().
static bool isNoReturnCall(CallInst *CI) {
if (CI->doesNotReturn()) return true;
Function *F = CI->getCalledFunction();
if (F && F->doesNotReturn()) return true;
return false;
}
bool AddressSanitizer::runOnFunction(Function &F) {
if (BL->isIn(F)) return false;
if (&F == AsanCtorFunction) return false;
@ -885,7 +893,7 @@ bool AddressSanitizer::runOnFunction(Function &F) {
if (CallInst *CI = dyn_cast<CallInst>(BI)) {
// A call inside BB.
TempsToInstrument.clear();
if (CI->doesNotReturn()) {
if (isNoReturnCall(CI)) {
NoReturnCalls.push_back(CI);
}
}

View File

@ -7,11 +7,22 @@ target triple = "x86_64-unknown-linux-gnu"
declare void @MyNoReturnFunc(i32) noreturn
define i32 @_Z5ChildPv(i8* nocapture %arg) uwtable address_safety {
define i32 @Call1(i8* nocapture %arg) uwtable address_safety {
entry:
call void @MyNoReturnFunc(i32 1) noreturn
call void @MyNoReturnFunc(i32 1) noreturn ; The call insn has noreturn attr.
; CHECK: @Call1
; CHECK: call void @__asan_handle_no_return
; CHECK-NEXT: call void @MyNoReturnFunc
; CHECK-NEXT: unreachable
unreachable
}
define i32 @Call2(i8* nocapture %arg) uwtable address_safety {
entry:
call void @MyNoReturnFunc(i32 1) ; No noreturn attribure on the call.
; CHECK: @Call2
; CHECK: call void @__asan_handle_no_return
; CHECK-NEXT: call void @MyNoReturnFunc
; CHECK-NEXT: unreachable
unreachable
}