14ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar//===-- FrontendAction.h - Generic Frontend Action Interface ----*- C++ -*-===// 24ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar// 34ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar// The LLVM Compiler Infrastructure 44ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar// 54ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar// This file is distributed under the University of Illinois Open Source 64ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar// License. See LICENSE.TXT for details. 74ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar// 84ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar//===----------------------------------------------------------------------===// 918f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// 1018f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// \file 1118f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// \brief Defines the clang::FrontendAction interface and various convenience 1218f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// abstract classes (clang::ASTFrontendAction, clang::PluginASTAction, 1318f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// clang::PreprocessorFrontendAction, and clang::WrapperFrontendAction) 1418f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// derived from it. 1518f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// 1618f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett//===----------------------------------------------------------------------===// 174ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 184ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar#ifndef LLVM_CLANG_FRONTEND_FRONTENDACTION_H 194ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar#define LLVM_CLANG_FRONTEND_FRONTENDACTION_H 204ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 21686775deca8b8685eb90801495880e3abdd844c2Chris Lattner#include "clang/Basic/LLVM.h" 22467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor#include "clang/Basic/LangOptions.h" 231f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor#include "clang/Frontend/FrontendOptions.h" 2430a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth#include "llvm/ADT/StringRef.h" 25651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines#include <memory> 264ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar#include <string> 273177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar#include <vector> 283177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar 294ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarnamespace clang { 304ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarclass ASTConsumer; 319bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregorclass ASTMergeAction; 32685ac6665a3f91f9a66a9f44b6bf755a0cd929eaDaniel Dunbarclass ASTUnit; 33685ac6665a3f91f9a66a9f44b6bf755a0cd929eaDaniel Dunbarclass CompilerInstance; 344ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 3518f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// Abstract base class for actions which can be performed by the frontend. 364ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarclass FrontendAction { 371f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor FrontendInputFile CurrentInput; 38651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<ASTUnit> CurrentASTUnit; 394ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar CompilerInstance *Instance; 409bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor friend class ASTMergeAction; 41f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth friend class WrapperFrontendAction; 424ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 435aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weberprivate: 445aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber ASTConsumer* CreateWrappedASTConsumer(CompilerInstance &CI, 45686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef InFile); 465aa74affa5d61d04c4b034b3722ca41aec0cba6eNico Weber 474ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarprotected: 484ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @name Implementation Action Interface 494ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @{ 504ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 5118f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Create the AST consumer object for this action, if supported. 524ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 5318f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// This routine is called as part of BeginSourceFile(), which will 544ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// fail if the AST consumer cannot be created. This will not be called if the 554ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// action has indicated that it only uses the preprocessor. 564ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 5718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \param CI - The current compiler instance, provided as a convenience, see 584ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// getCompilerInstance(). 594ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 6018f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \param InFile - The current input file, provided as a convenience, see 614ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// getCurrentFile(). 624ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 6318f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \return The new AST consumer, or null on failure. 644ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 65686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef InFile) = 0; 664ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 67e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis /// \brief Callback before starting processing a single input, giving the 68e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis /// opportunity to modify the CompilerInvocation or do some other action 69e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis /// before BeginSourceFileAction is called. 70e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis /// 7118f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \return True on success; on failure BeginSourceFileAction(), 7219e448df800048314d2f54487c48a3b33231e291James Dennett /// ExecuteAction() and EndSourceFileAction() will not be called. 73e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis virtual bool BeginInvocation(CompilerInstance &CI) { return true; } 74e665d6929e11796620ff799bc0186ebd747bfc76Argyrios Kyrtzidis 7518f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Callback at the start of processing a single input. 764ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 7718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \return True on success; on failure ExecutionAction() and 784ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// EndSourceFileAction() will not be called. 794ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual bool BeginSourceFileAction(CompilerInstance &CI, 80686775deca8b8685eb90801495880e3abdd844c2Chris Lattner StringRef Filename) { 814ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar return true; 824ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar } 834ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 8418f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Callback to run the program action, using the initialized 854ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// compiler instance. 864ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 8718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// This is guaranteed to only be called between BeginSourceFileAction() 8818f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// and EndSourceFileAction(). 894ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual void ExecuteAction() = 0; 904ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 9118f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Callback at the end of processing a single input. 9218f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// 9318f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// This is guaranteed to only be called following a successful call to 9436579d4f5510e8eb823171f532d6b19ce4250a92Dylan Noblesmith /// BeginSourceFileAction (and BeginSourceFile). 954ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual void EndSourceFileAction() {} 964ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 971f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis /// \brief Callback at the end of processing a single input, to determine 981f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis /// if the output files should be erased or not. 991f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis /// 1001f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis /// By default it returns true if a compiler error occurred. 1011f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis /// This is guaranteed to only be called following a successful call to 1021f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis /// BeginSourceFileAction (and BeginSourceFile). 1031f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis virtual bool shouldEraseOutputFiles(); 1041f01f7c160c06f8290b4f1c203e36b242074c6b1Argyrios Kyrtzidis 1054ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @} 1064ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1074ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarpublic: 1084ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar FrontendAction(); 1094ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual ~FrontendAction(); 1104ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1114ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @name Compiler Instance Access 1124ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @{ 1134ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1144ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar CompilerInstance &getCompilerInstance() const { 1154ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar assert(Instance && "Compiler instance not registered!"); 1164ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar return *Instance; 1174ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar } 1184ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1194ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar void setCompilerInstance(CompilerInstance *Value) { Instance = Value; } 1204ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1214ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @} 1224ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @name Current File Information 1234ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @{ 1244ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1254ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar bool isCurrentFileAST() const { 1268616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis assert(!CurrentInput.isEmpty() && "No current file!"); 127651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines return (bool)CurrentASTUnit; 1284ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar } 1294ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1301f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor const FrontendInputFile &getCurrentInput() const { 1311f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor return CurrentInput; 1321f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor } 1331f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor 1348616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis const StringRef getCurrentFile() const { 1358616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis assert(!CurrentInput.isEmpty() && "No current file!"); 1368616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis return CurrentInput.getFile(); 1374ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar } 1384ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 139685ac6665a3f91f9a66a9f44b6bf755a0cd929eaDaniel Dunbar InputKind getCurrentFileKind() const { 1408616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis assert(!CurrentInput.isEmpty() && "No current file!"); 1418616f9af65b9a3662f2c9dfed38eeabc509f8446Argyrios Kyrtzidis return CurrentInput.getKind(); 142685ac6665a3f91f9a66a9f44b6bf755a0cd929eaDaniel Dunbar } 143685ac6665a3f91f9a66a9f44b6bf755a0cd929eaDaniel Dunbar 1444ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar ASTUnit &getCurrentASTUnit() const { 145f1410802d1c9e7ff72b2818ad91fd85283abc6bfArgyrios Kyrtzidis assert(CurrentASTUnit && "No current AST unit!"); 1464ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar return *CurrentASTUnit; 1474ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar } 1484ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 149651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASTUnit *takeCurrentASTUnit() { return CurrentASTUnit.release(); } 1509bed8798964d9f07599c2c9199701f86fbc70e20Douglas Gregor 1516bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines void setCurrentInput(const FrontendInputFile &CurrentInput, 1526bcf27bb9a4b5c3f79cb44c0e4654a6d7619ad89Stephen Hines ASTUnit *AST = nullptr); 1534ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1544ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @} 1554ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @name Supported Modes 1564ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @{ 1574ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 15818f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Does this action only use the preprocessor? 15918f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// 16018f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// If so no AST context will be created and this action will be invalid 16118f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// with AST file inputs. 1624ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual bool usesPreprocessorOnly() const = 0; 1634ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 164467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor /// \brief For AST-based actions, the kind of translation unit we're handling. 165467dc88512b4ba4bb16e274ea3771dc1415d31daDouglas Gregor virtual TranslationUnitKind getTranslationUnitKind() { return TU_Complete; } 1664ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 16718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Does this action support use with PCH? 1684ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual bool hasPCHSupport() const { return !usesPreprocessorOnly(); } 1694ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 17018f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Does this action support use with AST files? 171eb58d831b283a9fa030a2eccc6e23480108d2fa1Daniel Dunbar virtual bool hasASTFileSupport() const { return !usesPreprocessorOnly(); } 1724ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 17318f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Does this action support use with IR files? 174faddc3e53a95c68f2c3a966e0f1e6eba110dafd6Daniel Dunbar virtual bool hasIRSupport() const { return false; } 175faddc3e53a95c68f2c3a966e0f1e6eba110dafd6Daniel Dunbar 17618f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Does this action support use with code completion? 1774ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar virtual bool hasCodeCompletionSupport() const { return false; } 1784ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 1794ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @} 1804ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @name Public Action Interface 1814ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @{ 1824ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 18318f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Prepare the action for processing the input file \p Input. 18418f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// 18518f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// This is run after the options and frontend have been initialized, 18618f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// but prior to executing any per-file processing. 1874ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 1884ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// \param CI - The compiler instance this action is being run from. The 1894ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// action may store and use this object up until the matching EndSourceFile 1904ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// action. 1914ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 1921f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor /// \param Input - The input filename and kind. Some input kinds are handled 193d3598a65716e120aef45aa2841d730e03f7101feDaniel Dunbar /// specially, for example AST inputs, since the AST file itself contains 194d3598a65716e120aef45aa2841d730e03f7101feDaniel Dunbar /// several objects which would normally be owned by the 195d3598a65716e120aef45aa2841d730e03f7101feDaniel Dunbar /// CompilerInstance. When processing AST input files, these objects should 196d3598a65716e120aef45aa2841d730e03f7101feDaniel Dunbar /// generally not be initialized in the CompilerInstance -- they will 19718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// automatically be shared with the AST file in between 19818f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// BeginSourceFile() and EndSourceFile(). 1994ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 20036579d4f5510e8eb823171f532d6b19ce4250a92Dylan Noblesmith /// \return True on success; on failure the compilation of this file should 20118f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// be aborted and neither Execute() nor EndSourceFile() should be called. 2021f6b2b5c82b2d2d3935b0db76352a04e9877b73fDouglas Gregor bool BeginSourceFile(CompilerInstance &CI, const FrontendInputFile &Input); 2034ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 20418f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Set the source manager's main input file, and run the action. 205374a00bcc6e26b4fc3cd1d378a5d056c4c7d618eArgyrios Kyrtzidis bool Execute(); 2064ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 20718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Perform any per-file post processing, deallocate per-file 2084ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// objects, and run statistics and output file cleanup code. 2094ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar void EndSourceFile(); 2104ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 2114ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// @} 2124ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar}; 2134ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 21418f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// \brief Abstract base class to use for AST consumer-based frontend actions. 2154ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarclass ASTFrontendAction : public FrontendAction { 2164cbbd94d0abeec2d7e7438d098527aa340d82389Daniel Dunbarprotected: 21718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Implement the ExecuteAction interface by running Sema on 21818f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// the already-initialized AST consumer. 2194ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// 2204ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// This will also take care of instantiating a code completion consumer if 2214ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// the user requested it and the action supports it. 222651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void ExecuteAction() override; 2234ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 2244ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarpublic: 225651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool usesPreprocessorOnly() const override { return false; } 2264ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar}; 2274ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 2283177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbarclass PluginASTAction : public ASTFrontendAction { 22999ba9e3bd70671f3441fb974895f226a83ce0e66David Blaikie virtual void anchor(); 2303177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbarprotected: 231651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 232651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef InFile) override = 0; 2333177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar 2343177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbarpublic: 23518f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Parse the given plugin command line arguments. 236f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar /// 237f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar /// \param CI - The compiler instance, for use in reporting diagnostics. 238f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar /// \return True if the parsing succeeded; otherwise the plugin will be 239f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar /// destroyed and no action run. The plugin is responsible for using the 240f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar /// CompilerInstance's Diagnostic object to report errors. 241f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar virtual bool ParseArgs(const CompilerInstance &CI, 242f56a488a6bdfe56ca814f37d384afa67c67f9dd5Daniel Dunbar const std::vector<std::string> &arg) = 0; 2433177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar}; 2443177aae51a21f61ab483c52f97124bdb707da7f1Daniel Dunbar 24518f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// \brief Abstract base class to use for preprocessor-based frontend actions. 2464ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarclass PreprocessorFrontendAction : public FrontendAction { 2474ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarprotected: 24818f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett /// \brief Provide a default implementation which returns aborts; 2494ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar /// this method should never be called by FrontendAction clients. 250651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 251651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef InFile) override; 2524ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 2534ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbarpublic: 254651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool usesPreprocessorOnly() const override { return true; } 2554ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar}; 2564ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 25718f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// \brief A frontend action which simply wraps some other runtime-specified 25818f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// frontend action. 25918f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// 26018f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// Deriving from this class allows an action to inject custom logic around 26118f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// some existing action's behavior. It implements every virtual method in 26218f43a62134eca1cd830a5b289f4bee4e6ee42feJames Dennett/// the FrontendAction interface by forwarding to the wrapped action. 263f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruthclass WrapperFrontendAction : public FrontendAction { 264651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines std::unique_ptr<FrontendAction> WrappedAction; 265f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth 266f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruthprotected: 267651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines ASTConsumer *CreateASTConsumer(CompilerInstance &CI, 268651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines StringRef InFile) override; 269651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool BeginInvocation(CompilerInstance &CI) override; 270651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool BeginSourceFileAction(CompilerInstance &CI, StringRef Filename) override; 271651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void ExecuteAction() override; 272651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines void EndSourceFileAction() override; 273f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth 274f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruthpublic: 275f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth /// Construct a WrapperFrontendAction from an existing action, taking 276f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth /// ownership of it. 277f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth WrapperFrontendAction(FrontendAction *WrappedAction); 278f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth 279651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool usesPreprocessorOnly() const override; 280651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines TranslationUnitKind getTranslationUnitKind() override; 281651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool hasPCHSupport() const override; 282651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool hasASTFileSupport() const override; 283651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool hasIRSupport() const override; 284651f13cea278ec967336033dd032faef0e9fc2ecStephen Hines bool hasCodeCompletionSupport() const override; 285f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth}; 286f7f8188fac71e34e09ee457ff6f039f5d14ad117Chandler Carruth 2874ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar} // end namespace clang 2884ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar 2894ee24097a8050b885c1d75ca4ee9f6d534c3f20bDaniel Dunbar#endif 290