xref: /freebsd-src/contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp (revision fe6060f10f634930ff71b7c50291ddc610da2475)
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