20#include "llvm/IR/Module.h"
21#include "llvm/Support/Error.h"
22#include "llvm/Support/ErrorHandling.h"
26 llvm::LLVMContext &LLVMCtx,
28 std::unique_ptr<ASTConsumer> Consumer)
30 llvm::ErrorAsOutParameter EAO(&Err);
31 std::unique_ptr<FrontendAction> Act;
32 switch (Instance.getFrontendOpts().ProgramAction) {
34 Err = llvm::createStringError(
35 std::errc::state_not_recoverable,
36 "Driver initialization failed. "
37 "Incremental mode for action %d is not supported",
38 Instance.getFrontendOpts().ProgramAction);
56 Interp(I), CI(Instance), Consumer(std::move(Consumer)) {}
58std::unique_ptr<ASTConsumer>
61 std::unique_ptr<ASTConsumer>
C =
65 std::vector<std::unique_ptr<ASTConsumer>> Cs;
66 Cs.push_back(std::move(Consumer));
67 Cs.push_back(std::move(
C));
68 return std::make_unique<MultiplexConsumer>(std::move(Cs));
71 return std::make_unique<InProcessPrintingASTConsumer>(std::move(
C), Interp);
85 assert(!IsTerminating &&
"Already finalized!");
95 return CachedInCodeGenModule.get();
99 static unsigned ID = 0;
108 assert(((!CachedInCodeGenModule ||
109 !CI.getPreprocessorOpts().Includes.empty() ||
110 !CI.getPreprocessorOpts().ImplicitPCHInclude.empty()) ||
111 (CachedInCodeGenModule->empty() &&
112 CachedInCodeGenModule->global_empty() &&
113 CachedInCodeGenModule->alias_empty() &&
114 CachedInCodeGenModule->ifunc_empty())) &&
115 "CodeGen wrote to a readonly module");
116 std::unique_ptr<llvm::Module> M(CG->ReleaseModule());
117 CG->StartModule(
"incr_module_" + std::to_string(ID++), M->getContext());
127 return static_cast<CodeGenAction *
>(WrappedAct)->getCodeGenerator();
139 if (
auto *TLSD = llvm::dyn_cast<TopLevelStmtDecl>(D))
140 if (TLSD && TLSD->isSemiMissing()) {
141 auto ExprOrErr = Interp.convertExprToValue(
cast<Expr>(TLSD->getStmt()));
142 if (llvm::Error E = ExprOrErr.takeError()) {
143 llvm::logAllUnhandledErrors(std::move(E), llvm::errs(),
144 "Value printing failed: ");
147 TLSD->setStmt(*ExprOrErr);
The primary public interface to the Clang code generator.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
Decl - This represents one declaration (or definition), e.g.
Abstract base class for actions which can be performed by the frontend.
virtual bool hasIRSupport() const
Does this action support use with IR files?
CompilerInstance & getCompilerInstance() const
InProcessPrintingASTConsumer(std::unique_ptr< ASTConsumer > C, Interpreter &I)
bool HandleTopLevelDecl(DeclGroupRef DGR) override
HandleTopLevelDecl - Handle the specified top-level declaration.
llvm::Module * getCachedCodeGenModule() const
Access the cached CodeGen module.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
CodeGenerator * getCodeGen() const
Access the current code generator.
void CacheCodeGenModule()
Cache the current CodeGen module to preserve internal references.
IncrementalAction(CompilerInstance &Instance, llvm::LLVMContext &LLVMCtx, llvm::Error &Err, Interpreter &I, std::unique_ptr< ASTConsumer > Consumer=nullptr)
FrontendAction * getWrapped() const
void EndSourceFile() override
Perform any per-file post processing, deallocate per-file objects, and run statistics and output file...
std::unique_ptr< llvm::Module > GenModule()
Generate an LLVM module for the most recent parsed input.
Provides top-level interfaces for incremental compilation and execution.
bool HandleTopLevelDecl(DeclGroupRef D) override
HandleTopLevelDecl - Handle the specified top-level declaration.
MultiplexConsumer(std::vector< std::unique_ptr< ASTConsumer > > C)
DeclContext * CurContext
CurContext - This is the current declaration context of parsing.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
WrapperFrontendAction(std::unique_ptr< FrontendAction > WrappedAction)
Construct a WrapperFrontendAction from an existing action, taking ownership of it.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void EndSourceFile() override
Perform any per-file post processing, deallocate per-file objects, and run statistics and output file...
@ PrintPreprocessedInput
-E mode.
@ ParseSyntaxOnly
Parse and perform semantic analysis.
@ PluginAction
Run a plugin action,.
@ ASTPrint
Parse ASTs and print them.
@ ASTDump
Parse ASTs and dump them.
@ EmitAssembly
Emit a .s file.
@ EmitLLVMOnly
Generate LLVM IR, but do not emit anything.
The JSON file list parser is used to communicate input to InstallAPI.
std::unique_ptr< FrontendAction > CreateFrontendAction(CompilerInstance &CI)
Construct the FrontendAction of a compiler invocation based on the options specified for the compiler...
U cast(CodeGen::Address addr)