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 GenerateInterfaceStubAction : public ASTFrontendAction {
124 TranslationUnitKind getTranslationUnitKind() override { return TU_Module; }
126 bool hasASTFileSupport() const override { return false; }
129 // Support different interface stub formats this way:
130 class GenerateInterfaceYAMLExpV1Action : public GenerateInterfaceStubAction {
132 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
133 StringRef InFile) override;
136 class GenerateInterfaceTBEExpV1Action : public GenerateInterfaceStubAction {
138 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
139 StringRef InFile) override;
142 class GenerateModuleFromModuleMapAction : public GenerateModuleAction {
144 bool BeginSourceFileAction(CompilerInstance &CI) override;
146 std::unique_ptr<raw_pwrite_stream>
147 CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
150 class GenerateModuleInterfaceAction : public GenerateModuleAction {
152 bool BeginSourceFileAction(CompilerInstance &CI) override;
154 std::unique_ptr<raw_pwrite_stream>
155 CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
158 class GenerateHeaderModuleAction : public GenerateModuleAction {
159 /// The synthesized module input buffer for the current compilation.
160 std::unique_ptr<llvm::MemoryBuffer> Buffer;
161 std::vector<std::string> ModuleHeaders;
164 bool PrepareToExecuteAction(CompilerInstance &CI) override;
165 bool BeginSourceFileAction(CompilerInstance &CI) override;
167 std::unique_ptr<raw_pwrite_stream>
168 CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
171 class SyntaxOnlyAction : public ASTFrontendAction {
173 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
174 StringRef InFile) override;
177 ~SyntaxOnlyAction() override;
178 bool hasCodeCompletionSupport() const override { return true; }
181 /// Dump information about the given module file, to be used for
182 /// basic debugging and discovery.
183 class DumpModuleInfoAction : public ASTFrontendAction {
185 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
186 StringRef InFile) override;
187 bool BeginInvocation(CompilerInstance &CI) override;
188 void ExecuteAction() override;
191 bool hasPCHSupport() const override { return false; }
192 bool hasASTFileSupport() const override { return true; }
193 bool hasIRSupport() const override { return false; }
194 bool hasCodeCompletionSupport() const override { return false; }
197 class VerifyPCHAction : public ASTFrontendAction {
199 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
200 StringRef InFile) override;
202 void ExecuteAction() override;
205 bool hasCodeCompletionSupport() const override { return false; }
208 class TemplightDumpAction : public ASTFrontendAction {
210 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
211 StringRef InFile) override;
213 void ExecuteAction() override;
217 * Frontend action adaptor that merges ASTs together.
219 * This action takes an existing AST file and "merges" it into the AST
220 * context, producing a merged context. This action is an action
221 * adaptor, which forwards most of its calls to another action that
222 * will consume the merged context.
224 class ASTMergeAction : public FrontendAction {
225 /// The action that the merge action adapts.
226 std::unique_ptr<FrontendAction> AdaptedAction;
228 /// The set of AST files to merge.
229 std::vector<std::string> ASTFiles;
232 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
233 StringRef InFile) override;
235 bool BeginSourceFileAction(CompilerInstance &CI) override;
237 void ExecuteAction() override;
238 void EndSourceFileAction() override;
241 ASTMergeAction(std::unique_ptr<FrontendAction> AdaptedAction,
242 ArrayRef<std::string> ASTFiles);
243 ~ASTMergeAction() override;
245 bool usesPreprocessorOnly() const override;
246 TranslationUnitKind getTranslationUnitKind() override;
247 bool hasPCHSupport() const override;
248 bool hasASTFileSupport() const override;
249 bool hasCodeCompletionSupport() const override;
252 class PrintPreambleAction : public FrontendAction {
254 void ExecuteAction() override;
255 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &,
256 StringRef) override {
260 bool usesPreprocessorOnly() const override { return true; }
263 class PrintDependencyDirectivesSourceMinimizerAction : public FrontendAction {
265 void ExecuteAction() override;
266 std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &,
267 StringRef) override {
271 bool usesPreprocessorOnly() const override { return true; }
274 //===----------------------------------------------------------------------===//
275 // Preprocessor Actions
276 //===----------------------------------------------------------------------===//
278 class DumpRawTokensAction : public PreprocessorFrontendAction {
280 void ExecuteAction() override;
283 class DumpTokensAction : public PreprocessorFrontendAction {
285 void ExecuteAction() override;
288 class PreprocessOnlyAction : public PreprocessorFrontendAction {
290 void ExecuteAction() override;
293 class PrintPreprocessedAction : public PreprocessorFrontendAction {
295 void ExecuteAction() override;
297 bool hasPCHSupport() const override { return true; }
300 } // end namespace clang