jhuber6 created this revision. jhuber6 added a reviewer: uabelho. Herald added a project: All. jhuber6 requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
There were intemittent errors in the linker wrapper when using the sanitizers in parallel. First, this is because the `TempFiles` global was not guarded when creating a new file. Second, even though the `Args` list is passed as const, the internal state is mutable when adding a string. So that needs to be guarded too. Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D142985 Files: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp Index: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp =================================================================== --- clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ 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<SmallString<128>> TempFiles; @@ -200,6 +203,7 @@ /// Get a temporary filename suitable for output. Expected<StringRef> createOutputFile(const Twine &Prefix, StringRef Extension) { + std::scoped_lock<decltype(TempFilesMutex)> Lock(TempFilesMutex); SmallString<128> OutputFile; if (SaveTemps) { (Prefix + "." + Extension).toNullTerminatedStringRef(OutputFile); @@ -1047,6 +1051,7 @@ return createFileError(*OutputOrErr, EC); } + std::scoped_lock<decltype(ImageMtx)> 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<decltype(ImageMtx)> Guard(ImageMtx); Images[Kind].emplace_back(std::move(TheImage)); } return Error::success();
Index: clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp =================================================================== --- clang/tools/clang-linker-wrapper/ClangLinkerWrapper.cpp +++ 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<SmallString<128>> TempFiles; @@ -200,6 +203,7 @@ /// Get a temporary filename suitable for output. Expected<StringRef> createOutputFile(const Twine &Prefix, StringRef Extension) { + std::scoped_lock<decltype(TempFilesMutex)> Lock(TempFilesMutex); SmallString<128> OutputFile; if (SaveTemps) { (Prefix + "." + Extension).toNullTerminatedStringRef(OutputFile); @@ -1047,6 +1051,7 @@ return createFileError(*OutputOrErr, EC); } + std::scoped_lock<decltype(ImageMtx)> 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<decltype(ImageMtx)> Guard(ImageMtx); Images[Kind].emplace_back(std::move(TheImage)); } return Error::success();
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits