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