xref: /llvm-project/flang/examples/FeatureList/FeatureList.cpp (revision 03cbe42627c7a7940b47cc1a2cda0120bc9c6d5e)
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({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(OmpAtomic)
449   READ_FEATURE(OmpAtomicCapture)
450   READ_FEATURE(OmpAtomicCapture::Stmt1)
451   READ_FEATURE(OmpAtomicCapture::Stmt2)
452   READ_FEATURE(OmpAtomicRead)
453   READ_FEATURE(OmpAtomicUpdate)
454   READ_FEATURE(OmpAtomicWrite)
455   READ_FEATURE(OmpBeginBlockDirective)
456   READ_FEATURE(OmpBeginLoopDirective)
457   READ_FEATURE(OmpBeginSectionsDirective)
458   READ_FEATURE(OmpBlockDirective)
459   READ_FEATURE(OmpCancelType)
460   READ_FEATURE(OmpCancelType::Type)
461   READ_FEATURE(OmpClause)
462   READ_FEATURE(OmpClauseList)
463   READ_FEATURE(OmpCriticalDirective)
464   READ_FEATURE(OmpDeclareTargetSpecifier)
465   READ_FEATURE(OmpDeclareTargetWithClause)
466   READ_FEATURE(OmpDeclareTargetWithList)
467   READ_FEATURE(OmpDefaultClause)
468   READ_FEATURE(OmpDefaultClause::DataSharingAttribute)
469   READ_FEATURE(OmpDefaultmapClause)
470   READ_FEATURE(OmpDefaultmapClause::ImplicitBehavior)
471   READ_FEATURE(OmpVariableCategory::Value)
472   READ_FEATURE(OmpDependClause)
473   READ_FEATURE(OmpDependClause::TaskDep)
474   READ_FEATURE(OmpDoacross::Sink)
475   READ_FEATURE(OmpDoacross::Source)
476   READ_FEATURE(OmpDoacrossClause)
477   READ_FEATURE(OmpDependenceType)
478   READ_FEATURE(OmpDependenceType::Value)
479   READ_FEATURE(OmpTaskDependenceType)
480   READ_FEATURE(OmpTaskDependenceType::Value)
481   READ_FEATURE(OmpIteration)
482   READ_FEATURE(OmpIterationOffset)
483   READ_FEATURE(OmpIterationVector)
484   READ_FEATURE(OmpEndAllocators)
485   READ_FEATURE(OmpEndAtomic)
486   READ_FEATURE(OmpEndBlockDirective)
487   READ_FEATURE(OmpEndCriticalDirective)
488   READ_FEATURE(OmpEndLoopDirective)
489   READ_FEATURE(OmpEndSectionsDirective)
490   READ_FEATURE(OmpGrainsizeClause)
491   READ_FEATURE(OmpGrainsizeClause::Modifier)
492   READ_FEATURE(OmpPrescriptiveness)
493   READ_FEATURE(OmpPrescriptiveness::Value)
494   READ_FEATURE(OmpIfClause)
495   READ_FEATURE(OmpIfClause::Modifier)
496   READ_FEATURE(OmpDirectiveNameModifier)
497   READ_FEATURE(OmpLinearClause)
498   READ_FEATURE(OmpLinearClause::Modifier)
499   READ_FEATURE(OmpLinearModifier)
500   READ_FEATURE(OmpLinearModifier::Value)
501   READ_FEATURE(OmpLoopDirective)
502   READ_FEATURE(OmpMapClause)
503   READ_FEATURE(OmpMapClause::Modifier)
504   READ_FEATURE(OmpNumTasksClause)
505   READ_FEATURE(OmpNumTasksClause::Modifier)
506   READ_FEATURE(OmpObject)
507   READ_FEATURE(OmpObjectList)
508   READ_FEATURE(OmpOrderClause)
509   READ_FEATURE(OmpOrderClause::Ordering)
510   READ_FEATURE(OmpOrderModifier)
511   READ_FEATURE(OmpOrderModifier::Value)
512   READ_FEATURE(OmpProcBindClause)
513   READ_FEATURE(OmpProcBindClause::AffinityPolicy)
514   READ_FEATURE(OmpReductionClause)
515   READ_FEATURE(OmpInReductionClause)
516   READ_FEATURE(OmpReductionCombiner)
517   READ_FEATURE(OmpReductionCombiner::FunctionCombiner)
518   READ_FEATURE(OmpReductionInitializerClause)
519   READ_FEATURE(OmpReductionIdentifier)
520   READ_FEATURE(OmpAllocateClause)
521   READ_FEATURE(OmpAllocateClause::Modifier)
522   READ_FEATURE(OmpAllocatorSimpleModifier)
523   READ_FEATURE(OmpAllocatorComplexModifier)
524   READ_FEATURE(OmpAlignModifier)
525   READ_FEATURE(OmpScheduleClause)
526   READ_FEATURE(OmpScheduleClause::Kind)
527   READ_FEATURE(OmpScheduleClause::Modifier)
528   READ_FEATURE(OmpDeviceModifier)
529   READ_FEATURE(OmpDeviceClause)
530   READ_FEATURE(OmpDeviceClause::Modifier)
531   READ_FEATURE(OmpDeviceTypeClause)
532   READ_FEATURE(OmpDeviceTypeClause::DeviceTypeDescription)
533   READ_FEATURE(OmpChunkModifier)
534   READ_FEATURE(OmpChunkModifier::Value)
535   READ_FEATURE(OmpOrderingModifier)
536   READ_FEATURE(OmpOrderingModifier::Value)
537   READ_FEATURE(OmpSectionBlocks)
538   READ_FEATURE(OmpSectionsDirective)
539   READ_FEATURE(OmpSimpleStandaloneDirective)
540   READ_FEATURE(Only)
541   READ_FEATURE(OpenACCAtomicConstruct)
542   READ_FEATURE(OpenACCBlockConstruct)
543   READ_FEATURE(OpenACCCacheConstruct)
544   READ_FEATURE(OpenACCCombinedConstruct)
545   READ_FEATURE(OpenACCConstruct)
546   READ_FEATURE(OpenACCDeclarativeConstruct)
547   READ_FEATURE(OpenACCLoopConstruct)
548   READ_FEATURE(OpenACCRoutineConstruct)
549   READ_FEATURE(OpenACCStandaloneDeclarativeConstruct)
550   READ_FEATURE(OpenACCStandaloneConstruct)
551   READ_FEATURE(OpenACCWaitConstruct)
552   READ_FEATURE(OpenMPAtomicConstruct)
553   READ_FEATURE(OpenMPBlockConstruct)
554   READ_FEATURE(OpenMPCancelConstruct)
555   READ_FEATURE(OpenMPCancelConstruct::If)
556   READ_FEATURE(OpenMPCancellationPointConstruct)
557   READ_FEATURE(OpenMPConstruct)
558   READ_FEATURE(OpenMPCriticalConstruct)
559   READ_FEATURE(OpenMPDeclarativeAllocate)
560   READ_FEATURE(OpenMPDeclarativeConstruct)
561   READ_FEATURE(OpenMPDeclareReductionConstruct)
562   READ_FEATURE(OpenMPDeclareSimdConstruct)
563   READ_FEATURE(OpenMPDeclareTargetConstruct)
564   READ_FEATURE(OmpMemoryOrderClause)
565   READ_FEATURE(OmpAtomicClause)
566   READ_FEATURE(OmpAtomicClauseList)
567   READ_FEATURE(OmpAtomicDefaultMemOrderClause)
568   READ_FEATURE(OmpAtomicDefaultMemOrderType)
569   READ_FEATURE(OpenMPFlushConstruct)
570   READ_FEATURE(OpenMPLoopConstruct)
571   READ_FEATURE(OpenMPExecutableAllocate)
572   READ_FEATURE(OpenMPAllocatorsConstruct)
573   READ_FEATURE(OpenMPRequiresConstruct)
574   READ_FEATURE(OpenMPSimpleStandaloneConstruct)
575   READ_FEATURE(OpenMPStandaloneConstruct)
576   READ_FEATURE(OpenMPSectionConstruct)
577   READ_FEATURE(OpenMPSectionsConstruct)
578   READ_FEATURE(OpenMPThreadprivate)
579   READ_FEATURE(OpenStmt)
580   READ_FEATURE(Optional)
581   READ_FEATURE(OptionalStmt)
582   READ_FEATURE(OtherSpecificationStmt)
583   READ_FEATURE(OutputImpliedDo)
584   READ_FEATURE(OutputItem)
585   READ_FEATURE(Parameter)
586   READ_FEATURE(ParameterStmt)
587   READ_FEATURE(ParentIdentifier)
588   READ_FEATURE(Pass)
589   READ_FEATURE(PauseStmt)
590   READ_FEATURE(Pointer)
591   READ_FEATURE(PointerAssignmentStmt)
592   READ_FEATURE(PointerAssignmentStmt::Bounds)
593   READ_FEATURE(PointerDecl)
594   READ_FEATURE(PointerObject)
595   READ_FEATURE(PointerStmt)
596   READ_FEATURE(PositionOrFlushSpec)
597   READ_FEATURE(PrefixSpec)
598   READ_FEATURE(PrefixSpec::Elemental)
599   READ_FEATURE(PrefixSpec::Impure)
600   READ_FEATURE(PrefixSpec::Module)
601   READ_FEATURE(PrefixSpec::Non_Recursive)
602   READ_FEATURE(PrefixSpec::Pure)
603   READ_FEATURE(PrefixSpec::Recursive)
604   READ_FEATURE(PrintStmt)
605   READ_FEATURE(PrivateStmt)
606   READ_FEATURE(PrivateOrSequence)
607   READ_FEATURE(ProcAttrSpec)
608   READ_FEATURE(ProcComponentAttrSpec)
609   READ_FEATURE(ProcComponentDefStmt)
610   READ_FEATURE(ProcComponentRef)
611   READ_FEATURE(ProcDecl)
612   READ_FEATURE(ProcInterface)
613   READ_FEATURE(ProcPointerInit)
614   READ_FEATURE(ProcedureDeclarationStmt)
615   READ_FEATURE(ProcedureDesignator)
616   READ_FEATURE(ProcedureStmt)
617   READ_FEATURE(ProcedureStmt::Kind)
618   READ_FEATURE(Program)
619   READ_FEATURE(ProgramStmt)
620   READ_FEATURE(ProgramUnit)
621   READ_FEATURE(Protected)
622   READ_FEATURE(ProtectedStmt)
623   READ_FEATURE(ReadStmt)
624   READ_FEATURE(RealLiteralConstant)
625   READ_FEATURE(RealLiteralConstant::Real)
626   READ_FEATURE(Rename)
627   READ_FEATURE(Rename::Names)
628   READ_FEATURE(Rename::Operators)
629   READ_FEATURE(ReturnStmt)
630   READ_FEATURE(RewindStmt)
631   READ_FEATURE(Save)
632   READ_FEATURE(SaveStmt)
633   READ_FEATURE(SavedEntity)
634   READ_FEATURE(SavedEntity::Kind)
635   READ_FEATURE(SectionSubscript)
636   READ_FEATURE(SelectCaseStmt)
637   READ_FEATURE(SelectRankCaseStmt)
638   READ_FEATURE(SelectRankCaseStmt::Rank)
639   READ_FEATURE(SelectRankConstruct)
640   READ_FEATURE(SelectRankConstruct::RankCase)
641   READ_FEATURE(SelectRankStmt)
642   READ_FEATURE(SelectTypeConstruct)
643   READ_FEATURE(SelectTypeConstruct::TypeCase)
644   READ_FEATURE(SelectTypeStmt)
645   READ_FEATURE(Selector)
646   READ_FEATURE(SeparateModuleSubprogram)
647   READ_FEATURE(SequenceStmt)
648   READ_FEATURE(Sign)
649   READ_FEATURE(SignedComplexLiteralConstant)
650   READ_FEATURE(SignedIntLiteralConstant)
651   READ_FEATURE(SignedRealLiteralConstant)
652   READ_FEATURE(SpecificationConstruct)
653   READ_FEATURE(SpecificationExpr)
654   READ_FEATURE(SpecificationPart)
655   READ_FEATURE(Star)
656   READ_FEATURE(StatOrErrmsg)
657   READ_FEATURE(StatVariable)
658   READ_FEATURE(StatusExpr)
659   READ_FEATURE(StmtFunctionStmt)
660   READ_FEATURE(StopCode)
661   READ_FEATURE(StopStmt)
662   READ_FEATURE(StopStmt::Kind)
663   READ_FEATURE(StructureComponent)
664   READ_FEATURE(StructureConstructor)
665   READ_FEATURE(StructureDef)
666   READ_FEATURE(StructureDef::EndStructureStmt)
667   READ_FEATURE(StructureField)
668   READ_FEATURE(StructureStmt)
669   READ_FEATURE(Submodule)
670   READ_FEATURE(SubmoduleStmt)
671   READ_FEATURE(SubroutineStmt)
672   READ_FEATURE(SubroutineSubprogram)
673   READ_FEATURE(SubscriptTriplet)
674   READ_FEATURE(Substring)
675   READ_FEATURE(SubstringInquiry)
676   READ_FEATURE(SubstringRange)
677   READ_FEATURE(Suffix)
678   READ_FEATURE(SyncAllStmt)
679   READ_FEATURE(SyncImagesStmt)
680   READ_FEATURE(SyncImagesStmt::ImageSet)
681   READ_FEATURE(SyncMemoryStmt)
682   READ_FEATURE(SyncTeamStmt)
683   READ_FEATURE(Target)
684   READ_FEATURE(TargetStmt)
685   READ_FEATURE(TypeAttrSpec)
686   READ_FEATURE(TypeAttrSpec::BindC)
687   READ_FEATURE(TypeAttrSpec::Extends)
688   READ_FEATURE(TypeBoundGenericStmt)
689   READ_FEATURE(TypeBoundProcBinding)
690   READ_FEATURE(TypeBoundProcDecl)
691   READ_FEATURE(TypeBoundProcedurePart)
692   READ_FEATURE(TypeBoundProcedureStmt)
693   READ_FEATURE(TypeBoundProcedureStmt::WithInterface)
694   READ_FEATURE(TypeBoundProcedureStmt::WithoutInterface)
695   READ_FEATURE(TypeDeclarationStmt)
696   READ_FEATURE(TypeGuardStmt)
697   READ_FEATURE(TypeGuardStmt::Guard)
698   READ_FEATURE(TypeParamDecl)
699   READ_FEATURE(TypeParamDefStmt)
700   READ_FEATURE(common::TypeParamAttr)
701   READ_FEATURE(TypeParamSpec)
702   READ_FEATURE(TypeParamValue)
703   READ_FEATURE(TypeParamValue::Deferred)
704   READ_FEATURE(TypeSpec)
705   READ_FEATURE(Union)
706   READ_FEATURE(Union::EndUnionStmt)
707   READ_FEATURE(Union::UnionStmt)
708   READ_FEATURE(UnlockStmt)
709   READ_FEATURE(UseStmt)
710   READ_FEATURE(UseStmt::ModuleNature)
711   READ_FEATURE(Value)
712   READ_FEATURE(ValueStmt)
713   READ_FEATURE(Variable)
714   READ_FEATURE(Verbatim)
715   READ_FEATURE(Volatile)
716   READ_FEATURE(VolatileStmt)
717   READ_FEATURE(WaitSpec)
718   READ_FEATURE(WaitStmt)
719   READ_FEATURE(WhereBodyConstruct)
720   READ_FEATURE(WhereConstruct)
721   READ_FEATURE(WhereConstruct::Elsewhere)
722   READ_FEATURE(WhereConstruct::MaskedElsewhere)
723   READ_FEATURE(WhereConstructStmt)
724   READ_FEATURE(WhereStmt)
725   READ_FEATURE(WriteStmt)
726 
727   READ_FEATURE(llvm::omp::Directive)
728   READ_FEATURE(llvm::omp::Clause)
729   READ_FEATURE(llvm::acc::Directive)
730   READ_FEATURE(llvm::acc::DefaultValue)
731 
732   template <typename A> bool Pre(const A &) { return true; }
733   template <typename A> void Post(const A &) {}
734 
735   template <typename T> bool Pre(const Statement<T> &) { return true; }
736   template <typename T> void Post(const Statement<T> &) {}
737 
738   template <typename T> bool Pre(const UnlabeledStatement<T> &) { return true; }
739   template <typename T> void Post(const UnlabeledStatement<T> &) {}
740 
741   template <typename T> bool Pre(const common::Indirection<T> &) {
742     return true;
743   }
744   template <typename T> void Post(const common::Indirection<T> &) {}
745 
746   template <typename A> bool Pre(const Scalar<A> &) { return true; }
747   template <typename A> void Post(const Scalar<A> &) {}
748 
749   template <typename A> bool Pre(const Constant<A> &) { return true; }
750   template <typename A> void Post(const Constant<A> &) {}
751 
752   template <typename A> bool Pre(const Integer<A> &) { return true; }
753   template <typename A> void Post(const Integer<A> &) {}
754 
755   template <typename A> bool Pre(const Logical<A> &) { return true; }
756   template <typename A> void Post(const Logical<A> &) {}
757 
758   template <typename A> bool Pre(const DefaultChar<A> &) { return true; }
759   template <typename A> void Post(const DefaultChar<A> &) {}
760 
761   template <typename... A> bool Pre(const std::tuple<A...> &) { return true; }
762   template <typename... A> void Post(const std::tuple<A...> &) {}
763 
764   template <typename... A> bool Pre(const std::variant<A...> &) { return true; }
765   template <typename... A> void Post(const std::variant<A...> &) {}
766 };
767 
768 bool sortNodes(std::pair<const char *, int> a, std::pair<const char *, int> b) {
769   return (a.second == b.second) ? (std::strcmp(a.first, b.first) < 0)
770                                 : a.second > b.second;
771 }
772 
773 class FeatureListAction : public PluginParseTreeAction {
774   void executeAction() override {
775     NodeVisitor visitor;
776     Fortran::parser::Walk(getParsing().parseTree(), visitor);
777 
778     const auto &frequencyMap = visitor.getFrequencies();
779     std::vector<std::pair<const char *, int>> frequencies(
780         frequencyMap.begin(), frequencyMap.end());
781 
782     std::sort(frequencies.begin(), frequencies.end(), sortNodes);
783     for (auto const &[feature, frequency] : frequencies) {
784       llvm::outs() << feature << ": " << frequency << "\n";
785     }
786   }
787 
788   bool beginSourceFileAction() override {
789     return runPrescan() && runParse(/*emitMessages=*/true);
790   }
791 };
792 
793 static FrontendPluginRegistry::Add<FeatureListAction> X(
794     "feature-list", "List program features");
795