17ccacaf4SAndrzej Warzynski //===-- examples/flang-omp-report-plugin/flang-omp-report-visitor.h -------===// 27ccacaf4SAndrzej Warzynski // 37ccacaf4SAndrzej Warzynski // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47ccacaf4SAndrzej Warzynski // See https://llvm.org/LICENSE.txt for license information. 57ccacaf4SAndrzej Warzynski // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67ccacaf4SAndrzej Warzynski // 77ccacaf4SAndrzej Warzynski //===----------------------------------------------------------------------===// 87ccacaf4SAndrzej Warzynski 97ccacaf4SAndrzej Warzynski #ifndef FORTRAN_FLANG_OMP_REPORT_VISITOR_H 107ccacaf4SAndrzej Warzynski #define FORTRAN_FLANG_OMP_REPORT_VISITOR_H 117ccacaf4SAndrzej Warzynski 127ccacaf4SAndrzej Warzynski #include "flang/Parser/parse-tree-visitor.h" 137ccacaf4SAndrzej Warzynski #include "flang/Parser/parse-tree.h" 147ccacaf4SAndrzej Warzynski #include "flang/Parser/parsing.h" 157ccacaf4SAndrzej Warzynski 167ccacaf4SAndrzej Warzynski #include "llvm/ADT/DenseMap.h" 177ccacaf4SAndrzej Warzynski #include "llvm/ADT/SmallVector.h" 187ccacaf4SAndrzej Warzynski #include "llvm/ADT/StringRef.h" 197ccacaf4SAndrzej Warzynski 207ccacaf4SAndrzej Warzynski #include <string> 217ccacaf4SAndrzej Warzynski 227ccacaf4SAndrzej Warzynski namespace Fortran { 237ccacaf4SAndrzej Warzynski namespace parser { 247ccacaf4SAndrzej Warzynski struct ClauseInfo { 257ccacaf4SAndrzej Warzynski std::string clause; 267ccacaf4SAndrzej Warzynski std::string clauseDetails; 277ccacaf4SAndrzej Warzynski ClauseInfo() {} 287ccacaf4SAndrzej Warzynski ClauseInfo(const std::string &c, const std::string &cd) 297ccacaf4SAndrzej Warzynski : clause{c}, clauseDetails{cd} {} 307ccacaf4SAndrzej Warzynski ClauseInfo(const std::pair<std::string, std::string> &p) 317ccacaf4SAndrzej Warzynski : clause{std::get<0>(p)}, clauseDetails{std::get<1>(p)} {} 327ccacaf4SAndrzej Warzynski }; 337ccacaf4SAndrzej Warzynski bool operator<(const ClauseInfo &a, const ClauseInfo &b); 347ccacaf4SAndrzej Warzynski bool operator==(const ClauseInfo &a, const ClauseInfo &b); 357ccacaf4SAndrzej Warzynski bool operator!=(const ClauseInfo &a, const ClauseInfo &b); 367ccacaf4SAndrzej Warzynski 377ccacaf4SAndrzej Warzynski struct LogRecord { 387ccacaf4SAndrzej Warzynski std::string file; 397ccacaf4SAndrzej Warzynski int line; 407ccacaf4SAndrzej Warzynski std::string construct; 417ccacaf4SAndrzej Warzynski llvm::SmallVector<ClauseInfo> clauses; 427ccacaf4SAndrzej Warzynski }; 437ccacaf4SAndrzej Warzynski bool operator==(const LogRecord &a, const LogRecord &b); 447ccacaf4SAndrzej Warzynski bool operator!=(const LogRecord &a, const LogRecord &b); 457ccacaf4SAndrzej Warzynski 467ccacaf4SAndrzej Warzynski using OmpWrapperType = 477ccacaf4SAndrzej Warzynski std::variant<const OpenMPConstruct *, const OpenMPDeclarativeConstruct *>; 487ccacaf4SAndrzej Warzynski 497ccacaf4SAndrzej Warzynski struct OpenMPCounterVisitor { 507ccacaf4SAndrzej Warzynski std::string normalize_construct_name(std::string s); 517ccacaf4SAndrzej Warzynski ClauseInfo normalize_clause_name(const llvm::StringRef s); 527ccacaf4SAndrzej Warzynski SourcePosition getLocation(const OmpWrapperType &w); 537ccacaf4SAndrzej Warzynski SourcePosition getLocation(const OpenMPDeclarativeConstruct &c); 547ccacaf4SAndrzej Warzynski SourcePosition getLocation(const OpenMPConstruct &c); 557ccacaf4SAndrzej Warzynski 567ccacaf4SAndrzej Warzynski std::string getName(const OmpWrapperType &w); 577ccacaf4SAndrzej Warzynski std::string getName(const OpenMPDeclarativeConstruct &c); 587ccacaf4SAndrzej Warzynski std::string getName(const OpenMPConstruct &c); 597ccacaf4SAndrzej Warzynski 607ccacaf4SAndrzej Warzynski template <typename A> bool Pre(const A &) { return true; } 617ccacaf4SAndrzej Warzynski template <typename A> void Post(const A &) {} 627ccacaf4SAndrzej Warzynski bool Pre(const OpenMPDeclarativeConstruct &c); 637ccacaf4SAndrzej Warzynski bool Pre(const OpenMPConstruct &c); 647ccacaf4SAndrzej Warzynski 657ccacaf4SAndrzej Warzynski void Post(const OpenMPDeclarativeConstruct &); 667ccacaf4SAndrzej Warzynski void Post(const OpenMPConstruct &); 677ccacaf4SAndrzej Warzynski void PostConstructsCommon(); 687ccacaf4SAndrzej Warzynski 69608f4ae1SKrzysztof Parzyszek void Post(const OmpProcBindClause::AffinityPolicy &c); 70608f4ae1SKrzysztof Parzyszek void Post(const OmpDefaultClause::DataSharingAttribute &c); 717ccacaf4SAndrzej Warzynski void Post(const OmpDefaultmapClause::ImplicitBehavior &c); 724fc1141eSKrzysztof Parzyszek void Post(const OmpVariableCategory::Value &c); 73608f4ae1SKrzysztof Parzyszek void Post(const OmpDeviceTypeClause::DeviceTypeDescription &c); 74e79cd246SKrzysztof Parzyszek void Post(const OmpChunkModifier::Value &c); 75cfd67c21SKrzysztof Parzyszek void Post(const OmpLinearModifier::Value &c); 76e79cd246SKrzysztof Parzyszek void Post(const OmpOrderingModifier::Value &c); 77cfd67c21SKrzysztof Parzyszek void Post(const OmpTaskDependenceType::Value &c); 7852755ac2SKrzysztof Parzyszek void Post(const OmpMapType::Value &c); 79e79cd246SKrzysztof Parzyszek void Post(const OmpScheduleClause::Kind &c); 80*33faa828SKrzysztof Parzyszek void Post(const OmpDirectiveNameModifier &c); 817ccacaf4SAndrzej Warzynski void Post(const OmpCancelType::Type &c); 827ccacaf4SAndrzej Warzynski void Post(const OmpClause &c); 837ccacaf4SAndrzej Warzynski void PostClauseCommon(const ClauseInfo &ci); 847ccacaf4SAndrzej Warzynski 85a8c294d6SKazu Hirata std::string clauseDetails; 867ccacaf4SAndrzej Warzynski llvm::SmallVector<LogRecord> constructClauses; 877ccacaf4SAndrzej Warzynski llvm::SmallVector<OmpWrapperType *> ompWrapperStack; 887ccacaf4SAndrzej Warzynski llvm::DenseMap<OmpWrapperType *, llvm::SmallVector<ClauseInfo>> clauseStrings; 897ccacaf4SAndrzej Warzynski Parsing *parsing{nullptr}; 907ccacaf4SAndrzej Warzynski }; 917ccacaf4SAndrzej Warzynski } // namespace parser 927ccacaf4SAndrzej Warzynski } // namespace Fortran 937ccacaf4SAndrzej Warzynski 947ccacaf4SAndrzej Warzynski #endif /* FORTRAN_FLANG_OMP_REPORT_VISITOR_H */ 95