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 | |