1 //===-- FrontendActions.h - Useful Frontend Actions -------------*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H
10 #define LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H
12 #include "clang/Frontend/FrontendAction.h"
21 //===----------------------------------------------------------------------===//
22 // Custom Consumer Actions
23 //===----------------------------------------------------------------------===//
25 class InitOnlyAction : public FrontendAction {
26 void ExecuteAction() override;
28 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
29 StringRef InFile) override;
32 // Don't claim to only use the preprocessor, we want to follow the AST path,
34 bool usesPreprocessorOnly() const override { return false; }
37 class DumpCompilerOptionsAction : public FrontendAction {
38 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
39 StringRef InFile) override {
43 void ExecuteAction() override;
46 bool usesPreprocessorOnly() const override { return true; }
49 //===----------------------------------------------------------------------===//
50 // AST Consumer Actions
51 //===----------------------------------------------------------------------===//
53 class ASTPrintAction : public ASTFrontendAction {
55 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
56 StringRef InFile) override;
59 class ASTDumpAction : public ASTFrontendAction {
61 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
62 StringRef InFile) override;
65 class ASTDeclListAction : public ASTFrontendAction {
67 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
68 StringRef InFile) override;
71 class ASTViewAction : public ASTFrontendAction {
73 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
74 StringRef InFile) override;
77 class GeneratePCHAction : public ASTFrontendAction {
79 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
80 StringRef InFile) override;
82 TranslationUnitKind getTranslationUnitKind() override {
86 bool hasASTFileSupport() const override { return false; }
88 bool shouldEraseOutputFiles() override;
91 /// Compute the AST consumer arguments that will be used to
92 /// create the PCHGenerator instance returned by CreateASTConsumer.
94 /// \returns false if an error occurred, true otherwise.
95 static bool ComputeASTConsumerArguments(CompilerInstance &CI,
96 std::string &Sysroot);
98 /// Creates file to write the PCH into and returns a stream to write it
99 /// into. On error, returns null.
100 static std::unique_ptr<llvm::raw_pwrite_stream>
101 CreateOutputFile(CompilerInstance &CI, StringRef InFile,
102 std::string &OutputFile);
104 bool BeginSourceFileAction(CompilerInstance &CI) override;
107 class GenerateModuleAction : public ASTFrontendAction {
108 virtual std::unique_ptr<raw_pwrite_stream>
109 CreateOutputFile(CompilerInstance &CI, StringRef InFile) = 0;
112 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
113 StringRef InFile) override;
115 TranslationUnitKind getTranslationUnitKind() override {
119 bool hasASTFileSupport() const override { return false; }
122 class GenerateInterfaceStubsAction : public ASTFrontendAction {
124 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
125 StringRef InFile) override;
127 TranslationUnitKind getTranslationUnitKind() override { return TU_Module; }
128 bool hasASTFileSupport() const override { return false; }
131 class GenerateModuleFromModuleMapAction : public GenerateModuleAction {
133 bool BeginSourceFileAction(CompilerInstance &CI) override;
135 std::unique_ptr<raw_pwrite_stream>
136 CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
139 class GenerateModuleInterfaceAction : public GenerateModuleAction {
141 bool BeginSourceFileAction(CompilerInstance &CI) override;
143 std::unique_ptr<raw_pwrite_stream>
144 CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
147 class GenerateHeaderModuleAction : public GenerateModuleAction {
148 /// The synthesized module input buffer for the current compilation.
149 std::unique_ptr<llvm::MemoryBuffer> Buffer;
150 std::vector<std::string> ModuleHeaders;
153 bool PrepareToExecuteAction(CompilerInstance &CI) override;
154 bool BeginSourceFileAction(CompilerInstance &CI) override;
156 std::unique_ptr<raw_pwrite_stream>
157 CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
160 class SyntaxOnlyAction : public ASTFrontendAction {
162 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
163 StringRef InFile) override;
166 ~SyntaxOnlyAction() override;
167 bool hasCodeCompletionSupport() const override { return true; }
170 /// Dump information about the given module file, to be used for
171 /// basic debugging and discovery.
172 class DumpModuleInfoAction : public ASTFrontendAction {
174 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
175 StringRef InFile) override;
176 bool BeginInvocation(CompilerInstance &CI) override;
177 void ExecuteAction() override;
180 bool hasPCHSupport() const override { return false; }
181 bool hasASTFileSupport() const override { return true; }
182 bool hasIRSupport() const override { return false; }
183 bool hasCodeCompletionSupport() const override { return false; }
186 class VerifyPCHAction : public ASTFrontendAction {
188 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
189 StringRef InFile) override;
191 void ExecuteAction() override;
194 bool hasCodeCompletionSupport() const override { return false; }
197 class TemplightDumpAction : public ASTFrontendAction {
199 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
200 StringRef InFile) override;
202 void ExecuteAction() override;
206 * Frontend action adaptor that merges ASTs together.
208 * This action takes an existing AST file and "merges" it into the AST
209 * context, producing a merged context. This action is an action
210 * adaptor, which forwards most of its calls to another action that
211 * will consume the merged context.
213 class ASTMergeAction : public FrontendAction {
214 /// The action that the merge action adapts.
215 std::unique_ptr<FrontendAction> AdaptedAction;
217 /// The set of AST files to merge.
218 std::vector<std::string> ASTFiles;
221 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
222 StringRef InFile) override;
224 bool BeginSourceFileAction(CompilerInstance &CI) override;
226 void ExecuteAction() override;
227 void EndSourceFileAction() override;
230 ASTMergeAction(std::unique_ptr<FrontendAction> AdaptedAction,
231 ArrayRef<std::string> ASTFiles);
232 ~ASTMergeAction() override;
234 bool usesPreprocessorOnly() const override;
235 TranslationUnitKind getTranslationUnitKind() override;
236 bool hasPCHSupport() const override;
237 bool hasASTFileSupport() const override;
238 bool hasCodeCompletionSupport() const override;
241 class PrintPreambleAction : public FrontendAction {
243 void ExecuteAction() override;
244 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &,
245 StringRef) override {
249 bool usesPreprocessorOnly() const override { return true; }
252 class PrintDependencyDirectivesSourceMinimizerAction : public FrontendAction {
254 void ExecuteAction() override;
255 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &,
256 StringRef) override {
260 bool usesPreprocessorOnly() const override { return true; }
263 //===----------------------------------------------------------------------===//
264 // Preprocessor Actions
265 //===----------------------------------------------------------------------===//
267 class DumpRawTokensAction : public PreprocessorFrontendAction {
269 void ExecuteAction() override;
272 class DumpTokensAction : public PreprocessorFrontendAction {
274 void ExecuteAction() override;
277 class PreprocessOnlyAction : public PreprocessorFrontendAction {
279 void ExecuteAction() override;
282 class PrintPreprocessedAction : public PreprocessorFrontendAction {
284 void ExecuteAction() override;
286 bool hasPCHSupport() const override { return true; }
289 } // end namespace clang