Path: blob/main/contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.cpp
35233 views
//===--- IncrementalExecutor.cpp - Incremental Execution --------*- C++ -*-===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements the class which performs incremental code execution.9//10//===----------------------------------------------------------------------===//1112#include "IncrementalExecutor.h"1314#include "clang/Basic/TargetInfo.h"15#include "clang/Basic/TargetOptions.h"16#include "clang/Interpreter/PartialTranslationUnit.h"17#include "llvm/ExecutionEngine/ExecutionEngine.h"18#include "llvm/ExecutionEngine/Orc/CompileUtils.h"19#include "llvm/ExecutionEngine/Orc/Debugging/DebuggerSupport.h"20#include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"21#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"22#include "llvm/ExecutionEngine/Orc/JITTargetMachineBuilder.h"23#include "llvm/ExecutionEngine/Orc/LLJIT.h"24#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h"25#include "llvm/ExecutionEngine/Orc/TargetProcess/JITLoaderGDB.h"26#include "llvm/ExecutionEngine/SectionMemoryManager.h"27#include "llvm/IR/Module.h"28#include "llvm/Support/ManagedStatic.h"29#include "llvm/Support/TargetSelect.h"3031// Force linking some of the runtimes that helps attaching to a debugger.32LLVM_ATTRIBUTE_USED void linkComponents() {33llvm::errs() << (void *)&llvm_orc_registerJITLoaderGDBWrapper34<< (void *)&llvm_orc_registerJITLoaderGDBAllocAction;35}3637namespace clang {38IncrementalExecutor::IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC)39: TSCtx(TSC) {}4041llvm::Expected<std::unique_ptr<llvm::orc::LLJITBuilder>>42IncrementalExecutor::createDefaultJITBuilder(43llvm::orc::JITTargetMachineBuilder JTMB) {44auto JITBuilder = std::make_unique<llvm::orc::LLJITBuilder>();45JITBuilder->setJITTargetMachineBuilder(std::move(JTMB));46JITBuilder->setPrePlatformSetup([](llvm::orc::LLJIT &J) {47// Try to enable debugging of JIT'd code (only works with JITLink for48// ELF and MachO).49consumeError(llvm::orc::enableDebuggerSupport(J));50return llvm::Error::success();51});52return std::move(JITBuilder);53}5455IncrementalExecutor::IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC,56llvm::orc::LLJITBuilder &JITBuilder,57llvm::Error &Err)58: TSCtx(TSC) {59using namespace llvm::orc;60llvm::ErrorAsOutParameter EAO(&Err);6162if (auto JitOrErr = JITBuilder.create())63Jit = std::move(*JitOrErr);64else {65Err = JitOrErr.takeError();66return;67}68}6970IncrementalExecutor::~IncrementalExecutor() {}7172llvm::Error IncrementalExecutor::addModule(PartialTranslationUnit &PTU) {73llvm::orc::ResourceTrackerSP RT =74Jit->getMainJITDylib().createResourceTracker();75ResourceTrackers[&PTU] = RT;7677return Jit->addIRModule(RT, {std::move(PTU.TheModule), TSCtx});78}7980llvm::Error IncrementalExecutor::removeModule(PartialTranslationUnit &PTU) {8182llvm::orc::ResourceTrackerSP RT = std::move(ResourceTrackers[&PTU]);83if (!RT)84return llvm::Error::success();8586ResourceTrackers.erase(&PTU);87if (llvm::Error Err = RT->remove())88return Err;89return llvm::Error::success();90}9192// Clean up the JIT instance.93llvm::Error IncrementalExecutor::cleanUp() {94// This calls the global dtors of registered modules.95return Jit->deinitialize(Jit->getMainJITDylib());96}9798llvm::Error IncrementalExecutor::runCtors() const {99return Jit->initialize(Jit->getMainJITDylib());100}101102llvm::Expected<llvm::orc::ExecutorAddr>103IncrementalExecutor::getSymbolAddress(llvm::StringRef Name,104SymbolNameKind NameKind) const {105using namespace llvm::orc;106auto SO = makeJITDylibSearchOrder({&Jit->getMainJITDylib(),107Jit->getPlatformJITDylib().get(),108Jit->getProcessSymbolsJITDylib().get()});109110ExecutionSession &ES = Jit->getExecutionSession();111112auto SymOrErr =113ES.lookup(SO, (NameKind == LinkerName) ? ES.intern(Name)114: Jit->mangleAndIntern(Name));115if (auto Err = SymOrErr.takeError())116return std::move(Err);117return SymOrErr->getAddress();118}119120} // end namespace clang121122123