diff --git a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp --- a/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ b/clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp @@ -77,6 +77,9 @@ /// Binary path for the CUDA installation. static std::string CudaBinaryPath; +/// Mutex lock to protect writes to shared TempFiles in parallel. +static std::mutex TempFilesMutex; + /// Temporary files created by the linker wrapper. static std::list> TempFiles; @@ -200,6 +203,7 @@ /// Get a temporary filename suitable for output. Expected createOutputFile(const Twine &Prefix, StringRef Extension) { + std::scoped_lock Lock(TempFilesMutex); SmallString<128> OutputFile; if (SaveTemps) { (Prefix + "." + Extension).toNullTerminatedStringRef(OutputFile); @@ -1047,6 +1051,7 @@ return createFileError(*OutputOrErr, EC); } + std::scoped_lock Guard(ImageMtx); OffloadingImage TheImage{}; TheImage.TheImageKind = Args.hasArg(OPT_embed_bitcode) ? IMG_Bitcode : IMG_Object; @@ -1058,7 +1063,6 @@ Args.MakeArgString(LinkerArgs.getLastArgValue(OPT_arch_EQ))}}; TheImage.Image = std::move(*FileOrErr); - std::lock_guard Guard(ImageMtx); Images[Kind].emplace_back(std::move(TheImage)); } return Error::success();