Convert another use of createUniqueFile to TempFile::create.

This one requires a new small feature in TempFile: the ability to keep
the temporary file with the temporary name.

llvm-svn: 318458
This commit is contained in:
Rafael Espindola 2017-11-16 21:40:10 +00:00
parent 2758fa8710
commit b60bb6904b
6 changed files with 44 additions and 12 deletions

View File

@ -723,6 +723,9 @@ public:
// Keep this with the given name.
Error keep(const Twine &Name);
// Keep this with the temporary name.
Error keep();
// Delete the file.
Error discard();

View File

@ -805,6 +805,22 @@ Error TempFile::keep(const Twine &Name) {
return errorCodeToError(RenameEC);
}
Error TempFile::keep() {
assert(!Done);
Done = true;
sys::DontRemoveFileOnSignal(TmpName);
TmpName = "";
if (close(FD) == -1) {
std::error_code EC(errno, std::generic_category());
return errorCodeToError(EC);
}
FD = -1;
return Error::success();
}
Expected<TempFile> TempFile::create(const Twine &Model, unsigned Mode) {
int FD;
SmallString<128> ResultPath;

View File

@ -33,6 +33,11 @@ Triple TargetTriple;
}
DiscardTemp::~DiscardTemp() {
if (SaveTemps) {
if (Error E = File.keep())
errs() << "Failed to keep temp file " << toString(std::move(E)) << '\n';
return;
}
if (Error E = File.discard())
errs() << "Failed to delete temp file " << toString(std::move(E)) << '\n';
}

View File

@ -271,6 +271,7 @@ public:
bool writeProgramToFile(const std::string &Filename, const Module *M) const;
bool writeProgramToFile(const std::string &Filename, int FD,
const Module *M) const;
bool writeProgramToFile(int FD, const Module *M) const;
private:
/// initializeExecutionEnvironment - This method is used to set up the

View File

@ -271,26 +271,23 @@ Error BugDriver::initializeExecutionEnvironment() {
///
Error BugDriver::compileProgram(Module *M) const {
// Emit the program to a bitcode file...
SmallString<128> BitcodeFile;
int BitcodeFD;
std::error_code EC = sys::fs::createUniqueFile(
OutputPrefix + "-test-program-%%%%%%%.bc", BitcodeFD, BitcodeFile);
if (EC) {
errs() << ToolName << ": Error making unique filename: " << EC.message()
auto Temp =
sys::fs::TempFile::create(OutputPrefix + "-test-program-%%%%%%%.bc");
if (!Temp) {
errs() << ToolName
<< ": Error making unique filename: " << toString(Temp.takeError())
<< "\n";
exit(1);
}
if (writeProgramToFile(BitcodeFile.str(), BitcodeFD, M)) {
errs() << ToolName << ": Error emitting bitcode to file '" << BitcodeFile
DiscardTemp Discard{*Temp};
if (writeProgramToFile(Temp->FD, M)) {
errs() << ToolName << ": Error emitting bitcode to file '" << Temp->TmpName
<< "'!\n";
exit(1);
}
// Remove the temporary bitcode file when we are done.
FileRemover BitcodeFileRemover(BitcodeFile.str(), !SaveTemps);
// Actually compile the program!
return Interpreter->compileProgram(BitcodeFile.str(), Timeout, MemoryLimit);
return Interpreter->compileProgram(Temp->TmpName, Timeout, MemoryLimit);
}
/// executeProgram - This method runs "Program", capturing the output of the

View File

@ -74,6 +74,16 @@ bool BugDriver::writeProgramToFile(const std::string &Filename, int FD,
return writeProgramToFileAux(Out, M);
}
bool BugDriver::writeProgramToFile(int FD, const Module *M) const {
raw_fd_ostream OS(FD, /*shouldClose*/ false);
WriteBitcodeToFile(M, OS, PreserveBitcodeUseListOrder);
OS.flush();
if (!OS.has_error())
return false;
OS.clear_error();
return true;
}
bool BugDriver::writeProgramToFile(const std::string &Filename,
const Module *M) const {
std::error_code EC;