xref: /freebsd-src/contrib/llvm-project/clang/lib/Interpreter/IncrementalExecutor.h (revision 71ac745d76c3ba442e753daff1870893f272b29d)
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 
1681ad6265SDimitry Andric #include "llvm/ADT/DenseMap.h"
17fe6060f1SDimitry Andric #include "llvm/ADT/StringRef.h"
18fe6060f1SDimitry Andric #include "llvm/ExecutionEngine/Orc/ExecutionUtils.h"
1906c3fb27SDimitry Andric #include "llvm/ExecutionEngine/Orc/Shared/ExecutorAddress.h"
20fe6060f1SDimitry Andric 
21fe6060f1SDimitry Andric #include <memory>
22fe6060f1SDimitry Andric 
23fe6060f1SDimitry Andric namespace llvm {
24fe6060f1SDimitry Andric class Error;
25fe6060f1SDimitry Andric namespace orc {
260fca6ea1SDimitry Andric class JITTargetMachineBuilder;
27fe6060f1SDimitry Andric class LLJIT;
280fca6ea1SDimitry Andric class LLJITBuilder;
29fe6060f1SDimitry Andric class ThreadSafeContext;
30fe6060f1SDimitry Andric } // namespace orc
31fe6060f1SDimitry Andric } // namespace llvm
32fe6060f1SDimitry Andric 
33fe6060f1SDimitry Andric namespace clang {
3481ad6265SDimitry Andric 
3581ad6265SDimitry Andric struct PartialTranslationUnit;
3681ad6265SDimitry Andric class TargetInfo;
3781ad6265SDimitry Andric 
38fe6060f1SDimitry Andric class IncrementalExecutor {
39fe6060f1SDimitry Andric   using CtorDtorIterator = llvm::orc::CtorDtorIterator;
40fe6060f1SDimitry Andric   std::unique_ptr<llvm::orc::LLJIT> Jit;
41fe6060f1SDimitry Andric   llvm::orc::ThreadSafeContext &TSCtx;
42fe6060f1SDimitry Andric 
4381ad6265SDimitry Andric   llvm::DenseMap<const PartialTranslationUnit *, llvm::orc::ResourceTrackerSP>
4481ad6265SDimitry Andric       ResourceTrackers;
4581ad6265SDimitry Andric 
460fca6ea1SDimitry Andric protected:
470fca6ea1SDimitry Andric   IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC);
480fca6ea1SDimitry Andric 
49fe6060f1SDimitry Andric public:
50349cc55cSDimitry Andric   enum SymbolNameKind { IRName, LinkerName };
51349cc55cSDimitry Andric 
520fca6ea1SDimitry Andric   IncrementalExecutor(llvm::orc::ThreadSafeContext &TSC,
530fca6ea1SDimitry Andric                       llvm::orc::LLJITBuilder &JITBuilder, llvm::Error &Err);
540fca6ea1SDimitry Andric   virtual ~IncrementalExecutor();
55fe6060f1SDimitry Andric 
560fca6ea1SDimitry Andric   virtual llvm::Error addModule(PartialTranslationUnit &PTU);
570fca6ea1SDimitry Andric   virtual llvm::Error removeModule(PartialTranslationUnit &PTU);
580fca6ea1SDimitry Andric   virtual llvm::Error runCtors() const;
59*71ac745dSDimitry Andric   virtual llvm::Error cleanUp();
6006c3fb27SDimitry Andric   llvm::Expected<llvm::orc::ExecutorAddr>
61349cc55cSDimitry Andric   getSymbolAddress(llvm::StringRef Name, SymbolNameKind NameKind) const;
6206c3fb27SDimitry Andric 
6306c3fb27SDimitry Andric   llvm::orc::LLJIT &GetExecutionEngine() { return *Jit; }
640fca6ea1SDimitry Andric 
650fca6ea1SDimitry Andric   static llvm::Expected<std::unique_ptr<llvm::orc::LLJITBuilder>>
660fca6ea1SDimitry Andric   createDefaultJITBuilder(llvm::orc::JITTargetMachineBuilder JTMB);
67fe6060f1SDimitry Andric };
68fe6060f1SDimitry Andric 
69fe6060f1SDimitry Andric } // end namespace clang
70fe6060f1SDimitry Andric 
71fe6060f1SDimitry Andric #endif // LLVM_CLANG_LIB_INTERPRETER_INCREMENTALEXECUTOR_H
72