Author: Wenju He Date: 2026-06-01T12:06:57+08:00 New Revision: 0ecf562dac85a29f3de1dd598e3ae0ecc34d1240
URL: https://github.com/llvm/llvm-project/commit/0ecf562dac85a29f3de1dd598e3ae0ecc34d1240 DIFF: https://github.com/llvm/llvm-project/commit/0ecf562dac85a29f3de1dd598e3ae0ecc34d1240.diff LOG: [Clang] Fix write-to-global TimePassesIsEnabled race condition in BackendConsumer ctor (#200102) When multiple threads launch multiple clang::CompilerInstance to compile sources, there is no crash but thread-sanitizer reports race condition in simultaneously writing to global variables llvm::TimePassesIsEnabled and llvm::TimePassesPerRun in BackendConsumer constructor. This PR fixes it using ManagedStatic SmartMutex and SmartScopedLock. Added: Modified: clang/lib/CodeGen/CodeGenAction.cpp Removed: ################################################################################ diff --git a/clang/lib/CodeGen/CodeGenAction.cpp b/clang/lib/CodeGen/CodeGenAction.cpp index fb1a410ce1761..1371fd48cb524 100644 --- a/clang/lib/CodeGen/CodeGenAction.cpp +++ b/clang/lib/CodeGen/CodeGenAction.cpp @@ -46,7 +46,9 @@ #include "llvm/LTO/LTOBackend.h" #include "llvm/Linker/Linker.h" #include "llvm/Pass.h" +#include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/Mutex.h" #include "llvm/Support/SourceMgr.h" #include "llvm/Support/TimeProfiler.h" #include "llvm/Support/Timer.h" @@ -60,6 +62,10 @@ using namespace llvm; #define DEBUG_TYPE "codegenaction" +namespace { +llvm::ManagedStatic<llvm::sys::SmartMutex<true>> TimePassesMutex; +} + namespace clang { class BackendConsumer; class ClangDiagnosticHandler final : public DiagnosticHandler { @@ -122,8 +128,11 @@ BackendConsumer::BackendConsumer(CompilerInstance &CI, BackendAction Action, Gen(CreateLLVMCodeGen(CI, InFile, C, CoverageInfo)), LinkModules(std::move(LinkModules)), CurLinkModule(CurLinkModule) { TimerIsEnabled = CodeGenOpts.TimePasses; - llvm::TimePassesIsEnabled = CodeGenOpts.TimePasses; - llvm::TimePassesPerRun = CodeGenOpts.TimePassesPerRun; + { + llvm::sys::SmartScopedLock<true> Lock(*TimePassesMutex); + llvm::TimePassesIsEnabled = CodeGenOpts.TimePasses; + llvm::TimePassesPerRun = CodeGenOpts.TimePassesPerRun; + } if (CodeGenOpts.TimePasses) LLVMIRGeneration.init("irgen", "LLVM IR generation", CI.getTimerGroup()); } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
