[asan] instrument invoke insns with noreturn attribute (as well as call insns)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@175617 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Kostya Serebryany 2013-02-20 12:35:15 +00:00
parent af3a5420ae
commit 1479c9bb39
2 changed files with 27 additions and 5 deletions

View File

@ -35,6 +35,7 @@
#include "llvm/IR/Module.h"
#include "llvm/IR/Type.h"
#include "llvm/InstVisitor.h"
#include "llvm/Support/CallSite.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/DataTypes.h"
#include "llvm/Support/Debug.h"
@ -1130,12 +1131,12 @@ bool AddressSanitizer::runOnFunction(Function &F) {
} else if (isa<MemIntrinsic>(BI) && ClMemIntrin) {
// ok, take it.
} else {
if (CallInst *CI = dyn_cast<CallInst>(BI)) {
CallSite CS(BI);
if (CS) {
// A call inside BB.
TempsToInstrument.clear();
if (CI->doesNotReturn()) {
NoReturnCalls.push_back(CI);
}
if (CS.doesNotReturn())
NoReturnCalls.push_back(CS.getInstruction());
}
continue;
}

View File

@ -1,6 +1,6 @@
; RUN: opt < %s -asan -S | FileCheck %s
; AddressSanitizer must insert __asan_handle_no_return
; before every noreturn call.
; before every noreturn call or invoke.
target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
target triple = "x86_64-unknown-linux-gnu"
@ -26,3 +26,24 @@ entry:
; CHECK-NEXT: unreachable
unreachable
}
declare i32 @__gxx_personality_v0(...)
define i64 @Invoke1(i8** %esc) nounwind uwtable ssp address_safety {
entry:
invoke void @MyNoReturnFunc(i32 1)
to label %invoke.cont unwind label %lpad
invoke.cont:
ret i64 0
lpad:
%0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
filter [0 x i8*] zeroinitializer
ret i64 1
}
; CHECK: @Invoke1
; CHECK: call void @__asan_handle_no_return
; CHECK-NEXT: invoke void @MyNoReturnFunc
; CHECK: ret i64 0
; CHECK: ret i64 1