| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 1 | //===- ExecutionDriver.cpp - Allow execution of LLVM program --------------===// | 
| Misha Brukman | 3da94ae | 2005-04-22 00:00:37 +0000 | [diff] [blame] | 2 | // | 
| John Criswell | 7c0e022 | 2003-10-20 17:47:21 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
| Chris Lattner | 21c62da | 2007-12-29 20:44:31 +0000 | [diff] [blame] | 5 | // This file is distributed under the University of Illinois Open Source | 
 | 6 | // License. See LICENSE.TXT for details. | 
| Misha Brukman | 3da94ae | 2005-04-22 00:00:37 +0000 | [diff] [blame] | 7 | // | 
| John Criswell | 7c0e022 | 2003-10-20 17:47:21 +0000 | [diff] [blame] | 8 | //===----------------------------------------------------------------------===// | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 9 | // | 
 | 10 | // This file contains code used to execute the program utilizing one of the | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 11 | // various ways of running LLVM bitcode. | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 12 | // | 
 | 13 | //===----------------------------------------------------------------------===// | 
 | 14 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 15 | #include "BugDriver.h" | 
| Chris Lattner | f1b20d8 | 2006-06-06 22:30:59 +0000 | [diff] [blame] | 16 | #include "ToolRunner.h" | 
| Reid Spencer | 551ccae | 2004-09-01 22:55:40 +0000 | [diff] [blame] | 17 | #include "llvm/Support/CommandLine.h" | 
 | 18 | #include "llvm/Support/Debug.h" | 
 | 19 | #include "llvm/Support/FileUtilities.h" | 
 | 20 | #include "llvm/Support/SystemUtils.h" | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 21 | #include "llvm/Support/raw_ostream.h" | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 22 | #include <fstream> | 
