1ea2cfcc1SKrzysztof Parzyszek //===-- Clauses.h -- OpenMP clause handling -------------------------------===// 2ea2cfcc1SKrzysztof Parzyszek // 3ea2cfcc1SKrzysztof Parzyszek // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4ea2cfcc1SKrzysztof Parzyszek // See https://llvm.org/LICENSE.txt for license information. 5ea2cfcc1SKrzysztof Parzyszek // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ea2cfcc1SKrzysztof Parzyszek // 7ea2cfcc1SKrzysztof Parzyszek //===----------------------------------------------------------------------===// 8ea2cfcc1SKrzysztof Parzyszek #ifndef FORTRAN_LOWER_OPENMP_CLAUSES_H 9ea2cfcc1SKrzysztof Parzyszek #define FORTRAN_LOWER_OPENMP_CLAUSES_H 10ea2cfcc1SKrzysztof Parzyszek 11ea2cfcc1SKrzysztof Parzyszek #include "flang/Evaluate/expression.h" 12973fa983SKrzysztof Parzyszek #include "flang/Evaluate/type.h" 13ea2cfcc1SKrzysztof Parzyszek #include "flang/Parser/parse-tree.h" 14ea2cfcc1SKrzysztof Parzyszek #include "flang/Semantics/expression.h" 15ea2cfcc1SKrzysztof Parzyszek #include "flang/Semantics/semantics.h" 16ea2cfcc1SKrzysztof Parzyszek #include "flang/Semantics/symbol.h" 17ea2cfcc1SKrzysztof Parzyszek 18ea2cfcc1SKrzysztof Parzyszek #include "llvm/ADT/STLExtras.h" 19148a5579SKrzysztof Parzyszek #include "llvm/Frontend/OpenMP/ClauseT.h" 20ea2cfcc1SKrzysztof Parzyszek 21ea2cfcc1SKrzysztof Parzyszek #include <optional> 22ea2cfcc1SKrzysztof Parzyszek #include <type_traits> 23ea2cfcc1SKrzysztof Parzyszek #include <utility> 24ea2cfcc1SKrzysztof Parzyszek 258b18f2feSKrzysztof Parzyszek namespace Fortran::semantics { 268b18f2feSKrzysztof Parzyszek class Symbol; 278b18f2feSKrzysztof Parzyszek } 288b18f2feSKrzysztof Parzyszek 29f9e55796SKrzysztof Parzyszek namespace Fortran::lower::omp { 30ea2cfcc1SKrzysztof Parzyszek using namespace Fortran; 31ea2cfcc1SKrzysztof Parzyszek using SomeExpr = semantics::SomeExpr; 32ea2cfcc1SKrzysztof Parzyszek using MaybeExpr = semantics::MaybeExpr; 33973fa983SKrzysztof Parzyszek using TypeTy = evaluate::DynamicType; 34be7c9e39SKrzysztof Parzyszek 35b025d691SKrzysztof Parzyszek template <typename ExprTy> 36b025d691SKrzysztof Parzyszek struct IdTyTemplate { 37b025d691SKrzysztof Parzyszek // "symbol" is always non-null for id's of actual objects. 38b025d691SKrzysztof Parzyszek Fortran::semantics::Symbol *symbol; 39b025d691SKrzysztof Parzyszek std::optional<ExprTy> designator; 40b025d691SKrzysztof Parzyszek 41b025d691SKrzysztof Parzyszek bool operator==(const IdTyTemplate &other) const { 42b025d691SKrzysztof Parzyszek // If symbols are different, then the objects are different. 43b025d691SKrzysztof Parzyszek if (symbol != other.symbol) 44b025d691SKrzysztof Parzyszek return false; 45b025d691SKrzysztof Parzyszek if (symbol == nullptr) 46b025d691SKrzysztof Parzyszek return true; 47b025d691SKrzysztof Parzyszek // Equal symbols don't necessarily indicate identical objects, 48b025d691SKrzysztof Parzyszek // for example, a derived object component may use a single symbol, 49b025d691SKrzysztof Parzyszek // which will refer to different objects for different designators, 50b025d691SKrzysztof Parzyszek // e.g. a%c and b%c. 51b025d691SKrzysztof Parzyszek return designator == other.designator; 52b025d691SKrzysztof Parzyszek } 53b025d691SKrzysztof Parzyszek 54e508baccSagozillon // Defining an "ordering" which allows types derived from this to be 55e508baccSagozillon // utilised in maps and other containers that require comparison 56e508baccSagozillon // operators for ordering 57e508baccSagozillon bool operator<(const IdTyTemplate &other) const { 58e508baccSagozillon return symbol < other.symbol; 59e508baccSagozillon } 60e508baccSagozillon 61b025d691SKrzysztof Parzyszek operator bool() const { return symbol != nullptr; } 62b025d691SKrzysztof Parzyszek }; 63b025d691SKrzysztof Parzyszek 64148a5579SKrzysztof Parzyszek using ExprTy = SomeExpr; 65ea2cfcc1SKrzysztof Parzyszek 66ea2cfcc1SKrzysztof Parzyszek template <typename T> 67ea2cfcc1SKrzysztof Parzyszek using List = tomp::ListT<T>; 68f9e55796SKrzysztof Parzyszek } // namespace Fortran::lower::omp 69ea2cfcc1SKrzysztof Parzyszek 70b025d691SKrzysztof Parzyszek // Specialization of the ObjectT template 71148a5579SKrzysztof Parzyszek namespace tomp::type { 72ea2cfcc1SKrzysztof Parzyszek template <> 73b025d691SKrzysztof Parzyszek struct ObjectT<Fortran::lower::omp::IdTyTemplate<Fortran::lower::omp::ExprTy>, 74b025d691SKrzysztof Parzyszek Fortran::lower::omp::ExprTy> { 75b025d691SKrzysztof Parzyszek using IdTy = Fortran::lower::omp::IdTyTemplate<Fortran::lower::omp::ExprTy>; 76148a5579SKrzysztof Parzyszek using ExprTy = Fortran::lower::omp::ExprTy; 77ea2cfcc1SKrzysztof Parzyszek 78b025d691SKrzysztof Parzyszek IdTy id() const { return identity; } 79b025d691SKrzysztof Parzyszek Fortran::semantics::Symbol *sym() const { return identity.symbol; } 80b025d691SKrzysztof Parzyszek const std::optional<ExprTy> &ref() const { return identity.designator; } 81ea2cfcc1SKrzysztof Parzyszek 82e508baccSagozillon bool operator<(const ObjectT<IdTy, ExprTy> &other) const { 83e508baccSagozillon return identity < other.identity; 84e508baccSagozillon } 85e508baccSagozillon 86b025d691SKrzysztof Parzyszek IdTy identity; 87ea2cfcc1SKrzysztof Parzyszek }; 88148a5579SKrzysztof Parzyszek } // namespace tomp::type 89ea2cfcc1SKrzysztof Parzyszek 90f9e55796SKrzysztof Parzyszek namespace Fortran::lower::omp { 91b025d691SKrzysztof Parzyszek using IdTy = IdTyTemplate<ExprTy>; 92b025d691SKrzysztof Parzyszek } 93ea2cfcc1SKrzysztof Parzyszek 94b025d691SKrzysztof Parzyszek namespace std { 95b025d691SKrzysztof Parzyszek template <> 96b025d691SKrzysztof Parzyszek struct hash<Fortran::lower::omp::IdTy> { 97b025d691SKrzysztof Parzyszek size_t operator()(const Fortran::lower::omp::IdTy &id) const { 98b025d691SKrzysztof Parzyszek return static_cast<size_t>(reinterpret_cast<uintptr_t>(id.symbol)); 99b025d691SKrzysztof Parzyszek } 100b025d691SKrzysztof Parzyszek }; 101b025d691SKrzysztof Parzyszek } // namespace std 102b025d691SKrzysztof Parzyszek 103b025d691SKrzysztof Parzyszek namespace Fortran::lower::omp { 104148a5579SKrzysztof Parzyszek using Object = tomp::ObjectT<IdTy, ExprTy>; 105148a5579SKrzysztof Parzyszek using ObjectList = tomp::ObjectListT<IdTy, ExprTy>; 106ea2cfcc1SKrzysztof Parzyszek 107ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::OmpObject &object, 108ea2cfcc1SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx); 109ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::Name &name, 110ea2cfcc1SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx); 111ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::Designator &dsg, 112ea2cfcc1SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx); 113ea2cfcc1SKrzysztof Parzyszek Object makeObject(const parser::StructureComponent &comp, 114ea2cfcc1SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx); 115ea2cfcc1SKrzysztof Parzyszek 116ea2cfcc1SKrzysztof Parzyszek inline auto makeObjectFn(semantics::SemanticsContext &semaCtx) { 117ea2cfcc1SKrzysztof Parzyszek return [&](auto &&s) { return makeObject(s, semaCtx); }; 118ea2cfcc1SKrzysztof Parzyszek } 119ea2cfcc1SKrzysztof Parzyszek 120ea2cfcc1SKrzysztof Parzyszek template <typename T> 121ea2cfcc1SKrzysztof Parzyszek SomeExpr makeExpr(T &&pftExpr, semantics::SemanticsContext &semaCtx) { 122ea2cfcc1SKrzysztof Parzyszek auto maybeExpr = evaluate::ExpressionAnalyzer(semaCtx).Analyze(pftExpr); 123ea2cfcc1SKrzysztof Parzyszek assert(maybeExpr); 124ea2cfcc1SKrzysztof Parzyszek return std::move(*maybeExpr); 125ea2cfcc1SKrzysztof Parzyszek } 126ea2cfcc1SKrzysztof Parzyszek 127ea2cfcc1SKrzysztof Parzyszek inline auto makeExprFn(semantics::SemanticsContext &semaCtx) { 128ea2cfcc1SKrzysztof Parzyszek return [&](auto &&s) { return makeExpr(s, semaCtx); }; 129ea2cfcc1SKrzysztof Parzyszek } 130ea2cfcc1SKrzysztof Parzyszek 131ea2cfcc1SKrzysztof Parzyszek template < 132ea2cfcc1SKrzysztof Parzyszek typename ContainerTy, typename FunctionTy, 133ea2cfcc1SKrzysztof Parzyszek typename ElemTy = typename llvm::remove_cvref_t<ContainerTy>::value_type, 134ea2cfcc1SKrzysztof Parzyszek typename ResultTy = std::invoke_result_t<FunctionTy, ElemTy>> 135ea2cfcc1SKrzysztof Parzyszek List<ResultTy> makeList(ContainerTy &&container, FunctionTy &&func) { 136ea2cfcc1SKrzysztof Parzyszek List<ResultTy> v; 137ea2cfcc1SKrzysztof Parzyszek llvm::transform(container, std::back_inserter(v), func); 138ea2cfcc1SKrzysztof Parzyszek return v; 139ea2cfcc1SKrzysztof Parzyszek } 140ea2cfcc1SKrzysztof Parzyszek 1414d177435SKrzysztof Parzyszek inline ObjectList makeObjects(const parser::OmpObjectList &objects, 142ea2cfcc1SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx) { 143ea2cfcc1SKrzysztof Parzyszek return makeList(objects.v, makeObjectFn(semaCtx)); 144ea2cfcc1SKrzysztof Parzyszek } 145ea2cfcc1SKrzysztof Parzyszek 146148a5579SKrzysztof Parzyszek template <typename FuncTy, // 147148a5579SKrzysztof Parzyszek typename ArgTy, // 148148a5579SKrzysztof Parzyszek typename ResultTy = std::invoke_result_t<FuncTy, ArgTy>> 149ea2cfcc1SKrzysztof Parzyszek std::optional<ResultTy> maybeApply(FuncTy &&func, 150148a5579SKrzysztof Parzyszek const std::optional<ArgTy> &arg) { 151148a5579SKrzysztof Parzyszek if (!arg) 152ea2cfcc1SKrzysztof Parzyszek return std::nullopt; 153e79cd246SKrzysztof Parzyszek return func(*arg); 154e79cd246SKrzysztof Parzyszek } 155e79cd246SKrzysztof Parzyszek 156cdbd2287SKrzysztof Parzyszek template < // 157e79cd246SKrzysztof Parzyszek typename FuncTy, // 158e79cd246SKrzysztof Parzyszek typename ArgTy, // 159cdbd2287SKrzysztof Parzyszek typename ResultTy = 160cdbd2287SKrzysztof Parzyszek std::invoke_result_t<FuncTy, decltype(std::declval<ArgTy>().v)>> 161e79cd246SKrzysztof Parzyszek std::optional<ResultTy> maybeApplyToV(FuncTy &&func, const ArgTy *arg) { 162e79cd246SKrzysztof Parzyszek if (!arg) 163e79cd246SKrzysztof Parzyszek return std::nullopt; 164e79cd246SKrzysztof Parzyszek return func(arg->v); 165ea2cfcc1SKrzysztof Parzyszek } 166ea2cfcc1SKrzysztof Parzyszek 1677a66e420SKrzysztof Parzyszek std::optional<Object> getBaseObject(const Object &object, 1687a66e420SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx); 169ea2cfcc1SKrzysztof Parzyszek 170ea2cfcc1SKrzysztof Parzyszek namespace clause { 171973fa983SKrzysztof Parzyszek using Range = tomp::type::RangeT<ExprTy>; 17252755ac2SKrzysztof Parzyszek using Mapper = tomp::type::MapperT<IdTy, ExprTy>; 173973fa983SKrzysztof Parzyszek using Iterator = tomp::type::IteratorT<TypeTy, IdTy, ExprTy>; 174973fa983SKrzysztof Parzyszek using IteratorSpecifier = tomp::type::IteratorSpecifierT<TypeTy, IdTy, ExprTy>; 175148a5579SKrzysztof Parzyszek using DefinedOperator = tomp::type::DefinedOperatorT<IdTy, ExprTy>; 176148a5579SKrzysztof Parzyszek using ProcedureDesignator = tomp::type::ProcedureDesignatorT<IdTy, ExprTy>; 177148a5579SKrzysztof Parzyszek using ReductionOperator = tomp::type::ReductionIdentifierT<IdTy, ExprTy>; 178f87737f3SKrzysztof Parzyszek using DependenceType = tomp::type::DependenceType; 179bde79c0eSKrzysztof Parzyszek using Prescriptiveness = tomp::type::Prescriptiveness; 180ea2cfcc1SKrzysztof Parzyszek 181ea2cfcc1SKrzysztof Parzyszek // "Requires" clauses are handled early on, and the aggregated information 182ea2cfcc1SKrzysztof Parzyszek // is stored in the Symbol details of modules, programs, and subprograms. 183ea2cfcc1SKrzysztof Parzyszek // These clauses are still handled here to cover all alternatives in the 184ea2cfcc1SKrzysztof Parzyszek // main clause variant. 185ea2cfcc1SKrzysztof Parzyszek 1866d688601SJulian Brown using Absent = tomp::clause::AbsentT<TypeTy, IdTy, ExprTy>; 187148a5579SKrzysztof Parzyszek using AcqRel = tomp::clause::AcqRelT<TypeTy, IdTy, ExprTy>; 188148a5579SKrzysztof Parzyszek using Acquire = tomp::clause::AcquireT<TypeTy, IdTy, ExprTy>; 189148a5579SKrzysztof Parzyszek using AdjustArgs = tomp::clause::AdjustArgsT<TypeTy, IdTy, ExprTy>; 190148a5579SKrzysztof Parzyszek using Affinity = tomp::clause::AffinityT<TypeTy, IdTy, ExprTy>; 191148a5579SKrzysztof Parzyszek using Aligned = tomp::clause::AlignedT<TypeTy, IdTy, ExprTy>; 192148a5579SKrzysztof Parzyszek using Align = tomp::clause::AlignT<TypeTy, IdTy, ExprTy>; 193148a5579SKrzysztof Parzyszek using Allocate = tomp::clause::AllocateT<TypeTy, IdTy, ExprTy>; 194148a5579SKrzysztof Parzyszek using Allocator = tomp::clause::AllocatorT<TypeTy, IdTy, ExprTy>; 195148a5579SKrzysztof Parzyszek using AppendArgs = tomp::clause::AppendArgsT<TypeTy, IdTy, ExprTy>; 196ea2cfcc1SKrzysztof Parzyszek using AtomicDefaultMemOrder = 197148a5579SKrzysztof Parzyszek tomp::clause::AtomicDefaultMemOrderT<TypeTy, IdTy, ExprTy>; 198148a5579SKrzysztof Parzyszek using At = tomp::clause::AtT<TypeTy, IdTy, ExprTy>; 199148a5579SKrzysztof Parzyszek using Bind = tomp::clause::BindT<TypeTy, IdTy, ExprTy>; 200148a5579SKrzysztof Parzyszek using Capture = tomp::clause::CaptureT<TypeTy, IdTy, ExprTy>; 201148a5579SKrzysztof Parzyszek using Collapse = tomp::clause::CollapseT<TypeTy, IdTy, ExprTy>; 202148a5579SKrzysztof Parzyszek using Compare = tomp::clause::CompareT<TypeTy, IdTy, ExprTy>; 20389c556cfSKrzysztof Parzyszek using Contains = tomp::clause::ContainsT<TypeTy, IdTy, ExprTy>; 204148a5579SKrzysztof Parzyszek using Copyin = tomp::clause::CopyinT<TypeTy, IdTy, ExprTy>; 205148a5579SKrzysztof Parzyszek using Copyprivate = tomp::clause::CopyprivateT<TypeTy, IdTy, ExprTy>; 206148a5579SKrzysztof Parzyszek using Defaultmap = tomp::clause::DefaultmapT<TypeTy, IdTy, ExprTy>; 207148a5579SKrzysztof Parzyszek using Default = tomp::clause::DefaultT<TypeTy, IdTy, ExprTy>; 208148a5579SKrzysztof Parzyszek using Depend = tomp::clause::DependT<TypeTy, IdTy, ExprTy>; 209148a5579SKrzysztof Parzyszek using Destroy = tomp::clause::DestroyT<TypeTy, IdTy, ExprTy>; 210148a5579SKrzysztof Parzyszek using Detach = tomp::clause::DetachT<TypeTy, IdTy, ExprTy>; 211148a5579SKrzysztof Parzyszek using Device = tomp::clause::DeviceT<TypeTy, IdTy, ExprTy>; 212148a5579SKrzysztof Parzyszek using DeviceType = tomp::clause::DeviceTypeT<TypeTy, IdTy, ExprTy>; 213148a5579SKrzysztof Parzyszek using DistSchedule = tomp::clause::DistScheduleT<TypeTy, IdTy, ExprTy>; 214148a5579SKrzysztof Parzyszek using Doacross = tomp::clause::DoacrossT<TypeTy, IdTy, ExprTy>; 215148a5579SKrzysztof Parzyszek using DynamicAllocators = 216148a5579SKrzysztof Parzyszek tomp::clause::DynamicAllocatorsT<TypeTy, IdTy, ExprTy>; 217148a5579SKrzysztof Parzyszek using Enter = tomp::clause::EnterT<TypeTy, IdTy, ExprTy>; 218148a5579SKrzysztof Parzyszek using Exclusive = tomp::clause::ExclusiveT<TypeTy, IdTy, ExprTy>; 219148a5579SKrzysztof Parzyszek using Fail = tomp::clause::FailT<TypeTy, IdTy, ExprTy>; 220148a5579SKrzysztof Parzyszek using Filter = tomp::clause::FilterT<TypeTy, IdTy, ExprTy>; 221148a5579SKrzysztof Parzyszek using Final = tomp::clause::FinalT<TypeTy, IdTy, ExprTy>; 222148a5579SKrzysztof Parzyszek using Firstprivate = tomp::clause::FirstprivateT<TypeTy, IdTy, ExprTy>; 223148a5579SKrzysztof Parzyszek using From = tomp::clause::FromT<TypeTy, IdTy, ExprTy>; 224148a5579SKrzysztof Parzyszek using Full = tomp::clause::FullT<TypeTy, IdTy, ExprTy>; 225148a5579SKrzysztof Parzyszek using Grainsize = tomp::clause::GrainsizeT<TypeTy, IdTy, ExprTy>; 226148a5579SKrzysztof Parzyszek using HasDeviceAddr = tomp::clause::HasDeviceAddrT<TypeTy, IdTy, ExprTy>; 227148a5579SKrzysztof Parzyszek using Hint = tomp::clause::HintT<TypeTy, IdTy, ExprTy>; 2286d688601SJulian Brown using Holds = tomp::clause::HoldsT<TypeTy, IdTy, ExprTy>; 229148a5579SKrzysztof Parzyszek using If = tomp::clause::IfT<TypeTy, IdTy, ExprTy>; 230148a5579SKrzysztof Parzyszek using Inbranch = tomp::clause::InbranchT<TypeTy, IdTy, ExprTy>; 231148a5579SKrzysztof Parzyszek using Inclusive = tomp::clause::InclusiveT<TypeTy, IdTy, ExprTy>; 232148a5579SKrzysztof Parzyszek using Indirect = tomp::clause::IndirectT<TypeTy, IdTy, ExprTy>; 233148a5579SKrzysztof Parzyszek using Init = tomp::clause::InitT<TypeTy, IdTy, ExprTy>; 234148a5579SKrzysztof Parzyszek using InReduction = tomp::clause::InReductionT<TypeTy, IdTy, ExprTy>; 235148a5579SKrzysztof Parzyszek using IsDevicePtr = tomp::clause::IsDevicePtrT<TypeTy, IdTy, ExprTy>; 236148a5579SKrzysztof Parzyszek using Lastprivate = tomp::clause::LastprivateT<TypeTy, IdTy, ExprTy>; 237148a5579SKrzysztof Parzyszek using Linear = tomp::clause::LinearT<TypeTy, IdTy, ExprTy>; 238148a5579SKrzysztof Parzyszek using Link = tomp::clause::LinkT<TypeTy, IdTy, ExprTy>; 239148a5579SKrzysztof Parzyszek using Map = tomp::clause::MapT<TypeTy, IdTy, ExprTy>; 240148a5579SKrzysztof Parzyszek using Match = tomp::clause::MatchT<TypeTy, IdTy, ExprTy>; 241148a5579SKrzysztof Parzyszek using Mergeable = tomp::clause::MergeableT<TypeTy, IdTy, ExprTy>; 242148a5579SKrzysztof Parzyszek using Message = tomp::clause::MessageT<TypeTy, IdTy, ExprTy>; 2436d688601SJulian Brown using NoOpenmp = tomp::clause::NoOpenmpT<TypeTy, IdTy, ExprTy>; 2446d688601SJulian Brown using NoOpenmpRoutines = tomp::clause::NoOpenmpRoutinesT<TypeTy, IdTy, ExprTy>; 2456d688601SJulian Brown using NoParallelism = tomp::clause::NoParallelismT<TypeTy, IdTy, ExprTy>; 246148a5579SKrzysztof Parzyszek using Nocontext = tomp::clause::NocontextT<TypeTy, IdTy, ExprTy>; 247148a5579SKrzysztof Parzyszek using Nogroup = tomp::clause::NogroupT<TypeTy, IdTy, ExprTy>; 248148a5579SKrzysztof Parzyszek using Nontemporal = tomp::clause::NontemporalT<TypeTy, IdTy, ExprTy>; 249148a5579SKrzysztof Parzyszek using Notinbranch = tomp::clause::NotinbranchT<TypeTy, IdTy, ExprTy>; 250148a5579SKrzysztof Parzyszek using Novariants = tomp::clause::NovariantsT<TypeTy, IdTy, ExprTy>; 251148a5579SKrzysztof Parzyszek using Nowait = tomp::clause::NowaitT<TypeTy, IdTy, ExprTy>; 252148a5579SKrzysztof Parzyszek using NumTasks = tomp::clause::NumTasksT<TypeTy, IdTy, ExprTy>; 253148a5579SKrzysztof Parzyszek using NumTeams = tomp::clause::NumTeamsT<TypeTy, IdTy, ExprTy>; 254148a5579SKrzysztof Parzyszek using NumThreads = tomp::clause::NumThreadsT<TypeTy, IdTy, ExprTy>; 255148a5579SKrzysztof Parzyszek using OmpxAttribute = tomp::clause::OmpxAttributeT<TypeTy, IdTy, ExprTy>; 256148a5579SKrzysztof Parzyszek using OmpxBare = tomp::clause::OmpxBareT<TypeTy, IdTy, ExprTy>; 257148a5579SKrzysztof Parzyszek using OmpxDynCgroupMem = tomp::clause::OmpxDynCgroupMemT<TypeTy, IdTy, ExprTy>; 258148a5579SKrzysztof Parzyszek using Ordered = tomp::clause::OrderedT<TypeTy, IdTy, ExprTy>; 259148a5579SKrzysztof Parzyszek using Order = tomp::clause::OrderT<TypeTy, IdTy, ExprTy>; 260*15ab7be2SKrzysztof Parzyszek using Otherwise = tomp::clause::OtherwiseT<TypeTy, IdTy, ExprTy>; 261148a5579SKrzysztof Parzyszek using Partial = tomp::clause::PartialT<TypeTy, IdTy, ExprTy>; 262148a5579SKrzysztof Parzyszek using Priority = tomp::clause::PriorityT<TypeTy, IdTy, ExprTy>; 263148a5579SKrzysztof Parzyszek using Private = tomp::clause::PrivateT<TypeTy, IdTy, ExprTy>; 264148a5579SKrzysztof Parzyszek using ProcBind = tomp::clause::ProcBindT<TypeTy, IdTy, ExprTy>; 265148a5579SKrzysztof Parzyszek using Read = tomp::clause::ReadT<TypeTy, IdTy, ExprTy>; 266148a5579SKrzysztof Parzyszek using Reduction = tomp::clause::ReductionT<TypeTy, IdTy, ExprTy>; 267148a5579SKrzysztof Parzyszek using Relaxed = tomp::clause::RelaxedT<TypeTy, IdTy, ExprTy>; 268148a5579SKrzysztof Parzyszek using Release = tomp::clause::ReleaseT<TypeTy, IdTy, ExprTy>; 269148a5579SKrzysztof Parzyszek using ReverseOffload = tomp::clause::ReverseOffloadT<TypeTy, IdTy, ExprTy>; 270148a5579SKrzysztof Parzyszek using Safelen = tomp::clause::SafelenT<TypeTy, IdTy, ExprTy>; 271148a5579SKrzysztof Parzyszek using Schedule = tomp::clause::ScheduleT<TypeTy, IdTy, ExprTy>; 272148a5579SKrzysztof Parzyszek using SeqCst = tomp::clause::SeqCstT<TypeTy, IdTy, ExprTy>; 273148a5579SKrzysztof Parzyszek using Severity = tomp::clause::SeverityT<TypeTy, IdTy, ExprTy>; 274148a5579SKrzysztof Parzyszek using Shared = tomp::clause::SharedT<TypeTy, IdTy, ExprTy>; 275148a5579SKrzysztof Parzyszek using Simdlen = tomp::clause::SimdlenT<TypeTy, IdTy, ExprTy>; 276148a5579SKrzysztof Parzyszek using Simd = tomp::clause::SimdT<TypeTy, IdTy, ExprTy>; 277148a5579SKrzysztof Parzyszek using Sizes = tomp::clause::SizesT<TypeTy, IdTy, ExprTy>; 2785b03efb8SMichael Kruse using Permutation = tomp::clause::PermutationT<TypeTy, IdTy, ExprTy>; 279148a5579SKrzysztof Parzyszek using TaskReduction = tomp::clause::TaskReductionT<TypeTy, IdTy, ExprTy>; 280148a5579SKrzysztof Parzyszek using ThreadLimit = tomp::clause::ThreadLimitT<TypeTy, IdTy, ExprTy>; 281148a5579SKrzysztof Parzyszek using Threads = tomp::clause::ThreadsT<TypeTy, IdTy, ExprTy>; 282148a5579SKrzysztof Parzyszek using To = tomp::clause::ToT<TypeTy, IdTy, ExprTy>; 283148a5579SKrzysztof Parzyszek using UnifiedAddress = tomp::clause::UnifiedAddressT<TypeTy, IdTy, ExprTy>; 284148a5579SKrzysztof Parzyszek using UnifiedSharedMemory = 285148a5579SKrzysztof Parzyszek tomp::clause::UnifiedSharedMemoryT<TypeTy, IdTy, ExprTy>; 286148a5579SKrzysztof Parzyszek using Uniform = tomp::clause::UniformT<TypeTy, IdTy, ExprTy>; 287148a5579SKrzysztof Parzyszek using Unknown = tomp::clause::UnknownT<TypeTy, IdTy, ExprTy>; 288148a5579SKrzysztof Parzyszek using Untied = tomp::clause::UntiedT<TypeTy, IdTy, ExprTy>; 289148a5579SKrzysztof Parzyszek using Update = tomp::clause::UpdateT<TypeTy, IdTy, ExprTy>; 290148a5579SKrzysztof Parzyszek using UseDeviceAddr = tomp::clause::UseDeviceAddrT<TypeTy, IdTy, ExprTy>; 291148a5579SKrzysztof Parzyszek using UseDevicePtr = tomp::clause::UseDevicePtrT<TypeTy, IdTy, ExprTy>; 292148a5579SKrzysztof Parzyszek using UsesAllocators = tomp::clause::UsesAllocatorsT<TypeTy, IdTy, ExprTy>; 293148a5579SKrzysztof Parzyszek using Use = tomp::clause::UseT<TypeTy, IdTy, ExprTy>; 294148a5579SKrzysztof Parzyszek using Weak = tomp::clause::WeakT<TypeTy, IdTy, ExprTy>; 295148a5579SKrzysztof Parzyszek using When = tomp::clause::WhenT<TypeTy, IdTy, ExprTy>; 296148a5579SKrzysztof Parzyszek using Write = tomp::clause::WriteT<TypeTy, IdTy, ExprTy>; 297ea2cfcc1SKrzysztof Parzyszek } // namespace clause 298ea2cfcc1SKrzysztof Parzyszek 299be7c9e39SKrzysztof Parzyszek using tomp::type::operator==; 300be7c9e39SKrzysztof Parzyszek 301148a5579SKrzysztof Parzyszek struct CancellationConstructType { 302148a5579SKrzysztof Parzyszek using EmptyTrait = std::true_type; 303148a5579SKrzysztof Parzyszek }; 304148a5579SKrzysztof Parzyszek struct Depobj { 305148a5579SKrzysztof Parzyszek using EmptyTrait = std::true_type; 306148a5579SKrzysztof Parzyszek }; 307148a5579SKrzysztof Parzyszek struct Flush { 308148a5579SKrzysztof Parzyszek using EmptyTrait = std::true_type; 309148a5579SKrzysztof Parzyszek }; 310148a5579SKrzysztof Parzyszek struct MemoryOrder { 311148a5579SKrzysztof Parzyszek using EmptyTrait = std::true_type; 312148a5579SKrzysztof Parzyszek }; 313148a5579SKrzysztof Parzyszek struct Threadprivate { 314148a5579SKrzysztof Parzyszek using EmptyTrait = std::true_type; 315148a5579SKrzysztof Parzyszek }; 316148a5579SKrzysztof Parzyszek 317148a5579SKrzysztof Parzyszek using ClauseBase = tomp::ClauseT<TypeTy, IdTy, ExprTy, 318148a5579SKrzysztof Parzyszek // Extras... 319148a5579SKrzysztof Parzyszek CancellationConstructType, Depobj, Flush, 320148a5579SKrzysztof Parzyszek MemoryOrder, Threadprivate>; 321148a5579SKrzysztof Parzyszek 322148a5579SKrzysztof Parzyszek struct Clause : public ClauseBase { 323be7c9e39SKrzysztof Parzyszek Clause(ClauseBase &&base, const parser::CharBlock source = {}) 324be7c9e39SKrzysztof Parzyszek : ClauseBase(std::move(base)), source(source) {} 325be7c9e39SKrzysztof Parzyszek // "source" will be ignored by tomp::type::operator==. 326ea2cfcc1SKrzysztof Parzyszek parser::CharBlock source; 327ea2cfcc1SKrzysztof Parzyszek }; 328ea2cfcc1SKrzysztof Parzyszek 329ea2cfcc1SKrzysztof Parzyszek template <typename Specific> 330ea2cfcc1SKrzysztof Parzyszek Clause makeClause(llvm::omp::Clause id, Specific &&specific, 331ea2cfcc1SKrzysztof Parzyszek parser::CharBlock source = {}) { 332be7c9e39SKrzysztof Parzyszek return Clause(typename Clause::BaseT{id, specific}, source); 333ea2cfcc1SKrzysztof Parzyszek } 334ea2cfcc1SKrzysztof Parzyszek 3357a66e420SKrzysztof Parzyszek Clause makeClause(const parser::OmpClause &cls, 336ea2cfcc1SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx); 337ea2cfcc1SKrzysztof Parzyszek 3384d177435SKrzysztof Parzyszek List<Clause> makeClauses(const parser::OmpClauseList &clauses, 339ea2cfcc1SKrzysztof Parzyszek semantics::SemanticsContext &semaCtx); 340be7c9e39SKrzysztof Parzyszek 341be7c9e39SKrzysztof Parzyszek bool transferLocations(const List<Clause> &from, List<Clause> &to); 342f9e55796SKrzysztof Parzyszek } // namespace Fortran::lower::omp 343ea2cfcc1SKrzysztof Parzyszek 344ea2cfcc1SKrzysztof Parzyszek #endif // FORTRAN_LOWER_OPENMP_CLAUSES_H 345