From 68c0efac35021516bf46b2793e56e0d9d804c9e8 Mon Sep 17 00:00:00 2001 From: Rafael Espindola Date: Mon, 17 Jun 2013 18:05:35 +0000 Subject: Don't use PathV1.h in LTOCodeGenerator.cpp This patch also adds a simpler version of sys::fs::remove and a tool_output_file constructor for when we already have an open file. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@184095 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/Support/FileSystem.h | 7 +++++++ include/llvm/Support/ToolOutputFile.h | 2 ++ lib/Support/ToolOutputFile.cpp | 4 ++++ tools/lto/LTOCodeGenerator.cpp | 31 ++++++++++++++----------------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/include/llvm/Support/FileSystem.h b/include/llvm/Support/FileSystem.h index 9d1d320eff..c1c1fc6ed6 100644 --- a/include/llvm/Support/FileSystem.h +++ b/include/llvm/Support/FileSystem.h @@ -292,6 +292,13 @@ error_code current_path(SmallVectorImpl &result); /// successfully set, otherwise a platform specific error_code. error_code remove(const Twine &path, bool &existed); +/// @brief Convenience function for clients that don't need to know if the file +/// existed or not. +inline error_code remove(const Twine &Path) { + bool Existed; + return remove(Path, Existed); +} + /// @brief Recursively remove all files below \a path, then \a path. Files are /// removed as if by POSIX remove(). /// diff --git a/include/llvm/Support/ToolOutputFile.h b/include/llvm/Support/ToolOutputFile.h index b3b7c577b7..cc8511f55b 100644 --- a/include/llvm/Support/ToolOutputFile.h +++ b/include/llvm/Support/ToolOutputFile.h @@ -49,6 +49,8 @@ public: tool_output_file(const char *filename, std::string &ErrorInfo, unsigned Flags = 0); + tool_output_file(const char *Filename, int FD); + /// os - Return the contained raw_fd_ostream. raw_fd_ostream &os() { return OS; } diff --git a/lib/Support/ToolOutputFile.cpp b/lib/Support/ToolOutputFile.cpp index 09fb6ee605..824e0a73d2 100644 --- a/lib/Support/ToolOutputFile.cpp +++ b/lib/Support/ToolOutputFile.cpp @@ -44,3 +44,7 @@ tool_output_file::tool_output_file(const char *filename, std::string &ErrorInfo, if (!ErrorInfo.empty()) Installer.Keep = true; } + +tool_output_file::tool_output_file(const char *Filename, int FD) + : Installer(Filename), OS(FD, true) { +} diff --git a/tools/lto/LTOCodeGenerator.cpp b/tools/lto/LTOCodeGenerator.cpp index 5383262847..1db296bbc3 100644 --- a/tools/lto/LTOCodeGenerator.cpp +++ b/tools/lto/LTOCodeGenerator.cpp @@ -30,10 +30,10 @@ #include "llvm/MC/SubtargetFeature.h" #include "llvm/PassManager.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/FileSystem.h" #include "llvm/Support/FormattedStream.h" #include "llvm/Support/Host.h" #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/PathV1.h" #include "llvm/Support/Signals.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/TargetSelect.h" @@ -160,36 +160,33 @@ bool LTOCodeGenerator::writeMergedModules(const char *path, bool LTOCodeGenerator::compile_to_file(const char** name, std::string& errMsg) { // make unique temp .o file to put generated object file - sys::PathWithStatus uniqueObjPath("lto-llvm.o"); - if (uniqueObjPath.createTemporaryFileOnDisk(false, &errMsg)) { - uniqueObjPath.eraseFromDisk(); + SmallString<128> Filename; + int FD; + error_code EC = sys::fs::unique_file("lto-llvm-%%%%%%%.o", + FD, Filename); + if (EC) { + errMsg = EC.message(); return true; } - sys::RemoveFileOnSignal(uniqueObjPath.str()); // generate object file - bool genResult = false; - tool_output_file objFile(uniqueObjPath.c_str(), errMsg); - if (!errMsg.empty()) { - uniqueObjPath.eraseFromDisk(); - return true; - } + tool_output_file objFile(Filename.c_str(), FD); - genResult = this->generateObjectFile(objFile.os(), errMsg); + bool genResult = generateObjectFile(objFile.os(), errMsg); objFile.os().close(); if (objFile.os().has_error()) { objFile.os().clear_error(); - uniqueObjPath.eraseFromDisk(); + sys::fs::remove(Twine(Filename)); return true; } objFile.keep(); if (genResult) { - uniqueObjPath.eraseFromDisk(); + sys::fs::remove(Twine(Filename)); return true; } - _nativeObjectPath = uniqueObjPath.str(); + _nativeObjectPath = Filename.c_str(); *name = _nativeObjectPath.c_str(); return false; } @@ -206,13 +203,13 @@ const void* LTOCodeGenerator::compile(size_t* length, std::string& errMsg) { OwningPtr BuffPtr; if (error_code ec = MemoryBuffer::getFile(name, BuffPtr, -1, false)) { errMsg = ec.message(); - sys::Path(_nativeObjectPath).eraseFromDisk(); + sys::fs::remove(_nativeObjectPath); return NULL; } _nativeObjectFile = BuffPtr.take(); // remove temp files - sys::Path(_nativeObjectPath).eraseFromDisk(); + sys::fs::remove(_nativeObjectPath); // return buffer, unless error if (_nativeObjectFile == NULL) -- cgit v1.2.3