summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2015-09-03 20:18:29 +0000
committerReid Kleckner <rnk@google.com>2015-09-03 20:18:29 +0000
commitdf52337bfc6bd210835ef0b22be2a9ad6b0a2e51 (patch)
tree89c682653a3ef13a8452dac9a2817fc9ca43a118
parent32eeb76a4fbe77d4885826aa4d370ee15b9a4d8a (diff)
downloadbcm5719-llvm-df52337bfc6bd210835ef0b22be2a9ad6b0a2e51.tar.gz
bcm5719-llvm-df52337bfc6bd210835ef0b22be2a9ad6b0a2e51.zip
[sancov] Disable sanitizer coverage on functions using SEH
Splitting basic blocks really messes up WinEHPrepare. We can remove this change when SEH uses the new EH IR. llvm-svn: 246799
-rw-r--r--llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp7
-rw-r--r--llvm/test/Instrumentation/SanitizerCoverage/seh.ll (renamed from llvm/test/Instrumentation/SanitizerCoverage/localescape.ll)10
2 files changed, 11 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
index 3bcb8de1c4f..b021f31e652 100644
--- a/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
+++ b/llvm/lib/Transforms/Instrumentation/SanitizerCoverage.cpp
@@ -31,6 +31,7 @@
#include "llvm/Transforms/Instrumentation.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/SmallVector.h"
+#include "llvm/Analysis/LibCallSemantics.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DebugInfo.h"
@@ -290,6 +291,12 @@ bool SanitizerCoverageModule::runOnFunction(Function &F) {
if (F.empty()) return false;
if (F.getName().find(".module_ctor") != std::string::npos)
return false; // Should not instrument sanitizer init functions.
+ // Don't instrument functions using SEH for now. Splitting basic blocks like
+ // we do for coverage breaks WinEHPrepare.
+ // FIXME: Remove this when SEH no longer uses landingpad pattern matching.
+ if (F.hasPersonalityFn() &&
+ isAsynchronousEHPersonality(classifyEHPersonality(F.getPersonalityFn())))
+ return false;
if (Options.CoverageType >= SanitizerCoverageOptions::SCK_Edge)
SplitAllCriticalEdges(F);
SmallVector<Instruction*, 8> IndirCalls;
diff --git a/llvm/test/Instrumentation/SanitizerCoverage/localescape.ll b/llvm/test/Instrumentation/SanitizerCoverage/seh.ll
index eff47c64f09..ce18334ed20 100644
--- a/llvm/test/Instrumentation/SanitizerCoverage/localescape.ll
+++ b/llvm/test/Instrumentation/SanitizerCoverage/seh.ll
@@ -45,14 +45,12 @@ eh.resume: ; preds = %lpad
resume { i8*, i32 } %1
}
-; Check that the alloca remains static and the localescape call remains in the
-; entry block.
+; Check that we don't do any instrumentation.
; CHECK-LABEL: define i32 @main()
-; CHECK-NOT: br {{.*}}label
-; CHECK: %__exception_code = alloca i32, align 4
-; CHECK-NOT: br {{.*}}label
-; CHECK: call void (...) @llvm.localescape(i32* nonnull %__exception_code)
+; CHECK-NOT: load atomic i32, i32* {{.*}} monotonic, align 4, !nosanitize
+; CHECK-NOT: call void @__sanitizer_cov
+; CHECK: ret i32
; Function Attrs: nounwind
define internal i32 @"\01?filt$0@0@main@@"() #1 {
OpenPOWER on IntegriCloud