extern "C" void* LLVMRustExecuteJIT(void* mem, LLVMPassManagerRef PMR, LLVMModuleRef M, CodeGenOpt::Level OptLevel, bool EnableSegmentedStacks) { InitializeNativeTarget(); InitializeNativeTargetAsmPrinter(); InitializeNativeTargetAsmParser(); std::string Err; TargetOptions Options; Options.JITExceptionHandling = true; Options.JITEmitDebugInfo = true; Options.NoFramePointerElim = true; Options.EnableSegmentedStacks = EnableSegmentedStacks; PassManager *PM = unwrap<PassManager>(PMR); RustMCJITMemoryManager* MM = (RustMCJITMemoryManager*) mem; assert(MM); PM->add(createBasicAliasAnalysisPass()); PM->add(createInstructionCombiningPass()); PM->add(createReassociatePass()); PM->add(createGVNPass()); PM->add(createCFGSimplificationPass()); PM->add(createFunctionInliningPass()); PM->add(createPromoteMemoryToRegisterPass()); PM->run(*unwrap(M)); ExecutionEngine* EE = EngineBuilder(unwrap(M)) .setErrorStr(&Err) .setTargetOptions(Options) .setJITMemoryManager(MM) .setOptLevel(OptLevel) .setUseMCJIT(true) .setAllocateGVsWithCode(false) .create(); if(!EE || Err != "") { LLVMRustError = Err.c_str(); return 0; } MM->invalidateInstructionCache(); Function* func = EE->FindFunctionNamed("_rust_main"); if(!func || Err != "") { LLVMRustError = Err.c_str(); return 0; } void* entry = EE->getPointerToFunction(func); assert(entry); return entry; }
extern "C" bool LLVMRustLoadCrate(void* mem, const char* crate) { RustMCJITMemoryManager* manager = (RustMCJITMemoryManager*) mem; std::string Err; assert(manager); if(!manager->loadCrate(crate, &Err)) { LLVMRustError = Err.c_str(); return false; } return true; }
extern "C" LLVMExecutionEngineRef LLVMRustBuildJIT(void* mem, LLVMModuleRef M, bool EnableSegmentedStacks) { InitializeNativeTarget(); InitializeNativeTargetAsmPrinter(); InitializeNativeTargetAsmParser(); std::string Err; TargetOptions Options; Options.JITEmitDebugInfo = true; Options.NoFramePointerElim = true; Options.EnableSegmentedStacks = EnableSegmentedStacks; RustMCJITMemoryManager* MM = (RustMCJITMemoryManager*) mem; assert(MM); ExecutionEngine* EE = EngineBuilder(unwrap(M)) .setErrorStr(&Err) .setTargetOptions(Options) .setJITMemoryManager(MM) .setUseMCJIT(true) .setAllocateGVsWithCode(false) .create(); if(!EE || Err != "") { LLVMRustError = Err.c_str(); // The EngineBuilder only takes ownership of these two structures if the // create() call is successful, but here it wasn't successful. LLVMDisposeModule(M); delete MM; return NULL; } MM->invalidateInstructionCache(); return wrap(EE); }