[sanitizer] prevent function call merging for sanitizer-coverage callbacks
authorKostya Serebryany <kcc@google.com>
Tue, 16 Dec 2014 21:24:15 +0000 (21:24 +0000)
committerKostya Serebryany <kcc@google.com>
Tue, 16 Dec 2014 21:24:15 +0000 (21:24 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224372 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Instrumentation/SanitizerCoverage.cpp
test/Instrumentation/SanitizerCoverage/coverage.ll

index 7d86e1c8af060ff83b49d6c3ee32773166d9189d..07223d4df5c01992c3fd6b1a2462f47afcef6f8b 100644 (file)
@@ -37,6 +37,7 @@
 #include "llvm/IR/DataLayout.h"
 #include "llvm/IR/Function.h"
 #include "llvm/IR/IRBuilder.h"
+#include "llvm/IR/InlineAsm.h"
 #include "llvm/IR/LLVMContext.h"
 #include "llvm/IR/MDBuilder.h"
 #include "llvm/IR/Module.h"
@@ -107,6 +108,7 @@ class SanitizerCoverageModule : public ModulePass {
   Function *SanCovIndirCallFunction;
   Function *SanCovModuleInit;
   Function *SanCovTraceEnter, *SanCovTraceBB;
+  InlineAsm *EmptyAsm;
   Type *IntptrTy;
   LLVMContext *C;
 
@@ -146,6 +148,10 @@ bool SanitizerCoverageModule::runOnModule(Module &M) {
   SanCovModuleInit = checkInterfaceFunction(M.getOrInsertFunction(
       kSanCovModuleInitName, Type::getVoidTy(*C), IntptrTy, nullptr));
   SanCovModuleInit->setLinkage(Function::ExternalLinkage);
+  // We insert an empty inline asm after cov callbacks to avoid callback merge.
+  EmptyAsm = InlineAsm::get(FunctionType::get(IRB.getVoidTy(), false),
+                            StringRef(""), StringRef(""),
+                            /*hasSideEffects=*/true);
 
   if (ClExperimentalTracing) {
     SanCovTraceEnter = checkInterfaceFunction(
@@ -283,6 +289,7 @@ void SanitizerCoverageModule::InjectCoverageAtBlock(Function &F,
   IRB.SetCurrentDebugLocation(EntryLoc);
   // __sanitizer_cov gets the PC of the instruction using GET_CALLER_PC.
   IRB.CreateCall(SanCovFunction, Guard);
+  IRB.CreateCall(EmptyAsm);  // Avoids callback merge.
 }
 
 char SanitizerCoverageModule::ID = 0;
index aa3ba5c7202838be7478e8dc3bf863816c5e4710..68e7fc0ef3201b51c9df4c229533eb5fbd1e1446 100644 (file)
@@ -37,6 +37,7 @@ entry:
 ; CHECK1: %1 = icmp eq i8 0, %0
 ; CHECK1: br i1 %1, label %2, label %3
 ; CHECK1: call void @__sanitizer_cov(i8*{{.*}})
+; CHECK1: call void asm sideeffect "", ""()
 ; CHECK1-NOT: call void @__sanitizer_cov
 ; CHECK1: ret void
 
@@ -48,8 +49,11 @@ entry:
 
 ; CHECK2-LABEL: define void @foo
 ; CHECK2: call void @__sanitizer_cov
+; CHECK2: call void asm sideeffect "", ""()
 ; CHECK2: call void @__sanitizer_cov
+; CHECK2: call void asm sideeffect "", ""()
 ; CHECK2: call void @__sanitizer_cov
+; CHECK2: call void asm sideeffect "", ""()
 ; CHECK2-NOT: call void @__sanitizer_cov
 ; CHECK2: ret void