diff options
-rw-r--r-- | lib/Transforms/Instrumentation/AddressSanitizer.cpp | 10 | ||||
-rw-r--r-- | test/Instrumentation/AddressSanitizer/instrument-no-return.ll | 15 |
2 files changed, 22 insertions, 3 deletions
diff --git a/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/lib/Transforms/Instrumentation/AddressSanitizer.cpp index 24dc0f2..444add6 100644 --- a/lib/Transforms/Instrumentation/AddressSanitizer.cpp +++ b/lib/Transforms/Instrumentation/AddressSanitizer.cpp @@ -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); } } diff --git a/test/Instrumentation/AddressSanitizer/instrument-no-return.ll b/test/Instrumentation/AddressSanitizer/instrument-no-return.ll index 80f1b1c..e8f62b5 100644 --- a/test/Instrumentation/AddressSanitizer/instrument-no-return.ll +++ b/test/Instrumentation/AddressSanitizer/instrument-no-return.ll @@ -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 +} |