| Reid Spencer | 51ab5c8 | 2006-06-06 00:00:42 +0000 | [diff] [blame] | 23 |  | 
| Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 24 | using namespace llvm; | 
 | 25 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 26 | namespace { | 
 | 27 |   // OutputType - Allow the user to specify the way code should be run, to test | 
 | 28 |   // for miscompilation. | 
 | 29 |   // | 
 | 30 |   enum OutputType { | 
| Anton Korobeynikov | 9ef7425 | 2008-04-28 20:53:48 +0000 | [diff] [blame] | 31 |     AutoPick, RunLLI, RunJIT, RunLLC, RunCBE, CBE_bug, LLC_Safe, Custom | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 32 |   }; | 
| Misha Brukman | 4148556 | 2003-09-29 22:40:52 +0000 | [diff] [blame] | 33 |  | 
| Chris Lattner | a328c51 | 2005-01-23 03:45:26 +0000 | [diff] [blame] | 34 |   cl::opt<double> | 
 | 35 |   AbsTolerance("abs-tolerance", cl::desc("Absolute error tolerated"), | 
 | 36 |                cl::init(0.0)); | 
 | 37 |   cl::opt<double> | 
 | 38 |   RelTolerance("rel-tolerance", cl::desc("Relative error tolerated"), | 
 | 39 |                cl::init(0.0)); | 
 | 40 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 41 |   cl::opt<OutputType> | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 42 |   InterpreterSel(cl::desc("Specify the \"test\" i.e. suspect back-end:"), | 
| Brian Gaeke | b5ee509 | 2003-10-21 17:41:35 +0000 | [diff] [blame] | 43 |                  cl::values(clEnumValN(AutoPick, "auto", "Use best guess"), | 
| Misha Brukman | b687d82 | 2004-04-19 03:12:35 +0000 | [diff] [blame] | 44 |                             clEnumValN(RunLLI, "run-int", | 
 | 45 |                                        "Execute with the interpreter"), | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 46 |                             clEnumValN(RunJIT, "run-jit", "Execute with JIT"), | 
 | 47 |                             clEnumValN(RunLLC, "run-llc", "Compile with LLC"), | 
 | 48 |                             clEnumValN(RunCBE, "run-cbe", "Compile with CBE"), | 
| Chris Lattner | c600f3c | 2006-09-15 21:29:15 +0000 | [diff] [blame] | 49 |                             clEnumValN(CBE_bug,"cbe-bug", "Find CBE bugs"), | 
| Chris Lattner | cd6f46e | 2006-11-09 05:57:53 +0000 | [diff] [blame] | 50 |                             clEnumValN(LLC_Safe, "llc-safe", "Use LLC for all"), | 
| Anton Korobeynikov | 9ef7425 | 2008-04-28 20:53:48 +0000 | [diff] [blame] | 51 |                             clEnumValN(Custom, "run-custom", | 
 | 52 |                             "Use -exec-command to define a command to execute " | 
 | 53 |                             "the bitcode. Useful for cross-compilation."), | 
| Chris Lattner | 4d143ee | 2004-07-16 00:08:28 +0000 | [diff] [blame] | 54 |                             clEnumValEnd), | 
| Brian Gaeke | b5ee509 | 2003-10-21 17:41:35 +0000 | [diff] [blame] | 55 |                  cl::init(AutoPick)); | 
| Chris Lattner | 3c053a0 | 2003-04-23 20:31:37 +0000 | [diff] [blame] | 56 |  | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 57 |   cl::opt<OutputType> | 
 | 58 |   SafeInterpreterSel(cl::desc("Specify \"safe\" i.e. known-good backend:"), | 
| Evan Cheng | 49419e2 | 2009-07-21 19:25:09 +0000 | [diff] [blame] | 59 |               cl::values(clEnumValN(AutoPick, "safe-auto", "Use best guess"), | 
 | 60 |                          clEnumValN(RunLLC, "safe-run-llc", "Compile with LLC"), | 
 | 61 |                          clEnumValN(RunCBE, "safe-run-cbe", "Compile with CBE"), | 
 | 62 |                          clEnumValN(Custom, "safe-run-custom", | 
 | 63 |                          "Use -exec-command to define a command to execute " | 
 | 64 |                          "the bitcode. Useful for cross-compilation."), | 
 | 65 |                          clEnumValEnd), | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 66 |                      cl::init(AutoPick)); | 
 | 67 |  | 
 | 68 |   cl::opt<std::string> | 
 | 69 |   SafeInterpreterPath("safe-path", | 
| Evan Cheng | 49419e2 | 2009-07-21 19:25:09 +0000 | [diff] [blame] | 70 |                    cl::desc("Specify the path to the \"safe\" backend program"), | 
 | 71 |                    cl::init("")); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 72 |  | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 73 |   cl::opt<bool> | 
| Reid Spencer | 5e1452c | 2006-11-28 07:04:10 +0000 | [diff] [blame] | 74 |   AppendProgramExitCode("append-exit-code", | 
 | 75 |       cl::desc("Append the exit code to the output so it gets diff'd too"), | 
 | 76 |       cl::init(false)); | 
 | 77 |  | 
| Chris Lattner | 3c053a0 | 2003-04-23 20:31:37 +0000 | [diff] [blame] | 78 |   cl::opt<std::string> | 
 | 79 |   InputFile("input", cl::init("/dev/null"), | 
 | 80 |             cl::desc("Filename to pipe in as stdin (default: /dev/null)")); | 
| Chris Lattner | 7dac658 | 2003-10-14 22:24:31 +0000 | [diff] [blame] | 81 |  | 
 | 82 |   cl::list<std::string> | 
 | 83 |   AdditionalSOs("additional-so", | 
 | 84 |                 cl::desc("Additional shared objects to load " | 
 | 85 |                          "into executing programs")); | 
| Chris Lattner | 7d91e49 | 2004-07-24 07:53:26 +0000 | [diff] [blame] | 86 |  | 
| Reid Spencer | 51ab5c8 | 2006-06-06 00:00:42 +0000 | [diff] [blame] | 87 |   cl::list<std::string> | 
| Anton Korobeynikov | 9ef7425 | 2008-04-28 20:53:48 +0000 | [diff] [blame] | 88 |   AdditionalLinkerArgs("Xlinker",  | 
| Reid Spencer | 51ab5c8 | 2006-06-06 00:00:42 +0000 | [diff] [blame] | 89 |       cl::desc("Additional arguments to pass to the linker")); | 
| Anton Korobeynikov | 9ef7425 | 2008-04-28 20:53:48 +0000 | [diff] [blame] | 90 |  | 
 | 91 |   cl::opt<std::string> | 
 | 92 |   CustomExecCommand("exec-command", cl::init("simulate"), | 
 | 93 |       cl::desc("Command to execute the bitcode (use with -run-custom) " | 
 | 94 |                "(default: simulate)")); | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 95 | } | 
 | 96 |  | 
| Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 97 | namespace llvm { | 
| Chris Lattner | fa76183 | 2004-01-14 03:38:37 +0000 | [diff] [blame] | 98 |   // Anything specified after the --args option are taken as arguments to the | 
 | 99 |   // program being debugged. | 
 | 100 |   cl::list<std::string> | 
 | 101 |   InputArgv("args", cl::Positional, cl::desc("<program arguments>..."), | 
| Chris Lattner | 60083e2 | 2004-05-06 22:05:35 +0000 | [diff] [blame] | 102 |             cl::ZeroOrMore, cl::PositionalEatsArgs); | 
| Daniel Dunbar | 68ccdaa | 2009-09-07 19:26:11 +0000 | [diff] [blame] | 103 |  | 
 | 104 |   cl::opt<std::string> | 
 | 105 |   OutputPrefix("output-prefix", cl::init("bugpoint"), | 
 | 106 |             cl::desc("Prefix to use for outputs (default: 'bugpoint')")); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 107 | } | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 108 |  | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 109 | namespace { | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 110 |   cl::list<std::string> | 
 | 111 |   ToolArgv("tool-args", cl::Positional, cl::desc("<tool arguments>..."), | 
| Chris Lattner | 60083e2 | 2004-05-06 22:05:35 +0000 | [diff] [blame] | 112 |            cl::ZeroOrMore, cl::PositionalEatsArgs); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 113 |  | 
 | 114 |   cl::list<std::string> | 
 | 115 |   SafeToolArgv("safe-tool-args", cl::Positional, | 
 | 116 |                cl::desc("<safe-tool arguments>..."), | 
 | 117 |                cl::ZeroOrMore, cl::PositionalEatsArgs); | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 118 |  | 
 | 119 |   cl::list<std::string> | 
 | 120 |   GCCToolArgv("gcc-tool-args", cl::Positional, | 
 | 121 |               cl::desc("<gcc-tool arguments>..."), | 
 | 122 |               cl::ZeroOrMore, cl::PositionalEatsArgs); | 
| Chris Lattner | fa76183 | 2004-01-14 03:38:37 +0000 | [diff] [blame] | 123 | } | 
| Misha Brukman | 9d679cb | 2003-07-30 20:15:44 +0000 | [diff] [blame] | 124 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 125 | //===----------------------------------------------------------------------===// | 
 | 126 | // BugDriver method implementation | 
 | 127 | // | 
 | 128 |  | 
 | 129 | /// initializeExecutionEnvironment - This method is used to set up the | 
 | 130 | /// environment for executing LLVM programs. | 
 | 131 | /// | 
 | 132 | bool BugDriver::initializeExecutionEnvironment() { | 
| Dan Gohman | ac95cc7 | 2009-07-16 15:30:09 +0000 | [diff] [blame] | 133 |   outs() << "Initializing execution environment: "; | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 134 |  | 
| Misha Brukman | 4148556 | 2003-09-29 22:40:52 +0000 | [diff] [blame] | 135 |   // Create an instance of the AbstractInterpreter interface as specified on | 
 | 136 |   // the command line | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 137 |   SafeInterpreter = 0; | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 138 |   std::string Message; | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 139 |  | 
| Chris Lattner | cc876a7 | 2003-05-03 03:19:41 +0000 | [diff] [blame] | 140 |   switch (InterpreterSel) { | 
| Brian Gaeke | b5ee509 | 2003-10-21 17:41:35 +0000 | [diff] [blame] | 141 |   case AutoPick: | 
 | 142 |     InterpreterSel = RunCBE; | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 143 |     Interpreter = | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 144 |       AbstractInterpreter::createCBE(getToolName(), Message, &ToolArgv, | 
 | 145 |                                      &GCCToolArgv); | 
| Brian Gaeke | b5ee509 | 2003-10-21 17:41:35 +0000 | [diff] [blame] | 146 |     if (!Interpreter) { | 
 | 147 |       InterpreterSel = RunJIT; | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 148 |       Interpreter = AbstractInterpreter::createJIT(getToolName(), Message, | 
 | 149 |                                                    &ToolArgv); | 
| Brian Gaeke | b5ee509 | 2003-10-21 17:41:35 +0000 | [diff] [blame] | 150 |     } | 
 | 151 |     if (!Interpreter) { | 
 | 152 |       InterpreterSel = RunLLC; | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 153 |       Interpreter = AbstractInterpreter::createLLC(getToolName(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 154 |                                                    &ToolArgv, &GCCToolArgv); | 
| Brian Gaeke | b5ee509 | 2003-10-21 17:41:35 +0000 | [diff] [blame] | 155 |     } | 
 | 156 |     if (!Interpreter) { | 
 | 157 |       InterpreterSel = RunLLI; | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 158 |       Interpreter = AbstractInterpreter::createLLI(getToolName(), Message, | 
 | 159 |                                                    &ToolArgv); | 
| Brian Gaeke | b5ee509 | 2003-10-21 17:41:35 +0000 | [diff] [blame] | 160 |     } | 
 | 161 |     if (!Interpreter) { | 
 | 162 |       InterpreterSel = AutoPick; | 
 | 163 |       Message = "Sorry, I can't automatically select an interpreter!\n"; | 
 | 164 |     } | 
 | 165 |     break; | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 166 |   case RunLLI: | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 167 |     Interpreter = AbstractInterpreter::createLLI(getToolName(), Message, | 
 | 168 |                                                  &ToolArgv); | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 169 |     break; | 
 | 170 |   case RunLLC: | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 171 |   case LLC_Safe: | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 172 |     Interpreter = AbstractInterpreter::createLLC(getToolName(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 173 |                                                  &ToolArgv, &GCCToolArgv); | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 174 |     break; | 
 | 175 |   case RunJIT: | 
| Brian Gaeke | 636df3d | 2004-05-04 21:09:16 +0000 | [diff] [blame] | 176 |     Interpreter = AbstractInterpreter::createJIT(getToolName(), Message, | 
 | 177 |                                                  &ToolArgv); | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 178 |     break; | 
 | 179 |   case RunCBE: | 
| Chris Lattner | c600f3c | 2006-09-15 21:29:15 +0000 | [diff] [blame] | 180 |   case CBE_bug: | 
 | 181 |     Interpreter = AbstractInterpreter::createCBE(getToolName(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 182 |                                                  &ToolArgv, &GCCToolArgv); | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 183 |     break; | 
| Anton Korobeynikov | 9ef7425 | 2008-04-28 20:53:48 +0000 | [diff] [blame] | 184 |   case Custom: | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 185 |     Interpreter = AbstractInterpreter::createCustom(Message, CustomExecCommand); | 
| Anton Korobeynikov | 9ef7425 | 2008-04-28 20:53:48 +0000 | [diff] [blame] | 186 |     break; | 
| Chris Lattner | cc876a7 | 2003-05-03 03:19:41 +0000 | [diff] [blame] | 187 |   default: | 
| Misha Brukman | 4148556 | 2003-09-29 22:40:52 +0000 | [diff] [blame] | 188 |     Message = "Sorry, this back-end is not supported by bugpoint right now!\n"; | 
| Chris Lattner | cc876a7 | 2003-05-03 03:19:41 +0000 | [diff] [blame] | 189 |     break; | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 190 |   } | 
| Matthijs Kooijman | ad6996d | 2008-06-12 13:09:43 +0000 | [diff] [blame] | 191 |   if (!Interpreter) | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 192 |     errs() << Message; | 
| Matthijs Kooijman | ad6996d | 2008-06-12 13:09:43 +0000 | [diff] [blame] | 193 |   else // Display informational messages on stdout instead of stderr | 
| Dan Gohman | ac95cc7 | 2009-07-16 15:30:09 +0000 | [diff] [blame] | 194 |     outs() << Message; | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 195 |  | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 196 |   std::string Path = SafeInterpreterPath; | 
 | 197 |   if (Path.empty()) | 
 | 198 |     Path = getToolName(); | 
 | 199 |   std::vector<std::string> SafeToolArgs = SafeToolArgv; | 
 | 200 |   switch (SafeInterpreterSel) { | 
 | 201 |   case AutoPick: | 
 | 202 |     // In "cbe-bug" mode, default to using LLC as the "safe" backend. | 
 | 203 |     if (!SafeInterpreter && | 
 | 204 |         InterpreterSel == CBE_bug) { | 
 | 205 |       SafeInterpreterSel = RunLLC; | 
 | 206 |       SafeToolArgs.push_back("--relocation-model=pic"); | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 207 |       SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 208 |                                                        &SafeToolArgs, | 
 | 209 |                                                        &GCCToolArgv); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 210 |     } | 
 | 211 |  | 
 | 212 |     // In "llc-safe" mode, default to using LLC as the "safe" backend. | 
 | 213 |     if (!SafeInterpreter && | 
 | 214 |         InterpreterSel == LLC_Safe) { | 
 | 215 |       SafeInterpreterSel = RunLLC; | 
 | 216 |       SafeToolArgs.push_back("--relocation-model=pic"); | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 217 |       SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 218 |                                                        &SafeToolArgs, | 
 | 219 |                                                        &GCCToolArgv); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 220 |     } | 
 | 221 |  | 
 | 222 |     // Pick a backend that's different from the test backend. The JIT and | 
 | 223 |     // LLC backends share a lot of code, so prefer to use the CBE as the | 
 | 224 |     // safe back-end when testing them. | 
 | 225 |     if (!SafeInterpreter && | 
 | 226 |         InterpreterSel != RunCBE) { | 
 | 227 |       SafeInterpreterSel = RunCBE; | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 228 |       SafeInterpreter = AbstractInterpreter::createCBE(Path.c_str(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 229 |                                                        &SafeToolArgs, | 
 | 230 |                                                        &GCCToolArgv); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 231 |     } | 
 | 232 |     if (!SafeInterpreter && | 
 | 233 |         InterpreterSel != RunLLC && | 
 | 234 |         InterpreterSel != RunJIT) { | 
 | 235 |       SafeInterpreterSel = RunLLC; | 
 | 236 |       SafeToolArgs.push_back("--relocation-model=pic"); | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 237 |       SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 238 |                                                        &SafeToolArgs, | 
 | 239 |                                                        &GCCToolArgv); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 240 |     } | 
 | 241 |     if (!SafeInterpreter) { | 
 | 242 |       SafeInterpreterSel = AutoPick; | 
 | 243 |       Message = "Sorry, I can't automatically select an interpreter!\n"; | 
 | 244 |     } | 
 | 245 |     break; | 
 | 246 |   case RunLLC: | 
 | 247 |     SafeToolArgs.push_back("--relocation-model=pic"); | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 248 |     SafeInterpreter = AbstractInterpreter::createLLC(Path.c_str(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 249 |                                                      &SafeToolArgs, | 
 | 250 |                                                      &GCCToolArgv); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 251 |     break; | 
 | 252 |   case RunCBE: | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 253 |     SafeInterpreter = AbstractInterpreter::createCBE(Path.c_str(), Message, | 
| Bill Wendling | 38efa38 | 2009-03-02 23:13:18 +0000 | [diff] [blame] | 254 |                                                      &SafeToolArgs, | 
 | 255 |                                                      &GCCToolArgv); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 256 |     break; | 
 | 257 |   case Custom: | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 258 |     SafeInterpreter = AbstractInterpreter::createCustom(Message, | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 259 |                                                         CustomExecCommand); | 
 | 260 |     break; | 
 | 261 |   default: | 
 | 262 |     Message = "Sorry, this back-end is not supported by bugpoint as the " | 
 | 263 |               "\"safe\" backend right now!\n"; | 
 | 264 |     break; | 
| Chris Lattner | 7bb1154 | 2004-02-18 20:52:02 +0000 | [diff] [blame] | 265 |   } | 
| Dan Gohman | ac95cc7 | 2009-07-16 15:30:09 +0000 | [diff] [blame] | 266 |   if (!SafeInterpreter) { outs() << Message << "\nExiting.\n"; exit(1); } | 
| Chris Lattner | c600f3c | 2006-09-15 21:29:15 +0000 | [diff] [blame] | 267 |    | 
| Dan Gohman | 197f728 | 2009-08-05 20:21:17 +0000 | [diff] [blame] | 268 |   gcc = GCC::create(Message, &GCCToolArgv); | 
| Dan Gohman | ac95cc7 | 2009-07-16 15:30:09 +0000 | [diff] [blame] | 269 |   if (!gcc) { outs() << Message << "\nExiting.\n"; exit(1); } | 
| Misha Brukman | a259c9b | 2003-07-24 21:59:10 +0000 | [diff] [blame] | 270 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 271 |   // If there was an error creating the selected interpreter, quit with error. | 
 | 272 |   return Interpreter == 0; | 
 | 273 | } | 
 | 274 |  | 
| Chris Lattner | ea9212c | 2004-02-18 23:25:22 +0000 | [diff] [blame] | 275 | /// compileProgram - Try to compile the specified module, throwing an exception | 
 | 276 | /// if an error occurs, or returning normally if not.  This is used for code | 
 | 277 | /// generation crash testing. | 
 | 278 | /// | 
 | 279 | void BugDriver::compileProgram(Module *M) { | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 280 |   // Emit the program to a bitcode file... | 
| Daniel Dunbar | 68ccdaa | 2009-09-07 19:26:11 +0000 | [diff] [blame] | 281 |   sys::Path BitcodeFile (OutputPrefix + "-test-program.bc"); | 
| Reid Spencer | 51c5a28 | 2006-08-23 20:34:57 +0000 | [diff] [blame] | 282 |   std::string ErrMsg; | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 283 |   if (BitcodeFile.makeUnique(true,&ErrMsg)) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 284 |     errs() << ToolName << ": Error making unique filename: " << ErrMsg  | 
 | 285 |            << "\n"; | 
| Reid Spencer | 51c5a28 | 2006-08-23 20:34:57 +0000 | [diff] [blame] | 286 |     exit(1); | 
 | 287 |   } | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 288 |   if (writeProgramToFile(BitcodeFile.str(), M)) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 289 |     errs() << ToolName << ": Error emitting bitcode to file '" | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 290 |            << BitcodeFile.str() << "'!\n"; | 
| Chris Lattner | ea9212c | 2004-02-18 23:25:22 +0000 | [diff] [blame] | 291 |     exit(1); | 
 | 292 |   } | 
 | 293 |  | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 294 |     // Remove the temporary bitcode file when we are done. | 
| Anton Korobeynikov | 86c006a | 2009-08-05 09:32:10 +0000 | [diff] [blame] | 295 |   FileRemover BitcodeFileRemover(BitcodeFile, !SaveTemps); | 
| Chris Lattner | ea9212c | 2004-02-18 23:25:22 +0000 | [diff] [blame] | 296 |  | 
 | 297 |   // Actually compile the program! | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 298 |   Interpreter->compileProgram(BitcodeFile.str()); | 
| Chris Lattner | ea9212c | 2004-02-18 23:25:22 +0000 | [diff] [blame] | 299 | } | 
 | 300 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 301 |  | 
 | 302 | /// executeProgram - This method runs "Program", capturing the output of the | 
 | 303 | /// program to a file, returning the filename of the file.  A recommended | 
 | 304 | /// filename may be optionally specified. | 
 | 305 | /// | 
 | 306 | std::string BugDriver::executeProgram(std::string OutputFile, | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 307 |                                       std::string BitcodeFile, | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 308 |                                       const std::string &SharedObj, | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 309 |                                       AbstractInterpreter *AI, | 
 | 310 |                                       bool *ProgramExitedNonzero) { | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 311 |   if (AI == 0) AI = Interpreter; | 
 | 312 |   assert(AI && "Interpreter should have been created already!"); | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 313 |   bool CreatedBitcode = false; | 
| Reid Spencer | 51c5a28 | 2006-08-23 20:34:57 +0000 | [diff] [blame] | 314 |   std::string ErrMsg; | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 315 |   if (BitcodeFile.empty()) { | 
 | 316 |     // Emit the program to a bitcode file... | 
| Daniel Dunbar | 68ccdaa | 2009-09-07 19:26:11 +0000 | [diff] [blame] | 317 |     sys::Path uniqueFilename(OutputPrefix + "-test-program.bc"); | 
| Reid Spencer | 51c5a28 | 2006-08-23 20:34:57 +0000 | [diff] [blame] | 318 |     if (uniqueFilename.makeUnique(true, &ErrMsg)) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 319 |       errs() << ToolName << ": Error making unique filename: " | 
 | 320 |              << ErrMsg << "!\n"; | 
| Reid Spencer | 51c5a28 | 2006-08-23 20:34:57 +0000 | [diff] [blame] | 321 |       exit(1); | 
 | 322 |     } | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 323 |     BitcodeFile = uniqueFilename.str(); | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 324 |  | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 325 |     if (writeProgramToFile(BitcodeFile, Program)) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 326 |       errs() << ToolName << ": Error emitting bitcode to file '" | 
 | 327 |              << BitcodeFile << "'!\n"; | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 328 |       exit(1); | 
 | 329 |     } | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 330 |     CreatedBitcode = true; | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 331 |   } | 
 | 332 |  | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 333 |   // Remove the temporary bitcode file when we are done. | 
 | 334 |   sys::Path BitcodePath (BitcodeFile); | 
