[llvm] r318361 - Convert a use of createUniqueFile to TempFile::create.

Michael Kruse via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 21 13:14:04 PST 2017


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