From 00ad2785002098bf4c1bd052d67c33eada9d6fc6 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Sat, 27 Mar 2010 16:49:51 +0000 Subject: [PATCH] Make llvm-ld remove its output files in the event of an error. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@99719 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-ld/llvm-ld.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/tools/llvm-ld/llvm-ld.cpp b/tools/llvm-ld/llvm-ld.cpp index 9956e23ddd8..4749fea4480 100644 --- a/tools/llvm-ld/llvm-ld.cpp +++ b/tools/llvm-ld/llvm-ld.cpp @@ -30,6 +30,7 @@ #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" #include "llvm/Support/CommandLine.h" +#include "llvm/Support/FileUtilities.h" #include "llvm/Support/ManagedStatic.h" #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/PrettyStackTrace.h" @@ -124,6 +125,10 @@ static cl::opt CO9("m", cl::Hidden, /// everywhere. static std::string progname; +/// FileRemover objects to clean up output files in the event of an error. +static FileRemover OutputRemover; +static FileRemover BitcodeOutputRemover; + /// PrintAndExit - Prints a message to standard error and exits with error code /// /// Inputs: @@ -236,10 +241,6 @@ void GenerateBitcode(Module* M, const std::string& FileName) { if (!ErrorInfo.empty()) PrintAndExit(ErrorInfo, M); - // Ensure that the bitcode file gets removed from the disk if we get a - // terminating signal. - sys::RemoveFileOnSignal(sys::Path(FileName)); - // Write it out WriteBitcodeToFile(M, Out); } @@ -582,8 +583,17 @@ int main(int argc, char **argv, char **envp) { if (!LinkAsLibrary) BitcodeOutputFilename += ".bc"; } + // Arrange for the bitcode output file to be deleted on any errors. + BitcodeOutputRemover = FileRemover(sys::Path(BitcodeOutputFilename)); + sys::RemoveFileOnSignal(sys::Path(BitcodeOutputFilename)); + + // Generate the bitcode output. GenerateBitcode(Composite.get(), BitcodeOutputFilename); + // Arrange for the output file to be deleted on any errors. + OutputRemover = FileRemover(sys::Path(OutputFilename)); + sys::RemoveFileOnSignal(sys::Path(OutputFilename)); + // If we are not linking a library, generate either a native executable // or a JIT shell script, depending upon what the user wants. if (!LinkAsLibrary) { @@ -636,7 +646,6 @@ int main(int argc, char **argv, char **envp) { // Mark the output files for removal if we get an interrupt. sys::RemoveFileOnSignal(AssemblyFile); - sys::RemoveFileOnSignal(sys::Path(OutputFilename)); // Determine the locations of the llc and gcc programs. sys::Path llc = FindExecutable("llc", argv[0], @@ -666,7 +675,6 @@ int main(int argc, char **argv, char **envp) { // Mark the output files for removal if we get an interrupt. sys::RemoveFileOnSignal(CFile); - sys::RemoveFileOnSignal(sys::Path(OutputFilename)); // Determine the locations of the llc and gcc programs. sys::Path llc = FindExecutable("llc", argv[0], @@ -707,6 +715,10 @@ int main(int argc, char **argv, char **envp) { PrintAndExit(ErrMsg, Composite.get()); } + // Operations which may fail are now complete. + OutputRemover.releaseFile(); + BitcodeOutputRemover.releaseFile(); + // Graceful exit return 0; }