[llvm] r318534 - Use TempFile in dsymutil.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Nov 17 09:33:09 PST 2017


Author: rafael
Date: Fri Nov 17 09:33:09 2017
New Revision: 318534

URL: http://llvm.org/viewvc/llvm-project?rev=318534&view=rev
Log:
Use TempFile in dsymutil.

I don't think there is any functionality change, but the code is
easier to understand IMHO.

Modified:
    llvm/trunk/tools/dsymutil/dsymutil.cpp

Modified: llvm/trunk/tools/dsymutil/dsymutil.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/dsymutil.cpp?rev=318534&r1=318533&r2=318534&view=diff
==============================================================================
--- llvm/trunk/tools/dsymutil/dsymutil.cpp (original)
+++ llvm/trunk/tools/dsymutil/dsymutil.cpp Fri Nov 17 09:33:09 2017
@@ -181,43 +181,7 @@ static bool createBundleDir(llvm::String
   return true;
 }
 
-static std::error_code getUniqueFile(const llvm::Twine &Model, int &ResultFD,
-                                     llvm::SmallVectorImpl<char> &ResultPath) {
-  // If in NoOutput mode, use the createUniqueFile variant that
-  // doesn't open the file but still generates a somewhat unique
-  // name. In the real usage scenario, we'll want to ensure that the
-  // file is trully unique, and creating it is the only way to achieve
-  // that.
-  if (NoOutput)
-    return llvm::sys::fs::createUniqueFile(Model, ResultPath);
-  return llvm::sys::fs::createUniqueFile(Model, ResultFD, ResultPath);
-}
-
-static std::string getOutputFileName(llvm::StringRef InputFile,
-                                     bool TempFile = false) {
-  if (TempFile) {
-    llvm::SmallString<128> TmpFile;
-    llvm::sys::path::system_temp_directory(true, TmpFile);
-    llvm::StringRef Basename =
-        OutputFileOpt.empty() ? InputFile : llvm::StringRef(OutputFileOpt);
-    llvm::sys::path::append(TmpFile, llvm::sys::path::filename(Basename));
-
-    int FD;
-    llvm::SmallString<128> UniqueFile;
-    if (auto EC = getUniqueFile(TmpFile + ".tmp%%%%%.dwarf", FD, UniqueFile)) {
-      llvm::errs() << "error: failed to create temporary outfile '"
-                   << TmpFile << "': " << EC.message() << '\n';
-      return "";
-    }
-    llvm::sys::RemoveFileOnSignal(UniqueFile);
-    if (!NoOutput) {
-      // Close the file immediately. We know it is unique. It will be
-      // reopened and written to later.
-      llvm::raw_fd_ostream CloseImmediately(FD, true /* shouldClose */, true);
-    }
-    return UniqueFile.str();
-  }
-
+static std::string getOutputFileName(llvm::StringRef InputFile) {
   if (FlatOut) {
     // If a flat dSYM has been requested, things are pretty simple.
     if (OutputFileOpt.empty()) {
@@ -250,21 +214,32 @@ static std::string getOutputFileName(llv
   return BundleDir.str();
 }
 
-/// Exit the dsymutil process, cleaning up every temporary files that we
-/// created.
-static LLVM_ATTRIBUTE_NORETURN void exitDsymutil(int ExitStatus) {
-  // Cleanup temporary files.
-  llvm::sys::RunInterruptHandlers();
-  exit(ExitStatus);
+static Expected<sys::fs::TempFile> createTempFile() {
+  llvm::SmallString<128> TmpModel;
+  llvm::sys::path::system_temp_directory(true, TmpModel);
+  llvm::sys::path::append(TmpModel, "dsym.tmp%%%%%.dwarf");
+  return sys::fs::TempFile::create(TmpModel);
 }
 
+namespace {
+struct TempFileVector {
+  std::vector<sys::fs::TempFile> Files;
+  ~TempFileVector() {
+    for (sys::fs::TempFile &Tmp : Files) {
+      if (Error E = Tmp.discard())
+        errs() << toString(std::move(E));
+    }
+  }
+};
+} // namespace
+
 int main(int argc, char **argv) {
   llvm::sys::PrintStackTraceOnErrorSignal(argv[0]);
   llvm::PrettyStackTraceProgram StackPrinter(argc, argv);
   llvm::llvm_shutdown_obj Shutdown;
   LinkOptions Options;
-  void *MainAddr = (void *)(intptr_t)&exitDsymutil;
-  std::string SDKPath = llvm::sys::fs::getMainExecutable(argv[0], MainAddr);
+  void *P = (void *)(intptr_t)getOutputFileName;
+  std::string SDKPath = llvm::sys::fs::getMainExecutable(argv[0], P);
   SDKPath = llvm::sys::path::parent_path(SDKPath);
 
   HideUnrelatedOptions(DsymCategory);
@@ -310,14 +285,14 @@ int main(int argc, char **argv) {
     if (Arch != "*" && Arch != "all" &&
         !llvm::object::MachOObjectFile::isValidArch(Arch)) {
       llvm::errs() << "error: Unsupported cpu architecture: '" << Arch << "'\n";
-      exitDsymutil(1);
+      return 1;
     }
 
   for (auto &InputFile : InputFiles) {
     // Dump the symbol table for each input file and requested arch
     if (DumpStab) {
       if (!dumpStab(InputFile, ArchFlags, OsoPrependPath))
-        exitDsymutil(1);
+        return 1;
       continue;
     }
 
@@ -327,12 +302,12 @@ int main(int argc, char **argv) {
     if (auto EC = DebugMapPtrsOrErr.getError()) {
       llvm::errs() << "error: cannot parse the debug map for \"" << InputFile
                    << "\": " << EC.message() << '\n';
-      exitDsymutil(1);
+      return 1;
     }
 
     if (DebugMapPtrsOrErr->empty()) {
       llvm::errs() << "error: no architecture to link\n";
-      exitDsymutil(1);
+      return 1;
     }
 
     if (NumThreads == 0)
@@ -346,6 +321,7 @@ int main(int argc, char **argv) {
     // temporary files.
     bool NeedsTempFiles = !DumpDebugMap && (*DebugMapPtrsOrErr).size() != 1;
     llvm::SmallVector<MachOUtils::ArchAndFilename, 4> TempFiles;
+    TempFileVector TempFileStore;
     for (auto &Map : *DebugMapPtrsOrErr) {
       if (Verbose || DumpDebugMap)
         Map->print(llvm::outs());
@@ -358,19 +334,30 @@ int main(int argc, char **argv) {
                      << MachOUtils::getArchName(Map->getTriple().getArchName())
                      << ")\n";
 
-      std::string OutputFile = getOutputFileName(InputFile, NeedsTempFiles);
-
-      auto LinkLambda = [OutputFile, Options, &Map]() {
-        if (OutputFile.empty())
-          exitDsymutil(1);
+      std::string OutputFile = getOutputFileName(InputFile);
+      std::unique_ptr<raw_fd_ostream> OS;
+      if (NeedsTempFiles) {
+        Expected<sys::fs::TempFile> T = createTempFile();
+        if (!T) {
+          errs() << toString(T.takeError());
+          return 1;
+        }
+        OS = make_unique<raw_fd_ostream>(T->FD, /*shouldClose*/ false);
+        OutputFile = T->TmpName;
+        TempFileStore.Files.push_back(std::move(*T));
+      } else {
         std::error_code EC;
-        raw_fd_ostream OS(NoOutput ? "-" : OutputFile, EC, sys::fs::F_None);
+        OS = make_unique<raw_fd_ostream>(NoOutput ? "-" : OutputFile, EC,
+                                         sys::fs::F_None);
         if (EC) {
           errs() << OutputFile << ": " << EC.message();
-          exitDsymutil(1);
+          return 1;
         }
-        if (!linkDwarf(OS, *Map, Options))
-          exitDsymutil(1);
+      }
+
+      std::atomic_char AllOK(1);
+      auto LinkLambda = [&]() {
+        AllOK.fetch_and(linkDwarf(*OS, *Map, Options));
       };
 
       // FIXME: The DwarfLinker can have some very deep recursion that can max
@@ -383,6 +370,8 @@ int main(int argc, char **argv) {
         Threads.async(LinkLambda);
         Threads.wait();
       }
+      if (!AllOK)
+        return 1;
 
       if (NeedsTempFiles)
         TempFiles.emplace_back(Map->getTriple().getArchName().str(),
@@ -393,8 +382,8 @@ int main(int argc, char **argv) {
     if (NeedsTempFiles &&
         !MachOUtils::generateUniversalBinary(
             TempFiles, getOutputFileName(InputFile), Options, SDKPath))
-      exitDsymutil(1);
+      return 1;
   }
 
-  exitDsymutil(0);
+  return 0;
 }




More information about the llvm-commits mailing list