diff options
Diffstat (limited to 'lib/Transforms/Instrumentation/AddressSanitizer.cpp')
-rw-r--r-- | lib/Transforms/Instrumentation/AddressSanitizer.cpp | 10 |
1 files changed, 9 insertions, 1 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); } } |