xref: /openbsd-src/gnu/llvm/clang/include/clang/Interpreter/Interpreter.h (revision 12c855180aad702bbcca06e0398d774beeafb155)
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