1 //===--- Interpreter.h - Incremental Compilation and Execution---*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 // 9 // This file defines the component which performs incremental code 10 // compilation and execution. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_INTERPRETER_INTERPRETER_H 15 #define LLVM_CLANG_INTERPRETER_INTERPRETER_H 16 17 #include "clang/Interpreter/PartialTranslationUnit.h" 18 19 #include "llvm/Support/Error.h" 20 21 #include <memory> 22 #include <vector> 23 24 namespace llvm { 25 namespace orc { 26 class ThreadSafeContext; 27 } 28 class Module; 29 } // namespace llvm 30 31 namespace clang { 32 33 class CompilerInstance; 34 class DeclGroupRef; 35 class IncrementalExecutor; 36 class IncrementalParser; 37 38 /// Create a pre-configured \c CompilerInstance for incremental processing. 39 class IncrementalCompilerBuilder { 40 public: 41 static llvm::Expected<std::unique_ptr<CompilerInstance>> 42 create(std::vector<const char *> &ClangArgv); 43 }; 44 45 /// Provides top-level interfaces for incremental compilation and execution. 46 class Interpreter { 47 std::unique_ptr<llvm::orc::ThreadSafeContext> TSCtx; 48 std::unique_ptr<IncrementalParser> IncrParser; 49 std::unique_ptr<IncrementalExecutor> IncrExecutor; 50 51 Interpreter(std::unique_ptr<CompilerInstance> CI, llvm::Error &Err); 52 53 public: 54 ~Interpreter(); 55 static llvm::Expected<std::unique_ptr<Interpreter>> 56 create(std::unique_ptr<CompilerInstance> CI); 57 const CompilerInstance *getCompilerInstance() const; 58 llvm::Expected<PartialTranslationUnit &> Parse(llvm::StringRef Code); 59 llvm::Error Execute(PartialTranslationUnit &T); 60 llvm::Error ParseAndExecute(llvm::StringRef Code) { 61 auto PTU = Parse(Code); 62 if (!PTU) 63 return PTU.takeError(); 64 if (PTU->TheModule) 65 return Execute(*PTU); 66 return llvm::Error::success(); 67 } 68 }; 69 } // namespace clang 70 71 #endif // LLVM_CLANG_INTERPRETER_INTERPRETER_H 72