//===- ExecutionDriver.cpp - Allow execution of LLVM program --------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// This file contains code used to execute the program utilizing one of the
// various ways of running LLVM bitcode.
//
//===----------------------------------------------------------------------===//

#include "BugDriver.h"
#include "ToolRunner.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/FileUtilities.h"
#include "llvm/Support/SystemUtils.h"
#include "llvm/Support/raw_ostream.h"
#include <fstream>

using namespace llvm;

namespace {
  // OutputType - Allow the user to specify the way code should be run, to test
  // for miscompilation.
  //
  enum OutputType {
    AutoPick, RunLLI, RunJIT, RunLLC, RunLLCIA, LLC_Safe, CompileCustom, Custom
  };

  cl::opt<double>
  AbsTolerance("abs-tolerance", cl::desc("Absolute error tolerated"),
               cl::init(0.0));
  cl::opt<double>
  RelTolerance("rel-tolerance", cl::desc("Relative error tolerated"),
               cl::init(0.0));

  cl::opt<OutputType>
  InterpreterSel(cl::desc("Specify the \"test\" i.e. suspect back-end:"),
                 cl::values(clEnumValN(AutoPick, "auto", "Use best guess"),
                            clEnumValN(RunLLI, "run-int",
                                       "Execute with the interpreter"),
                            clEnumValN(RunJIT, "run-jit", "Execute with JIT"),
                            clEnumValN(RunLLC, "run-llc", "Compile with LLC"),
                            clEnumValN(RunLLCIA, "run-llc-ia",
                                  "Compile with LLC with integrated assembler"),
                            clEnumValN(LLC_Safe, "llc-safe", "Use LLC for all"),
                            clEnumValN(CompileCustom, "compile-custom",
                            "Use -compile-command to define a command to "
                            "compile the bitcode. Useful to avoid linking."),
                            clEnumValN(Custom, "run-custom",
                            "Use -exec-command to define a command to execute "
                            "the bitcode. Useful for cross-compilation."),
                            clEnumValEnd),
                 cl::init(AutoPick));

  cl::opt<OutputType>
  SafeInterpreterSel(cl::desc("Specify \"safe\" i.e. known-good backend:"),
              cl::values(clEnumValN(AutoPick, "safe-auto", "Use best guess"),
                         clEnumValN(RunLLC, "safe-run-llc", "Compile with LLC"),
                         clEnumValN(Custom, "safe-run-custom",
                         "Use -exec-command to define a command to execute "
                         "the bitcode. Useful for cross-compilation."),
                         clEnumValEnd),
                     cl::init(AutoPick));

  cl::opt<std::string>
  SafeInterpreterPath("safe-path",
                   cl::desc("Specify the path to the \"safe\" backend program"),
                   cl::init(""));

  cl::opt<bool>
  AppendProgramExitCode("append-exit-code",
      cl::desc("Append the exit code to the output so it gets diff'd too"),
      cl::init(false));

  cl::opt<std::string>
  InputFile("input", cl::init("/dev/null"),
            cl::desc("Filename to pipe in as stdin (default: /dev/null)"));

  cl::list<std::string>
  AdditionalSOs("additional-so",
                cl::desc("Additional shared objects to load "
                         "into executing programs"));

  cl::list<std::string>
  AdditionalLinkerArgs("Xlinker",
      cl::desc("Additional arguments to pass to the linker"));

  cl::opt<std::string>
  CustomCompileCommand("compile-command", cl::init("llc"),
      cl::desc("Command to compile the bitcode (use with -compile-custom) "
               "(default: llc)"));

  cl::opt<std::string>
  CustomExecCommand("exec-command", cl::init("simulate"),
      cl::desc("Command to execute the bitcode (use with -run-custom) "
               "(default: simulate)"));
}

namespace llvm {
  // Anything specified after the --args option are taken as arguments to the
  // program being debugged.
  cl::list<std::string>
  InputArgv("args", cl::Positional, cl::desc("<program arguments>..."),
            cl::ZeroOrMore, cl::PositionalEatsArgs);

  cl::opt<std::string>
  OutputPrefix("output-prefix", cl::init("bugpoint"),
            cl::desc("Prefix to use for outputs (default: 'bugpoint')"));
}

