| 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::common; |
| 27 | using namespace Fortran::frontend; |
| 28 | using namespace Fortran::parser; |
| 29 | using 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 | |
| 40 | struct NodeVisitor { |
| 41 | private: |
| 42 | std::unordered_map<const char *, unsigned int> frequencies; |
| 43 | |
| 44 | void record(const char *name) { |
| 45 | auto [it, ins] = frequencies.insert(x: {name, 1}); |
| 46 | if (!ins) { |
| 47 | it->second++; |
| 48 | } |
| 49 | } |
| 50 | |
| 51 | public: |
| 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::Stat) |
| 352 | READ_FEATURE(ImageSelectorSpec::Team_Number) |
| 353 | READ_FEATURE(ImplicitPart) |
| 354 | READ_FEATURE(ImplicitPartStmt) |
| 355 | READ_FEATURE(ImplicitSpec) |
| 356 | READ_FEATURE(ImplicitStmt) |
| 357 | READ_FEATURE(ImplicitStmt::ImplicitNoneNameSpec) |
| 358 | READ_FEATURE(ImpliedShapeSpec) |
| 359 | READ_FEATURE(ImportStmt) |
| 360 | READ_FEATURE(Initialization) |
| 361 | READ_FEATURE(InputImpliedDo) |
| 362 | READ_FEATURE(InputItem) |
| 363 | READ_FEATURE(InquireSpec) |
| 364 | READ_FEATURE(InquireSpec::CharVar) |
| 365 | READ_FEATURE(InquireSpec::CharVar::Kind) |
| 366 | READ_FEATURE(InquireSpec::IntVar) |
| 367 | READ_FEATURE(InquireSpec::IntVar::Kind) |
| 368 | READ_FEATURE(InquireSpec::LogVar) |
| 369 | READ_FEATURE(InquireSpec::LogVar::Kind) |
| 370 | READ_FEATURE(InquireStmt) |
| 371 | READ_FEATURE(InquireStmt::Iolength) |
| 372 | READ_FEATURE(IntegerTypeSpec) |
| 373 | READ_FEATURE(IntentSpec) |
| 374 | READ_FEATURE(IntentSpec::Intent) |
| 375 | READ_FEATURE(IntentStmt) |
| 376 | READ_FEATURE(InterfaceBlock) |
| 377 | READ_FEATURE(InterfaceBody) |
| 378 | READ_FEATURE(InterfaceBody::Function) |
| 379 | READ_FEATURE(InterfaceBody::Subroutine) |
| 380 | READ_FEATURE(InterfaceSpecification) |
| 381 | READ_FEATURE(InterfaceStmt) |
| 382 | READ_FEATURE(InternalSubprogram) |
| 383 | READ_FEATURE(InternalSubprogramPart) |
| 384 | READ_FEATURE(Intrinsic) |
| 385 | READ_FEATURE(IntrinsicStmt) |
| 386 | READ_FEATURE(IntrinsicTypeSpec) |
| 387 | READ_FEATURE(IntrinsicTypeSpec::Character) |
| 388 | READ_FEATURE(IntrinsicTypeSpec::Complex) |
| 389 | READ_FEATURE(IntrinsicTypeSpec::DoubleComplex) |
| 390 | READ_FEATURE(IntrinsicTypeSpec::DoublePrecision) |
| 391 | READ_FEATURE(IntrinsicTypeSpec::Logical) |
| 392 | READ_FEATURE(IntrinsicTypeSpec::Real) |
| 393 | READ_FEATURE(IoControlSpec) |
| 394 | READ_FEATURE(IoControlSpec::Asynchronous) |
| 395 | READ_FEATURE(IoControlSpec::CharExpr) |
| 396 | READ_FEATURE(IoControlSpec::CharExpr::Kind) |
| 397 | READ_FEATURE(IoControlSpec::Pos) |
| 398 | READ_FEATURE(IoControlSpec::Rec) |
| 399 | READ_FEATURE(IoControlSpec::Size) |
| 400 | READ_FEATURE(IoUnit) |
| 401 | READ_FEATURE(Keyword) |
| 402 | READ_FEATURE(KindParam) |
| 403 | READ_FEATURE(KindSelector) |
| 404 | READ_FEATURE(KindSelector::StarSize) |
| 405 | READ_FEATURE(LabelDoStmt) |
| 406 | READ_FEATURE(LanguageBindingSpec) |
| 407 | READ_FEATURE(LengthSelector) |
| 408 | READ_FEATURE(LetterSpec) |
| 409 | READ_FEATURE(LiteralConstant) |
| 410 | READ_FEATURE(IntLiteralConstant) |
| 411 | READ_FEATURE(ReductionOperator) |
| 412 | READ_FEATURE(ReductionOperator::Operator) |
| 413 | READ_FEATURE(LocalitySpec) |
| 414 | READ_FEATURE(LocalitySpec::DefaultNone) |
| 415 | READ_FEATURE(LocalitySpec::Local) |
| 416 | READ_FEATURE(LocalitySpec::LocalInit) |
| 417 | READ_FEATURE(LocalitySpec::Reduce) |
| 418 | READ_FEATURE(LocalitySpec::Shared) |
| 419 | READ_FEATURE(LockStmt) |
| 420 | READ_FEATURE(LockStmt::LockStat) |
| 421 | READ_FEATURE(LogicalLiteralConstant) |
| 422 | READ_FEATURE(LoopControl) |
| 423 | READ_FEATURE(LoopControl::Concurrent) |
| 424 | READ_FEATURE(MainProgram) |
| 425 | READ_FEATURE(Map) |
| 426 | READ_FEATURE(Map::EndMapStmt) |
| 427 | READ_FEATURE(Map::MapStmt) |
| 428 | READ_FEATURE(MaskedElsewhereStmt) |
| 429 | READ_FEATURE(Module) |
| 430 | READ_FEATURE(ModuleStmt) |
| 431 | READ_FEATURE(ModuleSubprogram) |
| 432 | READ_FEATURE(ModuleSubprogramPart) |
| 433 | READ_FEATURE(MpSubprogramStmt) |
| 434 | READ_FEATURE(MsgVariable) |
| 435 | READ_FEATURE(Name) |
| 436 | READ_FEATURE(NamedConstant) |
| 437 | READ_FEATURE(NamedConstantDef) |
| 438 | READ_FEATURE(NamelistStmt) |
| 439 | READ_FEATURE(NamelistStmt::Group) |
| 440 | READ_FEATURE(NonLabelDoStmt) |
| 441 | READ_FEATURE(NoPass) |
| 442 | READ_FEATURE(NotifyWaitStmt) |
| 443 | READ_FEATURE(NullifyStmt) |
| 444 | READ_FEATURE(NullInit) |
| 445 | READ_FEATURE(ObjectDecl) |
| 446 | READ_FEATURE(OldParameterStmt) |
| 447 | READ_FEATURE(OmpAlignedClause) |
| 448 | READ_FEATURE(OmpBeginBlockDirective) |
| 449 | READ_FEATURE(OmpBeginLoopDirective) |
| 450 | READ_FEATURE(OmpBeginSectionsDirective) |
| 451 | READ_FEATURE(OmpBlockDirective) |
| 452 | READ_FEATURE(OmpClause) |
| 453 | READ_FEATURE(OmpClauseList) |
| 454 | READ_FEATURE(OmpCriticalDirective) |
| 455 | READ_FEATURE(OmpDeclareTargetSpecifier) |
| 456 | READ_FEATURE(OmpDeclareTargetWithClause) |
| 457 | READ_FEATURE(OmpDeclareTargetWithList) |
| 458 | READ_FEATURE(OmpDefaultClause) |
| 459 | READ_FEATURE(OmpDefaultClause::DataSharingAttribute) |
| 460 | READ_FEATURE(OmpDefaultmapClause) |
| 461 | READ_FEATURE(OmpDefaultmapClause::ImplicitBehavior) |
| 462 | READ_FEATURE(OmpVariableCategory::Value) |
| 463 | READ_FEATURE(OmpDependClause) |
| 464 | READ_FEATURE(OmpDependClause::TaskDep) |
| 465 | READ_FEATURE(OmpDoacross::Sink) |
| 466 | READ_FEATURE(OmpDoacross::Source) |
| 467 | READ_FEATURE(OmpDoacrossClause) |
| 468 | READ_FEATURE(OmpDependenceType) |
| 469 | READ_FEATURE(OmpDependenceType::Value) |
| 470 | READ_FEATURE(OmpTaskDependenceType) |
| 471 | READ_FEATURE(OmpTaskDependenceType::Value) |
| 472 | READ_FEATURE(OmpIteration) |
| 473 | READ_FEATURE(OmpIterationOffset) |
| 474 | READ_FEATURE(OmpIterationVector) |
| 475 | READ_FEATURE(OmpEndAllocators) |
| 476 | READ_FEATURE(OmpEndBlockDirective) |
| 477 | READ_FEATURE(OmpEndCriticalDirective) |
| 478 | READ_FEATURE(OmpEndLoopDirective) |
| 479 | READ_FEATURE(OmpEndSectionsDirective) |
| 480 | READ_FEATURE(OmpGrainsizeClause) |
| 481 | READ_FEATURE(OmpGrainsizeClause::Modifier) |
| 482 | READ_FEATURE(OmpPrescriptiveness) |
| 483 | READ_FEATURE(OmpPrescriptiveness::Value) |
| 484 | READ_FEATURE(OmpIfClause) |
| 485 | READ_FEATURE(OmpIfClause::Modifier) |
| 486 | READ_FEATURE(OmpDirectiveNameModifier) |
| 487 | READ_FEATURE(OmpLinearClause) |
| 488 | READ_FEATURE(OmpLinearClause::Modifier) |
| 489 | READ_FEATURE(OmpLinearModifier) |
| 490 | READ_FEATURE(OmpLinearModifier::Value) |
| 491 | READ_FEATURE(OmpLoopDirective) |
| 492 | READ_FEATURE(OmpMapClause) |
| 493 | READ_FEATURE(OmpMapClause::Modifier) |
| 494 | READ_FEATURE(OmpNumTasksClause) |
| 495 | READ_FEATURE(OmpNumTasksClause::Modifier) |
| 496 | READ_FEATURE(OmpObject) |
| 497 | READ_FEATURE(OmpObjectList) |
| 498 | READ_FEATURE(OmpOrderClause) |
| 499 | READ_FEATURE(OmpOrderClause::Ordering) |
| 500 | READ_FEATURE(OmpOrderModifier) |
| 501 | READ_FEATURE(OmpOrderModifier::Value) |
| 502 | READ_FEATURE(OmpProcBindClause) |
| 503 | READ_FEATURE(OmpProcBindClause::AffinityPolicy) |
| 504 | READ_FEATURE(OmpReductionClause) |
| 505 | READ_FEATURE(OmpInReductionClause) |
| 506 | READ_FEATURE(OmpReductionCombiner) |
| 507 | READ_FEATURE(OmpInitializerClause) |
| 508 | READ_FEATURE(OmpReductionIdentifier) |
| 509 | READ_FEATURE(OmpAllocateClause) |
| 510 | READ_FEATURE(OmpAllocateClause::Modifier) |
| 511 | READ_FEATURE(OmpAllocatorSimpleModifier) |
| 512 | READ_FEATURE(OmpAllocatorComplexModifier) |
| 513 | READ_FEATURE(OmpAlignModifier) |
| 514 | READ_FEATURE(OmpScheduleClause) |
| 515 | READ_FEATURE(OmpScheduleClause::Kind) |
| 516 | READ_FEATURE(OmpScheduleClause::Modifier) |
| 517 | READ_FEATURE(OmpInteropRuntimeIdentifier) |
| 518 | READ_FEATURE(OmpInteropPreference) |
| 519 | READ_FEATURE(OmpInteropType) |
| 520 | READ_FEATURE(OmpInteropType::Value) |
| 521 | READ_FEATURE(OmpInitClause) |
| 522 | READ_FEATURE(OmpInitClause::Modifier) |
| 523 | READ_FEATURE(OmpUseClause) |
| 524 | READ_FEATURE(OmpDeviceModifier) |
| 525 | READ_FEATURE(OmpDeviceClause) |
| 526 | READ_FEATURE(OmpDeviceClause::Modifier) |
| 527 | READ_FEATURE(OmpDeviceTypeClause) |
| 528 | READ_FEATURE(OmpDeviceTypeClause::DeviceTypeDescription) |
| 529 | READ_FEATURE(OmpChunkModifier) |
| 530 | READ_FEATURE(OmpChunkModifier::Value) |
| 531 | READ_FEATURE(OmpOrderingModifier) |
| 532 | READ_FEATURE(OmpOrderingModifier::Value) |
| 533 | READ_FEATURE(OmpSectionBlocks) |
| 534 | READ_FEATURE(OmpSectionsDirective) |
| 535 | READ_FEATURE(Only) |
| 536 | READ_FEATURE(OpenACCAtomicConstruct) |
| 537 | READ_FEATURE(OpenACCBlockConstruct) |
| 538 | READ_FEATURE(OpenACCCacheConstruct) |
| 539 | READ_FEATURE(OpenACCCombinedConstruct) |
| 540 | READ_FEATURE(OpenACCConstruct) |
| 541 | READ_FEATURE(OpenACCDeclarativeConstruct) |
| 542 | READ_FEATURE(OpenACCLoopConstruct) |
| 543 | READ_FEATURE(OpenMPInteropConstruct) |
| 544 | READ_FEATURE(OpenACCRoutineConstruct) |
| 545 | READ_FEATURE(OpenACCStandaloneDeclarativeConstruct) |
| 546 | READ_FEATURE(OpenACCStandaloneConstruct) |
| 547 | READ_FEATURE(OpenACCWaitConstruct) |
| 548 | READ_FEATURE(OpenMPAtomicConstruct) |
| 549 | READ_FEATURE(OpenMPBlockConstruct) |
| 550 | READ_FEATURE(OpenMPCancelConstruct) |
| 551 | READ_FEATURE(OpenMPCancellationPointConstruct) |
| 552 | READ_FEATURE(OpenMPConstruct) |
| 553 | READ_FEATURE(OpenMPCriticalConstruct) |
| 554 | READ_FEATURE(OpenMPDeclarativeAllocate) |
| 555 | READ_FEATURE(OpenMPDeclarativeConstruct) |
| 556 | READ_FEATURE(OpenMPDeclareReductionConstruct) |
| 557 | READ_FEATURE(OpenMPDeclareSimdConstruct) |
| 558 | READ_FEATURE(OpenMPDeclareTargetConstruct) |
| 559 | READ_FEATURE(OmpMemoryOrderType) |
| 560 | READ_FEATURE(OmpMemoryOrderClause) |
| 561 | READ_FEATURE(OmpAtomicDefaultMemOrderClause) |
| 562 | READ_FEATURE(OpenMPFlushConstruct) |
| 563 | READ_FEATURE(OpenMPLoopConstruct) |
| 564 | READ_FEATURE(OpenMPExecutableAllocate) |
| 565 | READ_FEATURE(OpenMPAllocatorsConstruct) |
| 566 | READ_FEATURE(OpenMPRequiresConstruct) |
| 567 | READ_FEATURE(OpenMPSimpleStandaloneConstruct) |
| 568 | READ_FEATURE(OpenMPStandaloneConstruct) |
| 569 | READ_FEATURE(OpenMPSectionConstruct) |
| 570 | READ_FEATURE(OpenMPSectionsConstruct) |
| 571 | READ_FEATURE(OpenMPThreadprivate) |
| 572 | READ_FEATURE(OpenStmt) |
| 573 | READ_FEATURE(Optional) |
| 574 | READ_FEATURE(OptionalStmt) |
| 575 | READ_FEATURE(OtherSpecificationStmt) |
| 576 | READ_FEATURE(OutputImpliedDo) |
| 577 | READ_FEATURE(OutputItem) |
| 578 | READ_FEATURE(Parameter) |
| 579 | READ_FEATURE(ParameterStmt) |
| 580 | READ_FEATURE(ParentIdentifier) |
| 581 | READ_FEATURE(Pass) |
| 582 | READ_FEATURE(PauseStmt) |
| 583 | READ_FEATURE(Pointer) |
| 584 | READ_FEATURE(PointerAssignmentStmt) |
| 585 | READ_FEATURE(PointerAssignmentStmt::Bounds) |
| 586 | READ_FEATURE(PointerDecl) |
| 587 | READ_FEATURE(PointerObject) |
| 588 | READ_FEATURE(PointerStmt) |
| 589 | READ_FEATURE(PositionOrFlushSpec) |
| 590 | READ_FEATURE(PrefixSpec) |
| 591 | READ_FEATURE(PrefixSpec::Elemental) |
| 592 | READ_FEATURE(PrefixSpec::Impure) |
| 593 | READ_FEATURE(PrefixSpec::Module) |
| 594 | READ_FEATURE(PrefixSpec::Non_Recursive) |
| 595 | READ_FEATURE(PrefixSpec::Pure) |
| 596 | READ_FEATURE(PrefixSpec::Recursive) |
| 597 | READ_FEATURE(PrintStmt) |
| 598 | READ_FEATURE(PrivateStmt) |
| 599 | READ_FEATURE(PrivateOrSequence) |
| 600 | READ_FEATURE(ProcAttrSpec) |
| 601 | READ_FEATURE(ProcComponentAttrSpec) |
| 602 | READ_FEATURE(ProcComponentDefStmt) |
| 603 | READ_FEATURE(ProcComponentRef) |
| 604 | READ_FEATURE(ProcDecl) |
| 605 | READ_FEATURE(ProcInterface) |
| 606 | READ_FEATURE(ProcPointerInit) |
| 607 | READ_FEATURE(ProcedureDeclarationStmt) |
| 608 | READ_FEATURE(ProcedureDesignator) |
| 609 | READ_FEATURE(ProcedureStmt) |
| 610 | READ_FEATURE(ProcedureStmt::Kind) |
| 611 | READ_FEATURE(Program) |
| 612 | READ_FEATURE(ProgramStmt) |
| 613 | READ_FEATURE(ProgramUnit) |
| 614 | READ_FEATURE(Protected) |
| 615 | READ_FEATURE(ProtectedStmt) |
| 616 | READ_FEATURE(ReadStmt) |
| 617 | READ_FEATURE(RealLiteralConstant) |
| 618 | READ_FEATURE(RealLiteralConstant::Real) |
| 619 | READ_FEATURE(Rename) |
| 620 | READ_FEATURE(Rename::Names) |
| 621 | READ_FEATURE(Rename::Operators) |
| 622 | READ_FEATURE(ReturnStmt) |
| 623 | READ_FEATURE(RewindStmt) |
| 624 | READ_FEATURE(Save) |
| 625 | READ_FEATURE(SaveStmt) |
| 626 | READ_FEATURE(SavedEntity) |
| 627 | READ_FEATURE(SavedEntity::Kind) |
| 628 | READ_FEATURE(SectionSubscript) |
| 629 | READ_FEATURE(SelectCaseStmt) |
| 630 | READ_FEATURE(SelectRankCaseStmt) |
| 631 | READ_FEATURE(SelectRankCaseStmt::Rank) |
| 632 | READ_FEATURE(SelectRankConstruct) |
| 633 | READ_FEATURE(SelectRankConstruct::RankCase) |
| 634 | READ_FEATURE(SelectRankStmt) |
| 635 | READ_FEATURE(SelectTypeConstruct) |
| 636 | READ_FEATURE(SelectTypeConstruct::TypeCase) |
| 637 | READ_FEATURE(SelectTypeStmt) |
| 638 | READ_FEATURE(Selector) |
| 639 | READ_FEATURE(SeparateModuleSubprogram) |
| 640 | READ_FEATURE(SequenceStmt) |
| 641 | READ_FEATURE(Sign) |
| 642 | READ_FEATURE(SignedComplexLiteralConstant) |
| 643 | READ_FEATURE(SignedIntLiteralConstant) |
| 644 | READ_FEATURE(SignedRealLiteralConstant) |
| 645 | READ_FEATURE(SpecificationConstruct) |
| 646 | READ_FEATURE(SpecificationExpr) |
| 647 | READ_FEATURE(SpecificationPart) |
| 648 | READ_FEATURE(Star) |
| 649 | READ_FEATURE(StatOrErrmsg) |
| 650 | READ_FEATURE(StatVariable) |
| 651 | READ_FEATURE(StatusExpr) |
| 652 | READ_FEATURE(StmtFunctionStmt) |
| 653 | READ_FEATURE(StopCode) |
| 654 | READ_FEATURE(StopStmt) |
| 655 | READ_FEATURE(StopStmt::Kind) |
| 656 | READ_FEATURE(StructureComponent) |
| 657 | READ_FEATURE(StructureConstructor) |
| 658 | READ_FEATURE(StructureDef) |
| 659 | READ_FEATURE(StructureDef::EndStructureStmt) |
| 660 | READ_FEATURE(StructureField) |
| 661 | READ_FEATURE(StructureStmt) |
| 662 | READ_FEATURE(Submodule) |
| 663 | READ_FEATURE(SubmoduleStmt) |
| 664 | READ_FEATURE(SubroutineStmt) |
| 665 | READ_FEATURE(SubroutineSubprogram) |
| 666 | READ_FEATURE(SubscriptTriplet) |
| 667 | READ_FEATURE(Substring) |
| 668 | READ_FEATURE(SubstringInquiry) |
| 669 | READ_FEATURE(SubstringRange) |
| 670 | READ_FEATURE(Suffix) |
| 671 | READ_FEATURE(SyncAllStmt) |
| 672 | READ_FEATURE(SyncImagesStmt) |
| 673 | READ_FEATURE(SyncImagesStmt::ImageSet) |
| 674 | READ_FEATURE(SyncMemoryStmt) |
| 675 | READ_FEATURE(SyncTeamStmt) |
| 676 | READ_FEATURE(Target) |
| 677 | READ_FEATURE(TargetStmt) |
| 678 | READ_FEATURE(TypeAttrSpec) |
| 679 | READ_FEATURE(TypeAttrSpec::BindC) |
| 680 | READ_FEATURE(TypeAttrSpec::Extends) |
| 681 | READ_FEATURE(TypeBoundGenericStmt) |
| 682 | READ_FEATURE(TypeBoundProcBinding) |
| 683 | READ_FEATURE(TypeBoundProcDecl) |
| 684 | READ_FEATURE(TypeBoundProcedurePart) |
| 685 | READ_FEATURE(TypeBoundProcedureStmt) |
| 686 | READ_FEATURE(TypeBoundProcedureStmt::WithInterface) |
| 687 | READ_FEATURE(TypeBoundProcedureStmt::WithoutInterface) |
| 688 | READ_FEATURE(TypeDeclarationStmt) |
| 689 | READ_FEATURE(TypeGuardStmt) |
| 690 | READ_FEATURE(TypeGuardStmt::Guard) |
| 691 | READ_FEATURE(TypeParamDecl) |
| 692 | READ_FEATURE(TypeParamDefStmt) |
| 693 | READ_FEATURE(common::TypeParamAttr) |
| 694 | READ_FEATURE(TypeParamSpec) |
| 695 | READ_FEATURE(TypeParamValue) |
| 696 | READ_FEATURE(TypeParamValue::Deferred) |
| 697 | READ_FEATURE(TypeSpec) |
| 698 | READ_FEATURE(Union) |
| 699 | READ_FEATURE(Union::EndUnionStmt) |
| 700 | READ_FEATURE(Union::UnionStmt) |
| 701 | READ_FEATURE(UnlockStmt) |
| 702 | READ_FEATURE(UseStmt) |
| 703 | READ_FEATURE(UseStmt::ModuleNature) |
| 704 | READ_FEATURE(Value) |
| 705 | READ_FEATURE(ValueStmt) |
| 706 | READ_FEATURE(Variable) |
| 707 | READ_FEATURE(Verbatim) |
| 708 | READ_FEATURE(Volatile) |
| 709 | READ_FEATURE(VolatileStmt) |
| 710 | READ_FEATURE(WaitSpec) |
| 711 | READ_FEATURE(WaitStmt) |
| 712 | READ_FEATURE(WhereBodyConstruct) |
| 713 | READ_FEATURE(WhereConstruct) |
| 714 | READ_FEATURE(WhereConstruct::Elsewhere) |
| 715 | READ_FEATURE(WhereConstruct::MaskedElsewhere) |
| 716 | READ_FEATURE(WhereConstructStmt) |
| 717 | READ_FEATURE(WhereStmt) |
| 718 | READ_FEATURE(WriteStmt) |
| 719 | |
| 720 | READ_FEATURE(llvm::omp::Directive) |
| 721 | READ_FEATURE(llvm::omp::Clause) |
| 722 | READ_FEATURE(llvm::acc::Directive) |
| 723 | READ_FEATURE(llvm::acc::DefaultValue) |
| 724 | |
| 725 | template <typename A> bool Pre(const A &) { return true; } |
| 726 | template <typename A> void Post(const A &) {} |
| 727 | |
| 728 | template <typename T> bool Pre(const Statement<T> &) { return true; } |
| 729 | template <typename T> void Post(const Statement<T> &) {} |
| 730 | |
| 731 | template <typename T> bool Pre(const UnlabeledStatement<T> &) { return true; } |
| 732 | template <typename T> void Post(const UnlabeledStatement<T> &) {} |
| 733 | |
| 734 | template <typename T> bool Pre(const common::Indirection<T> &) { |
| 735 | return true; |
| 736 | } |
| 737 | template <typename T> void Post(const common::Indirection<T> &) {} |
| 738 | |
| 739 | template <typename A> bool Pre(const Scalar<A> &) { return true; } |
| 740 | template <typename A> void Post(const Scalar<A> &) {} |
| 741 | |
| 742 | template <typename A> bool Pre(const Constant<A> &) { return true; } |
| 743 | template <typename A> void Post(const Constant<A> &) {} |
| 744 | |
| 745 | template <typename A> bool Pre(const Integer<A> &) { return true; } |
| 746 | template <typename A> void Post(const Integer<A> &) {} |
| 747 | |
| 748 | template <typename A> bool Pre(const Logical<A> &) { return true; } |
| 749 | template <typename A> void Post(const Logical<A> &) {} |
| 750 | |
| 751 | template <typename A> bool Pre(const DefaultChar<A> &) { return true; } |
| 752 | template <typename A> void Post(const DefaultChar<A> &) {} |
| 753 | |
| 754 | template <typename... A> bool Pre(const std::tuple<A...> &) { return true; } |
| 755 | template <typename... A> void Post(const std::tuple<A...> &) {} |
| 756 | |
| 757 | template <typename... A> bool Pre(const std::variant<A...> &) { return true; } |
| 758 | template <typename... A> void Post(const std::variant<A...> &) {} |
| 759 | }; |
| 760 | |
| 761 | bool sortNodes(std::pair<const char *, int> a, std::pair<const char *, int> b) { |
| 762 | return (a.second == b.second) ? (std::strcmp(s1: a.first, s2: b.first) < 0) |
| 763 | : a.second > b.second; |
| 764 | } |
| 765 | |
| 766 | class FeatureListAction : public PluginParseTreeAction { |
| 767 | void executeAction() override { |
| 768 | NodeVisitor visitor; |
| 769 | Fortran::parser::Walk(getParsing().parseTree(), visitor); |
| 770 | |
| 771 | const auto &frequencyMap = visitor.getFrequencies(); |
| 772 | std::vector<std::pair<const char *, int>> frequencies( |
| 773 | frequencyMap.begin(), frequencyMap.end()); |
| 774 | |
| 775 | std::sort(first: frequencies.begin(), last: frequencies.end(), comp: sortNodes); |
| 776 | for (auto const &[feature, frequency] : frequencies) { |
| 777 | llvm::outs() << feature << ": " << frequency << "\n" ; |
| 778 | } |
| 779 | } |
| 780 | |
| 781 | bool beginSourceFileAction() override { |
| 782 | return runPrescan() && runParse(/*emitMessages=*/true); |
| 783 | } |
| 784 | }; |
| 785 | |
| 786 | static FrontendPluginRegistry::Add<FeatureListAction> X( |
| 787 | "feature-list" , "List program features" ); |
| 788 | |