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