namespace {
  cl::list<std::string>
  ToolArgv("tool-args", cl::Positional, cl::desc("<tool arguments>..."),
           cl::ZeroOrMore, cl::PositionalEatsArgs);

  cl::list<std::string>
  SafeToolArgv("safe-tool-args", cl::Positional,
               cl::desc("<safe-tool arguments>..."),
               cl::ZeroOrMore, cl::PositionalEatsArgs);

  cl::opt<std::string>
  GCCBinary("gcc", cl::init("gcc"),
              cl::desc("The gcc binary to use. (default 'gcc')"));

  cl::list<std::string>
  GCCToolArgv("gcc-tool-args", cl::Positional,
              cl::desc("<gcc-tool arguments>..."),
              cl::ZeroOrMore, cl::PositionalEatsArgs);
}

//===----------------------------------------------------------------------===//
// BugDriver method implementation
//

/// initializeExecutionEnvironment - This method is used to set up the
/// environment for executing LLVM programs.
///
bool BugDriver::initializeExecutionEnvironment() {
  outs() << "Initializing execution environment: ";

  // Create an instance of the AbstractInterpreter interface as specified on
  // the command line
  SafeInterpreter = 0;
  std::string Message;

  switch (InterpreterSel) {
  case AutoPick:
    if (!Interpreter) {
      InterpreterSel = RunJIT;
      Interpreter = AbstractInterpreter::createJIT(getToolName(), Message,
                                                   &ToolArgv);
    }
    if (!Interpreter) {
      InterpreterSel = RunLLC;
      Interpreter = AbstractInterpreter::createLLC(getToolName(), Message,
                                                   GCCBinary, &ToolArgv,
                                                   &GCCToolArgv);
    }
    if (!Interpreter) {
      InterpreterSel = RunLLI;
      Interpreter = AbstractInterpreter::createLLI(getToolName(), Message,
                                                   &ToolArgv);
    }
    if (!Interpreter) {
      InterpreterSel = AutoPick;
      Message = "Sorry, I can't automatically select an interpreter!\n";
    }
    break;
  case RunLLI:
    Interpreter = AbstractInterpreter::createLLI(getToolName(), Message,
                                                 &ToolArgv);
    break;
  case RunLLC:
  case RunLLCIA:
  case LLC_Safe:
    Interpreter = AbstractInterpreter::createLLC(getToolName(), Message,
                                                 GCCBinary, &ToolArgv,
                                                 &GCCToolArgv,
                                                 InterpreterSel == RunLLCIA);
    break;
  case RunJIT:
    Interpreter = AbstractInterpreter::createJIT(getToolName(), Message,
                                                 &ToolArgv);
    break;
  case CompileCustom:
    Interpreter =
      AbstractInterpreter::createCustomCompiler(Message, CustomCompileCommand);
    break;
  case Custom:
    Interpreter =
      AbstractInterpreter::createCustomExecutor(Message, CustomExecCommand);
    break;
  }
  if (!Interpreter)
    errs() << Message;
  else // Display informational messages on stdout instead of stderr
    outs() << Message;

  std::string Path = SafeInterpreterPath;
  if (Path.empty())
    Path = getToolName();
  std::vector<std::string> SafeToolArgs = SafeToolArgv;
  switch (SafeInterpreterSel) {
  case AutoPick:
    // In "llc-safe" mode, default to using LLC as the "safe" backend.
    if (!SafeInterpreter &&
        InterpreterSel == LLC_Safe) {
      SafeInterpreterSel = RunLLC;
      SafeToolArgs.push_back("--relocation-model=pic");
      SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message,
                                                       GCCBinary,
                                                       &SafeToolArgs,
                                                       &GCCToolArgv);
    }

    if (!SafeInterpreter &&
        InterpreterSel != RunLLC &&
        InterpreterSel != RunJIT) {
      SafeInterpreterSel = RunLLC;
      SafeToolArgs.push_back("--relocation-model=pic");
      SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message,
                                                       GCCBinary,
                                                       &SafeToolArgs,
                                                       &GCCToolArgv);
    }
    if (!SafeInterpreter) {
      SafeInterpreterSel = AutoPick;
      Message = "Sorry, I can't automatically select a safe interpreter!\n";
    }
    break;
  case RunLLC:
  case RunLLCIA:
    SafeToolArgs.push_back("--relocation-model=pic");
    SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message,
                                                     GCCBinary, &SafeToolArgs,
                                                     &GCCToolArgv,
                                                SafeInterpreterSel == RunLLCIA);
    break;
  case Custom:
    SafeInterpreter =
      AbstractInterpreter::createCustomExecutor(Message, CustomExecCommand);
    break;
  default:
    Message = "Sorry, this back-end is not supported by bugpoint as the "
              "\"safe\" backend right now!\n";
    break;
  }
  if (!SafeInterpreter) { outs() << Message << "\nExiting.\n"; exit(1); }

  gcc = GCC::create(Message, GCCBinary, &GCCToolArgv);
  if (!gcc) { outs() << Message << "\nExiting.\n"; exit(1); }

  // If there was an error creating the selected interpreter, quit with error.
  return Interpreter == 0;
}

