brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.5 KiB · bb55a81 Raw
777 lines · cpp
1//===-- FeatureList.cpp ---------------------------------------------------===//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-exception6//7//===----------------------------------------------------------------------===//8//9// A plugin that counts the amount of times a particular parse tree node10// occurs.  This plugin should cover each feature covered in dump-parse-tree.h11//12//===----------------------------------------------------------------------===//13 14#include "flang/Frontend/FrontendActions.h"15#include "flang/Frontend/FrontendPluginRegistry.h"16#include "flang/Parser/parse-tree-visitor.h"17#include "flang/Parser/parse-tree.h"18#include "flang/Parser/parsing.h"19 20#include <algorithm>21#include <cstring>22#include <unordered_map>23#include <utility>24#include <vector>25 26using namespace Fortran::common;27using namespace Fortran::frontend;28using namespace Fortran::parser;29using namespace Fortran;30 31#define READ_FEATURE_CUST(classname, n) \32  bool Pre(const classname &) { \33    record(#n); \34    return true; \35  } \36  void Post(const classname &) {}37 38#define READ_FEATURE(classname) READ_FEATURE_CUST(classname, classname)39 40struct NodeVisitor {41private:42  std::unordered_map<const char *, unsigned int> frequencies;43 44  void record(const char *name) {45    auto [it, ins] = frequencies.insert({name, 1});46    if (!ins) {47      it->second++;48    }49  }50 51public:52  const std::unordered_map<const char *, unsigned int> &getFrequencies() const {53    return frequencies;54  }55 56  READ_FEATURE_CUST(format::ControlEditDesc, ControlEditDesc)57  READ_FEATURE_CUST(format::DerivedTypeDataEditDesc, DerivedTypeDataEditDesc)58  READ_FEATURE_CUST(format::FormatItem, FormatItem)59  READ_FEATURE_CUST(format::FormatSpecification, FormatSpecification)60  READ_FEATURE_CUST(61      format::IntrinsicTypeDataEditDesc, IntrinsicTypeDataEditDesc)62  READ_FEATURE(Abstract)63  READ_FEATURE(AccAtomicCapture)64  READ_FEATURE(AccAtomicCapture::Stmt1)65  READ_FEATURE(AccAtomicCapture::Stmt2)66  READ_FEATURE(AccAtomicRead)67  READ_FEATURE(AccAtomicUpdate)68  READ_FEATURE(AccAtomicWrite)69  READ_FEATURE(AccBeginBlockDirective)70  READ_FEATURE(AccBeginCombinedDirective)71  READ_FEATURE(AccBeginLoopDirective)72  READ_FEATURE(AccBlockDirective)73  READ_FEATURE(AccClause)74  READ_FEATURE(AccBindClause)75  READ_FEATURE(AccDefaultClause)76  READ_FEATURE(AccClauseList)77  READ_FEATURE(AccCombinedDirective)78  READ_FEATURE(AccDataModifier)79  READ_FEATURE(AccDataModifier::Modifier)80  READ_FEATURE(AccDeclarativeDirective)81  READ_FEATURE(AccEndAtomic)82  READ_FEATURE(AccEndBlockDirective)83  READ_FEATURE(AccEndCombinedDirective)84  READ_FEATURE(AccGangArg)85  READ_FEATURE(AccObject)86  READ_FEATURE(AccObjectList)87  READ_FEATURE(AccObjectListWithModifier)88  READ_FEATURE(AccObjectListWithReduction)89  READ_FEATURE(AccSizeExpr)90  READ_FEATURE(AccSizeExprList)91  READ_FEATURE(AccSelfClause)92  READ_FEATURE(AccStandaloneDirective)93  READ_FEATURE(AccDeviceTypeExpr)94  READ_FEATURE(AccDeviceTypeExprList)95  READ_FEATURE(AccTileExpr)96  READ_FEATURE(AccTileExprList)97  READ_FEATURE(AccLoopDirective)98  READ_FEATURE(AccWaitArgument)99  READ_FEATURE(AcImpliedDo)100  READ_FEATURE(AcImpliedDoControl)101  READ_FEATURE(AcValue)102  READ_FEATURE(AccessStmt)103  READ_FEATURE(AccessId)104  READ_FEATURE(AccessSpec)105  READ_FEATURE(AccessSpec::Kind)106  READ_FEATURE(AcSpec)107  READ_FEATURE(ActionStmt)108  READ_FEATURE(ActualArg)109  READ_FEATURE(ActualArg::PercentRef)110  READ_FEATURE(ActualArg::PercentVal)111  READ_FEATURE(ActualArgSpec)112  READ_FEATURE(AcValue::Triplet)113  READ_FEATURE(AllocOpt)114  READ_FEATURE(AllocOpt::Mold)115  READ_FEATURE(AllocOpt::Source)116  READ_FEATURE(Allocatable)117  READ_FEATURE(AllocatableStmt)118  READ_FEATURE(AllocateCoarraySpec)119  READ_FEATURE(AllocateObject)120  READ_FEATURE(AllocateShapeSpec)121  READ_FEATURE(AllocateStmt)122  READ_FEATURE(Allocation)123  READ_FEATURE(AltReturnSpec)124  READ_FEATURE(ArithmeticIfStmt)125  READ_FEATURE(ArrayConstructor)126  READ_FEATURE(ArrayElement)127  READ_FEATURE(ArraySpec)128  READ_FEATURE(AssignStmt)129  READ_FEATURE(AssignedGotoStmt)130  READ_FEATURE(AssignmentStmt)131  READ_FEATURE(AssociateConstruct)132  READ_FEATURE(AssociateStmt)133  READ_FEATURE(Association)134  READ_FEATURE(AssumedImpliedSpec)135  READ_FEATURE(AssumedRankSpec)136  READ_FEATURE(AssumedShapeSpec)137  READ_FEATURE(AssumedSizeSpec)138  READ_FEATURE(Asynchronous)139  READ_FEATURE(AsynchronousStmt)140  READ_FEATURE(AttrSpec)141  READ_FEATURE(BOZLiteralConstant)142  READ_FEATURE(BackspaceStmt)143  READ_FEATURE(BasedPointer)144  READ_FEATURE(BasedPointerStmt)145  READ_FEATURE(BindAttr)146  READ_FEATURE(BindAttr::Deferred)147  READ_FEATURE(BindAttr::Non_Overridable)148  READ_FEATURE(BindEntity)149  READ_FEATURE(BindEntity::Kind)150  READ_FEATURE(BindStmt)151  READ_FEATURE(Block)152  READ_FEATURE(BlockConstruct)153  READ_FEATURE(BlockData)154  READ_FEATURE(BlockDataStmt)155  READ_FEATURE(BlockSpecificationPart)156  READ_FEATURE(BlockStmt)157  READ_FEATURE(BoundsRemapping)158  READ_FEATURE(BoundsSpec)159  READ_FEATURE(Call)160  READ_FEATURE(CallStmt)161  READ_FEATURE(CaseConstruct)162  READ_FEATURE(CaseConstruct::Case)163  READ_FEATURE(CaseSelector)164  READ_FEATURE(CaseStmt)165  READ_FEATURE(CaseValueRange)166  READ_FEATURE(CaseValueRange::Range)167  READ_FEATURE(ChangeTeamConstruct)168  READ_FEATURE(ChangeTeamStmt)169  READ_FEATURE(CharLength)170  READ_FEATURE(CharLiteralConstant)171  READ_FEATURE(CharLiteralConstantSubstring)172  READ_FEATURE(CharSelector)173  READ_FEATURE(CharSelector::LengthAndKind)174  READ_FEATURE(CloseStmt)175  READ_FEATURE(CloseStmt::CloseSpec)176  READ_FEATURE(CoarrayAssociation)177  READ_FEATURE(CoarraySpec)178  READ_FEATURE(CodimensionDecl)179  READ_FEATURE(CodimensionStmt)180  READ_FEATURE(CoindexedNamedObject)181  READ_FEATURE(CommonBlockObject)182  READ_FEATURE(CommonStmt)183  READ_FEATURE(CommonStmt::Block)184  READ_FEATURE(CompilerDirective)185  READ_FEATURE(CompilerDirective::IgnoreTKR)186  READ_FEATURE(CompilerDirective::LoopCount)187  READ_FEATURE(CompilerDirective::NameValue)188  READ_FEATURE(ComplexLiteralConstant)189  READ_FEATURE(ComplexPart)190  READ_FEATURE(ComponentArraySpec)191  READ_FEATURE(ComponentAttrSpec)192  READ_FEATURE(ComponentDataSource)193  READ_FEATURE(ComponentDecl)194  READ_FEATURE(FillDecl)195  READ_FEATURE(ComponentOrFill)196  READ_FEATURE(ComponentDefStmt)197  READ_FEATURE(ComponentSpec)198  READ_FEATURE(ComputedGotoStmt)199  READ_FEATURE(ConcurrentControl)200  READ_FEATURE(ConcurrentHeader)201  READ_FEATURE(ConnectSpec)202  READ_FEATURE(ConnectSpec::CharExpr)203  READ_FEATURE(ConnectSpec::CharExpr::Kind)204  READ_FEATURE(ConnectSpec::Newunit)205  READ_FEATURE(ConnectSpec::Recl)206  READ_FEATURE(ContainsStmt)207  READ_FEATURE(Contiguous)208  READ_FEATURE(ContiguousStmt)209  READ_FEATURE(ContinueStmt)210  READ_FEATURE(CriticalConstruct)211  READ_FEATURE(CriticalStmt)212  READ_FEATURE(CycleStmt)213  READ_FEATURE(DataComponentDefStmt)214  READ_FEATURE(DataIDoObject)215  READ_FEATURE(DataImpliedDo)216  READ_FEATURE(DataRef)217  READ_FEATURE(DataStmt)218  READ_FEATURE(DataStmtConstant)219  READ_FEATURE(DataStmtObject)220  READ_FEATURE(DataStmtRepeat)221  READ_FEATURE(DataStmtSet)222  READ_FEATURE(DataStmtValue)223  READ_FEATURE(DeallocateStmt)224  READ_FEATURE(DeclarationConstruct)225  READ_FEATURE(DeclarationTypeSpec)226  READ_FEATURE(DeclarationTypeSpec::Class)227  READ_FEATURE(DeclarationTypeSpec::ClassStar)228  READ_FEATURE(DeclarationTypeSpec::Record)229  READ_FEATURE(DeclarationTypeSpec::Type)230  READ_FEATURE(DeclarationTypeSpec::TypeStar)231  READ_FEATURE(Default)232  READ_FEATURE(DeferredCoshapeSpecList)233  READ_FEATURE(DeferredShapeSpecList)234  READ_FEATURE(DefinedOpName)235  READ_FEATURE(DefinedOperator)236  READ_FEATURE(DefinedOperator::IntrinsicOperator)237  READ_FEATURE(DerivedTypeDef)238  READ_FEATURE(DerivedTypeSpec)239  READ_FEATURE(DerivedTypeStmt)240  READ_FEATURE(Designator)241  READ_FEATURE(DimensionStmt)242  READ_FEATURE(DimensionStmt::Declaration)243  READ_FEATURE(DoConstruct)244  READ_FEATURE(DummyArg)245  READ_FEATURE(ElseIfStmt)246  READ_FEATURE(ElseStmt)247  READ_FEATURE(ElsewhereStmt)248  READ_FEATURE(EndAssociateStmt)249  READ_FEATURE(EndBlockDataStmt)250  READ_FEATURE(EndBlockStmt)251  READ_FEATURE(EndChangeTeamStmt)252  READ_FEATURE(EndCriticalStmt)253  READ_FEATURE(EndDoStmt)254  READ_FEATURE(EndEnumStmt)255  READ_FEATURE(EndForallStmt)256  READ_FEATURE(EndFunctionStmt)257  READ_FEATURE(EndIfStmt)258  READ_FEATURE(EndInterfaceStmt)259  READ_FEATURE(EndLabel)260  READ_FEATURE(EndModuleStmt)261  READ_FEATURE(EndMpSubprogramStmt)262  READ_FEATURE(EndProgramStmt)263  READ_FEATURE(EndSelectStmt)264  READ_FEATURE(EndSubmoduleStmt)265  READ_FEATURE(EndSubroutineStmt)266  READ_FEATURE(EndTypeStmt)267  READ_FEATURE(EndWhereStmt)268  READ_FEATURE(EndfileStmt)269  READ_FEATURE(EntityDecl)270  READ_FEATURE(EntryStmt)271  READ_FEATURE(EnumDef)272  READ_FEATURE(EnumDefStmt)273  READ_FEATURE(Enumerator)274  READ_FEATURE(EnumeratorDefStmt)275  READ_FEATURE(EorLabel)276  READ_FEATURE(EquivalenceObject)277  READ_FEATURE(EquivalenceStmt)278  READ_FEATURE(ErrLabel)279  READ_FEATURE(ErrorRecovery)280  READ_FEATURE(EventPostStmt)281  READ_FEATURE(EventWaitStmt)282  READ_FEATURE(EventWaitSpec)283  READ_FEATURE(ExecutableConstruct)284  READ_FEATURE(ExecutionPart)285  READ_FEATURE(ExecutionPartConstruct)286  READ_FEATURE(ExitStmt)287  READ_FEATURE(ExplicitCoshapeSpec)288  READ_FEATURE(ExplicitShapeSpec)289  READ_FEATURE(Expr)290  READ_FEATURE(Expr::Parentheses)291  READ_FEATURE(Expr::UnaryPlus)292  READ_FEATURE(Expr::Negate)293  READ_FEATURE(Expr::NOT)294  READ_FEATURE(Expr::PercentLoc)295  READ_FEATURE(Expr::DefinedUnary)296  READ_FEATURE(Expr::Power)297  READ_FEATURE(Expr::Multiply)298  READ_FEATURE(Expr::Divide)299  READ_FEATURE(Expr::Add)300  READ_FEATURE(Expr::Subtract)301  READ_FEATURE(Expr::Concat)302  READ_FEATURE(Expr::LT)303  READ_FEATURE(Expr::LE)304  READ_FEATURE(Expr::EQ)305  READ_FEATURE(Expr::NE)306  READ_FEATURE(Expr::GE)307  READ_FEATURE(Expr::GT)308  READ_FEATURE(Expr::AND)309  READ_FEATURE(Expr::OR)310  READ_FEATURE(Expr::EQV)311  READ_FEATURE(Expr::NEQV)312  READ_FEATURE(Expr::DefinedBinary)313  READ_FEATURE(Expr::ComplexConstructor)314  READ_FEATURE(External)315  READ_FEATURE(ExternalStmt)316  READ_FEATURE(FailImageStmt)317  READ_FEATURE(FileUnitNumber)318  READ_FEATURE(FinalProcedureStmt)319  READ_FEATURE(FlushStmt)320  READ_FEATURE(ForallAssignmentStmt)321  READ_FEATURE(ForallBodyConstruct)322  READ_FEATURE(ForallConstruct)323  READ_FEATURE(ForallConstructStmt)324  READ_FEATURE(ForallStmt)325  READ_FEATURE(FormTeamStmt)326  READ_FEATURE(FormTeamStmt::FormTeamSpec)327  READ_FEATURE(Format)328  READ_FEATURE(FormatStmt)329  READ_FEATURE(FunctionReference)330  READ_FEATURE(FunctionStmt)331  READ_FEATURE(FunctionSubprogram)332  READ_FEATURE(GenericSpec)333  READ_FEATURE(GenericSpec::Assignment)334  READ_FEATURE(GenericSpec::ReadFormatted)335  READ_FEATURE(GenericSpec::ReadUnformatted)336  READ_FEATURE(GenericSpec::WriteFormatted)337  READ_FEATURE(GenericSpec::WriteUnformatted)338  READ_FEATURE(GenericStmt)339  READ_FEATURE(GotoStmt)340  READ_FEATURE(HollerithLiteralConstant)341  READ_FEATURE(IdExpr)342  READ_FEATURE(IdVariable)343  READ_FEATURE(IfConstruct)344  READ_FEATURE(IfConstruct::ElseBlock)345  READ_FEATURE(IfConstruct::ElseIfBlock)346  READ_FEATURE(IfStmt)347  READ_FEATURE(IfThenStmt)348  READ_FEATURE(TeamValue)349  READ_FEATURE(ImageSelector)350  READ_FEATURE(ImageSelectorSpec)351  READ_FEATURE(ImageSelectorSpec::Notify)352  READ_FEATURE(ImageSelectorSpec::Stat)353  READ_FEATURE(ImageSelectorSpec::Team_Number)354  READ_FEATURE(ImplicitPart)355  READ_FEATURE(ImplicitPartStmt)356  READ_FEATURE(ImplicitSpec)357  READ_FEATURE(ImplicitStmt)358  READ_FEATURE(ImplicitStmt::ImplicitNoneNameSpec)359  READ_FEATURE(ImpliedShapeSpec)360  READ_FEATURE(ImportStmt)361  READ_FEATURE(Initialization)362  READ_FEATURE(InputImpliedDo)363  READ_FEATURE(InputItem)364  READ_FEATURE(InquireSpec)365  READ_FEATURE(InquireSpec::CharVar)366  READ_FEATURE(InquireSpec::CharVar::Kind)367  READ_FEATURE(InquireSpec::IntVar)368  READ_FEATURE(InquireSpec::IntVar::Kind)369  READ_FEATURE(InquireSpec::LogVar)370  READ_FEATURE(InquireSpec::LogVar::Kind)371  READ_FEATURE(InquireStmt)372  READ_FEATURE(InquireStmt::Iolength)373  READ_FEATURE(IntegerTypeSpec)374  READ_FEATURE(IntentSpec)375  READ_FEATURE(IntentSpec::Intent)376  READ_FEATURE(IntentStmt)377  READ_FEATURE(InterfaceBlock)378  READ_FEATURE(InterfaceBody)379  READ_FEATURE(InterfaceBody::Function)380  READ_FEATURE(InterfaceBody::Subroutine)381  READ_FEATURE(InterfaceSpecification)382  READ_FEATURE(InterfaceStmt)383  READ_FEATURE(InternalSubprogram)384  READ_FEATURE(InternalSubprogramPart)385  READ_FEATURE(Intrinsic)386  READ_FEATURE(IntrinsicStmt)387  READ_FEATURE(IntrinsicTypeSpec)388  READ_FEATURE(IntrinsicTypeSpec::Character)389  READ_FEATURE(IntrinsicTypeSpec::Complex)390  READ_FEATURE(IntrinsicTypeSpec::DoubleComplex)391  READ_FEATURE(IntrinsicTypeSpec::DoublePrecision)392  READ_FEATURE(IntrinsicTypeSpec::Logical)393  READ_FEATURE(IntrinsicTypeSpec::Real)394  READ_FEATURE(IoControlSpec)395  READ_FEATURE(IoControlSpec::Asynchronous)396  READ_FEATURE(IoControlSpec::CharExpr)397  READ_FEATURE(IoControlSpec::CharExpr::Kind)398  READ_FEATURE(IoControlSpec::Pos)399  READ_FEATURE(IoControlSpec::Rec)400  READ_FEATURE(IoControlSpec::Size)401  READ_FEATURE(IoUnit)402  READ_FEATURE(Keyword)403  READ_FEATURE(KindParam)404  READ_FEATURE(KindSelector)405  READ_FEATURE(KindSelector::StarSize)406  READ_FEATURE(LabelDoStmt)407  READ_FEATURE(LanguageBindingSpec)408  READ_FEATURE(LengthSelector)409  READ_FEATURE(LetterSpec)410  READ_FEATURE(LiteralConstant)411  READ_FEATURE(IntLiteralConstant)412  READ_FEATURE(ReductionOperator)413  READ_FEATURE(ReductionOperator::Operator)414  READ_FEATURE(LocalitySpec)415  READ_FEATURE(LocalitySpec::DefaultNone)416  READ_FEATURE(LocalitySpec::Local)417  READ_FEATURE(LocalitySpec::LocalInit)418  READ_FEATURE(LocalitySpec::Reduce)419  READ_FEATURE(LocalitySpec::Shared)420  READ_FEATURE(LockStmt)421  READ_FEATURE(LockStmt::LockStat)422  READ_FEATURE(LogicalLiteralConstant)423  READ_FEATURE(LoopControl)424  READ_FEATURE(LoopControl::Concurrent)425  READ_FEATURE(MainProgram)426  READ_FEATURE(Map)427  READ_FEATURE(Map::EndMapStmt)428  READ_FEATURE(Map::MapStmt)429  READ_FEATURE(MaskedElsewhereStmt)430  READ_FEATURE(Module)431  READ_FEATURE(ModuleStmt)432  READ_FEATURE(ModuleSubprogram)433  READ_FEATURE(ModuleSubprogramPart)434  READ_FEATURE(MpSubprogramStmt)435  READ_FEATURE(MsgVariable)436  READ_FEATURE(Name)437  READ_FEATURE(NamedConstant)438  READ_FEATURE(NamedConstantDef)439  READ_FEATURE(NamelistStmt)440  READ_FEATURE(NamelistStmt::Group)441  READ_FEATURE(NonLabelDoStmt)442  READ_FEATURE(NoPass)443  READ_FEATURE(NotifyWaitStmt)444  READ_FEATURE(NullifyStmt)445  READ_FEATURE(NullInit)446  READ_FEATURE(ObjectDecl)447  READ_FEATURE(OldParameterStmt)448  READ_FEATURE(OmpAlignedClause)449  READ_FEATURE(OmpAllocateDirective)450  READ_FEATURE(OmpBeginDirective)451  READ_FEATURE(OmpBeginLoopDirective)452  READ_FEATURE(OmpBeginSectionsDirective)453  READ_FEATURE(OmpBlockConstruct)454  READ_FEATURE(OmpClause)455  READ_FEATURE(OmpClauseList)456  READ_FEATURE(OmpCombinerExpression)457  READ_FEATURE(OmpDefaultClause)458  READ_FEATURE(OmpDefaultClause::DataSharingAttribute)459  READ_FEATURE(OmpDefaultmapClause)460  READ_FEATURE(OmpDefaultmapClause::ImplicitBehavior)461  READ_FEATURE(OmpVariableCategory::Value)462  READ_FEATURE(OmpDependClause)463  READ_FEATURE(OmpDependClause::TaskDep)464  READ_FEATURE(OmpDoacross::Sink)465  READ_FEATURE(OmpDoacross::Source)466  READ_FEATURE(OmpDoacrossClause)467  READ_FEATURE(OmpDependenceType)468  READ_FEATURE(OmpDependenceType::Value)469  READ_FEATURE(OmpTaskDependenceType)470  READ_FEATURE(OmpTaskDependenceType::Value)471  READ_FEATURE(OmpIteration)472  READ_FEATURE(OmpIterationOffset)473  READ_FEATURE(OmpIterationVector)474  READ_FEATURE(OmpEndDirective)475  READ_FEATURE(OmpEndLoopDirective)476  READ_FEATURE(OmpEndSectionsDirective)477  READ_FEATURE(OmpGrainsizeClause)478  READ_FEATURE(OmpGrainsizeClause::Modifier)479  READ_FEATURE(OmpPrescriptiveness)480  READ_FEATURE(OmpPrescriptiveness::Value)481  READ_FEATURE(OmpIfClause)482  READ_FEATURE(OmpIfClause::Modifier)483  READ_FEATURE(OmpDirectiveNameModifier)484  READ_FEATURE(OmpLinearClause)485  READ_FEATURE(OmpLinearClause::Modifier)486  READ_FEATURE(OmpLinearModifier)487  READ_FEATURE(OmpLinearModifier::Value)488  READ_FEATURE(OmpMapClause)489  READ_FEATURE(OmpMapClause::Modifier)490  READ_FEATURE(OmpNumTasksClause)491  READ_FEATURE(OmpNumTasksClause::Modifier)492  READ_FEATURE(OmpObject)493  READ_FEATURE(OmpObjectList)494  READ_FEATURE(OmpOrderClause)495  READ_FEATURE(OmpOrderClause::Ordering)496  READ_FEATURE(OmpOrderModifier)497  READ_FEATURE(OmpOrderModifier::Value)498  READ_FEATURE(OmpProcBindClause)499  READ_FEATURE(OmpProcBindClause::AffinityPolicy)500  READ_FEATURE(OmpReductionClause)501  READ_FEATURE(OmpInReductionClause)502  READ_FEATURE(OmpInitializerClause)503  READ_FEATURE(OmpReductionIdentifier)504  READ_FEATURE(OmpAllocateClause)505  READ_FEATURE(OmpAllocateClause::Modifier)506  READ_FEATURE(OmpAllocatorSimpleModifier)507  READ_FEATURE(OmpAllocatorComplexModifier)508  READ_FEATURE(OmpAlignModifier)509  READ_FEATURE(OmpScheduleClause)510  READ_FEATURE(OmpScheduleClause::Kind)511  READ_FEATURE(OmpScheduleClause::Modifier)512  READ_FEATURE(OmpInteropRuntimeIdentifier)513  READ_FEATURE(OmpInteropPreference)514  READ_FEATURE(OmpInteropType)515  READ_FEATURE(OmpInteropType::Value)516  READ_FEATURE(OmpInitClause)517  READ_FEATURE(OmpInitClause::Modifier)518  READ_FEATURE(OmpUseClause)519  READ_FEATURE(OmpDeviceModifier)520  READ_FEATURE(OmpDeviceClause)521  READ_FEATURE(OmpDeviceClause::Modifier)522  READ_FEATURE(OmpDeviceTypeClause)523  READ_FEATURE(OmpDeviceTypeClause::DeviceTypeDescription)524  READ_FEATURE(OmpChunkModifier)525  READ_FEATURE(OmpChunkModifier::Value)526  READ_FEATURE(OmpOrderingModifier)527  READ_FEATURE(OmpOrderingModifier::Value)528  READ_FEATURE(Only)529  READ_FEATURE(OpenACCAtomicConstruct)530  READ_FEATURE(OpenACCBlockConstruct)531  READ_FEATURE(OpenACCCacheConstruct)532  READ_FEATURE(OpenACCCombinedConstruct)533  READ_FEATURE(OpenACCConstruct)534  READ_FEATURE(OpenACCDeclarativeConstruct)535  READ_FEATURE(OpenACCLoopConstruct)536  READ_FEATURE(OpenMPInteropConstruct)537  READ_FEATURE(OpenACCRoutineConstruct)538  READ_FEATURE(OpenACCStandaloneDeclarativeConstruct)539  READ_FEATURE(OpenACCStandaloneConstruct)540  READ_FEATURE(OpenACCWaitConstruct)541  READ_FEATURE(OpenMPAtomicConstruct)542  READ_FEATURE(OpenMPCancelConstruct)543  READ_FEATURE(OpenMPCancellationPointConstruct)544  READ_FEATURE(OpenMPConstruct)545  READ_FEATURE(OpenMPCriticalConstruct)546  READ_FEATURE(OpenMPDeclarativeConstruct)547  READ_FEATURE(OpenMPDeclareReductionConstruct)548  READ_FEATURE(OpenMPDeclareSimdConstruct)549  READ_FEATURE(OpenMPDeclareTargetConstruct)550  READ_FEATURE(OmpMemoryOrderType)551  READ_FEATURE(OmpAtomicDefaultMemOrderClause)552  READ_FEATURE(OpenMPFlushConstruct)553  READ_FEATURE(OpenMPLoopConstruct)554  READ_FEATURE(OpenMPAllocatorsConstruct)555  READ_FEATURE(OpenMPRequiresConstruct)556  READ_FEATURE(OpenMPSimpleStandaloneConstruct)557  READ_FEATURE(OpenMPStandaloneConstruct)558  READ_FEATURE(OpenMPSectionConstruct)559  READ_FEATURE(OpenMPSectionsConstruct)560  READ_FEATURE(OpenMPThreadprivate)561  READ_FEATURE(OpenStmt)562  READ_FEATURE(Optional)563  READ_FEATURE(OptionalStmt)564  READ_FEATURE(OtherSpecificationStmt)565  READ_FEATURE(OutputImpliedDo)566  READ_FEATURE(OutputItem)567  READ_FEATURE(Parameter)568  READ_FEATURE(ParameterStmt)569  READ_FEATURE(ParentIdentifier)570  READ_FEATURE(Pass)571  READ_FEATURE(PauseStmt)572  READ_FEATURE(Pointer)573  READ_FEATURE(PointerAssignmentStmt)574  READ_FEATURE(PointerAssignmentStmt::Bounds)575  READ_FEATURE(PointerDecl)576  READ_FEATURE(PointerObject)577  READ_FEATURE(PointerStmt)578  READ_FEATURE(PositionOrFlushSpec)579  READ_FEATURE(PrefixSpec)580  READ_FEATURE(PrefixSpec::Elemental)581  READ_FEATURE(PrefixSpec::Impure)582  READ_FEATURE(PrefixSpec::Module)583  READ_FEATURE(PrefixSpec::Non_Recursive)584  READ_FEATURE(PrefixSpec::Pure)585  READ_FEATURE(PrefixSpec::Recursive)586  READ_FEATURE(PrintStmt)587  READ_FEATURE(PrivateStmt)588  READ_FEATURE(PrivateOrSequence)589  READ_FEATURE(ProcAttrSpec)590  READ_FEATURE(ProcComponentAttrSpec)591  READ_FEATURE(ProcComponentDefStmt)592  READ_FEATURE(ProcComponentRef)593  READ_FEATURE(ProcDecl)594  READ_FEATURE(ProcInterface)595  READ_FEATURE(ProcPointerInit)596  READ_FEATURE(ProcedureDeclarationStmt)597  READ_FEATURE(ProcedureDesignator)598  READ_FEATURE(ProcedureStmt)599  READ_FEATURE(ProcedureStmt::Kind)600  READ_FEATURE(Program)601  READ_FEATURE(ProgramStmt)602  READ_FEATURE(ProgramUnit)603  READ_FEATURE(Protected)604  READ_FEATURE(ProtectedStmt)605  READ_FEATURE(ReadStmt)606  READ_FEATURE(RealLiteralConstant)607  READ_FEATURE(RealLiteralConstant::Real)608  READ_FEATURE(Rename)609  READ_FEATURE(Rename::Names)610  READ_FEATURE(Rename::Operators)611  READ_FEATURE(ReturnStmt)612  READ_FEATURE(RewindStmt)613  READ_FEATURE(Save)614  READ_FEATURE(SaveStmt)615  READ_FEATURE(SavedEntity)616  READ_FEATURE(SavedEntity::Kind)617  READ_FEATURE(SectionSubscript)618  READ_FEATURE(SelectCaseStmt)619  READ_FEATURE(SelectRankCaseStmt)620  READ_FEATURE(SelectRankCaseStmt::Rank)621  READ_FEATURE(SelectRankConstruct)622  READ_FEATURE(SelectRankConstruct::RankCase)623  READ_FEATURE(SelectRankStmt)624  READ_FEATURE(SelectTypeConstruct)625  READ_FEATURE(SelectTypeConstruct::TypeCase)626  READ_FEATURE(SelectTypeStmt)627  READ_FEATURE(Selector)628  READ_FEATURE(SeparateModuleSubprogram)629  READ_FEATURE(SequenceStmt)630  READ_FEATURE(Sign)631  READ_FEATURE(SignedComplexLiteralConstant)632  READ_FEATURE(SignedIntLiteralConstant)633  READ_FEATURE(SignedRealLiteralConstant)634  READ_FEATURE(SpecificationConstruct)635  READ_FEATURE(SpecificationExpr)636  READ_FEATURE(SpecificationPart)637  READ_FEATURE(Star)638  READ_FEATURE(StatOrErrmsg)639  READ_FEATURE(StatVariable)640  READ_FEATURE(StatusExpr)641  READ_FEATURE(StmtFunctionStmt)642  READ_FEATURE(StopCode)643  READ_FEATURE(StopStmt)644  READ_FEATURE(StopStmt::Kind)645  READ_FEATURE(StructureComponent)646  READ_FEATURE(StructureConstructor)647  READ_FEATURE(StructureDef)648  READ_FEATURE(StructureDef::EndStructureStmt)649  READ_FEATURE(StructureField)650  READ_FEATURE(StructureStmt)651  READ_FEATURE(Submodule)652  READ_FEATURE(SubmoduleStmt)653  READ_FEATURE(SubroutineStmt)654  READ_FEATURE(SubroutineSubprogram)655  READ_FEATURE(SubscriptTriplet)656  READ_FEATURE(Substring)657  READ_FEATURE(SubstringInquiry)658  READ_FEATURE(SubstringRange)659  READ_FEATURE(Suffix)660  READ_FEATURE(SyncAllStmt)661  READ_FEATURE(SyncImagesStmt)662  READ_FEATURE(SyncImagesStmt::ImageSet)663  READ_FEATURE(SyncMemoryStmt)664  READ_FEATURE(SyncTeamStmt)665  READ_FEATURE(Target)666  READ_FEATURE(TargetStmt)667  READ_FEATURE(TypeAttrSpec)668  READ_FEATURE(TypeAttrSpec::BindC)669  READ_FEATURE(TypeAttrSpec::Extends)670  READ_FEATURE(TypeBoundGenericStmt)671  READ_FEATURE(TypeBoundProcBinding)672  READ_FEATURE(TypeBoundProcDecl)673  READ_FEATURE(TypeBoundProcedurePart)674  READ_FEATURE(TypeBoundProcedureStmt)675  READ_FEATURE(TypeBoundProcedureStmt::WithInterface)676  READ_FEATURE(TypeBoundProcedureStmt::WithoutInterface)677  READ_FEATURE(TypeDeclarationStmt)678  READ_FEATURE(TypeGuardStmt)679  READ_FEATURE(TypeGuardStmt::Guard)680  READ_FEATURE(TypeParamDecl)681  READ_FEATURE(TypeParamDefStmt)682  READ_FEATURE(common::TypeParamAttr)683  READ_FEATURE(TypeParamSpec)684  READ_FEATURE(TypeParamValue)685  READ_FEATURE(TypeParamValue::Deferred)686  READ_FEATURE(TypeSpec)687  READ_FEATURE(Union)688  READ_FEATURE(Union::EndUnionStmt)689  READ_FEATURE(Union::UnionStmt)690  READ_FEATURE(UnlockStmt)691  READ_FEATURE(UseStmt)692  READ_FEATURE(UseStmt::ModuleNature)693  READ_FEATURE(Value)694  READ_FEATURE(ValueStmt)695  READ_FEATURE(Variable)696  READ_FEATURE(Verbatim)697  READ_FEATURE(Volatile)698  READ_FEATURE(VolatileStmt)699  READ_FEATURE(WaitSpec)700  READ_FEATURE(WaitStmt)701  READ_FEATURE(WhereBodyConstruct)702  READ_FEATURE(WhereConstruct)703  READ_FEATURE(WhereConstruct::Elsewhere)704  READ_FEATURE(WhereConstruct::MaskedElsewhere)705  READ_FEATURE(WhereConstructStmt)706  READ_FEATURE(WhereStmt)707  READ_FEATURE(WriteStmt)708 709  READ_FEATURE(llvm::omp::Directive)710  READ_FEATURE(llvm::omp::Clause)711  READ_FEATURE(llvm::acc::Directive)712  READ_FEATURE(llvm::acc::DefaultValue)713 714  template <typename A> bool Pre(const A &) { return true; }715  template <typename A> void Post(const A &) {}716 717  template <typename T> bool Pre(const Statement<T> &) { return true; }718  template <typename T> void Post(const Statement<T> &) {}719 720  template <typename T> bool Pre(const UnlabeledStatement<T> &) { return true; }721  template <typename T> void Post(const UnlabeledStatement<T> &) {}722 723  template <typename T> bool Pre(const common::Indirection<T> &) {724    return true;725  }726  template <typename T> void Post(const common::Indirection<T> &) {}727 728  template <typename A> bool Pre(const Scalar<A> &) { return true; }729  template <typename A> void Post(const Scalar<A> &) {}730 731  template <typename A> bool Pre(const Constant<A> &) { return true; }732  template <typename A> void Post(const Constant<A> &) {}733 734  template <typename A> bool Pre(const Integer<A> &) { return true; }735  template <typename A> void Post(const Integer<A> &) {}736 737  template <typename A> bool Pre(const Logical<A> &) { return true; }738  template <typename A> void Post(const Logical<A> &) {}739 740  template <typename A> bool Pre(const DefaultChar<A> &) { return true; }741  template <typename A> void Post(const DefaultChar<A> &) {}742 743  template <typename... A> bool Pre(const std::tuple<A...> &) { return true; }744  template <typename... A> void Post(const std::tuple<A...> &) {}745 746  template <typename... A> bool Pre(const std::variant<A...> &) { return true; }747  template <typename... A> void Post(const std::variant<A...> &) {}748};749 750bool sortNodes(std::pair<const char *, int> a, std::pair<const char *, int> b) {751  return (a.second == b.second) ? (std::strcmp(a.first, b.first) < 0)752                                : a.second > b.second;753}754 755class FeatureListAction : public PluginParseTreeAction {756  void executeAction() override {757    NodeVisitor visitor;758    Fortran::parser::Walk(getParsing().parseTree(), visitor);759 760    const auto &frequencyMap = visitor.getFrequencies();761    std::vector<std::pair<const char *, int>> frequencies(762        frequencyMap.begin(), frequencyMap.end());763 764    std::sort(frequencies.begin(), frequencies.end(), sortNodes);765    for (auto const &[feature, frequency] : frequencies) {766      llvm::outs() << feature << ": " << frequency << "\n";767    }768  }769 770  bool beginSourceFileAction() override {771    return runPrescan() && runParse(/*emitMessages=*/true);772  }773};774 775static FrontendPluginRegistry::Add<FeatureListAction> X(776    "feature-list", "List program features");777