| Anton Korobeynikov | 86c006a | 2009-08-05 09:32:10 +0000 | [diff] [blame] | 335 |   FileRemover BitcodeFileRemover(BitcodePath, CreatedBitcode && !SaveTemps); | 
| Chris Lattner | 9709272 | 2004-02-18 22:01:21 +0000 | [diff] [blame] | 336 |  | 
| Daniel Dunbar | 68ccdaa | 2009-09-07 19:26:11 +0000 | [diff] [blame] | 337 |   if (OutputFile.empty()) OutputFile = OutputPrefix + "-execution-output"; | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 338 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 339 |   // Check to see if this is a valid output filename... | 
| Reid Spencer | 9718298 | 2004-12-15 01:53:08 +0000 | [diff] [blame] | 340 |   sys::Path uniqueFile(OutputFile); | 
| Reid Spencer | 51c5a28 | 2006-08-23 20:34:57 +0000 | [diff] [blame] | 341 |   if (uniqueFile.makeUnique(true, &ErrMsg)) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 342 |     errs() << ToolName << ": Error making unique filename: " | 
 | 343 |            << ErrMsg << "\n"; | 
| Reid Spencer | 51c5a28 | 2006-08-23 20:34:57 +0000 | [diff] [blame] | 344 |     exit(1); | 
 | 345 |   } | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 346 |   OutputFile = uniqueFile.str(); | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 347 |  | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 348 |   // Figure out which shared objects to run, if any. | 
