diff options
author | Kostya Serebryany <kcc@google.com> | 2012-11-29 08:57:20 +0000 |
---|---|---|
committer | Kostya Serebryany <kcc@google.com> | 2012-11-29 08:57:20 +0000 |
commit | 5085eb80abe29320fa8922c10b36249f5163f45d (patch) | |
tree | ba17b40c787eccc25fea234bc7970f92cb28957b | |
parent | a18d377e73d3dd96233011e9da9789861fb8f315 (diff) |
[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
-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 24dc0f267a..444add65c5 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 80f1b1c74c..e8f62b5485 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 +} |