1 //===- lli.cpp - LLVM Interpreter / Dynamic compiler ----------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This utility provides a simple wrapper around the LLVM Execution Engines, 11 // which allow the direct execution of LLVM programs through a Just-In-Time 12 // compiler, or through an interpreter if no JIT is available for this platform. 13 // 14 //===----------------------------------------------------------------------===// 15 16 #include "llvm/LLVMContext.h" 17 #include "llvm/Module.h" 18 #include "llvm/Type.h" 19 #include "llvm/ADT/Triple.h" 20 #include "llvm/Bitcode/ReaderWriter.h" 21 #include "llvm/CodeGen/LinkAllCodegenComponents.h" 22 #include "llvm/ExecutionEngine/GenericValue.h" 23 #include "llvm/ExecutionEngine/Interpreter.h" 24 #include "llvm/ExecutionEngine/JIT.h" 25 #include "llvm/ExecutionEngine/JITEventListener.h" 26 #include "llvm/ExecutionEngine/JITMemoryManager.h" 27 #include "llvm/ExecutionEngine/MCJIT.h" 28 #include "llvm/Support/CommandLine.h" 29 #include "llvm/Support/IRReader.h" 30 #include "llvm/Support/ManagedStatic.h" 31 #include "llvm/Support/MemoryBuffer.h" 32 #include "llvm/Support/PluginLoader.h" 33 #include "llvm/Support/PrettyStackTrace.h" 34 #include "llvm/Support/raw_ostream.h" 35 #include "llvm/Support/Process.h" 36 #include "llvm/Support/Signals.h" 37 #include "llvm/Support/TargetSelect.h" 38 #include <cerrno> 39 40 #ifdef __CYGWIN__ 41 #include <cygwin/version.h> 42 #if defined(CYGWIN_VERSION_DLL_MAJOR) && CYGWIN_VERSION_DLL_MAJOR<1007 43 #define DO_NOTHING_ATEXIT 1 44 #endif 45 #endif 46 47 using namespace llvm; 48 49 namespace { 50 cl::opt<std::string> 51 InputFile(cl::desc("<input bitcode>"), cl::Positional, cl::init("-")); 52 53 cl::list<std::string> 54 InputArgv(cl::ConsumeAfter, cl::desc("<program arguments>...")); 55 56 cl::opt<bool> ForceInterpreter("force-interpreter", 57 cl::desc("Force interpretation: disable JIT"), 58 cl::init(false)); 59 60 cl::opt<bool> UseMCJIT( 61 "use-mcjit", cl::desc("Enable use of the MC-based JIT (if available)"), 62 cl::init(false)); 63 64 // Determine optimization level. 65 cl::opt<char> 66 OptLevel("O", 67 cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 68 "(default = '-O2')"), 69 cl::Prefix, 70 cl::ZeroOrMore, 71 cl::init(' ')); 72 73 cl::opt<std::string> 74 TargetTriple("mtriple", cl::desc("Override target triple for module")); 75 76 cl::opt<std::string> 77 MArch("march", 78 cl::desc("Architecture to generate assembly for (see --version)")); 79 80 cl::opt<std::string> 81 MCPU("mcpu", 82 cl::desc("Target a specific cpu type (-mcpu=help for details)"), 83 cl::value_desc("cpu-name"), 84 cl::init("")); 85 86 cl::list<std::string> 87 MAttrs("mattr", 88 cl::CommaSeparated, 89 cl::desc("Target specific attributes (-mattr=help for details)"), 90 cl::value_desc("a1,+a2,-a3,...")); 91 92 cl::opt<std::string> 93 EntryFunc("entry-function", 94 cl::desc("Specify the entry function (default = 'main') " 95 "of the executable"), 96 cl::value_desc("function"), 97 cl::init("main")); 98 99 cl::opt<std::string> 100 FakeArgv0("fake-argv0", 101 cl::desc("Override the 'argv[0]' value passed into the executing" 102 " program"), cl::value_desc("executable")); 103 104 cl::opt<bool> 105 DisableCoreFiles("disable-core-files", cl::Hidden, 106 cl::desc("Disable emission of core files if possible")); 107 108 cl::opt<bool> 109 NoLazyCompilation("disable-lazy-compilation", 110 cl::desc("Disable JIT lazy compilation"), 111 cl::init(false)); 112 113 cl::opt<Reloc::Model> 114 RelocModel("relocation-model", 115 cl::desc("Choose relocation model"), 116 cl::init(Reloc::Default), 117 cl::values( 118 clEnumValN(Reloc::Default, "default", 119 "Target default relocation model"), 120 clEnumValN(Reloc::Static, "static", 121 "Non-relocatable code"), 122 clEnumValN(Reloc::PIC_, "pic", 123 "Fully relocatable, position independent code"), 124 clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic", 125 "Relocatable external references, non-relocatable code"), 126 clEnumValEnd)); 127 128 cl::opt<llvm::CodeModel::Model> 129 CMModel("code-model", 130 cl::desc("Choose code model"), 131 cl::init(CodeModel::JITDefault), 132 cl::values(clEnumValN(CodeModel::JITDefault, "default", 133 "Target default JIT code model"), 134 clEnumValN(CodeModel::Small, "small", 135 "Small code model"), 136 clEnumValN(CodeModel::Kernel, "kernel", 137 "Kernel code model"), 138 clEnumValN(CodeModel::Medium, "medium", 139 "Medium code model"), 140 clEnumValN(CodeModel::Large, "large", 141 "Large code model"), 142 clEnumValEnd)); 143 144 cl::opt<bool> 145 EnableJITExceptionHandling("jit-enable-eh", 146 cl::desc("Emit exception handling information"), 147 cl::init(false)); 148 149 cl::opt<bool> 150 // In debug builds, make this default to true. 151 #ifdef NDEBUG 152 #define EMIT_DEBUG false 153 #else 154 #define EMIT_DEBUG true 155 #endif 156 EmitJitDebugInfo("jit-emit-debug", 157 cl::desc("Emit debug information to debugger"), 158 cl::init(EMIT_DEBUG)); 159 #undef EMIT_DEBUG 160 161 static cl::opt<bool> 162 EmitJitDebugInfoToDisk("jit-emit-debug-to-disk", 163 cl::Hidden, 164 cl::desc("Emit debug info objfiles to disk"), 165 cl::init(false)); 166 } 167 168 static ExecutionEngine *EE = 0; 169 170 static void do_shutdown() { 171 // Cygwin-1.5 invokes DLL's dtors before atexit handler. 172 #ifndef DO_NOTHING_ATEXIT 173 delete EE; 174 llvm_shutdown(); 175 #endif 176 } 177 178 //===----------------------------------------------------------------------===// 179 // main Driver function 180 // 181 int main(int argc, char **argv, char * const *envp) { 182 sys::PrintStackTraceOnErrorSignal(); 183 PrettyStackTraceProgram X(argc, argv); 184 185 LLVMContext &Context = getGlobalContext(); 186 atexit(do_shutdown); // Call llvm_shutdown() on exit. 187 188 // If we have a native target, initialize it to ensure it is linked in and 189 // usable by the JIT. 190 InitializeNativeTarget(); 191 InitializeNativeTargetAsmPrinter(); 192 193 cl::ParseCommandLineOptions(argc, argv, 194 "llvm interpreter & dynamic compiler\n"); 195 196 // If the user doesn't want core files, disable them. 197 if (DisableCoreFiles) 198 sys::Process::PreventCoreFiles(); 199 200 // Load the bitcode... 201 SMDiagnostic Err; 202 Module *Mod = ParseIRFile(InputFile, Err, Context); 203 if (!Mod) { 204 Err.print(argv[0], errs()); 205 return 1; 206 } 207 208 // If not jitting lazily, load the whole bitcode file eagerly too. 209 std::string ErrorMsg; 210 if (NoLazyCompilation) { 211 if (Mod->MaterializeAllPermanently(&ErrorMsg)) { 212 errs() << argv[0] << ": bitcode didn't read correctly.\n"; 213 errs() << "Reason: " << ErrorMsg << "\n"; 214 exit(1); 215 } 216 } 217 218 EngineBuilder builder(Mod); 219 builder.setMArch(MArch); 220 builder.setMCPU(MCPU); 221 builder.setMAttrs(MAttrs); 222 builder.setRelocationModel(RelocModel); 223 builder.setCodeModel(CMModel); 224 builder.setErrorStr(&ErrorMsg); 225 builder.setJITMemoryManager(ForceInterpreter ? 0 : 226 JITMemoryManager::CreateDefaultMemManager()); 227 builder.setEngineKind(ForceInterpreter 228 ? EngineKind::Interpreter 229 : EngineKind::JIT); 230 231 // If we are supposed to override the target triple, do so now. 232 if (!TargetTriple.empty()) 233 Mod->setTargetTriple(Triple::normalize(TargetTriple)); 234 235 // Enable MCJIT if desired. 236 if (UseMCJIT && !ForceInterpreter) { 237 builder.setUseMCJIT(true); 238 builder.setJITMemoryManager(JITMemoryManager::CreateDefaultMemManager()); 239 } 240 241 CodeGenOpt::Level OLvl = CodeGenOpt::Default; 242 switch (OptLevel) { 243 default: 244 errs() << argv[0] << ": invalid optimization level.\n"; 245 return 1; 246 case ' ': break; 247 case '0': OLvl = CodeGenOpt::None; break; 248 case '1': OLvl = CodeGenOpt::Less; break; 249 case '2': OLvl = CodeGenOpt::Default; break; 250 case '3': OLvl = CodeGenOpt::Aggressive; break; 251 } 252 builder.setOptLevel(OLvl); 253 254 TargetOptions Options; 255 Options.JITExceptionHandling = EnableJITExceptionHandling; 256 Options.JITEmitDebugInfo = EmitJitDebugInfo; 257 Options.JITEmitDebugInfoToDisk = EmitJitDebugInfoToDisk; 258 builder.setTargetOptions(Options); 259 260 EE = builder.create(); 261 if (!EE) { 262 if (!ErrorMsg.empty()) 263 errs() << argv[0] << ": error creating EE: " << ErrorMsg << "\n"; 264 else 265 errs() << argv[0] << ": unknown error creating EE!\n"; 266 exit(1); 267 } 268 269 // The following functions have no effect if their respective profiling 270 // support wasn't enabled in the build configuration. 271 EE->RegisterJITEventListener( 272 JITEventListener::createOProfileJITEventListener()); 273 EE->RegisterJITEventListener( 274 JITEventListener::createIntelJITEventListener()); 275 276 EE->DisableLazyCompilation(NoLazyCompilation); 277 278 // If the user specifically requested an argv[0] to pass into the program, 279 // do it now. 280 if (!FakeArgv0.empty()) { 281 InputFile = FakeArgv0; 282 } else { 283 // Otherwise, if there is a .bc suffix on the executable strip it off, it 284 // might confuse the program. 285 if (StringRef(InputFile).endswith(".bc")) 286 InputFile.erase(InputFile.length() - 3); 287 } 288 289 // Add the module's name to the start of the vector of arguments to main(). 290 InputArgv.insert(InputArgv.begin(), InputFile); 291 292 // Call the main function from M as if its signature were: 293 // int main (int argc, char **argv, const char **envp) 294 // using the contents of Args to determine argc & argv, and the contents of 295 // EnvVars to determine envp. 296 // 297 Function *EntryFn = Mod->getFunction(EntryFunc); 298 if (!EntryFn) { 299 errs() << '\'' << EntryFunc << "\' function not found in module.\n"; 300 return -1; 301 } 302 303 // If the program doesn't explicitly call exit, we will need the Exit 304 // function later on to make an explicit call, so get the function now. 305 Constant *Exit = Mod->getOrInsertFunction("exit", Type::getVoidTy(Context), 306 Type::getInt32Ty(Context), 307 NULL); 308 309 // Reset errno to zero on entry to main. 310 errno = 0; 311 312 // Run static constructors. 313 EE->runStaticConstructorsDestructors(false); 314 315 if (NoLazyCompilation) { 316 for (Module::iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { 317 Function *Fn = &*I; 318 if (Fn != EntryFn && !Fn->isDeclaration()) 319 EE->getPointerToFunction(Fn); 320 } 321 } 322 323 // Run main. 324 int Result = EE->runFunctionAsMain(EntryFn, InputArgv, envp); 325 326 // Run static destructors. 327 EE->runStaticConstructorsDestructors(true); 328 329 // If the program didn't call exit explicitly, we should call it now. 330 // This ensures that any atexit handlers get called correctly. 331 if (Function *ExitF = dyn_cast<Function>(Exit)) { 332 std::vector<GenericValue> Args; 333 GenericValue ResultGV; 334 ResultGV.IntVal = APInt(32, Result); 335 Args.push_back(ResultGV); 336 EE->runFunction(ExitF, Args); 337 errs() << "ERROR: exit(" << Result << ") returned!\n"; 338 abort(); 339 } else { 340 errs() << "ERROR: exit defined with wrong prototype!\n"; 341 abort(); 342 } 343 } 344