1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----- KaleidoscopeJIT.h - A simple JIT for Kaleidoscope ----*- C++ -*-===// 2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// The LLVM Compiler Infrastructure 4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source 6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details. 7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// Contains a simple JIT definition for use in the kaleidoscope tutorials. 11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// 12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===// 13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#ifndef LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H 15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#define LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H 16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/STLExtras.h" 18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/ExecutionEngine.h" 19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/RuntimeDyld.h" 20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/SectionMemoryManager.h" 21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/Orc/CompileOnDemandLayer.h" 22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/Orc/CompileUtils.h" 23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/Orc/JITSymbol.h" 24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" 25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/Orc/IRTransformLayer.h" 26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/Orc/LambdaResolver.h" 27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" 28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/DataLayout.h" 29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/IR/Mangler.h" 30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/DynamicLibrary.h" 31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/raw_ostream.h" 32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Target/TargetMachine.h" 33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <algorithm> 34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <memory> 35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <string> 36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <vector> 37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass PrototypeAST; 39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass ExprAST; 40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// FunctionAST - This class represents a function definition itself. 42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass FunctionAST { 43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<PrototypeAST> Proto; 44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<ExprAST> Body; 45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FunctionAST(std::unique_ptr<PrototypeAST> Proto, 48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<ExprAST> Body) 49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : Proto(std::move(Proto)), Body(std::move(Body)) {} 50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const PrototypeAST& getProto() const; 51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const std::string& getName() const; 52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar llvm::Function *codegen(); 53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// This will compile FnAST to IR, rename the function to add the given 56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// suffix (needed to prevent a name-clash with the function's stub), 57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// and then take ownership of the module that the function was compiled 58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar/// into. 59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarstd::unique_ptr<llvm::Module> 60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarirgenAndTakeOwnership(FunctionAST &FnAST, const std::string &Suffix); 61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace llvm { 63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace orc { 64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass KaleidoscopeJIT { 66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate: 67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<TargetMachine> TM; 68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar const DataLayout DL; 69de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<JITCompileCallbackManager> CompileCallbackMgr; 70de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<IndirectStubsManager> IndirectStubsMgr; 71de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ObjectLinkingLayer<> ObjectLayer; 72de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar IRCompileLayer<decltype(ObjectLayer)> CompileLayer; 73de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 74de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar typedef std::function<std::unique_ptr<Module>(std::unique_ptr<Module>)> 75de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OptimizeFunction; 76de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 77de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar IRTransformLayer<decltype(CompileLayer), OptimizeFunction> OptimizeLayer; 78de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 79de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic: 80de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar typedef decltype(OptimizeLayer)::ModuleSetHandleT ModuleHandle; 81de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 82de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar KaleidoscopeJIT() 83de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar : TM(EngineBuilder().selectTarget()), 84de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar DL(TM->createDataLayout()), 85de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CompileCallbackMgr( 86de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar orc::createLocalCompileCallbackManager(TM->getTargetTriple(), 0)), 87de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CompileLayer(ObjectLayer, SimpleCompiler(*TM)), 88de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OptimizeLayer(CompileLayer, 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar [this](std::unique_ptr<Module> M) { 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return optimizeModule(std::move(M)); 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }) { 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto IndirectStubsMgrBuilder = 93de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar orc::createLocalIndirectStubsManagerBuilder(TM->getTargetTriple()); 94de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar IndirectStubsMgr = IndirectStubsMgrBuilder(); 95de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar llvm::sys::DynamicLibrary::LoadLibraryPermanently(nullptr); 96de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 97de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 98de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetMachine &getTargetMachine() { return *TM; } 99de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 100de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar ModuleHandle addModule(std::unique_ptr<Module> M) { 101de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 102de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Build our symbol resolver: 103de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Lambda 1: Look back into the JIT itself to find symbols that are part of 104de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // the same "logical dylib". 105de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Lambda 2: Search for external symbols in the host process. 106de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto Resolver = createLambdaResolver( 107de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar [&](const std::string &Name) { 108de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto Sym = IndirectStubsMgr->findStub(Name, false)) 109de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Sym.toRuntimeDyldSymbol(); 110de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto Sym = OptimizeLayer.findSymbol(Name, false)) 111de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Sym.toRuntimeDyldSymbol(); 112de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return RuntimeDyld::SymbolInfo(nullptr); 113de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }, 114de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar [](const std::string &Name) { 115de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto SymAddr = 116de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar RTDyldMemoryManager::getSymbolAddressInProcess(Name)) 117de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return RuntimeDyld::SymbolInfo(SymAddr, JITSymbolFlags::Exported); 118de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return RuntimeDyld::SymbolInfo(nullptr); 119de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }); 120de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 121de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Build a singlton module set to hold our module. 122de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::vector<std::unique_ptr<Module>> Ms; 123de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Ms.push_back(std::move(M)); 124de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 125de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Add the set to the JIT with the resolver we created above and a newly 126de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // created SectionMemoryManager. 127de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return OptimizeLayer.addModuleSet(std::move(Ms), 128de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar make_unique<SectionMemoryManager>(), 129de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::move(Resolver)); 130de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 131de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 132de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Error addFunctionAST(std::unique_ptr<FunctionAST> FnAST) { 133de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Create a CompileCallback - this is the re-entry point into the compiler 134de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // for functions that haven't been compiled yet. 135de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto CCInfo = CompileCallbackMgr->getCompileCallback(); 136de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 137de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Create an indirect stub. This serves as the functions "canonical 138de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // definition" - an unchanging (constant address) entry point to the 139de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // function implementation. 140de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Initially we point the stub's function-pointer at the compile callback 141de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // that we just created. In the compile action for the callback (see below) 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // we will update the stub's function pointer to point at the function 143de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // implementation that we just implemented. 144de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto Err = IndirectStubsMgr->createStub(mangle(FnAST->getName()), 145de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CCInfo.getAddress(), 146de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar JITSymbolFlags::Exported)) 147de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Err; 148de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 149de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Move ownership of FnAST to a shared pointer - C++11 lambdas don't support 150de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // capture-by-move, which is be required for unique_ptr. 151de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto SharedFnAST = std::shared_ptr<FunctionAST>(std::move(FnAST)); 152de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 153de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Set the action to compile our AST. This lambda will be run if/when 154de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // execution hits the compile callback (via the stub). 155de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // 156de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // The steps to compile are: 157de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // (1) IRGen the function. 158de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // (2) Add the IR module to the JIT to make it executable like any other 159de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // module. 160de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // (3) Use findSymbol to get the address of the compiled function. 161de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // (4) Update the stub pointer to point at the implementation so that 162de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar /// subsequent calls go directly to it and bypass the compiler. 163de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // (5) Return the address of the implementation: this lambda will actually 164de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // be run inside an attempted call to the function, and we need to 165de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // continue on to the implementation to complete the attempted call. 166de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // The JIT runtime (the resolver block) will use the return address of 167de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // this function as the address to continue at once it has reset the 168de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // CPU state to what it was immediately before the call. 169de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar CCInfo.setCompileAction( 170de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar [this, SharedFnAST]() { 171de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto M = irgenAndTakeOwnership(*SharedFnAST, "$impl"); 172de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar addModule(std::move(M)); 173de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto Sym = findSymbol(SharedFnAST->getName() + "$impl"); 174de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar assert(Sym && "Couldn't find compiled function?"); 175de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar TargetAddress SymAddr = Sym.getAddress(); 176de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar if (auto Err = 177de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar IndirectStubsMgr->updatePointer(mangle(SharedFnAST->getName()), 178de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar SymAddr)) { 179de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar logAllUnhandledErrors(std::move(Err), errs(), 180de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar "Error updating function pointer: "); 181de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar exit(1); 182de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 183de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 184de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return SymAddr; 185de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar }); 186de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 187de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return Error::success(); 188de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 189de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 190de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar JITSymbol findSymbol(const std::string Name) { 191de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return OptimizeLayer.findSymbol(mangle(Name), true); 192de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 193de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 194de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar void removeModule(ModuleHandle H) { 195de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar OptimizeLayer.removeModuleSet(H); 196de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 197de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 198de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarprivate: 199de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 200de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string mangle(const std::string &Name) { 201de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::string MangledName; 202de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar raw_string_ostream MangledNameStream(MangledName); 203de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar Mangler::getNameWithPrefix(MangledNameStream, Name, DL); 204de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return MangledNameStream.str(); 205de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 206de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 207de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar std::unique_ptr<Module> optimizeModule(std::unique_ptr<Module> M) { 208de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Create a function pass manager. 209de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar auto FPM = llvm::make_unique<legacy::FunctionPassManager>(M.get()); 210de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 211de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Add some optimizations. 212de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FPM->add(createInstructionCombiningPass()); 213de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FPM->add(createReassociatePass()); 214de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FPM->add(createGVNPass()); 215de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FPM->add(createCFGSimplificationPass()); 216de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FPM->doInitialization(); 217de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 218de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // Run the optimizations over all functions in the module being added to 219de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar // the JIT. 220de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar for (auto &F : *M) 221de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar FPM->run(F); 222de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 223de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar return M; 224de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar } 225de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 226de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}; 227de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 228de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end namespace orc 229de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end namespace llvm 230de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar 231de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#endif // LLVM_EXECUTIONENGINE_ORC_KALEIDOSCOPEJIT_H 232