Frontend: Add an explicit RemoveFileOnSignal flag argument, to control the

automatic behavior (which is undesirable in a multithreaded context).

llvm-svn: 124612
This commit is contained in:
Daniel Dunbar 2011-01-31 22:00:42 +00:00
parent 56cc5fdf09
commit e326f9bb3e
2 changed files with 13 additions and 5 deletions

View File

@ -583,7 +583,8 @@ public:
/// ///
/// \return - Null on error. /// \return - Null on error.
llvm::raw_fd_ostream * 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 BaseInput = "",
llvm::StringRef Extension = ""); llvm::StringRef Extension = "");
@ -600,13 +601,17 @@ public:
/// for deriving the output path. /// for deriving the output path.
/// \param Extension - The extension to use for derived output names. /// \param Extension - The extension to use for derived output names.
/// \param Binary - The mode to open the file in. /// \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 /// \param ResultPathName [out] - If given, the result path name will be
/// stored here on success. /// stored here on success.
/// \param TempPathName [out] - If given, the temporary file path name /// \param TempPathName [out] - If given, the temporary file path name
/// will be stored here on success. /// will be stored here on success.
static llvm::raw_fd_ostream * static llvm::raw_fd_ostream *
createOutputFile(llvm::StringRef OutputPath, std::string &Error, 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 = "", llvm::StringRef Extension = "",
std::string *ResultPathName = 0, std::string *ResultPathName = 0,
std::string *TempPathName = 0); std::string *TempPathName = 0);

View File

@ -381,16 +381,17 @@ CompilerInstance::createDefaultOutputFile(bool Binary,
llvm::StringRef InFile, llvm::StringRef InFile,
llvm::StringRef Extension) { llvm::StringRef Extension) {
return createOutputFile(getFrontendOpts().OutputFile, Binary, return createOutputFile(getFrontendOpts().OutputFile, Binary,
InFile, Extension); /*RemoveFileOnSignal=*/true, InFile, Extension);
} }
llvm::raw_fd_ostream * llvm::raw_fd_ostream *
CompilerInstance::createOutputFile(llvm::StringRef OutputPath, CompilerInstance::createOutputFile(llvm::StringRef OutputPath,
bool Binary, bool Binary, bool RemoveFileOnSignal,
llvm::StringRef InFile, llvm::StringRef InFile,
llvm::StringRef Extension) { llvm::StringRef Extension) {
std::string Error, OutputPathName, TempPathName; std::string Error, OutputPathName, TempPathName;
llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary, llvm::raw_fd_ostream *OS = createOutputFile(OutputPath, Error, Binary,
RemoveFileOnSignal,
InFile, Extension, InFile, Extension,
&OutputPathName, &OutputPathName,
&TempPathName); &TempPathName);
@ -412,6 +413,7 @@ llvm::raw_fd_ostream *
CompilerInstance::createOutputFile(llvm::StringRef OutputPath, CompilerInstance::createOutputFile(llvm::StringRef OutputPath,
std::string &Error, std::string &Error,
bool Binary, bool Binary,
bool RemoveFileOnSignal,
llvm::StringRef InFile, llvm::StringRef InFile,
llvm::StringRef Extension, llvm::StringRef Extension,
std::string *ResultPathName, std::string *ResultPathName,
@ -455,7 +457,8 @@ CompilerInstance::createOutputFile(llvm::StringRef OutputPath,
return 0; return 0;
// Make sure the out stream file gets removed if we crash. // 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) if (ResultPathName)
*ResultPathName = OutFile; *ResultPathName = OutFile;