1a9ac8606Spatrick //===--- Interpreter.h - Incremental Compilation and 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 defines the component which performs incremental code 10a9ac8606Spatrick // compilation and execution. 11a9ac8606Spatrick // 12a9ac8606Spatrick //===----------------------------------------------------------------------===// 13a9ac8606Spatrick 14a9ac8606Spatrick #ifndef LLVM_CLANG_INTERPRETER_INTERPRETER_H 15a9ac8606Spatrick #define LLVM_CLANG_INTERPRETER_INTERPRETER_H 16a9ac8606Spatrick 17a9ac8606Spatrick #include "clang/Interpreter/PartialTranslationUnit.h" 18a9ac8606Spatrick 19*12c85518Srobert #include "clang/AST/GlobalDecl.h" 20*12c85518Srobert 21*12c85518Srobert #include "llvm/ExecutionEngine/JITSymbol.h" 22a9ac8606Spatrick #include "llvm/Support/Error.h" 23a9ac8606Spatrick 24a9ac8606Spatrick #include <memory> 25a9ac8606Spatrick #include <vector> 26a9ac8606Spatrick 27a9ac8606Spatrick namespace llvm { 28a9ac8606Spatrick namespace orc { 29*12c85518Srobert class LLJIT; 30a9ac8606Spatrick class ThreadSafeContext; 31a9ac8606Spatrick } 32a9ac8606Spatrick } // namespace llvm 33a9ac8606Spatrick 34a9ac8606Spatrick namespace clang { 35a9ac8606Spatrick 36a9ac8606Spatrick class CompilerInstance; 37a9ac8606Spatrick class IncrementalExecutor; 38a9ac8606Spatrick class IncrementalParser; 39a9ac8606Spatrick 40a9ac8606Spatrick /// Create a pre-configured \c CompilerInstance for incremental processing. 41a9ac8606Spatrick class IncrementalCompilerBuilder { 42a9ac8606Spatrick public: 43a9ac8606Spatrick static llvm::Expected<std::unique_ptr<CompilerInstance>> 44a9ac8606Spatrick create(std::vector<const char *> &ClangArgv); 45a9ac8606Spatrick }; 46a9ac8606Spatrick 47a9ac8606Spatrick /// Provides top-level interfaces for incremental compilation and execution. 48a9ac8606Spatrick class Interpreter { 49a9ac8606Spatrick std::unique_ptr<llvm::orc::ThreadSafeContext> TSCtx; 50a9ac8606Spatrick std::unique_ptr<IncrementalParser> IncrParser; 51a9ac8606Spatrick std::unique_ptr<IncrementalExecutor> IncrExecutor; 52a9ac8606Spatrick 53a9ac8606Spatrick Interpreter(std::unique_ptr<CompilerInstance> CI, llvm::Error &Err); 54a9ac8606Spatrick 55a9ac8606Spatrick public: 56a9ac8606Spatrick ~Interpreter(); 57a9ac8606Spatrick static llvm::Expected<std::unique_ptr<Interpreter>> 58a9ac8606Spatrick create(std::unique_ptr<CompilerInstance> CI); 59a9ac8606Spatrick const CompilerInstance *getCompilerInstance() const; 60*12c85518Srobert const llvm::orc::LLJIT *getExecutionEngine() const; 61a9ac8606Spatrick llvm::Expected<PartialTranslationUnit &> Parse(llvm::StringRef Code); 62a9ac8606Spatrick llvm::Error Execute(PartialTranslationUnit &T); ParseAndExecute(llvm::StringRef Code)63a9ac8606Spatrick llvm::Error ParseAndExecute(llvm::StringRef Code) { 64a9ac8606Spatrick auto PTU = Parse(Code); 65a9ac8606Spatrick if (!PTU) 66a9ac8606Spatrick return PTU.takeError(); 67a9ac8606Spatrick if (PTU->TheModule) 68a9ac8606Spatrick return Execute(*PTU); 69a9ac8606Spatrick return llvm::Error::success(); 70a9ac8606Spatrick } 71*12c85518Srobert 72*12c85518Srobert /// Undo N previous incremental inputs. 73*12c85518Srobert llvm::Error Undo(unsigned N = 1); 74*12c85518Srobert 75*12c85518Srobert /// \returns the \c JITTargetAddress of a \c GlobalDecl. This interface uses 76*12c85518Srobert /// the CodeGenModule's internal mangling cache to avoid recomputing the 77*12c85518Srobert /// mangled name. 78*12c85518Srobert llvm::Expected<llvm::JITTargetAddress> getSymbolAddress(GlobalDecl GD) const; 79*12c85518Srobert 80*12c85518Srobert /// \returns the \c JITTargetAddress of a given name as written in the IR. 81*12c85518Srobert llvm::Expected<llvm::JITTargetAddress> 82*12c85518Srobert getSymbolAddress(llvm::StringRef IRName) const; 83*12c85518Srobert 84*12c85518Srobert /// \returns the \c JITTargetAddress of a given name as written in the object 85*12c85518Srobert /// file. 86*12c85518Srobert llvm::Expected<llvm::JITTargetAddress> 87*12c85518Srobert getSymbolAddressFromLinkerName(llvm::StringRef LinkerName) const; 88a9ac8606Spatrick }; 89a9ac8606Spatrick } // namespace clang 90a9ac8606Spatrick 91a9ac8606Spatrick #endif // LLVM_CLANG_INTERPRETER_INTERPRETER_H 92