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