| Chris Lattner | 7dac658 | 2003-10-14 22:24:31 +0000 | [diff] [blame] | 349 |   std::vector<std::string> SharedObjs(AdditionalSOs); | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 350 |   if (!SharedObj.empty()) | 
 | 351 |     SharedObjs.push_back(SharedObj); | 
 | 352 |  | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 353 |   int RetVal = AI->ExecuteProgram(BitcodeFile, InputArgv, InputFile, | 
 | 354 |                                   OutputFile, AdditionalLinkerArgs, SharedObjs,  | 
 | 355 |                                   Timeout, MemoryLimit); | 
| Chris Lattner | 7d91e49 | 2004-07-24 07:53:26 +0000 | [diff] [blame] | 356 |  | 
 | 357 |   if (RetVal == -1) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 358 |     errs() << "<timeout>"; | 
| Chris Lattner | 7d91e49 | 2004-07-24 07:53:26 +0000 | [diff] [blame] | 359 |     static bool FirstTimeout = true; | 
 | 360 |     if (FirstTimeout) { | 
| Dan Gohman | ac95cc7 | 2009-07-16 15:30:09 +0000 | [diff] [blame] | 361 |       outs() << "\n" | 
| Chris Lattner | 7d91e49 | 2004-07-24 07:53:26 +0000 | [diff] [blame] | 362 |  "*** Program execution timed out!  This mechanism is designed to handle\n" | 
 | 363 |  "    programs stuck in infinite loops gracefully.  The -timeout option\n" | 
 | 364 |  "    can be used to change the timeout threshold or disable it completely\n" | 
 | 365 |  "    (with -timeout=0).  This message is only displayed once.\n"; | 
 | 366 |       FirstTimeout = false; | 
 | 367 |     } | 
 | 368 |   } | 
