1fe6060f1SDimitry Andric //===--- IncrementalExecutor.cpp - Incremental Execution --------*- C++ -*-===// 2fe6060f1SDimitry Andric // 3fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6fe6060f1SDimitry Andric // 7fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 8fe6060f1SDimitry Andric // 9fe6060f1SDimitry Andric // This file implements the class which performs incremental code execution. 10fe6060f1SDimitry Andric // 11fe6060f1SDimitry Andric //===----------------------------------------------------------------------===// 12fe6060f1SDimitry Andric 13fe6060f1SDimitry Andric #include "IncrementalExecutor.h" 14fe6060f1SDimitry Andric 15fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/ExecutionEngine.h" 16fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/CompileUtils.h" 17fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" 18fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" 19fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/LLJIT.h" 20fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" 21fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/SectionMemoryManager.h" 22fe6060f1SDimitry Andric #include "llvm/IR/Module.h" 23fe6060f1SDimitry Andric #include "llvm/Support/ManagedStatic.h" 24fe6060f1SDimitry Andric #include "llvm/Support/TargetSelect.h" 25fe6060f1SDimitry Andric 26fe6060f1SDimitry Andric namespace clang { 27fe6060f1SDimitry Andric 28fe6060f1SDimitry Andric IncrementalExecutor::IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC, 29fe6060f1SDimitry Andric llvm::Error &Err, 30fe6060f1SDimitry Andric const llvm::Triple &Triple) 31fe6060f1SDimitry Andric : TSCtx(TSC) { 32fe6060f1SDimitry Andric using namespace llvm::orc; 33fe6060f1SDimitry Andric llvm::ErrorAsOutParameter EAO(&Err); 34fe6060f1SDimitry Andric 35fe6060f1SDimitry Andric auto JTMB = JITTargetMachineBuilder(Triple); 36fe6060f1SDimitry Andric if (auto JitOrErr = LLJITBuilder().setJITTargetMachineBuilder(JTMB).create()) 37fe6060f1SDimitry Andric Jit = std::move(*JitOrErr); 38fe6060f1SDimitry Andric else { 39fe6060f1SDimitry Andric Err = JitOrErr.takeError(); 40fe6060f1SDimitry Andric return; 41fe6060f1SDimitry Andric } 42fe6060f1SDimitry Andric 43fe6060f1SDimitry Andric const char Pref = Jit->getDataLayout().getGlobalPrefix(); 44fe6060f1SDimitry Andric // Discover symbols from the process as a fallback. 45fe6060f1SDimitry Andric if (auto PSGOrErr = DynamicLibrarySearchGenerator::GetForCurrentProcess(Pref)) 46fe6060f1SDimitry Andric Jit->getMainJITDylib().addGenerator(std::move(*PSGOrErr)); 47fe6060f1SDimitry Andric else { 48fe6060f1SDimitry Andric Err = PSGOrErr.takeError(); 49fe6060f1SDimitry Andric return; 50fe6060f1SDimitry Andric } 51fe6060f1SDimitry Andric } 52fe6060f1SDimitry Andric 53fe6060f1SDimitry Andric IncrementalExecutor::~IncrementalExecutor() {} 54fe6060f1SDimitry Andric 55fe6060f1SDimitry Andric llvm::Error IncrementalExecutor::addModule(std::unique_ptr<llvm::Module> M) { 56fe6060f1SDimitry Andric return Jit->addIRModule(llvm::orc::ThreadSafeModule(std::move(M), TSCtx)); 57fe6060f1SDimitry Andric } 58fe6060f1SDimitry Andric 59fe6060f1SDimitry Andric llvm::Error IncrementalExecutor::runCtors() const { 60fe6060f1SDimitry Andric return Jit->initialize(Jit->getMainJITDylib()); 61fe6060f1SDimitry Andric } 62fe6060f1SDimitry Andric 63*349cc55cSDimitry Andric llvm::Expected<llvm::JITTargetAddress> 64*349cc55cSDimitry Andric IncrementalExecutor::getSymbolAddress(llvm::StringRef Name, 65*349cc55cSDimitry Andric SymbolNameKind NameKind) const { 66*349cc55cSDimitry Andric auto Sym = (NameKind == LinkerName) ? Jit->lookupLinkerMangled(Name) 67*349cc55cSDimitry Andric : Jit->lookup(Name); 68*349cc55cSDimitry Andric 69*349cc55cSDimitry Andric if (!Sym) 70*349cc55cSDimitry Andric return Sym.takeError(); 71*349cc55cSDimitry Andric return Sym->getAddress(); 72*349cc55cSDimitry Andric } 73*349cc55cSDimitry Andric 74fe6060f1SDimitry Andric } // end namespace clang 75