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