]> granicus.if.org Git - clang/commitdiff
Frontend: Add an explicit RemoveFileOnSignal flag argument, to control the
authorDaniel Dunbar <daniel@zuster.org>
Mon, 31 Jan 2011 22:00:42 +0000 (22:00 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Mon, 31 Jan 2011 22:00:42 +0000 (22:00 +0000)
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
lib/Frontend/CompilerInstance.cpp

index 67d6dd81fe4c3633c7cf6bcd746755b65ea990b1..fd6224bd3c3f17ad98d897bb8425f2194e57f0b3 100644 (file)
@@ -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);
index 901f8fa92764e4ab2424133978c71924b7bffcdf..9ff2e9d1bec648f3b49ef8ed458bb28d149d8477 100644 (file)
@@ -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;