aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/clang/include/clang/Interpreter/Interpreter.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/llvm-project/clang/include/clang/Interpreter/Interpreter.h')
-rw-r--r--contrib/llvm-project/clang/include/clang/Interpreter/Interpreter.h151
1 files changed, 151 insertions, 0 deletions
diff --git a/contrib/llvm-project/clang/include/clang/Interpreter/Interpreter.h b/contrib/llvm-project/clang/include/clang/Interpreter/Interpreter.h
new file mode 100644
index 000000000000..292fa566ae70
--- /dev/null
+++ b/contrib/llvm-project/clang/include/clang/Interpreter/Interpreter.h
@@ -0,0 +1,151 @@
+//===--- Interpreter.h - Incremental Compilation and 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 defines the component which performs incremental code
+// compilation and execution.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_INTERPRETER_INTERPRETER_H
+#define LLVM_CLANG_INTERPRETER_INTERPRETER_H
+
+#include "clang/AST/Decl.h"
+#include "clang/AST/GlobalDecl.h"
+#include "clang/Interpreter/PartialTranslationUnit.h"
+#include "clang/Interpreter/Value.h"
+
+#include "llvm/ADT/DenseMap.h"
+#include "llvm/ExecutionEngine/JITSymbol.h"
+#include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
+#include "llvm/Support/Error.h"
+#include <memory>
+#include <vector>
+
+namespace llvm {
+namespace orc {
+class LLJIT;
+class ThreadSafeContext;
+} // namespace orc
+} // namespace llvm
+
+namespace clang {
+
+class CompilerInstance;
+class IncrementalExecutor;
+class IncrementalParser;
+
+/// Create a pre-configured \c CompilerInstance for incremental processing.
+class IncrementalCompilerBuilder {
+public:
+ IncrementalCompilerBuilder() {}
+
+ void SetCompilerArgs(const std::vector<const char *> &Args) {
+ UserArgs = Args;
+ }
+
+ // General C++
+ llvm::Expected<std::unique_ptr<CompilerInstance>> CreateCpp();
+
+ // Offload options
+ void SetOffloadArch(llvm::StringRef Arch) { OffloadArch = Arch; };
+
+ // CUDA specific
+ void SetCudaSDK(llvm::StringRef path) { CudaSDKPath = path; };
+
+ llvm::Expected<std::unique_ptr<CompilerInstance>> CreateCudaHost();
+ llvm::Expected<std::unique_ptr<CompilerInstance>> CreateCudaDevice();
+
+private:
+ static llvm::Expected<std::unique_ptr<CompilerInstance>>
+ create(std::vector<const char *> &ClangArgv);
+
+ llvm::Expected<std::unique_ptr<CompilerInstance>> createCuda(bool device);
+
+ std::vector<const char *> UserArgs;
+
+ llvm::StringRef OffloadArch;
+ llvm::StringRef CudaSDKPath;
+};
+
+/// Provides top-level interfaces for incremental compilation and execution.
+class Interpreter {
+ std::unique_ptr<llvm::orc::ThreadSafeContext> TSCtx;
+ std::unique_ptr<IncrementalParser> IncrParser;
+ std::unique_ptr<IncrementalExecutor> IncrExecutor;
+
+ // An optional parser for CUDA offloading
+ std::unique_ptr<IncrementalParser> DeviceParser;
+
+ Interpreter(std::unique_ptr<CompilerInstance> CI, llvm::Error &Err);
+
+ llvm::Error CreateExecutor();
+ unsigned InitPTUSize = 0;
+
+ // This member holds the last result of the value printing. It's a class
+ // member because we might want to access it after more inputs. If no value
+ // printing happens, it's in an invalid state.
+ Value LastValue;
+
+public:
+ ~Interpreter();
+ static llvm::Expected<std::unique_ptr<Interpreter>>
+ create(std::unique_ptr<CompilerInstance> CI);
+ static llvm::Expected<std::unique_ptr<Interpreter>>
+ createWithCUDA(std::unique_ptr<CompilerInstance> CI,
+ std::unique_ptr<CompilerInstance> DCI);
+ const ASTContext &getASTContext() const;
+ ASTContext &getASTContext();
+ const CompilerInstance *getCompilerInstance() const;
+ CompilerInstance *getCompilerInstance();
+ llvm::Expected<llvm::orc::LLJIT &> getExecutionEngine();
+
+ llvm::Expected<PartialTranslationUnit &> Parse(llvm::StringRef Code);
+ llvm::Error Execute(PartialTranslationUnit &T);
+ llvm::Error ParseAndExecute(llvm::StringRef Code, Value *V = nullptr);
+ llvm::Expected<llvm::orc::ExecutorAddr> CompileDtorCall(CXXRecordDecl *CXXRD);
+
+ /// Undo N previous incremental inputs.
+ llvm::Error Undo(unsigned N = 1);
+
+ /// Link a dynamic library
+ llvm::Error LoadDynamicLibrary(const char *name);
+
+ /// \returns the \c ExecutorAddr of a \c GlobalDecl. This interface uses
+ /// the CodeGenModule's internal mangling cache to avoid recomputing the
+ /// mangled name.
+ llvm::Expected<llvm::orc::ExecutorAddr> getSymbolAddress(GlobalDecl GD) const;
+
+ /// \returns the \c ExecutorAddr of a given name as written in the IR.
+ llvm::Expected<llvm::orc::ExecutorAddr>
+ getSymbolAddress(llvm::StringRef IRName) const;
+
+ /// \returns the \c ExecutorAddr of a given name as written in the object
+ /// file.
+ llvm::Expected<llvm::orc::ExecutorAddr>
+ getSymbolAddressFromLinkerName(llvm::StringRef LinkerName) const;
+
+ enum InterfaceKind { NoAlloc, WithAlloc, CopyArray, NewTag };
+
+ const llvm::SmallVectorImpl<Expr *> &getValuePrintingInfo() const {
+ return ValuePrintingInfo;
+ }
+
+ Expr *SynthesizeExpr(Expr *E);
+
+private:
+ size_t getEffectivePTUSize() const;
+
+ bool FindRuntimeInterface();
+
+ llvm::DenseMap<CXXRecordDecl *, llvm::orc::ExecutorAddr> Dtors;
+
+ llvm::SmallVector<Expr *, 4> ValuePrintingInfo;
+};
+} // namespace clang
+
+#endif // LLVM_CLANG_INTERPRETER_INTERPRETER_H