/// compileProgram - Try to compile the specified module, returning false and
/// setting Error if an error occurs.  This is used for code generation
/// crash testing.
///
void BugDriver::compileProgram(Module *M, std::string *Error) const {
  // Emit the program to a bitcode file...
  sys::Path BitcodeFile (OutputPrefix + "-test-program.bc");
  std::string ErrMsg;
  if (BitcodeFile.makeUnique(true, &ErrMsg)) {
    errs() << ToolName << ": Error making unique filename: " << ErrMsg
           << "\n";
    exit(1);
  }
  if (writeProgramToFile(BitcodeFile.str(), M)) {
    errs() << ToolName << ": Error emitting bitcode to file '"
           << BitcodeFile.str() << "'!\n";
    exit(1);
  }

  // Remove the temporary bitcode file when we are done.
  FileRemover BitcodeFileRemover(BitcodeFile.str(), !SaveTemps);

  // Actually compile the program!
  Interpreter->compileProgram(BitcodeFile.str(), Error, Timeout, MemoryLimit);
}


/// executeProgram - This method runs "Program", capturing the output of the
/// program to a file, returning the filename of the file.  A recommended
/// filename may be optionally specified.
///
std::string BugDriver::executeProgram(const Module *Program,
                                      std::string OutputFile,
                                      std::string BitcodeFile,
                                      const std::string &SharedObj,
                                      AbstractInterpreter *AI,
                                      std::string *Error) const {
  if (AI == 0) AI = Interpreter;
  assert(AI && "Interpreter should have been created already!");
  bool CreatedBitcode = false;
  std::string ErrMsg;
  if (BitcodeFile.empty()) {
    // Emit the program to a bitcode file...
    sys::Path uniqueFilename(OutputPrefix + "-test-program.bc");
    if (uniqueFilename.makeUnique(true, &ErrMsg)) {
      errs() << ToolName << ": Error making unique filename: "
             << ErrMsg << "!\n";
      exit(1);
    }
    BitcodeFile = uniqueFilename.str();

    if (writeProgramToFile(BitcodeFile, Program)) {
      errs() << ToolName << ": Error emitting bitcode to file '"
             << BitcodeFile << "'!\n";
      exit(1);
    }
    CreatedBitcode = true;
  }

  // Remove the temporary bitcode file when we are done.
  sys::Path BitcodePath(BitcodeFile);
  FileRemover BitcodeFileRemover(BitcodePath.str(),
    CreatedBitcode && !SaveTemps);

  if (OutputFile.empty()) OutputFile = OutputPrefix + "-execution-output";

  // Check to see if this is a valid output filename...
  sys::Path uniqueFile(OutputFile);
  if (uniqueFile.makeUnique(true, &ErrMsg)) {
    errs() << ToolName << ": Error making unique filename: "
           << ErrMsg << "\n";
    exit(1);
  }
  OutputFile = uniqueFile.str();

  // Figure out which shared objects to run, if any.
  std::vector<std::string> SharedObjs(AdditionalSOs);
  if (!SharedObj.empty())
    SharedObjs.push_back(SharedObj);

  int RetVal = AI->ExecuteProgram(BitcodeFile, InputArgv, InputFile, OutputFile,
                                  Error, AdditionalLinkerArgs, SharedObjs,
                                  Timeout, MemoryLimit);
  if (!Error->empty())
    return OutputFile;

  if (RetVal == -1) {
    errs() << "<timeout>";
    static bool FirstTimeout = true;
    if (FirstTimeout) {
      outs() << "\n"
 "*** Program execution timed out!  This mechanism is designed to handle\n"
 "    programs stuck in infinite loops gracefully.  The -timeout option\n"
 "    can be used to change the timeout threshold or disable it completely\n"
 "    (with -timeout=0).  This message is only displayed once.\n";
      FirstTimeout = false;
    }
  }

  if (AppendProgramExitCode) {
    std::ofstream outFile(OutputFile.c_str(), std::ios_base::app);
    outFile << "exit " << RetVal << '\n';
    outFile.close();
  }

  // Return the filename we captured the output to.
  return OutputFile;
}

