summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
diff options
context:
space:
mode:
authorJulian Lettner <jlettner@apple.com>2019-02-02 02:05:16 +0000
committerJulian Lettner <jlettner@apple.com>2019-02-02 02:05:16 +0000
commitf82d8924ef7fe20f786d70ee4634be4d5dc508d3 (patch)
tree27e2a45bb7f8e863dcb9af6a53d14752c537e38a /llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
parent7d53675b709232bf94730f7e73bdd791103d5e1a (diff)
downloadbcm5719-llvm-f82d8924ef7fe20f786d70ee4634be4d5dc508d3.tar.gz
bcm5719-llvm-f82d8924ef7fe20f786d70ee4634be4d5dc508d3.zip
[ASan] Do not instrument other runtime functions with `__asan_handle_no_return`
Summary: Currently, ASan inserts a call to `__asan_handle_no_return` before every `noreturn` function call/invoke. This is unnecessary for calls to other runtime funtions. This patch changes ASan to skip instrumentation for functions calls marked with `!nosanitize` metadata. Reviewers: TODO Differential Revision: https://reviews.llvm.org/D57489 llvm-svn: 352948
Diffstat (limited to 'llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp')
-rw-r--r--llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp5
1 files changed, 3 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index 978ec491f00..e95b88b579c 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -2554,7 +2554,8 @@ bool AddressSanitizer::runOnFunction(Function &F) {
if (CS) {
// A call inside BB.
TempsToInstrument.clear();
- if (CS.doesNotReturn()) NoReturnCalls.push_back(CS.getInstruction());
+ if (CS.doesNotReturn() && !CS->getMetadata("nosanitize"))
+ NoReturnCalls.push_back(CS.getInstruction());
}
if (CallInst *CI = dyn_cast<CallInst>(&Inst))
maybeMarkSanitizerLibraryCallNoBuiltin(CI, TLI);
@@ -2591,7 +2592,7 @@ bool AddressSanitizer::runOnFunction(Function &F) {
FunctionStackPoisoner FSP(F, *this);
bool ChangedStack = FSP.runOnFunction();
- // We must unpoison the stack before every NoReturn call (throw, _exit, etc).
+ // We must unpoison the stack before NoReturn calls (throw, _exit, etc).
// See e.g. https://github.com/google/sanitizers/issues/37
for (auto CI : NoReturnCalls) {
IRBuilder<> IRB(CI);
OpenPOWER on IntegriCloud