ExecutionDriver.cpp revision b5ee509be2ce78badc11fd649dda90ec78394d1a
14a10645c70199c8d8567fbc46312158c419720abChris Lattner//===- ExecutionDriver.cpp - Allow execution of LLVM program --------------===//
27c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
37c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//                     The LLVM Compiler Infrastructure
47c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
57c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// This file was developed by the LLVM research group and is distributed under
67c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details.
77c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//
87c0e022c5c4be4b11e199a53f73bbdd84e34aa80John Criswell//===----------------------------------------------------------------------===//
94a10645c70199c8d8567fbc46312158c419720abChris Lattner//
104a10645c70199c8d8567fbc46312158c419720abChris Lattner// This file contains code used to execute the program utilizing one of the
114a10645c70199c8d8567fbc46312158c419720abChris Lattner// various ways of running LLVM bytecode.
124a10645c70199c8d8567fbc46312158c419720abChris Lattner//
134a10645c70199c8d8567fbc46312158c419720abChris Lattner//===----------------------------------------------------------------------===//
144a10645c70199c8d8567fbc46312158c419720abChris Lattner
154a10645c70199c8d8567fbc46312158c419720abChris Lattner/*
164a10645c70199c8d8567fbc46312158c419720abChris LattnerBUGPOINT NOTES:
174a10645c70199c8d8567fbc46312158c419720abChris Lattner
184a10645c70199c8d8567fbc46312158c419720abChris Lattner1. Bugpoint should not leave any files behind if the program works properly
194a10645c70199c8d8567fbc46312158c419720abChris Lattner2. There should be an option to specify the program name, which specifies a
204a10645c70199c8d8567fbc46312158c419720abChris Lattner   unique string to put into output files.  This allows operation in the
215073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman   SingleSource directory, e.g. default to the first input filename.
224a10645c70199c8d8567fbc46312158c419720abChris Lattner*/
234a10645c70199c8d8567fbc46312158c419720abChris Lattner
244a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "BugDriver.h"
254a10645c70199c8d8567fbc46312158c419720abChris Lattner#include "Support/CommandLine.h"
26c648dabf65c67d20c208ed0b39b9622387e636c7Chris Lattner#include "Support/Debug.h"
2765f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner#include "Support/FileUtilities.h"
28e49603d79d220a795bd50684c8b1f503ee40f97fMisha Brukman#include "Support/SystemUtils.h"
295de0bac111fc9d4e290b9a743a02b866154c12e5Chris Lattner#include "llvm/Support/ToolRunner.h"
304a10645c70199c8d8567fbc46312158c419720abChris Lattner#include <fstream>
31e1b52b765675015eee5ce9efdb1b81c6c3eaefb1Chris Lattner#include <iostream>
324a10645c70199c8d8567fbc46312158c419720abChris Lattner
334a10645c70199c8d8567fbc46312158c419720abChris Lattnernamespace {
344a10645c70199c8d8567fbc46312158c419720abChris Lattner  // OutputType - Allow the user to specify the way code should be run, to test
354a10645c70199c8d8567fbc46312158c419720abChris Lattner  // for miscompilation.
364a10645c70199c8d8567fbc46312158c419720abChris Lattner  //
374a10645c70199c8d8567fbc46312158c419720abChris Lattner  enum OutputType {
38b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    AutoPick, RunLLI, RunJIT, RunLLC, RunCBE
394a10645c70199c8d8567fbc46312158c419720abChris Lattner  };
404148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman
414a10645c70199c8d8567fbc46312158c419720abChris Lattner  cl::opt<OutputType>
424a10645c70199c8d8567fbc46312158c419720abChris Lattner  InterpreterSel(cl::desc("Specify how LLVM code should be executed:"),
43b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke                 cl::values(clEnumValN(AutoPick, "auto", "Use best guess"),
44b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke                            clEnumValN(RunLLI, "run-int", "Execute with the interpreter"),
455073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                            clEnumValN(RunJIT, "run-jit", "Execute with JIT"),
465073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                            clEnumValN(RunLLC, "run-llc", "Compile with LLC"),
475073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                            clEnumValN(RunCBE, "run-cbe", "Compile with CBE"),
4825d66473c620b6b01e301b9cfabdbedace96608eChris Lattner                            0),
49b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke                 cl::init(AutoPick));
503c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner
513c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner  cl::opt<std::string>
523c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner  InputFile("input", cl::init("/dev/null"),
533c053a0a98e19f5ac8905011ad4c8238b08d6aeaChris Lattner            cl::desc("Filename to pipe in as stdin (default: /dev/null)"));
547dac658792425c10274594782d6fcf10208a16f0Chris Lattner
557dac658792425c10274594782d6fcf10208a16f0Chris Lattner  cl::list<std::string>
567dac658792425c10274594782d6fcf10208a16f0Chris Lattner  AdditionalSOs("additional-so",
577dac658792425c10274594782d6fcf10208a16f0Chris Lattner                cl::desc("Additional shared objects to load "
587dac658792425c10274594782d6fcf10208a16f0Chris Lattner                         "into executing programs"));
594a10645c70199c8d8567fbc46312158c419720abChris Lattner}
604a10645c70199c8d8567fbc46312158c419720abChris Lattner
619d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha Brukman// Anything specified after the --args option are taken as arguments to the
629d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha Brukman// program being debugged.
639d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha Brukmancl::list<std::string>
649d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha BrukmanInputArgv("args", cl::Positional, cl::desc("<program arguments>..."),
659d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha Brukman          cl::ZeroOrMore);
669d679cbc6cb5c7dc8cca87a1e1548c480fb056b8Misha Brukman
674a10645c70199c8d8567fbc46312158c419720abChris Lattner//===----------------------------------------------------------------------===//
684a10645c70199c8d8567fbc46312158c419720abChris Lattner// BugDriver method implementation
694a10645c70199c8d8567fbc46312158c419720abChris Lattner//
704a10645c70199c8d8567fbc46312158c419720abChris Lattner
714a10645c70199c8d8567fbc46312158c419720abChris Lattner/// initializeExecutionEnvironment - This method is used to set up the
724a10645c70199c8d8567fbc46312158c419720abChris Lattner/// environment for executing LLVM programs.
734a10645c70199c8d8567fbc46312158c419720abChris Lattner///
744a10645c70199c8d8567fbc46312158c419720abChris Lattnerbool BugDriver::initializeExecutionEnvironment() {
754a10645c70199c8d8567fbc46312158c419720abChris Lattner  std::cout << "Initializing execution environment: ";
764a10645c70199c8d8567fbc46312158c419720abChris Lattner
774148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman  // Create an instance of the AbstractInterpreter interface as specified on
784148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman  // the command line
794a10645c70199c8d8567fbc46312158c419720abChris Lattner  std::string Message;
80cc876a7421f6dbcca98446058d5f0637092c6e1aChris Lattner  switch (InterpreterSel) {
81b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke  case AutoPick:
82b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    InterpreterSel = RunCBE;
83b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    Interpreter = AbstractInterpreter::createCBE(getToolName(), Message);
84b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    if (!Interpreter) {
85b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      InterpreterSel = RunJIT;
86b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      Interpreter = AbstractInterpreter::createJIT(getToolName(), Message);
87b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    }
88b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    if (!Interpreter) {
89b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      InterpreterSel = RunLLC;
90b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      Interpreter = AbstractInterpreter::createLLC(getToolName(), Message);
91b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    }
92b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    if (!Interpreter) {
93b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      InterpreterSel = RunLLI;
94b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      Interpreter = AbstractInterpreter::createLLI(getToolName(), Message);
95b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    }
96b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    if (!Interpreter) {
97b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      InterpreterSel = AutoPick;
98b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke      Message = "Sorry, I can't automatically select an interpreter!\n";
99b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    }
100b5ee509be2ce78badc11fd649dda90ec78394d1aBrian Gaeke    break;
101769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  case RunLLI:
102769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    Interpreter = AbstractInterpreter::createLLI(getToolName(), Message);
103769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    break;
104769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  case RunLLC:
105769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    Interpreter = AbstractInterpreter::createLLC(getToolName(), Message);
106769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    break;
107769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  case RunJIT:
108769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    Interpreter = AbstractInterpreter::createJIT(getToolName(), Message);
109769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    break;
110769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  case RunCBE:
111769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    Interpreter = AbstractInterpreter::createCBE(getToolName(), Message);
112769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    break;
113cc876a7421f6dbcca98446058d5f0637092c6e1aChris Lattner  default:
1144148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman    Message = "Sorry, this back-end is not supported by bugpoint right now!\n";
115cc876a7421f6dbcca98446058d5f0637092c6e1aChris Lattner    break;
1164a10645c70199c8d8567fbc46312158c419720abChris Lattner  }
1174148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman  std::cerr << Message;
1184a10645c70199c8d8567fbc46312158c419720abChris Lattner
119a259c9be2acc9528ec7feb3cfd51dcde36d87bb3Misha Brukman  // Initialize auxiliary tools for debugging
120769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  cbe = AbstractInterpreter::createCBE(getToolName(), Message);
121a259c9be2acc9528ec7feb3cfd51dcde36d87bb3Misha Brukman  if (!cbe) { std::cout << Message << "\nExiting.\n"; exit(1); }
122769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  gcc = GCC::create(getToolName(), Message);
123a259c9be2acc9528ec7feb3cfd51dcde36d87bb3Misha Brukman  if (!gcc) { std::cout << Message << "\nExiting.\n"; exit(1); }
124a259c9be2acc9528ec7feb3cfd51dcde36d87bb3Misha Brukman
1254a10645c70199c8d8567fbc46312158c419720abChris Lattner  // If there was an error creating the selected interpreter, quit with error.
1264a10645c70199c8d8567fbc46312158c419720abChris Lattner  return Interpreter == 0;
1274a10645c70199c8d8567fbc46312158c419720abChris Lattner}
1284a10645c70199c8d8567fbc46312158c419720abChris Lattner
1294a10645c70199c8d8567fbc46312158c419720abChris Lattner
1304a10645c70199c8d8567fbc46312158c419720abChris Lattner/// executeProgram - This method runs "Program", capturing the output of the
1314a10645c70199c8d8567fbc46312158c419720abChris Lattner/// program to a file, returning the filename of the file.  A recommended
1324a10645c70199c8d8567fbc46312158c419720abChris Lattner/// filename may be optionally specified.
1334a10645c70199c8d8567fbc46312158c419720abChris Lattner///
1344a10645c70199c8d8567fbc46312158c419720abChris Lattnerstd::string BugDriver::executeProgram(std::string OutputFile,
1355073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                                      std::string BytecodeFile,
136769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner                                      const std::string &SharedObj,
1375073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                                      AbstractInterpreter *AI) {
138769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  if (AI == 0) AI = Interpreter;
139769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  assert(AI && "Interpreter should have been created already!");
1404a10645c70199c8d8567fbc46312158c419720abChris Lattner  bool CreatedBytecode = false;
1414a10645c70199c8d8567fbc46312158c419720abChris Lattner  if (BytecodeFile.empty()) {
1424a10645c70199c8d8567fbc46312158c419720abChris Lattner    // Emit the program to a bytecode file...
1434a10645c70199c8d8567fbc46312158c419720abChris Lattner    BytecodeFile = getUniqueFilename("bugpoint-test-program.bc");
1444a10645c70199c8d8567fbc46312158c419720abChris Lattner
1454a10645c70199c8d8567fbc46312158c419720abChris Lattner    if (writeProgramToFile(BytecodeFile, Program)) {
1464a10645c70199c8d8567fbc46312158c419720abChris Lattner      std::cerr << ToolName << ": Error emitting bytecode to file '"
1475073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                << BytecodeFile << "'!\n";
1484a10645c70199c8d8567fbc46312158c419720abChris Lattner      exit(1);
1494a10645c70199c8d8567fbc46312158c419720abChris Lattner    }
1504a10645c70199c8d8567fbc46312158c419720abChris Lattner    CreatedBytecode = true;
1514a10645c70199c8d8567fbc46312158c419720abChris Lattner  }
1524a10645c70199c8d8567fbc46312158c419720abChris Lattner
1534a10645c70199c8d8567fbc46312158c419720abChris Lattner  if (OutputFile.empty()) OutputFile = "bugpoint-execution-output";
1545073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
1554a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Check to see if this is a valid output filename...
1564a10645c70199c8d8567fbc46312158c419720abChris Lattner  OutputFile = getUniqueFilename(OutputFile);
1574a10645c70199c8d8567fbc46312158c419720abChris Lattner
158769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  // Figure out which shared objects to run, if any.
1597dac658792425c10274594782d6fcf10208a16f0Chris Lattner  std::vector<std::string> SharedObjs(AdditionalSOs);
160769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  if (!SharedObj.empty())
161769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner    SharedObjs.push_back(SharedObj);
162769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner
1634a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Actually execute the program!
164769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  int RetVal = AI->ExecuteProgram(BytecodeFile, InputArgv, InputFile,
165769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner                                  OutputFile, SharedObjs);
166769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner
1674a10645c70199c8d8567fbc46312158c419720abChris Lattner
1684a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Remove the temporary bytecode file.
1695073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  if (CreatedBytecode) removeFile(BytecodeFile);
1704a10645c70199c8d8567fbc46312158c419720abChris Lattner
1714a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Return the filename we captured the output to.
1724a10645c70199c8d8567fbc46312158c419720abChris Lattner  return OutputFile;
1734a10645c70199c8d8567fbc46312158c419720abChris Lattner}
1744a10645c70199c8d8567fbc46312158c419720abChris Lattner
1755073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
176a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattnerstd::string BugDriver::compileSharedObject(const std::string &BytecodeFile) {
1775073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  assert(Interpreter && "Interpreter should have been created already!");
178a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner  std::string OutputCFile;
1795073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
1805073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  // Using CBE
1815073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  cbe->OutputC(BytecodeFile, OutputCFile);
1825073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
1835073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman#if 0 /* This is an alternative, as yet unimplemented */
1845073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  // Using LLC
185a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner  std::string Message;
1864148556a9c767fdf3047ae8e004a759356b893ddMisha Brukman  LLC *llc = createLLCtool(Message);
1875073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  if (llc->OutputAsm(BytecodeFile, OutputFile)) {
1885073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman    std::cerr << "Could not generate asm code with `llc', exiting.\n";
1895073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman    exit(1);
1905073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  }
1915073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman#endif
1925073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
193a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner  std::string SharedObjectFile;
194769f1fe6728ffb5627ae0cedc392576d6e701a5aChris Lattner  if (gcc->MakeSharedObject(OutputCFile, GCC::CFile, SharedObjectFile))
195a0f5b15e1eb8642d92b3141a6b88a5729ea979dcChris Lattner    exit(1);
1965073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
1975073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  // Remove the intermediate C file
1985073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  removeFile(OutputCFile);
1995073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
2006ebe44d22f6dd1ab9f7aa1f3cfd02be52145d535Chris Lattner  return "./" + SharedObjectFile;
2015073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman}
2025073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
2035073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman
2044a10645c70199c8d8567fbc46312158c419720abChris Lattner/// diffProgram - This method executes the specified module and diffs the output
2054a10645c70199c8d8567fbc46312158c419720abChris Lattner/// against the file specified by ReferenceOutputFile.  If the output is
2064a10645c70199c8d8567fbc46312158c419720abChris Lattner/// different, true is returned.
2074a10645c70199c8d8567fbc46312158c419720abChris Lattner///
2085073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukmanbool BugDriver::diffProgram(const std::string &BytecodeFile,
2095073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman                            const std::string &SharedObject,
210640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner                            bool RemoveBytecode) {
2114a10645c70199c8d8567fbc46312158c419720abChris Lattner  // Execute the program, generating an output file...
2125073336cd4da5df4ae13a167582d1dc90f32e4e0Misha Brukman  std::string Output = executeProgram("", BytecodeFile, SharedObject);
2134a10645c70199c8d8567fbc46312158c419720abChris Lattner
21465f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner  std::string Error;
2154a10645c70199c8d8567fbc46312158c419720abChris Lattner  bool FilesDifferent = false;
21665f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner  if (DiffFiles(ReferenceOutputFile, Output, &Error)) {
21765f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner    if (!Error.empty()) {
21865f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner      std::cerr << "While diffing output: " << Error << "\n";
21965f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner      exit(1);
22065f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner    }
22165f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner    FilesDifferent = true;
22265f62790d6e3e7f7ceb9cd12a7a51a66d95a3b03Chris Lattner  }
2231a28a2b76d16913fe38f47032d31620a55dcce2eChris Lattner
2241a28a2b76d16913fe38f47032d31620a55dcce2eChris Lattner  // Remove the generated output.
2251a28a2b76d16913fe38f47032d31620a55dcce2eChris Lattner  removeFile(Output);
2264a10645c70199c8d8567fbc46312158c419720abChris Lattner
2271a28a2b76d16913fe38f47032d31620a55dcce2eChris Lattner  // Remove the bytecode file if we are supposed to.
228640f22e66d90439857a97a83896ee68c4f7128c9Chris Lattner  if (RemoveBytecode) removeFile(BytecodeFile);
2294a10645c70199c8d8567fbc46312158c419720abChris Lattner  return FilesDifferent;
2304a10645c70199c8d8567fbc46312158c419720abChris Lattner}
23191eabc13d3a456cc4b387d3d7fdb041d976732c7Misha Brukman
23291eabc13d3a456cc4b387d3d7fdb041d976732c7Misha Brukmanbool BugDriver::isExecutingJIT() {
23391eabc13d3a456cc4b387d3d7fdb041d976732c7Misha Brukman  return InterpreterSel == RunJIT;
23491eabc13d3a456cc4b387d3d7fdb041d976732c7Misha Brukman}
235