/// executeProgramSafely - Used to create reference output with the "safe"
/// backend, if reference output is not provided.
///
std::string BugDriver::executeProgramSafely(const Module *Program,
                                            std::string OutputFile,
                                            std::string *Error) const {
  return executeProgram(Program, OutputFile, "", "", SafeInterpreter, Error);
}

std::string BugDriver::compileSharedObject(const std::string &BitcodeFile,
                                           std::string &Error) {
  assert(Interpreter && "Interpreter should have been created already!");
  sys::Path OutputFile;

  // Using the known-good backend.
  GCC::FileType FT = SafeInterpreter->OutputCode(BitcodeFile, OutputFile,
                                                 Error);
  if (!Error.empty())
    return "";

  std::string SharedObjectFile;
  bool Failure = gcc->MakeSharedObject(OutputFile.str(), FT, SharedObjectFile,
                                       AdditionalLinkerArgs, Error);
  if (!Error.empty())
    return "";
  if (Failure)
    exit(1);

  // Remove the intermediate C file
  OutputFile.eraseFromDisk();

  return "./" + SharedObjectFile;
}

/// createReferenceFile - calls compileProgram and then records the output
/// into ReferenceOutputFile. Returns true if reference file created, false
/// otherwise. Note: initializeExecutionEnvironment should be called BEFORE
/// this function.
///
bool BugDriver::createReferenceFile(Module *M, const std::string &Filename) {
  std::string Error;
  compileProgram(Program, &Error);
  if (!Error.empty())
    return false;

  ReferenceOutputFile = executeProgramSafely(Program, Filename, &Error);
  if (!Error.empty()) {
    errs() << Error;
    if (Interpreter != SafeInterpreter) {
      errs() << "*** There is a bug running the \"safe\" backend.  Either"
             << " debug it (for example with the -run-jit bugpoint option,"
             << " if JIT is being used as the \"safe\" backend), or fix the"
             << " error some other way.\n";
    }
    return false;
  }
  outs() << "\nReference output is: " << ReferenceOutputFile << "\n\n";
  return true;
}

/// diffProgram - This method executes the specified module and diffs the
/// output against the file specified by ReferenceOutputFile.  If the output
/// is different, 1 is returned.  If there is a problem with the code
/// generator (e.g., llc crashes), this will set ErrMsg.
///
bool BugDriver::diffProgram(const Module *Program,
                            const std::string &BitcodeFile,
                            const std::string &SharedObject,
                            bool RemoveBitcode,
                            std::string *ErrMsg) const {
  // Execute the program, generating an output file...
  sys::Path Output(executeProgram(Program, "", BitcodeFile, SharedObject, 0,
                                  ErrMsg));
  if (!ErrMsg->empty())
    return false;

  std::string Error;
  bool FilesDifferent = false;
  if (int Diff = DiffFilesWithTolerance(sys::Path(ReferenceOutputFile),
                                        sys::Path(Output.str()),
                                        AbsTolerance, RelTolerance, &Error)) {
    if (Diff == 2) {
      errs() << "While diffing output: " << Error << '\n';
      exit(1);
    }
    FilesDifferent = true;
  }
  else {
    // Remove the generated output if there are no differences.
    Output.eraseFromDisk();
  }

  // Remove the bitcode file if we are supposed to.
  if (RemoveBitcode)
    sys::Path(BitcodeFile).eraseFromDisk();
  return FilesDifferent;
}

bool BugDriver::isExecutingJIT() {
  return InterpreterSel == RunJIT;
}

