1e5dd7070Spatrick //===-- FrontendActions.h - Useful Frontend Actions -------------*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick 9e5dd7070Spatrick #ifndef LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H 10e5dd7070Spatrick #define LLVM_CLANG_FRONTEND_FRONTENDACTIONS_H 11e5dd7070Spatrick 12e5dd7070Spatrick #include "clang/Frontend/FrontendAction.h" 13*12c85518Srobert #include <memory> 14e5dd7070Spatrick #include <string> 15e5dd7070Spatrick #include <vector> 16e5dd7070Spatrick 17e5dd7070Spatrick namespace clang { 18e5dd7070Spatrick 19e5dd7070Spatrick //===----------------------------------------------------------------------===// 20e5dd7070Spatrick // Custom Consumer Actions 21e5dd7070Spatrick //===----------------------------------------------------------------------===// 22e5dd7070Spatrick 23e5dd7070Spatrick class InitOnlyAction : public FrontendAction { 24e5dd7070Spatrick void ExecuteAction() override; 25e5dd7070Spatrick 26e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 27e5dd7070Spatrick StringRef InFile) override; 28e5dd7070Spatrick 29e5dd7070Spatrick public: 30e5dd7070Spatrick // Don't claim to only use the preprocessor, we want to follow the AST path, 31e5dd7070Spatrick // but do nothing. usesPreprocessorOnly()32e5dd7070Spatrick bool usesPreprocessorOnly() const override { return false; } 33e5dd7070Spatrick }; 34e5dd7070Spatrick 35a9ac8606Spatrick /// Preprocessor-based frontend action that also loads PCH files. 36a9ac8606Spatrick class ReadPCHAndPreprocessAction : public FrontendAction { 37a9ac8606Spatrick void ExecuteAction() override; 38a9ac8606Spatrick 39a9ac8606Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 40a9ac8606Spatrick StringRef InFile) override; 41a9ac8606Spatrick 42a9ac8606Spatrick public: usesPreprocessorOnly()43a9ac8606Spatrick bool usesPreprocessorOnly() const override { return false; } 44a9ac8606Spatrick }; 45a9ac8606Spatrick 46e5dd7070Spatrick class DumpCompilerOptionsAction : public FrontendAction { CreateASTConsumer(CompilerInstance & CI,StringRef InFile)47e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 48e5dd7070Spatrick StringRef InFile) override { 49e5dd7070Spatrick return nullptr; 50e5dd7070Spatrick } 51e5dd7070Spatrick 52e5dd7070Spatrick void ExecuteAction() override; 53e5dd7070Spatrick 54e5dd7070Spatrick public: usesPreprocessorOnly()55e5dd7070Spatrick bool usesPreprocessorOnly() const override { return true; } 56e5dd7070Spatrick }; 57e5dd7070Spatrick 58e5dd7070Spatrick //===----------------------------------------------------------------------===// 59e5dd7070Spatrick // AST Consumer Actions 60e5dd7070Spatrick //===----------------------------------------------------------------------===// 61e5dd7070Spatrick 62e5dd7070Spatrick class ASTPrintAction : public ASTFrontendAction { 63e5dd7070Spatrick protected: 64e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 65e5dd7070Spatrick StringRef InFile) override; 66e5dd7070Spatrick }; 67e5dd7070Spatrick 68e5dd7070Spatrick class ASTDumpAction : public ASTFrontendAction { 69e5dd7070Spatrick protected: 70e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 71e5dd7070Spatrick StringRef InFile) override; 72e5dd7070Spatrick }; 73e5dd7070Spatrick 74e5dd7070Spatrick class ASTDeclListAction : public ASTFrontendAction { 75e5dd7070Spatrick protected: 76e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 77e5dd7070Spatrick StringRef InFile) override; 78e5dd7070Spatrick }; 79e5dd7070Spatrick 80e5dd7070Spatrick class ASTViewAction : public ASTFrontendAction { 81e5dd7070Spatrick protected: 82e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 83e5dd7070Spatrick StringRef InFile) override; 84e5dd7070Spatrick }; 85e5dd7070Spatrick 86e5dd7070Spatrick class GeneratePCHAction : public ASTFrontendAction { 87e5dd7070Spatrick protected: 88e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 89e5dd7070Spatrick StringRef InFile) override; 90e5dd7070Spatrick getTranslationUnitKind()91e5dd7070Spatrick TranslationUnitKind getTranslationUnitKind() override { 92e5dd7070Spatrick return TU_Prefix; 93e5dd7070Spatrick } 94e5dd7070Spatrick hasASTFileSupport()95e5dd7070Spatrick bool hasASTFileSupport() const override { return false; } 96e5dd7070Spatrick 97e5dd7070Spatrick bool shouldEraseOutputFiles() override; 98e5dd7070Spatrick 99e5dd7070Spatrick public: 100e5dd7070Spatrick /// Compute the AST consumer arguments that will be used to 101e5dd7070Spatrick /// create the PCHGenerator instance returned by CreateASTConsumer. 102e5dd7070Spatrick /// 103e5dd7070Spatrick /// \returns false if an error occurred, true otherwise. 104e5dd7070Spatrick static bool ComputeASTConsumerArguments(CompilerInstance &CI, 105e5dd7070Spatrick std::string &Sysroot); 106e5dd7070Spatrick 107e5dd7070Spatrick /// Creates file to write the PCH into and returns a stream to write it 108e5dd7070Spatrick /// into. On error, returns null. 109e5dd7070Spatrick static std::unique_ptr<llvm::raw_pwrite_stream> 110e5dd7070Spatrick CreateOutputFile(CompilerInstance &CI, StringRef InFile, 111e5dd7070Spatrick std::string &OutputFile); 112e5dd7070Spatrick 113e5dd7070Spatrick bool BeginSourceFileAction(CompilerInstance &CI) override; 114e5dd7070Spatrick }; 115e5dd7070Spatrick 116e5dd7070Spatrick class GenerateModuleAction : public ASTFrontendAction { 117e5dd7070Spatrick virtual std::unique_ptr<raw_pwrite_stream> 118e5dd7070Spatrick CreateOutputFile(CompilerInstance &CI, StringRef InFile) = 0; 119e5dd7070Spatrick 120e5dd7070Spatrick protected: 121e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 122e5dd7070Spatrick StringRef InFile) override; 123e5dd7070Spatrick getTranslationUnitKind()124e5dd7070Spatrick TranslationUnitKind getTranslationUnitKind() override { 125e5dd7070Spatrick return TU_Module; 126e5dd7070Spatrick } 127e5dd7070Spatrick hasASTFileSupport()128e5dd7070Spatrick bool hasASTFileSupport() const override { return false; } 129a9ac8606Spatrick 130a9ac8606Spatrick bool shouldEraseOutputFiles() override; 131e5dd7070Spatrick }; 132e5dd7070Spatrick 133ec727ea7Spatrick class GenerateInterfaceStubsAction : public ASTFrontendAction { 134e5dd7070Spatrick protected: 135e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 136e5dd7070Spatrick StringRef InFile) override; 137ec727ea7Spatrick getTranslationUnitKind()138ec727ea7Spatrick TranslationUnitKind getTranslationUnitKind() override { return TU_Module; } hasASTFileSupport()139ec727ea7Spatrick bool hasASTFileSupport() const override { return false; } 140e5dd7070Spatrick }; 141e5dd7070Spatrick 142e5dd7070Spatrick class GenerateModuleFromModuleMapAction : public GenerateModuleAction { 143e5dd7070Spatrick private: 144e5dd7070Spatrick bool BeginSourceFileAction(CompilerInstance &CI) override; 145e5dd7070Spatrick 146e5dd7070Spatrick std::unique_ptr<raw_pwrite_stream> 147e5dd7070Spatrick CreateOutputFile(CompilerInstance &CI, StringRef InFile) override; 148e5dd7070Spatrick }; 149e5dd7070Spatrick 150e5dd7070Spatrick class GenerateModuleInterfaceAction : public GenerateModuleAction { 151e5dd7070Spatrick private: 152e5dd7070Spatrick bool BeginSourceFileAction(CompilerInstance &CI) override; 153e5dd7070Spatrick 154e5dd7070Spatrick std::unique_ptr<raw_pwrite_stream> 155e5dd7070Spatrick CreateOutputFile(CompilerInstance &CI, StringRef InFile) override; 156e5dd7070Spatrick }; 157e5dd7070Spatrick 158*12c85518Srobert class GenerateHeaderUnitAction : public GenerateModuleAction { 159e5dd7070Spatrick 160e5dd7070Spatrick private: 161e5dd7070Spatrick bool BeginSourceFileAction(CompilerInstance &CI) override; 162e5dd7070Spatrick 163e5dd7070Spatrick std::unique_ptr<raw_pwrite_stream> 164e5dd7070Spatrick CreateOutputFile(CompilerInstance &CI, StringRef InFile) override; 165e5dd7070Spatrick }; 166e5dd7070Spatrick 167e5dd7070Spatrick class SyntaxOnlyAction : public ASTFrontendAction { 168e5dd7070Spatrick protected: 169e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 170e5dd7070Spatrick StringRef InFile) override; 171e5dd7070Spatrick 172e5dd7070Spatrick public: 173e5dd7070Spatrick ~SyntaxOnlyAction() override; hasCodeCompletionSupport()174e5dd7070Spatrick bool hasCodeCompletionSupport() const override { return true; } 175e5dd7070Spatrick }; 176e5dd7070Spatrick 177e5dd7070Spatrick /// Dump information about the given module file, to be used for 178e5dd7070Spatrick /// basic debugging and discovery. 179e5dd7070Spatrick class DumpModuleInfoAction : public ASTFrontendAction { 180*12c85518Srobert public: 181*12c85518Srobert // Allow other tools (ex lldb) to direct output for their use. 182*12c85518Srobert llvm::raw_ostream *OutputStream = nullptr; 183*12c85518Srobert 184e5dd7070Spatrick protected: 185e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 186e5dd7070Spatrick StringRef InFile) override; 187e5dd7070Spatrick bool BeginInvocation(CompilerInstance &CI) override; 188e5dd7070Spatrick void ExecuteAction() override; 189e5dd7070Spatrick 190e5dd7070Spatrick public: hasPCHSupport()191e5dd7070Spatrick bool hasPCHSupport() const override { return false; } hasASTFileSupport()192e5dd7070Spatrick bool hasASTFileSupport() const override { return true; } hasIRSupport()193e5dd7070Spatrick bool hasIRSupport() const override { return false; } hasCodeCompletionSupport()194e5dd7070Spatrick bool hasCodeCompletionSupport() const override { return false; } 195e5dd7070Spatrick }; 196e5dd7070Spatrick 197e5dd7070Spatrick class VerifyPCHAction : public ASTFrontendAction { 198e5dd7070Spatrick protected: 199e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 200e5dd7070Spatrick StringRef InFile) override; 201e5dd7070Spatrick 202e5dd7070Spatrick void ExecuteAction() override; 203e5dd7070Spatrick 204e5dd7070Spatrick public: hasCodeCompletionSupport()205e5dd7070Spatrick bool hasCodeCompletionSupport() const override { return false; } 206e5dd7070Spatrick }; 207e5dd7070Spatrick 208e5dd7070Spatrick class TemplightDumpAction : public ASTFrontendAction { 209e5dd7070Spatrick protected: 210e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 211e5dd7070Spatrick StringRef InFile) override; 212e5dd7070Spatrick 213e5dd7070Spatrick void ExecuteAction() override; 214e5dd7070Spatrick }; 215e5dd7070Spatrick 216e5dd7070Spatrick /** 217e5dd7070Spatrick * Frontend action adaptor that merges ASTs together. 218e5dd7070Spatrick * 219e5dd7070Spatrick * This action takes an existing AST file and "merges" it into the AST 220e5dd7070Spatrick * context, producing a merged context. This action is an action 221e5dd7070Spatrick * adaptor, which forwards most of its calls to another action that 222e5dd7070Spatrick * will consume the merged context. 223e5dd7070Spatrick */ 224e5dd7070Spatrick class ASTMergeAction : public FrontendAction { 225e5dd7070Spatrick /// The action that the merge action adapts. 226e5dd7070Spatrick std::unique_ptr<FrontendAction> AdaptedAction; 227e5dd7070Spatrick 228e5dd7070Spatrick /// The set of AST files to merge. 229e5dd7070Spatrick std::vector<std::string> ASTFiles; 230e5dd7070Spatrick 231e5dd7070Spatrick protected: 232e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &CI, 233e5dd7070Spatrick StringRef InFile) override; 234e5dd7070Spatrick 235e5dd7070Spatrick bool BeginSourceFileAction(CompilerInstance &CI) override; 236e5dd7070Spatrick 237e5dd7070Spatrick void ExecuteAction() override; 238e5dd7070Spatrick void EndSourceFileAction() override; 239e5dd7070Spatrick 240e5dd7070Spatrick public: 241e5dd7070Spatrick ASTMergeAction(std::unique_ptr<FrontendAction> AdaptedAction, 242e5dd7070Spatrick ArrayRef<std::string> ASTFiles); 243e5dd7070Spatrick ~ASTMergeAction() override; 244e5dd7070Spatrick 245e5dd7070Spatrick bool usesPreprocessorOnly() const override; 246e5dd7070Spatrick TranslationUnitKind getTranslationUnitKind() override; 247e5dd7070Spatrick bool hasPCHSupport() const override; 248e5dd7070Spatrick bool hasASTFileSupport() const override; 249e5dd7070Spatrick bool hasCodeCompletionSupport() const override; 250e5dd7070Spatrick }; 251e5dd7070Spatrick 252e5dd7070Spatrick class PrintPreambleAction : public FrontendAction { 253e5dd7070Spatrick protected: 254e5dd7070Spatrick void ExecuteAction() override; CreateASTConsumer(CompilerInstance &,StringRef)255e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &, 256e5dd7070Spatrick StringRef) override { 257e5dd7070Spatrick return nullptr; 258e5dd7070Spatrick } 259e5dd7070Spatrick usesPreprocessorOnly()260e5dd7070Spatrick bool usesPreprocessorOnly() const override { return true; } 261e5dd7070Spatrick }; 262e5dd7070Spatrick 263e5dd7070Spatrick class PrintDependencyDirectivesSourceMinimizerAction : public FrontendAction { 264e5dd7070Spatrick protected: 265e5dd7070Spatrick void ExecuteAction() override; CreateASTConsumer(CompilerInstance &,StringRef)266e5dd7070Spatrick std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance &, 267e5dd7070Spatrick StringRef) override { 268e5dd7070Spatrick return nullptr; 269e5dd7070Spatrick } 270e5dd7070Spatrick usesPreprocessorOnly()271e5dd7070Spatrick bool usesPreprocessorOnly() const override { return true; } 272e5dd7070Spatrick }; 273e5dd7070Spatrick 274e5dd7070Spatrick //===----------------------------------------------------------------------===// 275e5dd7070Spatrick // Preprocessor Actions 276e5dd7070Spatrick //===----------------------------------------------------------------------===// 277e5dd7070Spatrick 278e5dd7070Spatrick class DumpRawTokensAction : public PreprocessorFrontendAction { 279e5dd7070Spatrick protected: 280e5dd7070Spatrick void ExecuteAction() override; 281e5dd7070Spatrick }; 282e5dd7070Spatrick 283e5dd7070Spatrick class DumpTokensAction : public PreprocessorFrontendAction { 284e5dd7070Spatrick protected: 285e5dd7070Spatrick void ExecuteAction() override; 286e5dd7070Spatrick }; 287e5dd7070Spatrick 288e5dd7070Spatrick class PreprocessOnlyAction : public PreprocessorFrontendAction { 289e5dd7070Spatrick protected: 290e5dd7070Spatrick void ExecuteAction() override; 291e5dd7070Spatrick }; 292e5dd7070Spatrick 293e5dd7070Spatrick class PrintPreprocessedAction : public PreprocessorFrontendAction { 294e5dd7070Spatrick protected: 295e5dd7070Spatrick void ExecuteAction() override; 296e5dd7070Spatrick hasPCHSupport()297e5dd7070Spatrick bool hasPCHSupport() const override { return true; } 298e5dd7070Spatrick }; 299e5dd7070Spatrick 300*12c85518Srobert class GetDependenciesByModuleNameAction : public PreprocessOnlyAction { 301*12c85518Srobert StringRef ModuleName; 302*12c85518Srobert void ExecuteAction() override; 303*12c85518Srobert 304*12c85518Srobert public: GetDependenciesByModuleNameAction(StringRef ModuleName)305*12c85518Srobert GetDependenciesByModuleNameAction(StringRef ModuleName) 306*12c85518Srobert : ModuleName(ModuleName) {} 307*12c85518Srobert }; 308*12c85518Srobert 309e5dd7070Spatrick } // end namespace clang 310e5dd7070Spatrick 311e5dd7070Spatrick #endif 312