| Chris Lattner | 769f1fe | 2003-10-14 21:59:36 +0000 | [diff] [blame] | 369 |  | 
| Reid Spencer | 5e1452c | 2006-11-28 07:04:10 +0000 | [diff] [blame] | 370 |   if (AppendProgramExitCode) { | 
 | 371 |     std::ofstream outFile(OutputFile.c_str(), std::ios_base::app); | 
 | 372 |     outFile << "exit " << RetVal << '\n'; | 
 | 373 |     outFile.close(); | 
 | 374 |   } | 
 | 375 |  | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 376 |   if (ProgramExitedNonzero != 0) | 
 | 377 |     *ProgramExitedNonzero = (RetVal != 0); | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 378 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 379 |   // Return the filename we captured the output to. | 
 | 380 |   return OutputFile; | 
 | 381 | } | 
 | 382 |  | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 383 | /// executeProgramSafely - Used to create reference output with the "safe" | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 384 | /// backend, if reference output is not provided. | 
 | 385 | /// | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 386 | std::string BugDriver::executeProgramSafely(std::string OutputFile) { | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 387 |   bool ProgramExitedNonzero; | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 388 |   std::string outFN = executeProgram(OutputFile, "", "", SafeInterpreter, | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 389 |                                      &ProgramExitedNonzero); | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 390 |   return outFN; | 
 | 391 | } | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 392 |  | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 393 | std::string BugDriver::compileSharedObject(const std::string &BitcodeFile) { | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 394 |   assert(Interpreter && "Interpreter should have been created already!"); | 
| Chris Lattner | c600f3c | 2006-09-15 21:29:15 +0000 | [diff] [blame] | 395 |   sys::Path OutputFile; | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 396 |  | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 397 |   // Using the known-good backend. | 
 | 398 |   GCC::FileType FT = SafeInterpreter->OutputCode(BitcodeFile, OutputFile); | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 399 |  | 
| Chris Lattner | a0f5b15 | 2003-10-14 21:09:11 +0000 | [diff] [blame] | 400 |   std::string SharedObjectFile; | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 401 |   if (gcc->MakeSharedObject(OutputFile.str(), FT, | 
| Chris Lattner | 130e2a3 | 2006-06-27 20:35:36 +0000 | [diff] [blame] | 402 |                             SharedObjectFile, AdditionalLinkerArgs)) | 
| Chris Lattner | a0f5b15 | 2003-10-14 21:09:11 +0000 | [diff] [blame] | 403 |     exit(1); | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 404 |  | 
 | 405 |   // Remove the intermediate C file | 
| Chris Lattner | c600f3c | 2006-09-15 21:29:15 +0000 | [diff] [blame] | 406 |   OutputFile.eraseFromDisk(); | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 407 |  | 
| Chris Lattner | 6ebe44d | 2003-10-19 21:54:13 +0000 | [diff] [blame] | 408 |   return "./" + SharedObjectFile; | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 409 | } | 
 | 410 |  | 
