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 #define DEBUG_TYPE "lli" 17 #include "llvm/IR/LLVMContext.h" 18 #include "RemoteMemoryManager.h" 19 #include "RemoteTarget.h" 20 #include "RemoteTargetExternal.h" 21 #include "llvm/ADT/Triple.h" 22 #include "llvm/Bitcode/ReaderWriter.h" 23 #include "llvm/CodeGen/LinkAllCodegenComponents.h" 24 #include "llvm/ExecutionEngine/GenericValue.h" 25 #include "llvm/ExecutionEngine/Interpreter.h" 26 #include "llvm/ExecutionEngine/JIT.h" 27 #include "llvm/ExecutionEngine/JITEventListener.h" 28 #include "llvm/ExecutionEngine/JITMemoryManager.h" 29 #include "llvm/ExecutionEngine/MCJIT.h" 30 #include "llvm/ExecutionEngine/ObjectCache.h" 31 #include "llvm/ExecutionEngine/SectionMemoryManager.h" 32 #include "llvm/IR/IRBuilder.h" 33 #include "llvm/IR/Module.h" 34 #include "llvm/IR/Type.h" 35 #include "llvm/IR/TypeBuilder.h" 36 #include "llvm/IRReader/IRReader.h" 37 #include "llvm/Object/Archive.h" 38 #include "llvm/Object/ObjectFile.h" 39 #include "llvm/Support/CommandLine.h" 40 #include "llvm/Support/Debug.h" 41 #include "llvm/Support/DynamicLibrary.h" 42 #include "llvm/Support/Format.h" 43 #include "llvm/Support/ManagedStatic.h" 44 #include "llvm/Support/MathExtras.h" 45 #include "llvm/Support/Memory.h" 46 #include "llvm/Support/MemoryBuffer.h" 47 #include "llvm/Support/PluginLoader.h" 48 #include "llvm/Support/PrettyStackTrace.h" 49 #include "llvm/Support/Process.h" 50 #include "llvm/Support/Program.h" 51 #include "llvm/Support/Signals.h" 52 #include "llvm/Support/SourceMgr.h" 53 #include "llvm/Support/TargetSelect.h" 54 #include "llvm/Support/raw_ostream.h" 55 #include "llvm/Transforms/Instrumentation.h" 56 #include <cerrno> 57 58 #ifdef __CYGWIN__ 59 #include <cygwin/version.h> 60 #if defined(CYGWIN_VERSION_DLL_MAJOR) && CYGWIN_VERSION_DLL_MAJOR<1007 61 #define DO_NOTHING_ATEXIT 1 62 #endif 63 #endif 64 65 using namespace llvm; 66 67 namespace { 68 cl::opt<std::string> 69 InputFile(cl::desc("<input bitcode>"), cl::Positional, cl::init("-")); 70 71 cl::list<std::string> 72 InputArgv(cl::ConsumeAfter, cl::desc("<program arguments>...")); 73 74 cl::opt<bool> ForceInterpreter("force-interpreter", 75 cl::desc("Force interpretation: disable JIT"), 76 cl::init(false)); 77 78 cl::opt<bool> UseMCJIT( 79 "use-mcjit", cl::desc("Enable use of the MC-based JIT (if available)"), 80 cl::init(false)); 81 82 cl::opt<bool> DebugIR( 83 "debug-ir", cl::desc("Generate debug information to allow debugging IR."), 84 cl::init(false)); 85 86 // The MCJIT supports building for a target address space separate from 87 // the JIT compilation process. Use a forked process and a copying 88 // memory manager with IPC to execute using this functionality. 89 cl::opt<bool> RemoteMCJIT("remote-mcjit", 90 cl::desc("Execute MCJIT'ed code in a separate process."), 91 cl::init(false)); 92 93 // Manually specify the child process for remote execution. This overrides 94 // the simulated remote execution that allocates address space for child 95 // execution. The child process will be executed and will communicate with 96 // lli via stdin/stdout pipes. 97 cl::opt<std::string> 98 ChildExecPath("mcjit-remote-process", 99 cl::desc("Specify the filename of the process to launch " 100 "for remote MCJIT execution. If none is specified," 101 "\n\tremote execution will be simulated in-process."), 102 cl::value_desc("filename"), cl::init("")); 103 104 // Determine optimization level. 105 cl::opt<char> 106 OptLevel("O", 107 cl::desc("Optimization level. [-O0, -O1, -O2, or -O3] " 108 "(default = '-O2')"), 109 cl::Prefix, 110 cl::ZeroOrMore, 111 cl::init(' ')); 112 113 cl::opt<std::string> 114 TargetTriple("mtriple", cl::desc("Override target triple for module")); 115 116 cl::opt<std::string> 117 MArch("march", 118 cl::desc("Architecture to generate assembly for (see --version)")); 119 120 cl::opt<std::string> 121 MCPU("mcpu", 122 cl::desc("Target a specific cpu type (-mcpu=help for details)"), 123 cl::value_desc("cpu-name"), 124 cl::init("")); 125 126 cl::list<std::string> 127 MAttrs("mattr", 128 cl::CommaSeparated, 129 cl::desc("Target specific attributes (-mattr=help for details)"), 130 cl::value_desc("a1,+a2,-a3,...")); 131 132 cl::opt<std::string> 133 EntryFunc("entry-function", 134 cl::desc("Specify the entry function (default = 'main') " 135 "of the executable"), 136 cl::value_desc("function"), 137 cl::init("main")); 138 139 cl::list<std::string> 140 ExtraModules("extra-module", 141 cl::desc("Extra modules to be loaded"), 142 cl::value_desc("input bitcode")); 143 144 cl::list<std::string> 145 ExtraObjects("extra-object", 146 cl::desc("Extra object files to be loaded"), 147 cl::value_desc("input object")); 148 149 cl::list<std::string> 150 ExtraArchives("extra-archive", 151 cl::desc("Extra archive files to be loaded"), 152 cl::value_desc("input archive")); 153 154 cl::opt<bool> 155 EnableCacheManager("enable-cache-manager", 156 cl::desc("Use cache manager to save/load mdoules"), 157 cl::init(false)); 158 159 cl::opt<std::string> 160 ObjectCacheDir("object-cache-dir", 161 cl::desc("Directory to store cached object files " 162 "(must be user writable)"), 163 cl::init("")); 164 165 cl::opt<std::string> 166 FakeArgv0("fake-argv0", 167 cl::desc("Override the 'argv[0]' value passed into the executing" 168 " program"), cl::value_desc("executable")); 169 170 cl::opt<bool> 171 DisableCoreFiles("disable-core-files", cl::Hidden, 172 cl::desc("Disable emission of core files if possible")); 173 174 cl::opt<bool> 175 NoLazyCompilation("disable-lazy-compilation", 176 cl::desc("Disable JIT lazy compilation"), 177 cl::init(false)); 178 179 cl::opt<Reloc::Model> 180 RelocModel("relocation-model", 181 cl::desc("Choose relocation model"), 182 cl::init(Reloc::Default), 183 cl::values( 184 clEnumValN(Reloc::Default, "default", 185 "Target default relocation model"), 186 clEnumValN(Reloc::Static, "static", 187 "Non-relocatable code"), 188 clEnumValN(Reloc::PIC_, "pic", 189 "Fully relocatable, position independent code"), 190 clEnumValN(Reloc::DynamicNoPIC, "dynamic-no-pic", 191 "Relocatable external references, non-relocatable code"), 192 clEnumValEnd)); 193 194 cl::opt<llvm::CodeModel::Model> 195 CMModel("code-model", 196 cl::desc("Choose code model"), 197 cl::init(CodeModel::JITDefault), 198 cl::values(clEnumValN(CodeModel::JITDefault, "default", 199 "Target default JIT code model"), 200 clEnumValN(CodeModel::Small, "small", 201 "Small code model"), 202 clEnumValN(CodeModel::Kernel, "kernel", 203 "Kernel code model"), 204 clEnumValN(CodeModel::Medium, "medium", 205 "Medium code model"), 206 clEnumValN(CodeModel::Large, "large", 207 "Large code model"), 208 clEnumValEnd)); 209 210 cl::opt<bool> 211 GenerateSoftFloatCalls("soft-float", 212 cl::desc("Generate software floating point library calls"), 213 cl::init(false)); 214 215 cl::opt<llvm::FloatABI::ABIType> 216 FloatABIForCalls("float-abi", 217 cl::desc("Choose float ABI type"), 218 cl::init(FloatABI::Default), 219 cl::values( 220 clEnumValN(FloatABI::Default, "default", 221 "Target default float ABI type"), 222 clEnumValN(FloatABI::Soft, "soft", 223 "Soft float ABI (implied by -soft-float)"), 224 clEnumValN(FloatABI::Hard, "hard", 225 "Hard float ABI (uses FP registers)"), 226 clEnumValEnd)); 227 cl::opt<bool> 228 // In debug builds, make this default to true. 229 #ifdef NDEBUG 230 #define EMIT_DEBUG false 231 #else 232 #define EMIT_DEBUG true 233 #endif 234 EmitJitDebugInfo("jit-emit-debug", 235 cl::desc("Emit debug information to debugger"), 236 cl::init(EMIT_DEBUG)); 237 #undef EMIT_DEBUG 238 239 static cl::opt<bool> 240 EmitJitDebugInfoToDisk("jit-emit-debug-to-disk", 241 cl::Hidden, 242 cl::desc("Emit debug info objfiles to disk"), 243 cl::init(false)); 244 } 245 246 //===----------------------------------------------------------------------===// 247 // Object cache 248 // 249 // This object cache implementation writes cached objects to disk to the 250 // directory specified by CacheDir, using a filename provided in the module 251 // descriptor. The cache tries to load a saved object using that path if the 252 // file exists. CacheDir defaults to "", in which case objects are cached 253 // alongside their originating bitcodes. 254 // 255 class LLIObjectCache : public ObjectCache { 256 public: 257 LLIObjectCache(const std::string& CacheDir) : CacheDir(CacheDir) { 258 // Add trailing '/' to cache dir if necessary. 259 if (!this->CacheDir.empty() && 260 this->CacheDir[this->CacheDir.size() - 1] != '/') 261 this->CacheDir += '/'; 262 } 263 virtual ~LLIObjectCache() {} 264 265 virtual void notifyObjectCompiled(const Module *M, const MemoryBuffer *Obj) { 266 const std::string ModuleID = M->getModuleIdentifier(); 267 std::string CacheName; 268 if (!getCacheFilename(ModuleID, CacheName)) 269 return; 270 std::string errStr; 271 if (!CacheDir.empty()) { // Create user-defined cache dir. 272 SmallString<128> dir(CacheName); 273 sys::path::remove_filename(dir); 274 sys::fs::create_directories(Twine(dir)); 275 } 276 raw_fd_ostream outfile(CacheName.c_str(), errStr, sys::fs::F_Binary); 277 outfile.write(Obj->getBufferStart(), Obj->getBufferSize()); 278 outfile.close(); 279 } 280 281 virtual MemoryBuffer* getObject(const Module* M) { 282 const std::string ModuleID = M->getModuleIdentifier(); 283 std::string CacheName; 284 if (!getCacheFilename(ModuleID, CacheName)) 285 return NULL; 286 // Load the object from the cache filename 287 OwningPtr<MemoryBuffer> IRObjectBuffer; 288 MemoryBuffer::getFile(CacheName.c_str(), IRObjectBuffer, -1, false); 289 // If the file isn't there, that's OK. 290 if (!IRObjectBuffer) 291 return NULL; 292 // MCJIT will want to write into this buffer, and we don't want that 293 // because the file has probably just been mmapped. Instead we make 294 // a copy. The filed-based buffer will be released when it goes 295 // out of scope. 296 return MemoryBuffer::getMemBufferCopy(IRObjectBuffer->getBuffer()); 297 } 298 299 private: 300 std::string CacheDir; 301 302 bool getCacheFilename(const std::string &ModID, std::string &CacheName) { 303 std::string Prefix("file:"); 304 size_t PrefixLength = Prefix.length(); 305 if (ModID.substr(0, PrefixLength) != Prefix) 306 return false; 307 std::string CacheSubdir = ModID.substr(PrefixLength); 308 #if defined(_WIN32) 309 // Transform "X:\foo" => "/X\foo" for convenience. 310 if (isalpha(CacheSubdir[0]) && CacheSubdir[1] == ':') { 311 CacheSubdir[1] = CacheSubdir[0]; 312 CacheSubdir[0] = '/'; 313 } 314 #endif 315 CacheName = CacheDir + CacheSubdir; 316 size_t pos = CacheName.rfind('.'); 317 CacheName.replace(pos, CacheName.length() - pos, ".o"); 318 return true; 319 } 320 }; 321 322 static ExecutionEngine *EE = 0; 323 static LLIObjectCache *CacheManager = 0; 324 325 static void do_shutdown() { 326 // Cygwin-1.5 invokes DLL's dtors before atexit handler. 327 #ifndef DO_NOTHING_ATEXIT 328 delete EE; 329 if (CacheManager) 330 delete CacheManager; 331 llvm_shutdown(); 332 #endif 333 } 334 335 // On Mingw and Cygwin, an external symbol named '__main' is called from the 336 // generated 'main' function to allow static intialization. To avoid linking 337 // problems with remote targets (because lli's remote target support does not 338 // currently handle external linking) we add a secondary module which defines 339 // an empty '__main' function. 340 static void addCygMingExtraModule(ExecutionEngine *EE, 341 LLVMContext &Context, 342 StringRef TargetTripleStr) { 343 IRBuilder<> Builder(Context); 344 Triple TargetTriple(TargetTripleStr); 345 346 // Create a new module. 347 Module *M = new Module("CygMingHelper", Context); 348 M->setTargetTriple(TargetTripleStr); 349 350 // Create an empty function named "__main". 351 Function *Result; 352 if (TargetTriple.isArch64Bit()) { 353 Result = Function::Create( 354 TypeBuilder<int64_t(void), false>::get(Context), 355 GlobalValue::ExternalLinkage, "__main", M); 356 } else { 357 Result = Function::Create( 358 TypeBuilder<int32_t(void), false>::get(Context), 359 GlobalValue::ExternalLinkage, "__main", M); 360 } 361 BasicBlock *BB = BasicBlock::Create(Context, "__main", Result); 362 Builder.SetInsertPoint(BB); 363 Value *ReturnVal; 364 if (TargetTriple.isArch64Bit()) 365 ReturnVal = ConstantInt::get(Context, APInt(64, 0)); 366 else 367 ReturnVal = ConstantInt::get(Context, APInt(32, 0)); 368 Builder.CreateRet(ReturnVal); 369 370 // Add this new module to the ExecutionEngine. 371 EE->addModule(M); 372 } 373 374 375 //===----------------------------------------------------------------------===// 376 // main Driver function 377 // 378 int main(int argc, char **argv, char * const *envp) { 379 sys::PrintStackTraceOnErrorSignal(); 380 PrettyStackTraceProgram X(argc, argv); 381 382 LLVMContext &Context = getGlobalContext(); 383 atexit(do_shutdown); // Call llvm_shutdown() on exit. 384 385 // If we have a native target, initialize it to ensure it is linked in and 386 // usable by the JIT. 387 InitializeNativeTarget(); 388 InitializeNativeTargetAsmPrinter(); 389 InitializeNativeTargetAsmParser(); 390 391 cl::ParseCommandLineOptions(argc, argv, 392 "llvm interpreter & dynamic compiler\n"); 393 394 // If the user doesn't want core files, disable them. 395 if (DisableCoreFiles) 396 sys::Process::PreventCoreFiles(); 397 398 // Load the bitcode... 399 SMDiagnostic Err; 400 Module *Mod = ParseIRFile(InputFile, Err, Context); 401 if (!Mod) { 402 Err.print(argv[0], errs()); 403 return 1; 404 } 405 406 if (EnableCacheManager) { 407 if (UseMCJIT) { 408 std::string CacheName("file:"); 409 CacheName.append(InputFile); 410 Mod->setModuleIdentifier(CacheName); 411 } else 412 errs() << "warning: -enable-cache-manager can only be used with MCJIT."; 413 } 414 415 // If not jitting lazily, load the whole bitcode file eagerly too. 416 if (NoLazyCompilation) { 417 if (error_code EC = Mod->materializeAllPermanently()) { 418 errs() << argv[0] << ": bitcode didn't read correctly.\n"; 419 errs() << "Reason: " << EC.message() << "\n"; 420 exit(1); 421 } 422 } 423 424 if (DebugIR) { 425 if (!UseMCJIT) { 426 errs() << "warning: -debug-ir used without -use-mcjit. Only partial debug" 427 << " information will be emitted by the non-MC JIT engine. To see full" 428 << " source debug information, enable the flag '-use-mcjit'.\n"; 429 430 } 431 ModulePass *DebugIRPass = createDebugIRPass(); 432 DebugIRPass->runOnModule(*Mod); 433 } 434 435 std::string ErrorMsg; 436 EngineBuilder builder(Mod); 437 builder.setMArch(MArch); 438 builder.setMCPU(MCPU); 439 builder.setMAttrs(MAttrs); 440 builder.setRelocationModel(RelocModel); 441 builder.setCodeModel(CMModel); 442 builder.setErrorStr(&ErrorMsg); 443 builder.setEngineKind(ForceInterpreter 444 ? EngineKind::Interpreter 445 : EngineKind::JIT); 446 447 // If we are supposed to override the target triple, do so now. 448 if (!TargetTriple.empty()) 449 Mod->setTargetTriple(Triple::normalize(TargetTriple)); 450 451 // Enable MCJIT if desired. 452 RTDyldMemoryManager *RTDyldMM = 0; 453 if (UseMCJIT && !ForceInterpreter) { 454 builder.setUseMCJIT(true); 455 if (RemoteMCJIT) 456 RTDyldMM = new RemoteMemoryManager(); 457 else 458 RTDyldMM = new SectionMemoryManager(); 459 builder.setMCJITMemoryManager(RTDyldMM); 460 } else { 461 if (RemoteMCJIT) { 462 errs() << "error: Remote process execution requires -use-mcjit\n"; 463 exit(1); 464 } 465 builder.setJITMemoryManager(ForceInterpreter ? 0 : 466 JITMemoryManager::CreateDefaultMemManager()); 467 } 468 469 CodeGenOpt::Level OLvl = CodeGenOpt::Default; 470 switch (OptLevel) { 471 default: 472 errs() << argv[0] << ": invalid optimization level.\n"; 473 return 1; 474 case ' ': break; 475 case '0': OLvl = CodeGenOpt::None; break; 476 case '1': OLvl = CodeGenOpt::Less; break; 477 case '2': OLvl = CodeGenOpt::Default; break; 478 case '3': OLvl = CodeGenOpt::Aggressive; break; 479 } 480 builder.setOptLevel(OLvl); 481 482 TargetOptions Options; 483 Options.UseSoftFloat = GenerateSoftFloatCalls; 484 if (FloatABIForCalls != FloatABI::Default) 485 Options.FloatABIType = FloatABIForCalls; 486 if (GenerateSoftFloatCalls) 487 FloatABIForCalls = FloatABI::Soft; 488 489 // Remote target execution doesn't handle EH or debug registration. 490 if (!RemoteMCJIT) { 491 Options.JITEmitDebugInfo = EmitJitDebugInfo; 492 Options.JITEmitDebugInfoToDisk = EmitJitDebugInfoToDisk; 493 } 494 495 builder.setTargetOptions(Options); 496 497 EE = builder.create(); 498 if (!EE) { 499 if (!ErrorMsg.empty()) 500 errs() << argv[0] << ": error creating EE: " << ErrorMsg << "\n"; 501 else 502 errs() << argv[0] << ": unknown error creating EE!\n"; 503 exit(1); 504 } 505 506 if (EnableCacheManager) { 507 CacheManager = new LLIObjectCache(ObjectCacheDir); 508 EE->setObjectCache(CacheManager); 509 } 510 511 // Load any additional modules specified on the command line. 512 for (unsigned i = 0, e = ExtraModules.size(); i != e; ++i) { 513 Module *XMod = ParseIRFile(ExtraModules[i], Err, Context); 514 if (!XMod) { 515 Err.print(argv[0], errs()); 516 return 1; 517 } 518 if (EnableCacheManager) { 519 if (UseMCJIT) { 520 std::string CacheName("file:"); 521 CacheName.append(ExtraModules[i]); 522 XMod->setModuleIdentifier(CacheName); 523 } 524 // else, we already printed a warning above. 525 } 526 EE->addModule(XMod); 527 } 528 529 for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) { 530 ErrorOr<object::ObjectFile *> Obj = 531 object::ObjectFile::createObjectFile(ExtraObjects[i]); 532 if (!Obj) { 533 Err.print(argv[0], errs()); 534 return 1; 535 } 536 EE->addObjectFile(Obj.get()); 537 } 538 539 for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) { 540 OwningPtr<MemoryBuffer> ArBuf; 541 error_code ec; 542 ec = MemoryBuffer::getFileOrSTDIN(ExtraArchives[i], ArBuf); 543 if (ec) { 544 Err.print(argv[0], errs()); 545 return 1; 546 } 547 object::Archive *Ar = new object::Archive(ArBuf.take(), ec); 548 if (ec || !Ar) { 549 Err.print(argv[0], errs()); 550 return 1; 551 } 552 EE->addArchive(Ar); 553 } 554 555 // If the target is Cygwin/MingW and we are generating remote code, we 556 // need an extra module to help out with linking. 557 if (RemoteMCJIT && Triple(Mod->getTargetTriple()).isOSCygMing()) { 558 addCygMingExtraModule(EE, Context, Mod->getTargetTriple()); 559 } 560 561 // The following functions have no effect if their respective profiling 562 // support wasn't enabled in the build configuration. 563 EE->RegisterJITEventListener( 564 JITEventListener::createOProfileJITEventListener()); 565 EE->RegisterJITEventListener( 566 JITEventListener::createIntelJITEventListener()); 567 568 if (!NoLazyCompilation && RemoteMCJIT) { 569 errs() << "warning: remote mcjit does not support lazy compilation\n"; 570 NoLazyCompilation = true; 571 } 572 EE->DisableLazyCompilation(NoLazyCompilation); 573 574 // If the user specifically requested an argv[0] to pass into the program, 575 // do it now. 576 if (!FakeArgv0.empty()) { 577 InputFile = FakeArgv0; 578 } else { 579 // Otherwise, if there is a .bc suffix on the executable strip it off, it 580 // might confuse the program. 581 if (StringRef(InputFile).endswith(".bc")) 582 InputFile.erase(InputFile.length() - 3); 583 } 584 585 // Add the module's name to the start of the vector of arguments to main(). 586 InputArgv.insert(InputArgv.begin(), InputFile); 587 588 // Call the main function from M as if its signature were: 589 // int main (int argc, char **argv, const char **envp) 590 // using the contents of Args to determine argc & argv, and the contents of 591 // EnvVars to determine envp. 592 // 593 Function *EntryFn = Mod->getFunction(EntryFunc); 594 if (!EntryFn) { 595 errs() << '\'' << EntryFunc << "\' function not found in module.\n"; 596 return -1; 597 } 598 599 // Reset errno to zero on entry to main. 600 errno = 0; 601 602 int Result; 603 604 if (!RemoteMCJIT) { 605 // If the program doesn't explicitly call exit, we will need the Exit 606 // function later on to make an explicit call, so get the function now. 607 Constant *Exit = Mod->getOrInsertFunction("exit", Type::getVoidTy(Context), 608 Type::getInt32Ty(Context), 609 NULL); 610 611 // Run static constructors. 612 if (UseMCJIT && !ForceInterpreter) { 613 // Give MCJIT a chance to apply relocations and set page permissions. 614 EE->finalizeObject(); 615 } 616 EE->runStaticConstructorsDestructors(false); 617 618 if (!UseMCJIT && NoLazyCompilation) { 619 for (Module::iterator I = Mod->begin(), E = Mod->end(); I != E; ++I) { 620 Function *Fn = &*I; 621 if (Fn != EntryFn && !Fn->isDeclaration()) 622 EE->getPointerToFunction(Fn); 623 } 624 } 625 626 // Trigger compilation separately so code regions that need to be 627 // invalidated will be known. 628 (void)EE->getPointerToFunction(EntryFn); 629 // Clear instruction cache before code will be executed. 630 if (RTDyldMM) 631 static_cast<SectionMemoryManager*>(RTDyldMM)->invalidateInstructionCache(); 632 633 // Run main. 634 Result = EE->runFunctionAsMain(EntryFn, InputArgv, envp); 635 636 // Run static destructors. 637 EE->runStaticConstructorsDestructors(true); 638 639 // If the program didn't call exit explicitly, we should call it now. 640 // This ensures that any atexit handlers get called correctly. 641 if (Function *ExitF = dyn_cast<Function>(Exit)) { 642 std::vector<GenericValue> Args; 643 GenericValue ResultGV; 644 ResultGV.IntVal = APInt(32, Result); 645 Args.push_back(ResultGV); 646 EE->runFunction(ExitF, Args); 647 errs() << "ERROR: exit(" << Result << ") returned!\n"; 648 abort(); 649 } else { 650 errs() << "ERROR: exit defined with wrong prototype!\n"; 651 abort(); 652 } 653 } else { 654 // else == "if (RemoteMCJIT)" 655 656 // Remote target MCJIT doesn't (yet) support static constructors. No reason 657 // it couldn't. This is a limitation of the LLI implemantation, not the 658 // MCJIT itself. FIXME. 659 // 660 RemoteMemoryManager *MM = static_cast<RemoteMemoryManager*>(RTDyldMM); 661 // Everything is prepared now, so lay out our program for the target 662 // address space, assign the section addresses to resolve any relocations, 663 // and send it to the target. 664 665 OwningPtr<RemoteTarget> Target; 666 if (!ChildExecPath.empty()) { // Remote execution on a child process 667 #ifndef LLVM_ON_UNIX 668 // FIXME: Remove this pointless fallback mode which causes tests to "pass" 669 // on platforms where they should XFAIL. 670 errs() << "Warning: host does not support external remote targets.\n" 671 << " Defaulting to simulated remote execution\n"; 672 Target.reset(new RemoteTarget); 673 #else 674 if (!sys::fs::can_execute(ChildExecPath)) { 675 errs() << "Unable to find usable child executable: '" << ChildExecPath 676 << "'\n"; 677 return -1; 678 } 679 Target.reset(new RemoteTargetExternal(ChildExecPath)); 680 #endif 681 } else { 682 // No child process name provided, use simulated remote execution. 683 Target.reset(new RemoteTarget); 684 } 685 686 // Give the memory manager a pointer to our remote target interface object. 687 MM->setRemoteTarget(Target.get()); 688 689 // Create the remote target. 690 if (!Target->create()) { 691 errs() << "ERROR: " << Target->getErrorMsg() << "\n"; 692 return EXIT_FAILURE; 693 } 694 695 // Since we're executing in a (at least simulated) remote address space, 696 // we can't use the ExecutionEngine::runFunctionAsMain(). We have to 697 // grab the function address directly here and tell the remote target 698 // to execute the function. 699 // 700 // Our memory manager will map generated code into the remote address 701 // space as it is loaded and copy the bits over during the finalizeMemory 702 // operation. 703 // 704 // FIXME: argv and envp handling. 705 uint64_t Entry = EE->getFunctionAddress(EntryFn->getName().str()); 706 707 DEBUG(dbgs() << "Executing '" << EntryFn->getName() << "' at 0x" 708 << format("%llx", Entry) << "\n"); 709 710 if (!Target->executeCode(Entry, Result)) 711 errs() << "ERROR: " << Target->getErrorMsg() << "\n"; 712 713 // Like static constructors, the remote target MCJIT support doesn't handle 714 // this yet. It could. FIXME. 715 716 // Stop the remote target 717 Target->stop(); 718 } 719 720 return Result; 721 } 722