From ff9cd968cd5b623e3ec7e5f862b598cd22f7ec79 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Mon, 31 Jan 2011 22:00:42 +0000 Subject: [PATCH] Frontend: Add an explicit RemoveFileOnSignal flag argument, to control the automatic behavior (which is undesirable in a multithreaded context). git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@124612 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/clang/Frontend/CompilerInstance.h | 9 +++++++-- lib/Frontend/CompilerInstance.cpp | 9 ++++++--- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/include/clang/Frontend/CompilerInstance.h b/include/clang/Frontend/CompilerInstance.h index 67d6dd81fe..fd6224bd3c 100644 --- a/include/clang/Frontend/CompilerInstance.h +++ b/include/clang/Frontend/CompilerInstance.h @@ -583,7 +583,8 @@ public: /// /// \return - Null on error. llvm::raw_fd_ostream * - createOutputFile(llvm::StringRef OutputPath, bool Binary = true, + createOutputFile(llvm::StringRef OutputPath, + bool Binary = true, bool RemoveFileOnSignal = true, llvm::StringRef BaseInput = "", llvm::StringRef Extension = ""); @@ -600,13 +601,17 @@ public: /// for deriving the output path. /// \param Extension - The extension to use for derived output names. /// \param Binary - The mode to open the file in. + /// \param RemoveFileOnSignal - Whether the file should be registered with + /// llvm::sys::RemoveFileOnSignal. Note that this is not safe for + /// multithreaded use, as the underlying signal mechanism is not reentrant /// \param ResultPathName [out] - If given, the result path name will be /// stored here on success. /// \param TempPathName [out] - If given, the temporary file path name /// will be stored here on success. static llvm::raw_fd_ostream * createOutputFile(llvm::StringRef OutputPath, std::string &Error, - bool Binary = true, llvm::StringRef BaseInput = "", + bool Binary = true, bool RemoveFileOnSignal = true, + llvm::StringRef BaseInput = "", llvm::StringRef Extension = "", std::string *ResultPathName = 0, std::string *TempPathName = 0); diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 901f8fa927..9ff2e9d1be 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -381,16 +381,17 @@ CompilerInstance::createDefaultOutputFile(bool Binary, llvm::StringRef InFile, llvm::StringRef Extension) { return createOutputFile(getFrontendOpts().OutputFile, Binary, - InFile, Extension); + /*RemoveFileOnSignal=*/true, InFile, Extension); } llvm::raw_fd_ostream * CompilerInstance::createOutputFile(llvm::StringRef OutputPath, - bool Binary, + bool Binary, bool RemoveFileOnSignal, llvm::StringRef InFile, llvm::StringRef Extension) { std::string Error, OutputPathName, TempPathName; llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary, + RemoveFileOnSignal, InFile, Extension, &OutputPathName, &TempPathName); @@ -412,6 +413,7 @@ llvm::raw_fd_ostream * CompilerInstance::createOutputFile(llvm::StringRef OutputPath, std::string &Error, bool Binary, + bool RemoveFileOnSignal, llvm::StringRef InFile, llvm::StringRef Extension, std::string *ResultPathName, @@ -455,7 +457,8 @@ CompilerInstance::createOutputFile(llvm::StringRef OutputPath, return 0; // Make sure the out stream file gets removed if we crash. - llvm::sys::RemoveFileOnSignal(llvm::sys::Path(OSFile)); + if (RemoveFileOnSignal) + llvm::sys::RemoveFileOnSignal(llvm::sys::Path(OSFile)); if (ResultPathName) *ResultPathName = OutFile; -- 2.40.0