[llvm] r318361 - Convert a use of createUniqueFile to TempFile::create.
Michael Kruse via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 23 00:49:21 PST 2017
Thank you.
Michael
2017-11-22 21:03 GMT+01:00 Rafael Avila de Espindola
<rafael.espindola at gmail.com>:
> Should be fixed now. Thanks a lot for the bug report.
>
> Cheers,
> Rafael
>
> Michael Kruse <llvm-commits at meinersbur.de> writes:
>
>> Hi,
>>
>> this seems to break bugpoint on at least Windows. When 'opt' crashes,
>> bugpoint crashes as well.
>>
>> Unhandled exception at 0x0FB5CAB6 (ucrtbased.dll) in bugpoint.exe: An
>> invalid parameter was passed to a function that considers invalid
>> parameters fatal.
>>
>> Stack trace:
>>
>> ucrtbased.dll!_close(int fh) Line 49
>> bugpoint.exe!llvm::sys::fs::TempFile::discard() Line 782
>> bugpoint.exe!llvm::DiscardTemp::~DiscardTemp() Line 41
>> bugpoint.exe!llvm::BugDriver::runPasses(llvm::Module * Program,
>> const std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>>>,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>>> > > & Passes,
>> std::basic_string<char,std::char_traits<char>,std::allocator<char> > &
>> OutputFilename, bool DeleteOutput, bool Quiet, unsigned int
>> NumExtraArgs, const char * const * ExtraArgs) Line 274
>> bugpoint.exe!llvm::BugDriver::runPasses(llvm::Module * M, const
>> std::vector<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>>>,std::allocator<std::basic_string<char,std::char_traits<char>,std::allocator<char>
>>> > > & PassesToRun) Line 257
>> bugpoint.exe!llvm::BugDriver::run() Line 175
>> bugpoint.exe!main(int argc, char * * argv) Line 215
>> bugpoint.exe!invoke_main() Line 78
>>
>> The line crashing Path.cpp:782 is
>>
>> if (FD != -1 && close(FD) == -1) {
>>
>> Due to Windows LLVM not support the -load mechanism, the unit testing
>> for bugpoint are not active on windows.
>>
>> I assume this is due OptimizationDriver.cpp:256
>>
>> // Remove the temporary input file as well
>> consumeError(Temp->discard());
>>
>> with DiscardTemp, the temp file therefore is discarded twice. It works
>> for me if I comment-out one of them. Apparently, the MS (debug-)CRT
>> has in-built assertions that fast-fails (int 3 breakpoint; which ends
>> the program if no debugger is attached) if close() is called on the
>> same file descriptor multiple times.
>>
>> Michael
>>
>>
>>
>> 2017-11-16 2:06 GMT+01:00 Rafael Espindola via llvm-commits
>> <llvm-commits at lists.llvm.org>:
>>> Author: rafael
>>> Date: Wed Nov 15 17:06:36 2017
>>> New Revision: 318361
>>>
>>> URL: http://llvm.org/viewvc/llvm-project?rev=318361&view=rev
>>> Log:
>>> Convert a use of createUniqueFile to TempFile::create.
>>>
>>> Modified:
>>> llvm/trunk/tools/bugpoint/OptimizerDriver.cpp
>>>
>>> Modified: llvm/trunk/tools/bugpoint/OptimizerDriver.cpp
>>> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/bugpoint/OptimizerDriver.cpp?rev=318361&r1=318360&r2=318361&view=diff
>>> ==============================================================================
>>> --- llvm/trunk/tools/bugpoint/OptimizerDriver.cpp (original)
>>> +++ llvm/trunk/tools/bugpoint/OptimizerDriver.cpp Wed Nov 15 17:06:36 2017
>>> @@ -118,6 +118,11 @@ static cl::list<std::string> OptArgs("op
>>> cl::desc("<opt arguments>..."),
>>> cl::ZeroOrMore, cl::PositionalEatsArgs);
>>>
>>> +struct DiscardTemp {
>>> + sys::fs::TempFile &File;
>>> + ~DiscardTemp() { consumeError(File.discard()); }
>>> +};
>>> +
>>> /// runPasses - Run the specified passes on Program, outputting a bitcode file
>>> /// and writing the filename into OutputFile if successful. If the
>>> /// optimizations fail for some reason (optimizer crashes), return true,
>>> @@ -144,23 +149,22 @@ bool BugDriver::runPasses(Module *Progra
>>> OutputFilename = UniqueFilename.str();
>>>
>>> // set up the input file name
>>> - SmallString<128> InputFilename;
>>> - int InputFD;
>>> - EC = sys::fs::createUniqueFile(OutputPrefix + "-input-%%%%%%%.bc", InputFD,
>>> - InputFilename);
>>> - if (EC) {
>>> + Expected<sys::fs::TempFile> Temp =
>>> + sys::fs::TempFile::create(OutputPrefix + "-input-%%%%%%%.bc");
>>> + if (!Temp) {
>>> errs() << getToolName()
>>> - << ": Error making unique filename: " << EC.message() << "\n";
>>> + << ": Error making unique filename: " << toString(Temp.takeError())
>>> + << "\n";
>>> return 1;
>>> }
>>> + DiscardTemp Discard{*Temp};
>>> + raw_fd_ostream OS(Temp->FD, /*shouldClose*/ false);
>>>
>>> - ToolOutputFile InFile(InputFilename, InputFD);
>>> -
>>> - WriteBitcodeToFile(Program, InFile.os(), PreserveBitcodeUseListOrder);
>>> - InFile.os().close();
>>> - if (InFile.os().has_error()) {
>>> - errs() << "Error writing bitcode file: " << InputFilename << "\n";
>>> - InFile.os().clear_error();
>>> + WriteBitcodeToFile(Program, OS, PreserveBitcodeUseListOrder);
>>> + OS.flush();
>>> + if (OS.has_error()) {
>>> + errs() << "Error writing bitcode file: " << Temp->TmpName << "\n";
>>> + OS.clear_error();
>>> return 1;
>>> }
>>>
>>> @@ -189,9 +193,6 @@ bool BugDriver::runPasses(Module *Progra
>>> return 1;
>>> }
>>>
>>> - // Ok, everything that could go wrong before running opt is done.
>>> - InFile.keep();
>>> -
>>> // setup the child process' arguments
>>> SmallVector<const char *, 8> Args;
>>> if (UseValgrind) {
>>> @@ -220,7 +221,7 @@ bool BugDriver::runPasses(Module *Progra
>>> E = pass_args.end();
>>> I != E; ++I)
>>> Args.push_back(I->c_str());
>>> - Args.push_back(InputFilename.c_str());
>>> + Args.push_back(Temp->TmpName.c_str());
>>> for (unsigned i = 0; i < NumExtraArgs; ++i)
>>> Args.push_back(*ExtraArgs);
>>> Args.push_back(nullptr);
>>> @@ -247,7 +248,7 @@ bool BugDriver::runPasses(Module *Progra
>>> sys::fs::remove(OutputFilename);
>>>
>>> // Remove the temporary input file as well
>>> - sys::fs::remove(InputFilename.c_str());
>>> + consumeError(Temp->discard());
>>>
>>> if (!Quiet) {
>>> if (result == 0)
>>>
>>>
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list