mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-22 04:22:57 +02:00
e23e38391a
This is the initial patch for the OpenMP-IR-Builder, as discussed on the mailing list ([1] and later) and at the US Dev Meeting'19. The design is similar to D61953 but: - in a non-WIP status, with proper documentation and working. - using a OpenMPKinds.def file to manage lists of directives, runtime functions, types, ..., similar to the current Clang implementation. - restricted to handle only (simple) barriers, to implement most `#pragma omp barrier` directives and most implicit barriers. - properly hooked into Clang to be used if possible (D69922). - compatible with the remaining code generation. Parts have been extracted into D69853. The plan is to have multiple people working on moving logic from Clang here once the initial scaffolding (=this patch) landed. [1] http://lists.flang-compiler.org/pipermail/flang-dev_lists.flang-compiler.org/2019-May/000197.html Reviewers: kiranchandramohan, ABataev, RaviNarayanaswamy, gtbercea, grokos, sdmitriev, JonChesterfield, hfinkel, fghanim Subscribers: mgorny, hiraditya, bollu, guansong, jfb, cfe-commits, llvm-commits, penzn, ppenzin Tags: #clang, #llvm Differential Revision: https://reviews.llvm.org/D69785
237 lines
7.5 KiB
C++
237 lines
7.5 KiB
C++
//===--- 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_barrier, false, Int32, IdentPtr, Int32)
|
|
__OMP_RTL(__kmpc_global_thread_num, false, Int32, IdentPtr)
|
|
__OMP_RTL(__kmpc_fork_call, true, Void, IdentPtr, Int32, ParallelTaskPtr)
|
|
__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_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
|
|
|
|
///}
|