diff options
| author | Nico Weber <nicolasweber@gmx.de> | 2019-10-11 02:44:20 +0000 | 
|---|---|---|
| committer | Nico Weber <nicolasweber@gmx.de> | 2019-10-11 02:44:20 +0000 | 
| commit | d38332981fbdf88a6a9d45c46041307bcd76fec6 (patch) | |
| tree | 9c27c9ed24e7b0bb176dec3ce0b7831192561c90 /llvm/lib/Transforms | |
| parent | c1f8e04eeefef0eb69cb4942841ef5437e3c1c75 (diff) | |
| download | bcm5719-llvm-d38332981fbdf88a6a9d45c46041307bcd76fec6.tar.gz bcm5719-llvm-d38332981fbdf88a6a9d45c46041307bcd76fec6.zip  | |
Revert 374481 "[tsan,msan] Insert module constructors in a module pass"
CodeGen/sanitizer-module-constructor.c fails on mac and windows, see e.g.
http://lab.llvm.org:8011/builders/clang-x64-windows-msvc/builds/11424
llvm-svn: 374503
Diffstat (limited to 'llvm/lib/Transforms')
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp | 50 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp | 52 | 
2 files changed, 45 insertions, 57 deletions
diff --git a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp index 69c9020e060..cf93de6f759 100644 --- a/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/MemorySanitizer.cpp @@ -587,25 +587,9 @@ private:    /// An empty volatile inline asm that prevents callback merge.    InlineAsm *EmptyAsm; -}; -void insertModuleCtor(Module &M) { -  getOrCreateSanitizerCtorAndInitFunctions( -      M, kMsanModuleCtorName, kMsanInitName, -      /*InitArgTypes=*/{}, -      /*InitArgs=*/{}, -      // This callback is invoked when the functions are created the first -      // time. Hook them into the global ctors list in that case: -      [&](Function *Ctor, FunctionCallee) { -        if (!ClWithComdat) { -          appendToGlobalCtors(M, Ctor, 0); -          return; -        } -        Comdat *MsanCtorComdat = M.getOrInsertComdat(kMsanModuleCtorName); -        Ctor->setComdat(MsanCtorComdat); -        appendToGlobalCtors(M, Ctor, 0, Ctor); -      }); -} +  Function *MsanCtorFunction; +};  /// A legacy function pass for msan instrumentation.  /// @@ -651,14 +635,6 @@ PreservedAnalyses MemorySanitizerPass::run(Function &F,    return PreservedAnalyses::all();  } -PreservedAnalyses MemorySanitizerPass::run(Module &M, -                                           ModuleAnalysisManager &AM) { -  if (Options.Kernel) -    return PreservedAnalyses::all(); -  insertModuleCtor(M); -  return PreservedAnalyses::none(); -} -  char MemorySanitizerLegacyPass::ID = 0;  INITIALIZE_PASS_BEGIN(MemorySanitizerLegacyPass, "msan", @@ -944,6 +920,23 @@ void MemorySanitizer::initializeModule(Module &M) {    OriginStoreWeights = MDBuilder(*C).createBranchWeights(1, 1000);    if (!CompileKernel) { +    std::tie(MsanCtorFunction, std::ignore) = +        getOrCreateSanitizerCtorAndInitFunctions( +            M, kMsanModuleCtorName, kMsanInitName, +            /*InitArgTypes=*/{}, +            /*InitArgs=*/{}, +            // This callback is invoked when the functions are created the first +            // time. Hook them into the global ctors list in that case: +            [&](Function *Ctor, FunctionCallee) { +              if (!ClWithComdat) { +                appendToGlobalCtors(M, Ctor, 0); +                return; +              } +              Comdat *MsanCtorComdat = M.getOrInsertComdat(kMsanModuleCtorName); +              Ctor->setComdat(MsanCtorComdat); +              appendToGlobalCtors(M, Ctor, 0, Ctor); +            }); +      if (TrackOrigins)        M.getOrInsertGlobal("__msan_track_origins", IRB.getInt32Ty(), [&] {          return new GlobalVariable( @@ -961,8 +954,6 @@ void MemorySanitizer::initializeModule(Module &M) {  }  bool MemorySanitizerLegacyPass::doInitialization(Module &M) { -  if (!Options.Kernel) -    insertModuleCtor(M);    MSan.emplace(M, Options);    return true;  } @@ -4587,9 +4578,8 @@ static VarArgHelper *CreateVarArgHelper(Function &Func, MemorySanitizer &Msan,  }  bool MemorySanitizer::sanitizeFunction(Function &F, TargetLibraryInfo &TLI) { -  if (!CompileKernel && F.getName() == kMsanModuleCtorName) +  if (!CompileKernel && (&F == MsanCtorFunction))      return false; -    MemorySanitizerVisitor Visitor(F, *this, TLI);    // Clear out readonly/readnone attributes. diff --git a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp index ac274a155a8..643a03783e7 100644 --- a/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp +++ b/llvm/lib/Transforms/Instrumentation/ThreadSanitizer.cpp @@ -92,10 +92,11 @@ namespace {  /// ensures the __tsan_init function is in the list of global constructors for  /// the module.  struct ThreadSanitizer { +  ThreadSanitizer(Module &M);    bool sanitizeFunction(Function &F, const TargetLibraryInfo &TLI);  private: -  void initialize(Module &M); +  void initializeCallbacks(Module &M);    bool instrumentLoadOrStore(Instruction *I, const DataLayout &DL);    bool instrumentAtomic(Instruction *I, const DataLayout &DL);    bool instrumentMemIntrinsic(Instruction *I); @@ -107,6 +108,8 @@ private:    void InsertRuntimeIgnores(Function &F);    Type *IntptrTy; +  IntegerType *OrdTy; +  // Callbacks to run-time library are computed in doInitialization.    FunctionCallee TsanFuncEntry;    FunctionCallee TsanFuncExit;    FunctionCallee TsanIgnoreBegin; @@ -127,6 +130,7 @@ private:    FunctionCallee TsanVptrUpdate;    FunctionCallee TsanVptrLoad;    FunctionCallee MemmoveFn, MemcpyFn, MemsetFn; +  Function *TsanCtorFunction;  };  struct ThreadSanitizerLegacyPass : FunctionPass { @@ -139,32 +143,16 @@ struct ThreadSanitizerLegacyPass : FunctionPass {  private:    Optional<ThreadSanitizer> TSan;  }; - -void insertModuleCtor(Module &M) { -  getOrCreateSanitizerCtorAndInitFunctions( -      M, kTsanModuleCtorName, kTsanInitName, /*InitArgTypes=*/{}, -      /*InitArgs=*/{}, -      // This callback is invoked when the functions are created the first -      // time. Hook them into the global ctors list in that case: -      [&](Function *Ctor, FunctionCallee) { appendToGlobalCtors(M, Ctor, 0); }); -} -  }  // namespace  PreservedAnalyses ThreadSanitizerPass::run(Function &F,                                             FunctionAnalysisManager &FAM) { -  ThreadSanitizer TSan; +  ThreadSanitizer TSan(*F.getParent());    if (TSan.sanitizeFunction(F, FAM.getResult<TargetLibraryAnalysis>(F)))      return PreservedAnalyses::none();    return PreservedAnalyses::all();  } -PreservedAnalyses ThreadSanitizerPass::run(Module &M, -                                           ModuleAnalysisManager &MAM) { -  insertModuleCtor(M); -  return PreservedAnalyses::none(); -} -  char ThreadSanitizerLegacyPass::ID = 0;  INITIALIZE_PASS_BEGIN(ThreadSanitizerLegacyPass, "tsan",                        "ThreadSanitizer: detects data races.", false, false) @@ -181,8 +169,7 @@ void ThreadSanitizerLegacyPass::getAnalysisUsage(AnalysisUsage &AU) const {  }  bool ThreadSanitizerLegacyPass::doInitialization(Module &M) { -  insertModuleCtor(M); -  TSan.emplace(); +  TSan.emplace(M);    return true;  } @@ -196,10 +183,7 @@ FunctionPass *llvm::createThreadSanitizerLegacyPassPass() {    return new ThreadSanitizerLegacyPass();  } -void ThreadSanitizer::initialize(Module &M) { -  const DataLayout &DL = M.getDataLayout(); -  IntptrTy = DL.getIntPtrType(M.getContext()); - +void ThreadSanitizer::initializeCallbacks(Module &M) {    IRBuilder<> IRB(M.getContext());    AttributeList Attr;    Attr = Attr.addAttribute(M.getContext(), AttributeList::FunctionIndex, @@ -213,7 +197,7 @@ void ThreadSanitizer::initialize(Module &M) {                                            IRB.getVoidTy());    TsanIgnoreEnd =        M.getOrInsertFunction("__tsan_ignore_thread_end", Attr, IRB.getVoidTy()); -  IntegerType *OrdTy = IRB.getInt32Ty(); +  OrdTy = IRB.getInt32Ty();    for (size_t i = 0; i < kNumberOfAccessSizes; ++i) {      const unsigned ByteSize = 1U << i;      const unsigned BitSize = ByteSize * 8; @@ -296,6 +280,20 @@ void ThreadSanitizer::initialize(Module &M) {                              IRB.getInt8PtrTy(), IRB.getInt32Ty(), IntptrTy);  } +ThreadSanitizer::ThreadSanitizer(Module &M) { +  const DataLayout &DL = M.getDataLayout(); +  IntptrTy = DL.getIntPtrType(M.getContext()); +  std::tie(TsanCtorFunction, std::ignore) = +      getOrCreateSanitizerCtorAndInitFunctions( +          M, kTsanModuleCtorName, kTsanInitName, /*InitArgTypes=*/{}, +          /*InitArgs=*/{}, +          // This callback is invoked when the functions are created the first +          // time. Hook them into the global ctors list in that case: +          [&](Function *Ctor, FunctionCallee) { +            appendToGlobalCtors(M, Ctor, 0); +          }); +} +  static bool isVtableAccess(Instruction *I) {    if (MDNode *Tag = I->getMetadata(LLVMContext::MD_tbaa))      return Tag->isTBAAVtableAccess(); @@ -438,9 +436,9 @@ bool ThreadSanitizer::sanitizeFunction(Function &F,                                         const TargetLibraryInfo &TLI) {    // This is required to prevent instrumenting call to __tsan_init from within    // the module constructor. -  if (F.getName() == kTsanModuleCtorName) +  if (&F == TsanCtorFunction)      return false; -  initialize(*F.getParent()); +  initializeCallbacks(*F.getParent());    SmallVector<Instruction*, 8> AllLoadsAndStores;    SmallVector<Instruction*, 8> LocalLoadsAndStores;    SmallVector<Instruction*, 8> AtomicAccesses;  | 