| Patrick Jenkins | 6a3f31c | 2006-08-15 16:40:49 +0000 | [diff] [blame] | 411 | /// createReferenceFile - calls compileProgram and then records the output | 
 | 412 | /// into ReferenceOutputFile. Returns true if reference file created, false  | 
 | 413 | /// otherwise. Note: initializeExecutionEnvironment should be called BEFORE | 
 | 414 | /// this function. | 
 | 415 | /// | 
| Chris Lattner | c600f3c | 2006-09-15 21:29:15 +0000 | [diff] [blame] | 416 | bool BugDriver::createReferenceFile(Module *M, const std::string &Filename) { | 
| Patrick Jenkins | 6a3f31c | 2006-08-15 16:40:49 +0000 | [diff] [blame] | 417 |   try { | 
 | 418 |     compileProgram(Program); | 
| Jeff Cohen | d41b30d | 2006-11-05 19:31:28 +0000 | [diff] [blame] | 419 |   } catch (ToolExecutionError &) { | 
| Patrick Jenkins | 6a3f31c | 2006-08-15 16:40:49 +0000 | [diff] [blame] | 420 |     return false; | 
 | 421 |   } | 
 | 422 |   try { | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 423 |     ReferenceOutputFile = executeProgramSafely(Filename); | 
| Dan Gohman | ac95cc7 | 2009-07-16 15:30:09 +0000 | [diff] [blame] | 424 |     outs() << "\nReference output is: " << ReferenceOutputFile << "\n\n"; | 
| Patrick Jenkins | 6a3f31c | 2006-08-15 16:40:49 +0000 | [diff] [blame] | 425 |   } catch (ToolExecutionError &TEE) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 426 |     errs() << TEE.what(); | 
| Dan Gohman | 70ef449 | 2008-12-08 04:02:47 +0000 | [diff] [blame] | 427 |     if (Interpreter != SafeInterpreter) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 428 |       errs() << "*** There is a bug running the \"safe\" backend.  Either" | 
 | 429 |              << " debug it (for example with the -run-cbe bugpoint option," | 
 | 430 |              << " if CBE is being used as the \"safe\" backend), or fix the" | 
 | 431 |              << " error some other way.\n"; | 
| Patrick Jenkins | 6a3f31c | 2006-08-15 16:40:49 +0000 | [diff] [blame] | 432 |     } | 
 | 433 |     return false; | 
 | 434 |   } | 
 | 435 |   return true; | 
 | 436 | } | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 437 |  | 
