mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-27 13:30:05 +00:00
[asan] when checking the noreturn attribute on the call, also check it on the callee
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@168861 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
a18d377e73
commit
5085eb80ab
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user