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