1a9ac8606Spatrick //===--- IncrementalExecutor.h - Incremental Execution ----------*- C++ -*-===// 2a9ac8606Spatrick // 3a9ac8606Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4a9ac8606Spatrick // See https://llvm.org/LICENSE.txt for license information. 5a9ac8606Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6a9ac8606Spatrick // 7a9ac8606Spatrick //===----------------------------------------------------------------------===// 8a9ac8606Spatrick // 9a9ac8606Spatrick // This file implements the class which performs incremental code execution. 10a9ac8606Spatrick // 11a9ac8606Spatrick //===----------------------------------------------------------------------===// 12a9ac8606Spatrick 13a9ac8606Spatrick #ifndef LLVM_CLANG_LIB_INTERPRETER_INCREMENTALEXECUTOR_H 14a9ac8606Spatrick #define LLVM_CLANG_LIB_INTERPRETER_INCREMENTALEXECUTOR_H 15a9ac8606Spatrick 16*12c85518Srobert #include "llvm/ADT/DenseMap.h" 17a9ac8606Spatrick #include "llvm/ADT/StringRef.h" 18a9ac8606Spatrick #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h" 19a9ac8606Spatrick 20a9ac8606Spatrick #include <memory> 21a9ac8606Spatrick 22a9ac8606Spatrick namespace llvm { 23a9ac8606Spatrick class Error; 24a9ac8606Spatrick namespace orc { 25a9ac8606Spatrick class LLJIT; 26a9ac8606Spatrick class ThreadSafeContext; 27a9ac8606Spatrick } // namespace orc 28a9ac8606Spatrick } // namespace llvm 29a9ac8606Spatrick 30a9ac8606Spatrick namespace clang { 31*12c85518Srobert 32*12c85518Srobert struct PartialTranslationUnit; 33*12c85518Srobert class TargetInfo; 34*12c85518Srobert 35a9ac8606Spatrick class IncrementalExecutor { 36a9ac8606Spatrick using CtorDtorIterator = llvm::orc::CtorDtorIterator; 37a9ac8606Spatrick std::unique_ptr<llvm::orc::LLJIT> Jit; 38a9ac8606Spatrick llvm::orc::ThreadSafeContext &TSCtx; 39a9ac8606Spatrick 40*12c85518Srobert llvm::DenseMap<const PartialTranslationUnit *, llvm::orc::ResourceTrackerSP> 41*12c85518Srobert ResourceTrackers; 42*12c85518Srobert 43a9ac8606Spatrick public: 44*12c85518Srobert enum SymbolNameKind { IRName, LinkerName }; 45*12c85518Srobert 46a9ac8606Spatrick IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC, llvm::Error &Err, 47*12c85518Srobert const clang::TargetInfo &TI); 48a9ac8606Spatrick ~IncrementalExecutor(); 49a9ac8606Spatrick 50*12c85518Srobert llvm::Error addModule(PartialTranslationUnit &PTU); 51*12c85518Srobert llvm::Error removeModule(PartialTranslationUnit &PTU); 52a9ac8606Spatrick llvm::Error runCtors() const; 53*12c85518Srobert llvm::Error cleanUp(); 54*12c85518Srobert llvm::Expected<llvm::JITTargetAddress> 55*12c85518Srobert getSymbolAddress(llvm::StringRef Name, SymbolNameKind NameKind) const; getExecutionEngine()56*12c85518Srobert llvm::orc::LLJIT *getExecutionEngine() const { return Jit.get(); } 57a9ac8606Spatrick }; 58a9ac8606Spatrick 59a9ac8606Spatrick } // end namespace clang 60a9ac8606Spatrick 61a9ac8606Spatrick #endif // LLVM_CLANG_LIB_INTERPRETER_INCREMENTALEXECUTOR_H 62