1//===--- OMPKinds.def - OpenMP directives, clauses, rt-calls -*- C++ -*-===// 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/// \file 9/// 10/// This file defines the list of supported OpenMP directives, clauses, runtime 11/// calls, and other things that need to be listed in enums. 12/// 13//===----------------------------------------------------------------------===// 14 15/// OpenMP Directives and combined directives 16/// 17///{ 18 19#ifndef OMP_DIRECTIVE 20#define OMP_DIRECTIVE(Enum, Str) 21#endif 22 23#define __OMP_DIRECTIVE_EXT(Name, Str) OMP_DIRECTIVE(OMPD_##Name, Str) 24#define __OMP_DIRECTIVE(Name) __OMP_DIRECTIVE_EXT(Name, #Name) 25 26__OMP_DIRECTIVE(threadprivate) 27__OMP_DIRECTIVE(parallel) 28__OMP_DIRECTIVE(task) 29__OMP_DIRECTIVE(simd) 30__OMP_DIRECTIVE(for) 31__OMP_DIRECTIVE(sections) 32__OMP_DIRECTIVE(section) 33__OMP_DIRECTIVE(single) 34__OMP_DIRECTIVE(master) 35__OMP_DIRECTIVE(critical) 36__OMP_DIRECTIVE(taskyield) 37__OMP_DIRECTIVE(barrier) 38__OMP_DIRECTIVE(taskwait) 39__OMP_DIRECTIVE(taskgroup) 40__OMP_DIRECTIVE(flush) 41__OMP_DIRECTIVE(ordered) 42__OMP_DIRECTIVE(atomic) 43__OMP_DIRECTIVE(target) 44__OMP_DIRECTIVE(teams) 45__OMP_DIRECTIVE(cancel) 46__OMP_DIRECTIVE(requires) 47__OMP_DIRECTIVE_EXT(target_data, "target data") 48__OMP_DIRECTIVE_EXT(target_enter_data, "target enter data") 49__OMP_DIRECTIVE_EXT(target_exit_data, "target exit data") 50__OMP_DIRECTIVE_EXT(target_parallel, "target parallel") 51__OMP_DIRECTIVE_EXT(target_parallel_for, "target parallel for") 52__OMP_DIRECTIVE_EXT(target_update, "target update") 53__OMP_DIRECTIVE_EXT(parallel_for, "parallel for") 54__OMP_DIRECTIVE_EXT(parallel_for_simd, "parallel for simd") 55__OMP_DIRECTIVE_EXT(parallel_master, "parallel master") 56__OMP_DIRECTIVE_EXT(parallel_sections, "parallel sections") 57__OMP_DIRECTIVE_EXT(for_simd, "for simd") 58__OMP_DIRECTIVE_EXT(cancellation_point, "cancellation point") 59__OMP_DIRECTIVE_EXT(declare_reduction, "declare reduction") 60__OMP_DIRECTIVE_EXT(declare_mapper, "declare mapper") 61__OMP_DIRECTIVE_EXT(declare_simd, "declare simd") 62__OMP_DIRECTIVE(taskloop) 63__OMP_DIRECTIVE_EXT(taskloop_simd, "taskloop simd") 64__OMP_DIRECTIVE(distribute) 65__OMP_DIRECTIVE_EXT(declare_target, "declare target") 66__OMP_DIRECTIVE_EXT(end_declare_target, "end declare target") 67__OMP_DIRECTIVE_EXT(distribute_parallel_for, "distribute parallel for") 68__OMP_DIRECTIVE_EXT(distribute_parallel_for_simd, 69 "distribute parallel for simd") 70__OMP_DIRECTIVE_EXT(distribute_simd, "distribute simd") 71__OMP_DIRECTIVE_EXT(target_parallel_for_simd, "target parallel for simd") 72__OMP_DIRECTIVE_EXT(target_simd, "target simd") 73__OMP_DIRECTIVE_EXT(teams_distribute, "teams distribute") 74__OMP_DIRECTIVE_EXT(teams_distribute_simd, "teams distribute simd") 75__OMP_DIRECTIVE_EXT(teams_distribute_parallel_for_simd, 76 "teams distribute parallel for simd") 77__OMP_DIRECTIVE_EXT(teams_distribute_parallel_for, 78 "teams distribute parallel for") 79__OMP_DIRECTIVE_EXT(target_teams, "target teams") 80__OMP_DIRECTIVE_EXT(target_teams_distribute, "target teams distribute") 81__OMP_DIRECTIVE_EXT(target_teams_distribute_parallel_for, 82 "target teams distribute parallel for") 83__OMP_DIRECTIVE_EXT(target_teams_distribute_parallel_for_simd, 84 "target teams distribute parallel for simd") 85__OMP_DIRECTIVE_EXT(target_teams_distribute_simd, 86 "target teams distribute simd") 87__OMP_DIRECTIVE(allocate) 88__OMP_DIRECTIVE_EXT(declare_variant, "declare variant") 89__OMP_DIRECTIVE_EXT(master_taskloop, "master taskloop") 90__OMP_DIRECTIVE_EXT(parallel_master_taskloop, "parallel master taskloop") 91__OMP_DIRECTIVE_EXT(master_taskloop_simd, "master taskloop simd") 92__OMP_DIRECTIVE_EXT(parallel_master_taskloop_simd, 93 "parallel master taskloop simd") 94 95// Has to be the last because Clang implicitly expects it to be. 96__OMP_DIRECTIVE(unknown) 97 98#undef __OMP_DIRECTIVE_EXT 99#undef __OMP_DIRECTIVE 100#undef OMP_DIRECTIVE 101 102///} 103 104/// Types used in runtime structs or runtime functions 105/// 106///{ 107 108#ifndef OMP_TYPE 109#define OMP_TYPE(VarName, InitValue) 110#endif 111 112#define __OMP_TYPE(VarName) OMP_TYPE(VarName, Type::get##VarName##Ty(Ctx)) 113 114__OMP_TYPE(Void) 115__OMP_TYPE(Int8) 116__OMP_TYPE(Int32) 117__OMP_TYPE(Int8Ptr) 118__OMP_TYPE(Int32Ptr) 119 120#undef __OMP_TYPE 121#undef OMP_TYPE 122 123///} 124 125/// Struct and function types 126/// 127///{ 128 129#ifndef OMP_STRUCT_TYPE 130#define OMP_STRUCT_TYPE(VarName, StructName, ...) 131#endif 132 133#define __OMP_STRUCT_TYPE(VarName, Name, ...) \ 134 OMP_STRUCT_TYPE(VarName, "struct." #Name, __VA_ARGS__) 135 136__OMP_STRUCT_TYPE(Ident, ident_t, Int32, Int32, Int32, Int32, Int8Ptr) 137 138#undef __OMP_STRUCT_TYPE 139#undef OMP_STRUCT_TYPE 140 141#ifndef OMP_FUNCTION_TYPE 142#define OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) 143#endif 144 145#define __OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, ...) \ 146 OMP_FUNCTION_TYPE(VarName, IsVarArg, ReturnType, __VA_ARGS__) 147 148__OMP_FUNCTION_TYPE(ParallelTask, true, Void, Int32Ptr, Int32Ptr) 149 150#undef __OMP_FUNCTION_TYPE 151#undef OMP_FUNCTION_TYPE 152 153///} 154 155/// Runtime library function (and their attributes) 156/// 157///{ 158 159#ifndef OMP_RTL 160#define OMP_RTL(Enum, Str, IsVarArg, ReturnType, ...) 161#endif 162 163#define __OMP_RTL(Name, IsVarArg, ReturnType, ...) \ 164 OMP_RTL(OMPRTL_##Name, #Name, IsVarArg, ReturnType, __VA_ARGS__) 165 166__OMP_RTL(__kmpc_barrier, false, Void, IdentPtr, Int32) 167__OMP_RTL(__kmpc_cancel, false, Int32, IdentPtr, Int32, Int32) 168__OMP_RTL(__kmpc_cancel_barrier, false, Int32, IdentPtr, Int32) 169__OMP_RTL(__kmpc_global_thread_num, false, Int32, IdentPtr) 170__OMP_RTL(__kmpc_fork_call, true, Void, IdentPtr, Int32, ParallelTaskPtr) 171__OMP_RTL(__kmpc_push_num_threads, false, Void, IdentPtr, Int32, 172 /* Int */ Int32) 173__OMP_RTL(__kmpc_push_proc_bind, false, Void, IdentPtr, Int32, /* Int */ Int32) 174__OMP_RTL(__kmpc_serialized_parallel, false, Void, IdentPtr, Int32) 175__OMP_RTL(__kmpc_end_serialized_parallel, false, Void, IdentPtr, Int32) 176 177__OMP_RTL(omp_get_thread_num, false, Int32, ) 178 179#undef __OMP_RTL 180#undef OMP_RTL 181 182#define EnumAttr(Kind) Attribute::get(Ctx, Attribute::AttrKind::Kind) 183#define AttributeSet(...) \ 184 AttributeSet::get(Ctx, ArrayRef<Attribute>({__VA_ARGS__})) 185 186#ifndef OMP_ATTRS_SET 187#define OMP_ATTRS_SET(VarName, AttrSet) 188#endif 189 190#define __OMP_ATTRS_SET(VarName, AttrSet) OMP_ATTRS_SET(VarName, AttrSet) 191 192__OMP_ATTRS_SET(GetterAttrs, 193 OptimisticAttributes 194 ? AttributeSet(EnumAttr(NoUnwind), EnumAttr(ReadOnly), 195 EnumAttr(NoSync), EnumAttr(NoFree)) 196 : AttributeSet(EnumAttr(NoUnwind))) 197 198#undef __OMP_ATTRS_SET 199#undef OMP_ATTRS_SET 200 201#ifndef OMP_RTL_ATTRS 202#define OMP_RTL_ATTRS(Enum, FnAttrSet, RetAttrSet, ArgAttrSets) 203#endif 204 205#define __OMP_RTL_ATTRS(Name, FnAttrSet, RetAttrSet, ArgAttrSets) \ 206 OMP_RTL_ATTRS(OMPRTL_##Name, FnAttrSet, RetAttrSet, ArgAttrSets) 207 208__OMP_RTL_ATTRS(__kmpc_fork_call, AttributeSet(EnumAttr(NoUnwind)), 209 AttributeSet(), {}) 210 211__OMP_RTL_ATTRS(__kmpc_global_thread_num, GetterAttrs, AttributeSet(), {}) 212__OMP_RTL_ATTRS(omp_get_thread_num, GetterAttrs, AttributeSet(), {}) 213 214#undef __OMP_RTL_ATTRS 215#undef OMP_RTL_ATTRS 216#undef AttributeSet 217#undef EnumAttr 218 219///} 220 221/// KMP ident_t bit flags 222/// 223/// In accordance with the values in `openmp/runtime/src/kmp.h`. 224/// 225///{ 226 227#ifndef OMP_IDENT_FLAG 228#define OMP_IDENT_FLAG(Enum, Str, Value) 229#endif 230 231#define __OMP_IDENT_FLAG(Name, Value) \ 232 OMP_IDENT_FLAG(OMP_IDENT_FLAG_##Name, #Name, Value) 233 234__OMP_IDENT_FLAG(KMPC, 0x02) 235__OMP_IDENT_FLAG(BARRIER_EXPL, 0x20) 236__OMP_IDENT_FLAG(BARRIER_IMPL, 0x0040) 237__OMP_IDENT_FLAG(BARRIER_IMPL_MASK, 0x01C0) 238__OMP_IDENT_FLAG(BARRIER_IMPL_FOR, 0x0040) 239__OMP_IDENT_FLAG(BARRIER_IMPL_SECTIONS, 0x00C0) 240__OMP_IDENT_FLAG(BARRIER_IMPL_SINGLE, 0x0140) 241__OMP_IDENT_FLAG(BARRIER_IMPL_WORKSHARE, 0x01C0) 242 243#undef __OMP_IDENT_FLAG 244#undef OMP_IDENT_FLAG 245 246///} 247 248/// KMP cancel kind 249/// 250///{ 251 252#ifndef OMP_CANCEL_KIND 253#define OMP_CANCEL_KIND(Enum, Str, DirectiveEnum, Value) 254#endif 255 256#define __OMP_CANCEL_KIND(Name, Value) \ 257 OMP_CANCEL_KIND(OMP_CANCEL_KIND_##Name, #Name, OMPD_##Name, Value) 258 259__OMP_CANCEL_KIND(parallel, 1) 260__OMP_CANCEL_KIND(for, 2) 261__OMP_CANCEL_KIND(sections, 3) 262__OMP_CANCEL_KIND(taskgroup, 4) 263 264#undef __OMP_CANCEL_KIND 265#undef OMP_CANCEL_KIND 266 267///} 268 269/// Proc bind kinds 270/// 271///{ 272 273#ifndef OMP_PROC_BIND_KIND 274#define OMP_PROC_BIND_KIND(Enum, Str, Value) 275#endif 276 277#define __OMP_PROC_BIND_KIND(Name, Value) \ 278 OMP_PROC_BIND_KIND(OMP_PROC_BIND_##Name, #Name, Value) 279 280__OMP_PROC_BIND_KIND(master, 2) 281__OMP_PROC_BIND_KIND(close, 3) 282__OMP_PROC_BIND_KIND(spread, 4) 283__OMP_PROC_BIND_KIND(default, 6) 284__OMP_PROC_BIND_KIND(unknown, 7) 285 286#undef __OMP_PROC_BIND_KIND 287#undef OMP_PROC_BIND_KIND 288 289///} 290