clang  19.0.0git
FrontendActions.h
Go to the documentation of this file.
1 //===-- FrontendActions.h - Useful Frontend Actions -------------*- 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 #ifndef LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H
10 #define LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H
11 
13 #include <memory>
14 #include <string>
15 #include <vector>
16 
17 namespace clang {
18 
19 //===----------------------------------------------------------------------===//
20 // Custom Consumer Actions
21 //===----------------------------------------------------------------------===//
22 
24  void ExecuteAction() override;
25 
26  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
27  StringRef InFile) override;
28 
29 public:
30  // Don't claim to only use the preprocessor, we want to follow the AST path,
31  // but do nothing.
32  bool usesPreprocessorOnly() const override { return false; }
33 };
34 
35 /// Preprocessor-based frontend action that also loads PCH files.
37  void ExecuteAction() override;
38 
39  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
40  StringRef InFile) override;
41 
42 public:
43  bool usesPreprocessorOnly() const override { return false; }
44 };
45 
47  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
48  StringRef InFile) override {
49  return nullptr;
50  }
51 
52  void ExecuteAction() override;
53 
54 public:
55  bool usesPreprocessorOnly() const override { return true; }
56 };
57 
58 //===----------------------------------------------------------------------===//
59 // AST Consumer Actions
60 //===----------------------------------------------------------------------===//
61 
63 protected:
64  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
65  StringRef InFile) override;
66 };
67 
69 protected:
70  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
71  StringRef InFile) override;
72 };
73 
75 protected:
76  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
77  StringRef InFile) override;
78 };
79 
81 protected:
82  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
83  StringRef InFile) override;
84 };
85 
87 protected:
88  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
89  StringRef InFile) override;
90 
92  return TU_Prefix;
93  }
94 
95  bool hasASTFileSupport() const override { return false; }
96 
97  bool shouldEraseOutputFiles() override;
98 
99 public:
100  /// Compute the AST consumer arguments that will be used to
101  /// create the PCHGenerator instance returned by CreateASTConsumer.
102  ///
103  /// \returns false if an error occurred, true otherwise.
105  std::string &Sysroot);
106 
107  /// Creates file to write the PCH into and returns a stream to write it
108  /// into. On error, returns null.
109  static std::unique_ptr<llvm::raw_pwrite_stream>
110  CreateOutputFile(CompilerInstance &CI, StringRef InFile,
111  std::string &OutputFile);
112 
113  bool BeginSourceFileAction(CompilerInstance &CI) override;
114 };
115 
117  virtual std::unique_ptr<raw_pwrite_stream>
118  CreateOutputFile(CompilerInstance &CI, StringRef InFile) = 0;
119 
120 protected:
121  std::vector<std::unique_ptr<ASTConsumer>>
122  CreateMultiplexConsumer(CompilerInstance &CI, StringRef InFile);
123 
124  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
125  StringRef InFile) override;
126 
128  return TU_ClangModule;
129  }
130 
131  bool hasASTFileSupport() const override { return false; }
132 
133  bool shouldEraseOutputFiles() override;
134 };
135 
137 protected:
138  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
139  StringRef InFile) override;
140 
142  return TU_ClangModule;
143  }
144  bool hasASTFileSupport() const override { return false; }
145 };
146 
148 private:
149  bool BeginSourceFileAction(CompilerInstance &CI) override;
150 
151  std::unique_ptr<raw_pwrite_stream>
152  CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
153 };
154 
155 /// Generates full BMI (which contains full information to generate the object
156 /// files) for C++20 Named Modules.
158 protected:
159  bool BeginSourceFileAction(CompilerInstance &CI) override;
160 
161  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
162  StringRef InFile) override;
163 
165 
166  std::unique_ptr<raw_pwrite_stream>
167  CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
168 };
169 
170 /// Only generates the reduced BMI. This action is mainly used by tests.
173 private:
174  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
175  StringRef InFile) override;
176 };
177 
179 
180 private:
181  bool BeginSourceFileAction(CompilerInstance &CI) override;
182 
183  std::unique_ptr<raw_pwrite_stream>
184  CreateOutputFile(CompilerInstance &CI, StringRef InFile) override;
185 };
186 
188 protected:
189  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
190  StringRef InFile) override;
191 
192 public:
193  ~SyntaxOnlyAction() override;
194  bool hasCodeCompletionSupport() const override { return true; }
195 };
196 
197 /// Dump information about the given module file, to be used for
198 /// basic debugging and discovery.
200  // Allow other tools (ex lldb) to direct output for their use.
201  std::shared_ptr<llvm::raw_ostream> OutputStream;
202 
203 protected:
204  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
205  StringRef InFile) override;
206  bool BeginInvocation(CompilerInstance &CI) override;
207  void ExecuteAction() override;
208 
209 public:
210  DumpModuleInfoAction() = default;
211  explicit DumpModuleInfoAction(std::shared_ptr<llvm::raw_ostream> Out)
212  : OutputStream(Out) {}
213  bool hasPCHSupport() const override { return false; }
214  bool hasASTFileSupport() const override { return true; }
215  bool hasIRSupport() const override { return false; }
216  bool hasCodeCompletionSupport() const override { return false; }
217 };
218 
220 protected:
221  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
222  StringRef InFile) override;
223 
224  void ExecuteAction() override;
225 
226 public:
227  bool hasCodeCompletionSupport() const override { return false; }
228 };
229 
231 protected:
232  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
233  StringRef InFile) override;
234 
235  void ExecuteAction() override;
236 };
237 
238 /**
239  * Frontend action adaptor that merges ASTs together.
240  *
241  * This action takes an existing AST file and "merges" it into the AST
242  * context, producing a merged context. This action is an action
243  * adaptor, which forwards most of its calls to another action that
244  * will consume the merged context.
245  */
247  /// The action that the merge action adapts.
248  std::unique_ptr<FrontendAction> AdaptedAction;
249 
250  /// The set of AST files to merge.
251  std::vector<std::string> ASTFiles;
252 
253 protected:
254  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI,
255  StringRef InFile) override;
256 
257  bool BeginSourceFileAction(CompilerInstance &CI) override;
258 
259  void ExecuteAction() override;
260  void EndSourceFileAction() override;
261 
262 public:
263  ASTMergeAction(std::unique_ptr<FrontendAction> AdaptedAction,
264  ArrayRef<std::string> ASTFiles);
265  ~ASTMergeAction() override;
266 
267  bool usesPreprocessorOnly() const override;
269  bool hasPCHSupport() const override;
270  bool hasASTFileSupport() const override;
271  bool hasCodeCompletionSupport() const override;
272 };
273 
275 protected:
276  void ExecuteAction() override;
277  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &,
278  StringRef) override {
279  return nullptr;
280  }
281 
282  bool usesPreprocessorOnly() const override { return true; }
283 };
284 
286 protected:
287  void ExecuteAction() override;
288  std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &,
289  StringRef) override {
290  return nullptr;
291  }
292 
293  bool usesPreprocessorOnly() const override { return true; }
294 };
295 
296 //===----------------------------------------------------------------------===//
297 // Preprocessor Actions
298 //===----------------------------------------------------------------------===//
299 
301 protected:
302  void ExecuteAction() override;
303 };
304 
306 protected:
307  void ExecuteAction() override;
308 };
309 
311 protected:
312  void ExecuteAction() override;
313 };
314 
316 protected:
317  void ExecuteAction() override;
318 
319  bool hasPCHSupport() const override { return true; }
320 };
321 
323  StringRef ModuleName;
324  void ExecuteAction() override;
325 
326 public:
327  GetDependenciesByModuleNameAction(StringRef ModuleName)
328  : ModuleName(ModuleName) {}
329 };
330 
331 } // end namespace clang
332 
333 #endif
Defines the clang::FrontendAction interface and various convenience abstract classes (clang::ASTFront...
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
Abstract base class to use for AST consumer-based frontend actions.
Frontend action adaptor that merges ASTs together.
bool hasCodeCompletionSupport() const override
Does this action support use with code completion?
Definition: ASTMerge.cpp:112
void EndSourceFileAction() override
Callback at the end of processing a single input.
Definition: ASTMerge.cpp:83
TranslationUnitKind getTranslationUnitKind() override
For AST-based actions, the kind of translation unit we're handling.
Definition: ASTMerge.cpp:100
~ASTMergeAction() override
Definition: ASTMerge.cpp:93
bool usesPreprocessorOnly() const override
Does this action only use the preprocessor?
Definition: ASTMerge.cpp:96
bool hasASTFileSupport() const override
Does this action support use with AST files?
Definition: ASTMerge.cpp:108
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
Definition: ASTMerge.cpp:33
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
Definition: ASTMerge.cpp:24
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
Definition: ASTMerge.cpp:20
bool hasPCHSupport() const override
Does this action support use with PCH?
Definition: ASTMerge.cpp:104
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
CompilerInstance - Helper class for managing a single instance of the Clang compiler.
bool usesPreprocessorOnly() const override
Does this action only use the preprocessor?
Dump information about the given module file, to be used for basic debugging and discovery.
DumpModuleInfoAction(std::shared_ptr< llvm::raw_ostream > Out)
bool hasCodeCompletionSupport() const override
Does this action support use with code completion?
bool hasASTFileSupport() const override
Does this action support use with AST files?
bool hasIRSupport() const override
Does this action support use with IR files?
bool hasPCHSupport() const override
Does this action support use with PCH?
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
bool BeginInvocation(CompilerInstance &CI) override
Callback before starting processing a single input, giving the opportunity to modify the CompilerInvo...
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
Abstract base class for actions which can be performed by the frontend.
friend class ASTMergeAction
TranslationUnitKind getTranslationUnitKind() override
For AST-based actions, the kind of translation unit we're handling.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
bool hasASTFileSupport() const override
Does this action support use with AST files?
bool shouldEraseOutputFiles() override
Callback at the end of processing a single input, to determine if the output files should be erased o...
TranslationUnitKind getTranslationUnitKind() override
For AST-based actions, the kind of translation unit we're handling.
bool hasASTFileSupport() const override
Does this action support use with AST files?
std::vector< std::unique_ptr< ASTConsumer > > CreateMultiplexConsumer(CompilerInstance &CI, StringRef InFile)
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
Generates full BMI (which contains full information to generate the object files) for C++20 Named Mod...
TranslationUnitKind getTranslationUnitKind() override
For AST-based actions, the kind of translation unit we're handling.
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
std::unique_ptr< raw_pwrite_stream > CreateOutputFile(CompilerInstance &CI, StringRef InFile) override
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
static std::unique_ptr< llvm::raw_pwrite_stream > CreateOutputFile(CompilerInstance &CI, StringRef InFile, std::string &OutputFile)
Creates file to write the PCH into and returns a stream to write it into.
bool BeginSourceFileAction(CompilerInstance &CI) override
Callback at the start of processing a single input.
TranslationUnitKind getTranslationUnitKind() override
For AST-based actions, the kind of translation unit we're handling.
static bool ComputeASTConsumerArguments(CompilerInstance &CI, std::string &Sysroot)
Compute the AST consumer arguments that will be used to create the PCHGenerator instance returned by ...
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
bool hasASTFileSupport() const override
Does this action support use with AST files?
bool shouldEraseOutputFiles() override
Callback at the end of processing a single input, to determine if the output files should be erased o...
Only generates the reduced BMI. This action is mainly used by tests.
GetDependenciesByModuleNameAction(StringRef ModuleName)
bool usesPreprocessorOnly() const override
Does this action only use the preprocessor?
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
Abstract base class to use for preprocessor-based frontend actions.
bool usesPreprocessorOnly() const override
Does this action only use the preprocessor?
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &, StringRef) override
Create the AST consumer object for this action, if supported.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &, StringRef) override
Create the AST consumer object for this action, if supported.
bool usesPreprocessorOnly() const override
Does this action only use the preprocessor?
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
void ExecuteAction() override
Callback to run the program action, using the initialized compiler instance.
bool hasPCHSupport() const override
Does this action support use with PCH?
Preprocessor-based frontend action that also loads PCH files.
bool usesPreprocessorOnly() const override
Does this action only use the preprocessor?
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
bool hasCodeCompletionSupport() const override
Does this action support use with code completion?
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
std::unique_ptr< ASTConsumer > CreateASTConsumer(CompilerInstance &CI, StringRef InFile) override
Create the AST consumer object for this action, if supported.
bool hasCodeCompletionSupport() const override
Does this action support use with code completion?
void ExecuteAction() override
Implement the ExecuteAction interface by running Sema on the already-initialized AST consumer.
The JSON file list parser is used to communicate input to InstallAPI.
TranslationUnitKind
Describes the kind of translation unit being processed.
Definition: LangOptions.h:1074
@ TU_Complete
The translation unit is a complete translation unit.
Definition: LangOptions.h:1076
@ TU_ClangModule
The translation unit is a clang module.
Definition: LangOptions.h:1083
@ TU_Prefix
The translation unit is a prefix to a translation unit, and is not complete.
Definition: LangOptions.h:1080