mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 12:41:49 +01:00
[openmp] Remove clause from OMPKinds.def and use OMP.td info
Remove the OpenMP clause information from the OMPKinds.def file and use the information from the new OMP.td file. There is now a single source of truth for the directives and clauses. To avoid generate lots of specific small code from tablegen, the macros previously used in OMPKinds.def are generated almost as identical. This can be polished and possibly removed in a further patch. Reviewed By: jdoerfert Differential Revision: https://reviews.llvm.org/D92955
This commit is contained in:
parent
5cbcf5677b
commit
328670a855
@ -1,4 +1,4 @@
|
||||
set(LLVM_TARGET_DEFINITIONS OMP.td)
|
||||
tablegen(LLVM OMP.h.inc --gen-directive-decl)
|
||||
tablegen(LLVM OMP.cpp.inc --gen-directive-gen)
|
||||
tablegen(LLVM OMP.inc --gen-directive-gen)
|
||||
add_public_tablegen_target(omp_gen)
|
||||
|
@ -7,130 +7,16 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
/// \file
|
||||
///
|
||||
/// This file defines the list of supported OpenMP directives, clauses, runtime
|
||||
/// This file defines the list of supported OpenMP runtime
|
||||
/// calls, and other things that need to be listed in enums.
|
||||
///
|
||||
/// This file is under transition to OMP.td with TableGen code generation.
|
||||
///
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
/// OpenMP Directives and combined directives
|
||||
/// OpenMP Directives, combined directives and Clauses
|
||||
/// - Moved to OMP.td
|
||||
|
||||
/// OpenMP Clauses
|
||||
///
|
||||
///{
|
||||
|
||||
#ifndef OMP_CLAUSE
|
||||
#define OMP_CLAUSE(Enum, Str, Implicit)
|
||||
#endif
|
||||
#ifndef OMP_CLAUSE_CLASS
|
||||
#define OMP_CLAUSE_CLASS(Enum, Str, Class)
|
||||
#endif
|
||||
#ifndef OMP_CLAUSE_NO_CLASS
|
||||
#define OMP_CLAUSE_NO_CLASS(Enum, Str)
|
||||
#endif
|
||||
|
||||
#define __OMP_CLAUSE(Name, Class) \
|
||||
OMP_CLAUSE(OMPC_##Name, #Name, /* Implicit */ false) \
|
||||
OMP_CLAUSE_CLASS(OMPC_##Name, #Name, Class)
|
||||
#define __OMP_CLAUSE_NO_CLASS(Name) \
|
||||
OMP_CLAUSE(OMPC_##Name, #Name, /* Implicit */ false) \
|
||||
OMP_CLAUSE_NO_CLASS(OMPC_##Name, #Name)
|
||||
#define __OMP_IMPLICIT_CLAUSE_CLASS(Name, Str, Class) \
|
||||
OMP_CLAUSE(OMPC_##Name, Str, /* Implicit */ true) \
|
||||
OMP_CLAUSE_CLASS(OMPC_##Name, Str, Class)
|
||||
#define __OMP_IMPLICIT_CLAUSE_NO_CLASS(Name, Str) \
|
||||
OMP_CLAUSE(OMPC_##Name, Str, /* Implicit */ true) \
|
||||
OMP_CLAUSE_NO_CLASS(OMPC_##Name, Str)
|
||||
|
||||
__OMP_CLAUSE(allocator, OMPAllocatorClause)
|
||||
__OMP_CLAUSE(if, OMPIfClause)
|
||||
__OMP_CLAUSE(final, OMPFinalClause)
|
||||
__OMP_CLAUSE(num_threads, OMPNumThreadsClause)
|
||||
__OMP_CLAUSE(safelen, OMPSafelenClause)
|
||||
__OMP_CLAUSE(simdlen, OMPSimdlenClause)
|
||||
__OMP_CLAUSE(collapse, OMPCollapseClause)
|
||||
__OMP_CLAUSE(default, OMPDefaultClause)
|
||||
__OMP_CLAUSE(private, OMPPrivateClause)
|
||||
__OMP_CLAUSE(firstprivate, OMPFirstprivateClause)
|
||||
__OMP_CLAUSE(lastprivate, OMPLastprivateClause)
|
||||
__OMP_CLAUSE(shared, OMPSharedClause)
|
||||
__OMP_CLAUSE(reduction, OMPReductionClause)
|
||||
__OMP_CLAUSE(linear, OMPLinearClause)
|
||||
__OMP_CLAUSE(aligned, OMPAlignedClause)
|
||||
__OMP_CLAUSE(copyin, OMPCopyinClause)
|
||||
__OMP_CLAUSE(copyprivate, OMPCopyprivateClause)
|
||||
__OMP_CLAUSE(proc_bind, OMPProcBindClause)
|
||||
__OMP_CLAUSE(schedule, OMPScheduleClause)
|
||||
__OMP_CLAUSE(ordered, OMPOrderedClause)
|
||||
__OMP_CLAUSE(nowait, OMPNowaitClause)
|
||||
__OMP_CLAUSE(untied, OMPUntiedClause)
|
||||
__OMP_CLAUSE(mergeable, OMPMergeableClause)
|
||||
__OMP_CLAUSE(read, OMPReadClause)
|
||||
__OMP_CLAUSE(write, OMPWriteClause)
|
||||
__OMP_CLAUSE(update, OMPUpdateClause)
|
||||
__OMP_CLAUSE(capture, OMPCaptureClause)
|
||||
__OMP_CLAUSE(seq_cst, OMPSeqCstClause)
|
||||
__OMP_CLAUSE(acq_rel, OMPAcqRelClause)
|
||||
__OMP_CLAUSE(acquire, OMPAcquireClause)
|
||||
__OMP_CLAUSE(release, OMPReleaseClause)
|
||||
__OMP_CLAUSE(relaxed, OMPRelaxedClause)
|
||||
__OMP_CLAUSE(depend, OMPDependClause)
|
||||
__OMP_CLAUSE(device, OMPDeviceClause)
|
||||
__OMP_CLAUSE(threads, OMPThreadsClause)
|
||||
__OMP_CLAUSE(simd, OMPSIMDClause)
|
||||
__OMP_CLAUSE(map, OMPMapClause)
|
||||
__OMP_CLAUSE(num_teams, OMPNumTeamsClause)
|
||||
__OMP_CLAUSE(thread_limit, OMPThreadLimitClause)
|
||||
__OMP_CLAUSE(priority, OMPPriorityClause)
|
||||
__OMP_CLAUSE(grainsize, OMPGrainsizeClause)
|
||||
__OMP_CLAUSE(nogroup, OMPNogroupClause)
|
||||
__OMP_CLAUSE(num_tasks, OMPNumTasksClause)
|
||||
__OMP_CLAUSE(hint, OMPHintClause)
|
||||
__OMP_CLAUSE(dist_schedule, OMPDistScheduleClause)
|
||||
__OMP_CLAUSE(defaultmap, OMPDefaultmapClause)
|
||||
__OMP_CLAUSE(to, OMPToClause)
|
||||
__OMP_CLAUSE(from, OMPFromClause)
|
||||
__OMP_CLAUSE(use_device_ptr, OMPUseDevicePtrClause)
|
||||
__OMP_CLAUSE(is_device_ptr, OMPIsDevicePtrClause)
|
||||
__OMP_CLAUSE(task_reduction, OMPTaskReductionClause)
|
||||
__OMP_CLAUSE(in_reduction, OMPInReductionClause)
|
||||
__OMP_CLAUSE(unified_address, OMPUnifiedAddressClause)
|
||||
__OMP_CLAUSE(unified_shared_memory, OMPUnifiedSharedMemoryClause)
|
||||
__OMP_CLAUSE(reverse_offload, OMPReverseOffloadClause)
|
||||
__OMP_CLAUSE(dynamic_allocators, OMPDynamicAllocatorsClause)
|
||||
__OMP_CLAUSE(atomic_default_mem_order, OMPAtomicDefaultMemOrderClause)
|
||||
__OMP_CLAUSE(allocate, OMPAllocateClause)
|
||||
__OMP_CLAUSE(nontemporal, OMPNontemporalClause)
|
||||
__OMP_CLAUSE(order, OMPOrderClause)
|
||||
__OMP_CLAUSE(destroy, OMPDestroyClause)
|
||||
__OMP_CLAUSE(detach, OMPDetachClause)
|
||||
__OMP_CLAUSE(inclusive, OMPInclusiveClause)
|
||||
__OMP_CLAUSE(exclusive, OMPExclusiveClause)
|
||||
__OMP_CLAUSE(uses_allocators, OMPUsesAllocatorsClause)
|
||||
__OMP_CLAUSE(affinity, OMPAffinityClause)
|
||||
__OMP_CLAUSE(use_device_addr, OMPUseDeviceAddrClause)
|
||||
|
||||
__OMP_CLAUSE_NO_CLASS(uniform)
|
||||
__OMP_CLAUSE_NO_CLASS(device_type)
|
||||
__OMP_CLAUSE_NO_CLASS(match)
|
||||
|
||||
__OMP_IMPLICIT_CLAUSE_CLASS(depobj, "depobj", OMPDepobjClause)
|
||||
__OMP_IMPLICIT_CLAUSE_CLASS(flush, "flush", OMPFlushClause)
|
||||
|
||||
__OMP_IMPLICIT_CLAUSE_NO_CLASS(threadprivate, "threadprivate or thread local")
|
||||
__OMP_IMPLICIT_CLAUSE_NO_CLASS(unknown, "unknown")
|
||||
|
||||
#undef __OMP_IMPLICIT_CLAUSE_NO_CLASS
|
||||
#undef __OMP_IMPLICIT_CLAUSE_CLASS
|
||||
#undef __OMP_CLAUSE
|
||||
#undef OMP_CLAUSE_NO_CLASS
|
||||
#undef OMP_CLAUSE_CLASS
|
||||
#undef OMP_CLAUSE
|
||||
|
||||
///}
|
||||
|
||||
/// Types used in runtime structs or runtime functions
|
||||
///
|
||||
///{
|
||||
|
@ -182,7 +182,7 @@ public:
|
||||
return Def->getValueAsString("defaultValue");
|
||||
}
|
||||
|
||||
bool isImplict() const { return Def->getValueAsBit("isImplicit"); }
|
||||
bool isImplicit() const { return Def->getValueAsBit("isImplicit"); }
|
||||
};
|
||||
|
||||
// Wrapper class that contains VersionedClause's information defined in
|
||||
|
@ -23,10 +23,15 @@ def TDLC_ClauseB : Clause<"clauseb"> {
|
||||
let isValueList = 1;
|
||||
}
|
||||
def TDLC_ClauseC : Clause<"clausec"> {
|
||||
let clangClass = "ClauseC";
|
||||
let flangClassValue = "Name";
|
||||
let defaultValue = "*";
|
||||
let isValueOptional = 1;
|
||||
}
|
||||
def TDLC_ClauseD : Clause<"claused"> {
|
||||
let clangClass = "ClauseD";
|
||||
let isImplicit = 1;
|
||||
}
|
||||
|
||||
def TDL_DirA : Directive<"dira"> {
|
||||
let allowedClauses = [
|
||||
@ -53,9 +58,10 @@ def TDL_DirA : Directive<"dira"> {
|
||||
// CHECK-NEXT: TDLC_clausea,
|
||||
// CHECK-NEXT: TDLC_clauseb,
|
||||
// CHECK-NEXT: TDLC_clausec,
|
||||
// CHECK-NEXT: TDLC_claused,
|
||||
// CHECK-NEXT: };
|
||||
// CHECK-EMPTY:
|
||||
// CHECK-NEXT: static constexpr std::size_t Clause_enumSize = 3;
|
||||
// CHECK-NEXT: static constexpr std::size_t Clause_enumSize = 4;
|
||||
// CHECK-EMPTY:
|
||||
// CHECK-NEXT: // Enumeration helper functions
|
||||
// CHECK-NEXT: Directive getTdlDirectiveKind(llvm::StringRef Str);
|
||||
@ -101,6 +107,7 @@ def TDL_DirA : Directive<"dira"> {
|
||||
// IMPL-NEXT: .Case("clausea",TDLC_clauseb)
|
||||
// IMPL-NEXT: .Case("clauseb",TDLC_clauseb)
|
||||
// IMPL-NEXT: .Case("clausec",TDLC_clausec)
|
||||
// IMPL-NEXT: .Case("claused",TDLC_clauseb)
|
||||
// IMPL-NEXT: .Default(TDLC_clauseb);
|
||||
// IMPL-NEXT: }
|
||||
// IMPL-EMPTY:
|
||||
@ -112,6 +119,8 @@ def TDL_DirA : Directive<"dira"> {
|
||||
// IMPL-NEXT: return "clauseb";
|
||||
// IMPL-NEXT: case TDLC_clausec:
|
||||
// IMPL-NEXT: return "clausec";
|
||||
// IMPL-NEXT: case TDLC_claused:
|
||||
// IMPL-NEXT: return "claused";
|
||||
// IMPL-NEXT: }
|
||||
// IMPL-NEXT: llvm_unreachable("Invalid Tdl Clause kind");
|
||||
// IMPL-NEXT: }
|
||||
@ -183,6 +192,7 @@ def TDL_DirA : Directive<"dira"> {
|
||||
// GEN-NEXT: EMPTY_CLASS(Clausea);
|
||||
// GEN-NEXT: WRAPPER_CLASS(Clauseb, std::list<IntExpr>);
|
||||
// GEN-NEXT: WRAPPER_CLASS(Clausec, std::optional<Name>);
|
||||
// GEN-NEXT: EMPTY_CLASS(Claused);
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #endif // GEN_FLANG_CLAUSE_PARSER_CLASSES
|
||||
// GEN-EMPTY:
|
||||
@ -192,6 +202,7 @@ def TDL_DirA : Directive<"dira"> {
|
||||
// GEN-NEXT: Clausea
|
||||
// GEN-NEXT: , Clauseb
|
||||
// GEN-NEXT: , Clausec
|
||||
// GEN-NEXT: , Claused
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #endif // GEN_FLANG_CLAUSE_PARSER_CLASSES_LIST
|
||||
// GEN-EMPTY:
|
||||
@ -201,6 +212,7 @@ def TDL_DirA : Directive<"dira"> {
|
||||
// GEN-NEXT: NODE(TdlClause, Clausea)
|
||||
// GEN-NEXT: NODE(TdlClause, Clauseb)
|
||||
// GEN-NEXT: NODE(TdlClause, Clausec)
|
||||
// GEN-NEXT: NODE(TdlClause, Claused)
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #endif // GEN_FLANG_DUMP_PARSE_TREE_CLAUSES
|
||||
// GEN-EMPTY:
|
||||
@ -223,5 +235,47 @@ def TDL_DirA : Directive<"dira"> {
|
||||
// GEN-NEXT: Put("*");
|
||||
// GEN-NEXT: Put(")");
|
||||
// GEN-NEXT: }
|
||||
// GEN-NEXT: void Before(const TdlClause::Claused &) { Word("CLAUSED"); }
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #endif // GEN_FLANG_CLAUSE_UNPARSE
|
||||
|
||||
// GEN: #ifdef GEN_CLANG_CLAUSE_CLASS
|
||||
// GEN-NEXT: #undef GEN_CLANG_CLAUSE_CLASS
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #ifndef CLAUSE
|
||||
// GEN-NEXT: #define CLAUSE(Enum, Str, Implicit)
|
||||
// GEN-NEXT: #endif
|
||||
// GEN-NEXT: #ifndef CLAUSE_CLASS
|
||||
// GEN-NEXT: #define CLAUSE_CLASS(Enum, Str, Class)
|
||||
// GEN-NEXT: #endif
|
||||
// GEN-NEXT: #ifndef CLAUSE_NO_CLASS
|
||||
// GEN-NEXT: #define CLAUSE_NO_CLASS(Enum, Str)
|
||||
// GEN-NEXT: #endif
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #define __CLAUSE(Name, Class) \
|
||||
// GEN-NEXT: CLAUSE(TDLC_##Name, #Name, /* Implicit */ false) \
|
||||
// GEN-NEXT: CLAUSE_CLASS(TDLC_##Name, #Name, Class)
|
||||
// GEN-NEXT: #define __CLAUSE_NO_CLASS(Name) \
|
||||
// GEN-NEXT: CLAUSE(TDLC_##Name, #Name, /* Implicit */ false) \
|
||||
// GEN-NEXT: CLAUSE_NO_CLASS(TDLC_##Name, #Name)
|
||||
// GEN-NEXT: #define __IMPLICIT_CLAUSE_CLASS(Name, Str, Class) \
|
||||
// GEN-NEXT: CLAUSE(TDLC_##Name, Str, /* Implicit */ true) \
|
||||
// GEN-NEXT: CLAUSE_CLASS(TDLC_##Name, Str, Class)
|
||||
// GEN-NEXT: #define __IMPLICIT_CLAUSE_NO_CLASS(Name, Str) \
|
||||
// GEN-NEXT: CLAUSE(TDLC_##Name, Str, /* Implicit */ true) \
|
||||
// GEN-NEXT: CLAUSE_NO_CLASS(TDLC_##Name, Str)
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: __IMPLICIT_CLAUSE_NO_CLASS(clausea, "clausea")
|
||||
// GEN-NEXT: __CLAUSE_NO_CLASS(clauseb)
|
||||
// GEN-NEXT: __CLAUSE(clausec, ClauseC)
|
||||
// GEN-NEXT: __IMPLICIT_CLAUSE_CLASS(claused, "claused", ClauseD)
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #undef __IMPLICIT_CLAUSE_NO_CLASS
|
||||
// GEN-NEXT: #undef __IMPLICIT_CLAUSE_CLASS
|
||||
// GEN-NEXT: #undef __CLAUSE
|
||||
// GEN-NEXT: #undef CLAUSE_NO_CLASS
|
||||
// GEN-NEXT: #undef CLAUSE_CLASS
|
||||
// GEN-NEXT: #undef CLAUSE
|
||||
// GEN-EMPTY:
|
||||
// GEN-NEXT: #endif // GEN_CLANG_CLAUSE_CLASS
|
||||
|
||||
|
@ -645,6 +645,72 @@ void EmitDirectivesFlangImpl(const DirectiveLanguage &DirLang,
|
||||
GenerateFlangClauseUnparse(DirLang, OS);
|
||||
}
|
||||
|
||||
void GenerateClauseClassMacro(const DirectiveLanguage &DirLang,
|
||||
raw_ostream &OS) {
|
||||
// Generate macros style information for legacy code in clang
|
||||
IfDefScope Scope("GEN_CLANG_CLAUSE_CLASS", OS);
|
||||
|
||||
OS << "\n";
|
||||
|
||||
OS << "#ifndef CLAUSE\n";
|
||||
OS << "#define CLAUSE(Enum, Str, Implicit)\n";
|
||||
OS << "#endif\n";
|
||||
OS << "#ifndef CLAUSE_CLASS\n";
|
||||
OS << "#define CLAUSE_CLASS(Enum, Str, Class)\n";
|
||||
OS << "#endif\n";
|
||||
OS << "#ifndef CLAUSE_NO_CLASS\n";
|
||||
OS << "#define CLAUSE_NO_CLASS(Enum, Str)\n";
|
||||
OS << "#endif\n";
|
||||
OS << "\n";
|
||||
OS << "#define __CLAUSE(Name, Class) \\\n";
|
||||
OS << " CLAUSE(" << DirLang.getClausePrefix()
|
||||
<< "##Name, #Name, /* Implicit */ false) \\\n";
|
||||
OS << " CLAUSE_CLASS(" << DirLang.getClausePrefix()
|
||||
<< "##Name, #Name, Class)\n";
|
||||
OS << "#define __CLAUSE_NO_CLASS(Name) \\\n";
|
||||
OS << " CLAUSE(" << DirLang.getClausePrefix()
|
||||
<< "##Name, #Name, /* Implicit */ false) \\\n";
|
||||
OS << " CLAUSE_NO_CLASS(" << DirLang.getClausePrefix() << "##Name, #Name)\n";
|
||||
OS << "#define __IMPLICIT_CLAUSE_CLASS(Name, Str, Class) \\\n";
|
||||
OS << " CLAUSE(" << DirLang.getClausePrefix()
|
||||
<< "##Name, Str, /* Implicit */ true) \\\n";
|
||||
OS << " CLAUSE_CLASS(" << DirLang.getClausePrefix()
|
||||
<< "##Name, Str, Class)\n";
|
||||
OS << "#define __IMPLICIT_CLAUSE_NO_CLASS(Name, Str) \\\n";
|
||||
OS << " CLAUSE(" << DirLang.getClausePrefix()
|
||||
<< "##Name, Str, /* Implicit */ true) \\\n";
|
||||
OS << " CLAUSE_NO_CLASS(" << DirLang.getClausePrefix() << "##Name, Str)\n";
|
||||
OS << "\n";
|
||||
|
||||
for (const auto &R : DirLang.getClauses()) {
|
||||
Clause C{R};
|
||||
if (C.getClangClass().empty()) { // NO_CLASS
|
||||
if (C.isImplicit()) {
|
||||
OS << "__IMPLICIT_CLAUSE_NO_CLASS(" << C.getFormattedName() << ", \""
|
||||
<< C.getFormattedName() << "\")\n";
|
||||
} else {
|
||||
OS << "__CLAUSE_NO_CLASS(" << C.getFormattedName() << ")\n";
|
||||
}
|
||||
} else { // CLASS
|
||||
if (C.isImplicit()) {
|
||||
OS << "__IMPLICIT_CLAUSE_CLASS(" << C.getFormattedName() << ", \""
|
||||
<< C.getFormattedName() << "\", " << C.getClangClass() << ")\n";
|
||||
} else {
|
||||
OS << "__CLAUSE(" << C.getFormattedName() << ", " << C.getClangClass()
|
||||
<< ")\n";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OS << "\n";
|
||||
OS << "#undef __IMPLICIT_CLAUSE_NO_CLASS\n";
|
||||
OS << "#undef __IMPLICIT_CLAUSE_CLASS\n";
|
||||
OS << "#undef __CLAUSE\n";
|
||||
OS << "#undef CLAUSE_NO_CLASS\n";
|
||||
OS << "#undef CLAUSE_CLASS\n";
|
||||
OS << "#undef CLAUSE\n";
|
||||
}
|
||||
|
||||
// Generate the implemenation section for the enumeration in the directive
|
||||
// language.
|
||||
void EmitDirectivesGen(RecordKeeper &Records, raw_ostream &OS) {
|
||||
@ -653,6 +719,8 @@ void EmitDirectivesGen(RecordKeeper &Records, raw_ostream &OS) {
|
||||
return;
|
||||
|
||||
EmitDirectivesFlangImpl(DirLang, OS);
|
||||
|
||||
GenerateClauseClassMacro(DirLang, OS);
|
||||
}
|
||||
|
||||
// Generate the implemenation for the enumeration in the directive
|
||||
|
Loading…
x
Reference in New Issue
Block a user