| Patrick Jenkins | 6a3f31c | 2006-08-15 16:40:49 +0000 | [diff] [blame] | 438 | /// diffProgram - This method executes the specified module and diffs the | 
 | 439 | /// output against the file specified by ReferenceOutputFile.  If the output | 
 | 440 | /// is different, true is returned.  If there is a problem with the code | 
 | 441 | /// generator (e.g., llc crashes), this will throw an exception. | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 442 | /// | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 443 | bool BugDriver::diffProgram(const std::string &BitcodeFile, | 
| Misha Brukman | 5073336 | 2003-07-24 18:17:43 +0000 | [diff] [blame] | 444 |                             const std::string &SharedObject, | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 445 |                             bool RemoveBitcode) { | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 446 |   bool ProgramExitedNonzero; | 
 | 447 |  | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 448 |   // Execute the program, generating an output file... | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 449 |   sys::Path Output(executeProgram("", BitcodeFile, SharedObject, 0, | 
| Reid Spencer | 5f76760 | 2004-12-16 23:04:20 +0000 | [diff] [blame] | 450 |                                       &ProgramExitedNonzero)); | 
| Brian Gaeke | c5cad21 | 2004-02-11 18:37:32 +0000 | [diff] [blame] | 451 |  | 
| Chris Lattner | 65f6279 | 2003-08-01 20:29:45 +0000 | [diff] [blame] | 452 |   std::string Error; | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 453 |   bool FilesDifferent = false; | 
| Chris Lattner | a328c51 | 2005-01-23 03:45:26 +0000 | [diff] [blame] | 454 |   if (int Diff = DiffFilesWithTolerance(sys::Path(ReferenceOutputFile), | 
| Chris Lattner | 74382b7 | 2009-08-23 22:45:37 +0000 | [diff] [blame] | 455 |                                         sys::Path(Output.str()), | 
| Chris Lattner | a328c51 | 2005-01-23 03:45:26 +0000 | [diff] [blame] | 456 |                                         AbsTolerance, RelTolerance, &Error)) { | 
 | 457 |     if (Diff == 2) { | 
| Dan Gohman | 65f57c2 | 2009-07-15 16:35:29 +0000 | [diff] [blame] | 458 |       errs() << "While diffing output: " << Error << '\n'; | 
| Chris Lattner | 65f6279 | 2003-08-01 20:29:45 +0000 | [diff] [blame] | 459 |       exit(1); | 
 | 460 |     } | 
 | 461 |     FilesDifferent = true; | 
 | 462 |   } | 
| David Goodwin | 80becf1 | 2009-07-10 21:39:28 +0000 | [diff] [blame] | 463 |   else { | 
 | 464 |     // Remove the generated output if there are no differences. | 
 | 465 |     Output.eraseFromDisk(); | 
 | 466 |   } | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 467 |  | 
| Gabor Greif | 8ff70c2 | 2007-07-04 21:55:50 +0000 | [diff] [blame] | 468 |   // Remove the bitcode file if we are supposed to. | 
 | 469 |   if (RemoveBitcode) | 
 | 470 |     sys::Path(BitcodeFile).eraseFromDisk(); | 
| Chris Lattner | 4a10645 | 2002-12-23 23:50:16 +0000 | [diff] [blame] | 471 |   return FilesDifferent; | 
 | 472 | } | 
| Misha Brukman | 91eabc1 | 2003-07-28 19:16:14 +0000 | [diff] [blame] | 473 |  | 
 | 474 | bool BugDriver::isExecutingJIT() { | 
 | 475 |   return InterpreterSel == RunJIT; | 
 | 476 | } | 
| Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 477 |  |