diff options
| author | Dimitry Andric <dim@FreeBSD.org> | 2021-08-22 19:00:43 +0000 |
|---|---|---|
| committer | Dimitry Andric <dim@FreeBSD.org> | 2021-11-13 20:39:49 +0000 |
| commit | fe6060f10f634930ff71b7c50291ddc610da2475 (patch) | |
| tree | 1483580c790bd4d27b6500a7542b5ee00534d3cc /contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp | |
| parent | b61bce17f346d79cecfd8f195a64b10f77be43b1 (diff) | |
| parent | 344a3780b2e33f6ca763666c380202b18aab72a3 (diff) | |
Diffstat (limited to 'contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp')
| -rw-r--r-- | contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp b/contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp new file mode 100644 index 000000000000..9a368d9122bc --- /dev/null +++ b/contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp @@ -0,0 +1,63 @@ +//===--- IncrementalExecutor.cpp - Incremental Execution --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements the class which performs incremental code execution. +// +//===----------------------------------------------------------------------===// + +#include "IncrementalExecutor.h" + +#include "llvm/ExecutionEngine/ExecutionEngine.h" +#include "llvm/ExecutionEngine/Orc/CompileUtils.h" +#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" +#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" +#include "llvm/ExecutionEngine/Orc/LLJIT.h" +#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" +#include "llvm/ExecutionEngine/SectionMemoryManager.h" +#include "llvm/IR/Module.h" +#include "llvm/Support/ManagedStatic.h" +#include "llvm/Support/TargetSelect.h" + +namespace clang { + +IncrementalExecutor::IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC, + llvm::Error &Err, + const llvm::Triple &Triple) + : TSCtx(TSC) { + using namespace llvm::orc; + llvm::ErrorAsOutParameter EAO(&Err); + + auto JTMB = JITTargetMachineBuilder(Triple); + if (auto JitOrErr = LLJITBuilder().setJITTargetMachineBuilder(JTMB).create()) + Jit = std::move(*JitOrErr); + else { + Err = JitOrErr.takeError(); + return; + } + + const char Pref = Jit->getDataLayout().getGlobalPrefix(); + // Discover symbols from the process as a fallback. + if (auto PSGOrErr = DynamicLibrarySearchGenerator::GetForCurrentProcess(Pref)) + Jit->getMainJITDylib().addGenerator(std::move(*PSGOrErr)); + else { + Err = PSGOrErr.takeError(); + return; + } +} + +IncrementalExecutor::~IncrementalExecutor() {} + +llvm::Error IncrementalExecutor::addModule(std::unique_ptr<llvm::Module> M) { + return Jit->addIRModule(llvm::orc::ThreadSafeModule(std::move(M), TSCtx)); +} + +llvm::Error IncrementalExecutor::runCtors() const { + return Jit->initialize(Jit->getMainJITDylib()); +} + +} // end namespace clang |
