| //===--- OMPKinds.def - OpenMP directives, clauses, rt-calls -*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| /// \file |
| /// |
| /// This file defines the list of supported OpenMP directives, clauses, runtime |
| /// calls, and other things that need to be listed in enums. |
| /// |
| //===----------------------------------------------------------------------===// |
| |
| /// OpenMP Directives and combined directives |
| /// |
| ///{ |
| |
| #ifndef OMP_DIRECTIVE |
| #define OMP_DIRECTIVE(Enum, Str) |
| #endif |
| |
| #define __OMP_DIRECTIVE_EXT(Name, Str) OMP_DIRECTIVE(OMPD_##Name, Str) |
| #define __OMP_DIRECTIVE(Name) __OMP_DIRECTIVE_EXT(Name, #Name) |
| |
| __OMP_DIRECTIVE(threadprivate) |
| __OMP_DIRECTIVE(parallel) |
| __OMP_DIRECTIVE(task) |
| __OMP_DIRECTIVE(simd) |
| __OMP_DIRECTIVE(for) |
| __OMP_DIRECTIVE(sections) |
| __OMP_DIRECTIVE(section) |
| __OMP_DIRECTIVE(single) |
| __OMP_DIRECTIVE(master) |
| __OMP_DIRECTIVE(critical) |
| __OMP_DIRECTIVE(taskyield) |
| __OMP_DIRECTIVE(barrier) |
| __OMP_DIRECTIVE(taskwait) |
| __OMP_DIRECTIVE(taskgroup) |
| __OMP_DIRECTIVE(flush) |
| __OMP_DIRECTIVE(ordered) |
| __OMP_DIRECTIVE(atomic) |
| __OMP_DIRECTIVE(target) |
| __OMP_DIRECTIVE(teams) |
| __OMP_DIRECTIVE(cancel) |
| __OMP_DIRECTIVE(requires) |
| __OMP_DIRECTIVE_EXT(target_data, "target data") |
| __OMP_DIRECTIVE_EXT(target_enter_data, "target enter data") |
| __OMP_DIRECTIVE_EXT(target_exit_data, "target exit data") |
| __OMP_DIRECTIVE_EXT(target_parallel, "target parallel") |
| __OMP_DIRECTIVE_EXT(target_parallel_for, "target parallel for") |
| __OMP_DIRECTIVE_EXT(target_update, "target update") |
| __OMP_DIRECTIVE_EXT(parallel_for, "parallel for") |
| __OMP_DIRECTIVE_EXT(parallel_for_simd, "parallel for simd") |
| __OMP_DIRECTIVE_EXT(parallel_master, "parallel master") |
| __OMP_DIRECTIVE_EXT(parallel_sections, "parallel sections") |
| __OMP_DIRECTIVE_EXT(for_simd, "for simd") |
| __OMP_DIRECTIVE_EXT(cancellation_point, "cancellation point") |
| __OMP_DIRECTIVE_EXT(declare_reduction, "declare reduction") |
| __OMP_DIRECTIVE_EXT(declare_mapper, "declare mapper") |
| __OMP_DIRECTIVE_EXT(declare_simd, "declare simd") |
| __OMP_DIRECTIVE(taskloop) |
| __OMP_DIRECTIVE_EXT(taskloop_simd, "taskloop simd") |
| __OMP_DIRECTIVE(distribute) |
| __OMP_DIRECTIVE_EXT(declare_target, "declare target") |
| __OMP_DIRECTIVE_EXT(end_declare_target, "end declare target") |
| __OMP_DIRECTIVE_EXT(distribute_parallel_for, "distribute parallel for") |
| __OMP_DIRECTIVE_EXT(distribute_parallel_for_simd, |
| "distribute parallel for simd") |
| __OMP_DIRECTIVE_EXT(distribute_simd, "distribute simd") |
| __OMP_DIRECTIVE_EXT(target_parallel_for_simd, "target parallel for simd") |
| __OMP_DIRECTIVE_EXT(target_simd, "target simd") |
| __OMP_DIRECTIVE_EXT(teams_distribute, "teams distribute") |
| __OMP_DIRECTIVE_EXT(teams_distribute_simd, "teams distribute simd") |
| __OMP_DIRECTIVE_EXT(teams_distribute_parallel_for_simd, |
| "teams distribute parallel for simd") |
| __OMP_DIRECTIVE_EXT(teams_distribute_parallel_for, |
| "teams distribute parallel for") |
| __OMP_DIRECTIVE_EXT(target_teams, "target teams") |
| __OMP_DIRECTIVE_EXT(target_teams_distribute, "target teams distribute") |
| __OMP_DIRECTIVE_EXT(target_teams_distribute_parallel_for, |
| "target teams distribute parallel for") |
| __OMP_DIRECTIVE_EXT(target_teams_distribute_parallel_for_simd, |
| "target teams distribute parallel for simd") |
| __OMP_DIRECTIVE_EXT(target_teams_distribute_simd, |
| "target teams distribute simd") |
| __OMP_DIRECTIVE(allocate) |
| __OMP_DIRECTIVE_EXT(declare_variant, "declare variant") |
| __OMP_DIRECTIVE_EXT(master_taskloop, "master taskloop") |
| __OMP_DIRECTIVE_EXT(parallel_master_taskloop, "parallel master taskloop") |
| __OMP_DIRECTIVE_EXT(master_taskloop_simd, "master taskloop simd") |
| __OMP_DIRECTIVE_EXT(parallel_master_taskloop_simd, |
| "parallel master taskloop simd") |
| |
| // Has to be the last because Clang implicitly expects it to be. |
| __OMP_DIRECTIVE(unknown) |
| |
| #undef __OMP_DIRECTIVE_EXT |
| #undef __OMP_DIRECTIVE |
| #undef OMP_DIRECTIVE |
| |
| ///} |
| |
| /// Types used in runtime structs or runtime functions |
| /// |
| ///{ |
| |
| #ifndef OMP_TYPE |
| #define OMP_TYPE(VarName, InitValue) |
| #endif |
| |
| #define __OMP_TYPE(VarName) OMP_TYPE(VarName, Type::get##VarName##Ty(Ctx)) |
| |
| __OMP_TYPE(Void) |
| __OMP_TYPE(Int8) |
| __OMP_TYPE(Int32) |
| __OMP_TYPE(Int8Ptr) |
| __OMP_TYPE(Int32Ptr) |
| |
| #undef __OMP_TYPE |
| #undef OMP_TYPE |
| |
| ///} |
| |
| /// Struct and function types |
| /// |
| ///{ |
| |
| #ifndef OMP_STRUCT_TYPE |
| #define OMP_STRUCT_TYPE(VarName, StructName, ...) |
| #endif |
| |
| #define __OMP_STRUCT_TYPE(VarName, Name, ...) \ |
| OMP_STRUCT_TYPE(VarName, "struct." #Name, __VA_ARGS__) |
| |
| __OMP_STRUCT_TYPE(Ident, ident_t, Int32, Int32, Int32, Int32, Int8Ptr) |
| |
| #undef __OMP_STRUCT_TYPE |
| #undef OMP_STRUCT_TYPE |
| |
| #ifndef OMP_FUNCTION_TYPE |
| #define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) |
| #endif |
| |
| #define __OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \ |
| OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, __VA_ARGS__) |
| |
| __OMP_FUNCTION_TYPE(ParallelTask, true, Void, Int32Ptr, Int32Ptr) |
| |
| #undef __OMP_FUNCTION_TYPE |
| #undef OMP_FUNCTION_TYPE |
| |
| ///} |
| |
| /// Runtime library function (and their attributes) |
| /// |
| ///{ |
| |
| #ifndef OMP_RTL |
| #define OMP_RTL(Enum, Str, IsVarArg, ReturnType, ...) |
| #endif |
| |
| #define __OMP_RTL(Name, IsVarArg, ReturnType, ...) \ |
| OMP_RTL(OMPRTL_##Name, #Name, IsVarArg, ReturnType, __VA_ARGS__) |
| |
| __OMP_RTL(__kmpc_barrier, false, Void, IdentPtr, Int32) |
| __OMP_RTL(__kmpc_cancel, false, Int32, IdentPtr, Int32, Int32) |
| __OMP_RTL(__kmpc_cancel_barrier, false, Int32, IdentPtr, Int32) |
| __OMP_RTL(__kmpc_flush, false, Void, IdentPtr) |
| __OMP_RTL(__kmpc_global_thread_num, false, Int32, IdentPtr) |
| __OMP_RTL(__kmpc_fork_call, true, Void, IdentPtr, Int32, ParallelTaskPtr) |
| __OMP_RTL(__kmpc_push_num_threads, false, Void, IdentPtr, Int32, |
| /* Int */ Int32) |
| __OMP_RTL(__kmpc_push_proc_bind, false, Void, IdentPtr, Int32, /* Int */ Int32) |
| __OMP_RTL(__kmpc_serialized_parallel, false, Void, IdentPtr, Int32) |
| __OMP_RTL(__kmpc_end_serialized_parallel, false, Void, IdentPtr, Int32) |
| |
| __OMP_RTL(omp_get_thread_num, false, Int32, ) |
| |
| #undef __OMP_RTL |
| #undef OMP_RTL |
| |
| #define EnumAttr(Kind) Attribute::get(Ctx, Attribute::AttrKind::Kind) |
| #define AttributeSet(...) \ |
| AttributeSet::get(Ctx, ArrayRef<Attribute>({__VA_ARGS__})) |
| |
| #ifndef OMP_ATTRS_SET |
| #define OMP_ATTRS_SET(VarName, AttrSet) |
| #endif |
| |
| #define __OMP_ATTRS_SET(VarName, AttrSet) OMP_ATTRS_SET(VarName, AttrSet) |
| |
| __OMP_ATTRS_SET(GetterAttrs, |
| OptimisticAttributes |
| ? AttributeSet(EnumAttr(NoUnwind), EnumAttr(ReadOnly), |
| EnumAttr(NoSync), EnumAttr(NoFree)) |
| : AttributeSet(EnumAttr(NoUnwind))) |
| |
| #undef __OMP_ATTRS_SET |
| #undef OMP_ATTRS_SET |
| |
| #ifndef OMP_RTL_ATTRS |
| #define OMP_RTL_ATTRS(Enum, FnAttrSet, RetAttrSet, ArgAttrSets) |
| #endif |
| |
| #define __OMP_RTL_ATTRS(Name, FnAttrSet, RetAttrSet, ArgAttrSets) \ |
| OMP_RTL_ATTRS(OMPRTL_##Name, FnAttrSet, RetAttrSet, ArgAttrSets) |
| |
| __OMP_RTL_ATTRS(__kmpc_fork_call, AttributeSet(EnumAttr(NoUnwind)), |
| AttributeSet(), {}) |
| |
| __OMP_RTL_ATTRS(__kmpc_global_thread_num, GetterAttrs, AttributeSet(), {}) |
| __OMP_RTL_ATTRS(omp_get_thread_num, GetterAttrs, AttributeSet(), {}) |
| |
| #undef __OMP_RTL_ATTRS |
| #undef OMP_RTL_ATTRS |
| #undef AttributeSet |
| #undef EnumAttr |
| |
| ///} |
| |
| /// KMP ident_t bit flags |
| /// |
| /// In accordance with the values in `openmp/runtime/src/kmp.h`. |
| /// |
| ///{ |
| |
| #ifndef OMP_IDENT_FLAG |
| #define OMP_IDENT_FLAG(Enum, Str, Value) |
| #endif |
| |
| #define __OMP_IDENT_FLAG(Name, Value) \ |
| OMP_IDENT_FLAG(OMP_IDENT_FLAG_##Name, #Name, Value) |
| |
| __OMP_IDENT_FLAG(KMPC, 0x02) |
| __OMP_IDENT_FLAG(BARRIER_EXPL, 0x20) |
| __OMP_IDENT_FLAG(BARRIER_IMPL, 0x0040) |
| __OMP_IDENT_FLAG(BARRIER_IMPL_MASK, 0x01C0) |
| __OMP_IDENT_FLAG(BARRIER_IMPL_FOR, 0x0040) |
| __OMP_IDENT_FLAG(BARRIER_IMPL_SECTIONS, 0x00C0) |
| __OMP_IDENT_FLAG(BARRIER_IMPL_SINGLE, 0x0140) |
| __OMP_IDENT_FLAG(BARRIER_IMPL_WORKSHARE, 0x01C0) |
| |
| #undef __OMP_IDENT_FLAG |
| #undef OMP_IDENT_FLAG |
| |
| ///} |
| |
| /// KMP cancel kind |
| /// |
| ///{ |
| |
| #ifndef OMP_CANCEL_KIND |
| #define OMP_CANCEL_KIND(Enum, Str, DirectiveEnum, Value) |
| #endif |
| |
| #define __OMP_CANCEL_KIND(Name, Value) \ |
| OMP_CANCEL_KIND(OMP_CANCEL_KIND_##Name, #Name, OMPD_##Name, Value) |
| |
| __OMP_CANCEL_KIND(parallel, 1) |
| __OMP_CANCEL_KIND(for, 2) |
| __OMP_CANCEL_KIND(sections, 3) |
| __OMP_CANCEL_KIND(taskgroup, 4) |
| |
| #undef __OMP_CANCEL_KIND |
| #undef OMP_CANCEL_KIND |
| |
| ///} |
| |
| /// Proc bind kinds |
| /// |
| ///{ |
| |
| #ifndef OMP_PROC_BIND_KIND |
| #define OMP_PROC_BIND_KIND(Enum, Str, Value) |
| #endif |
| |
| #define __OMP_PROC_BIND_KIND(Name, Value) \ |
| OMP_PROC_BIND_KIND(OMP_PROC_BIND_##Name, #Name, Value) |
| |
| __OMP_PROC_BIND_KIND(master, 2) |
| __OMP_PROC_BIND_KIND(close, 3) |
| __OMP_PROC_BIND_KIND(spread, 4) |
| __OMP_PROC_BIND_KIND(default, 6) |
| __OMP_PROC_BIND_KIND(unknown, 7) |
| |
| #undef __OMP_PROC_BIND_KIND |
| #undef OMP_PROC_BIND_KIND |
| |
| ///} |
| |
| /// OpenMP context related definitions: |
| /// - trait set selector |
| /// - trait selector |
| /// - trait property |
| /// |
| ///{ |
| |
| #ifndef OMP_TRAIT_SET |
| #define OMP_TRAIT_SET(Enum, Str) |
| #endif |
| #ifndef OMP_TRAIT_SELECTOR |
| #define OMP_TRAIT_SELECTOR(Enum, TraitSetEnum, Str, RequiresProperty) |
| #endif |
| #ifndef OMP_TRAIT_PROPERTY |
| #define OMP_TRAIT_PROPERTY(Enum, TraitSetEnum, TraitSelectorEnum, Str) |
| #endif |
| |
| #define __OMP_TRAIT_SET(Name) OMP_TRAIT_SET(Name, #Name) |
| #define __OMP_TRAIT_SELECTOR(TraitSet, Name, RequiresProperty) \ |
| OMP_TRAIT_SELECTOR(TraitSet##_##Name, TraitSet, #Name, RequiresProperty) |
| #define __OMP_TRAIT_SELECTOR_AND_PROPERTY(TraitSet, Name) \ |
| OMP_TRAIT_SELECTOR(TraitSet##_##Name, TraitSet, #Name, false) \ |
| OMP_TRAIT_PROPERTY(TraitSet##_##Name##_##Name, TraitSet, TraitSet##_##Name, \ |
| #Name) |
| #define __OMP_TRAIT_PROPERTY(TraitSet, TraitSelector, Name) \ |
| OMP_TRAIT_PROPERTY(TraitSet##_##TraitSelector##_##Name, TraitSet, \ |
| TraitSet##_##TraitSelector, #Name) |
| |
| // "invalid" must go first. |
| OMP_TRAIT_SET(invalid, "invalid") |
| OMP_TRAIT_SELECTOR(invalid, invalid, "invalid", false) |
| OMP_TRAIT_PROPERTY(invalid, invalid, invalid, "invalid") |
| |
| __OMP_TRAIT_SET(construct) |
| __OMP_TRAIT_SELECTOR_AND_PROPERTY(construct, target) |
| __OMP_TRAIT_SELECTOR_AND_PROPERTY(construct, teams) |
| __OMP_TRAIT_SELECTOR_AND_PROPERTY(construct, parallel) |
| __OMP_TRAIT_SELECTOR_AND_PROPERTY(construct, for) |
| __OMP_TRAIT_SELECTOR_AND_PROPERTY(construct, simd) |
| |
| __OMP_TRAIT_SET(device) |
| |
| __OMP_TRAIT_SELECTOR(device, kind, true) |
| |
| __OMP_TRAIT_PROPERTY(device, kind, host) |
| __OMP_TRAIT_PROPERTY(device, kind, nohost) |
| __OMP_TRAIT_PROPERTY(device, kind, cpu) |
| __OMP_TRAIT_PROPERTY(device, kind, gpu) |
| __OMP_TRAIT_PROPERTY(device, kind, fpga) |
| __OMP_TRAIT_PROPERTY(device, kind, any) |
| |
| __OMP_TRAIT_SELECTOR(device, isa, true) |
| |
| // TODO: What do we want for ISA? |
| |
| __OMP_TRAIT_SELECTOR(device, arch, true) |
| |
| __OMP_TRAIT_PROPERTY(device, arch, arm) |
| __OMP_TRAIT_PROPERTY(device, arch, armeb) |
| __OMP_TRAIT_PROPERTY(device, arch, aarch64) |
| __OMP_TRAIT_PROPERTY(device, arch, aarch64_be) |
| __OMP_TRAIT_PROPERTY(device, arch, aarch64_32) |
| __OMP_TRAIT_PROPERTY(device, arch, ppc) |
| __OMP_TRAIT_PROPERTY(device, arch, ppc64) |
| __OMP_TRAIT_PROPERTY(device, arch, ppc64le) |
| __OMP_TRAIT_PROPERTY(device, arch, x86) |
| __OMP_TRAIT_PROPERTY(device, arch, x86_64) |
| __OMP_TRAIT_PROPERTY(device, arch, amdgcn) |
| __OMP_TRAIT_PROPERTY(device, arch, nvptx) |
| __OMP_TRAIT_PROPERTY(device, arch, nvptx64) |
| |
| __OMP_TRAIT_SET(implementation) |
| |
| __OMP_TRAIT_SELECTOR(implementation, vendor, true) |
| |
| __OMP_TRAIT_PROPERTY(implementation, vendor, amd) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, arm) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, bsc) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, cray) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, fujitsu) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, gnu) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, ibm) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, intel) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, llvm) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, pgi) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, ti) |
| __OMP_TRAIT_PROPERTY(implementation, vendor, unknown) |
| |
| __OMP_TRAIT_SELECTOR(implementation, extension, true) |
| |
| __OMP_TRAIT_SET(user) |
| |
| __OMP_TRAIT_SELECTOR(user, condition, true) |
| |
| __OMP_TRAIT_PROPERTY(user, condition, true) |
| __OMP_TRAIT_PROPERTY(user, condition, false) |
| __OMP_TRAIT_PROPERTY(user, condition, unknown) |
| |
| #undef OMP_TRAIT_SET |
| #undef __OMP_TRAIT_SET |
| ///} |
| |
| /// Traits for the requires directive |
| /// |
| /// These will (potentially) become trait selectors for the OpenMP context if |
| /// the OMP_REQUIRES_TRAIT macro is not defined. |
| /// |
| ///{ |
| |
| #ifdef OMP_REQUIRES_TRAIT |
| #define __OMP_REQUIRES_TRAIT(Name) \ |
| OMP_REQUIRES_TRAIT(OMP_REQUIRES_TRAIT_##Name, #Name) |
| #else |
| #define __OMP_REQUIRES_TRAIT(Name) \ |
| __OMP_TRAIT_SELECTOR_AND_PROPERTY(implementation, Name) |
| #endif |
| |
| __OMP_REQUIRES_TRAIT(unified_address) |
| __OMP_REQUIRES_TRAIT(unified_shared_memory) |
| __OMP_REQUIRES_TRAIT(reverse_offload) |
| __OMP_REQUIRES_TRAIT(dynamic_allocators) |
| __OMP_REQUIRES_TRAIT(atomic_default_mem_order) |
| |
| #undef __OMP_TRAIT_SELECTOR_AND_PROPERTY |
| #undef OMP_TRAIT_SELECTOR |
| #undef __OMP_TRAIT_SELECTOR |
| #undef OMP_TRAIT_PROPERTY |
| #undef __OMP_TRAIT_PROPERTY |
| #undef __OMP_REQUIRES_TRAIT |
| #undef OMP_REQUIRES_TRAIT |
| ///} |