[Openmp-commits] [openmp] [OpenMP] Support up to 32 arguments in the generic microtask dispatcher (PR #211071)
Sam Clegg via Openmp-commits
openmp-commits at lists.llvm.org
Mon Aug 3 08:30:01 PDT 2026
================
@@ -1,49 +1,27 @@
#include "kmp.h"
+#include <utility>
+
#if !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_MIC || KMP_ARCH_AARCH64 || \
KMP_ARCH_PPC64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
KMP_ARCH_ARM || KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_PPC_XCOFF || \
KMP_ARCH_AARCH64_32)
-// Because WebAssembly will use `call_indirect` to invoke the microtask and
-// WebAssembly indirect calls check that the called signature is a precise
-// match, we need to cast each microtask function pointer back from `void *` to
-// its original type.
-typedef void (*microtask_t0)(int *, int *);
-typedef void (*microtask_t1)(int *, int *, void *);
-typedef void (*microtask_t2)(int *, int *, void *, void *);
-typedef void (*microtask_t3)(int *, int *, void *, void *, void *);
-typedef void (*microtask_t4)(int *, int *, void *, void *, void *, void *);
-typedef void (*microtask_t5)(int *, int *, void *, void *, void *, void *,
- void *);
-typedef void (*microtask_t6)(int *, int *, void *, void *, void *, void *,
- void *, void *);
-typedef void (*microtask_t7)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *);
-typedef void (*microtask_t8)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *);
-typedef void (*microtask_t9)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *);
-typedef void (*microtask_t10)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *, void *);
-typedef void (*microtask_t11)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *, void *,
- void *);
-typedef void (*microtask_t12)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *, void *,
- void *, void *);
-typedef void (*microtask_t13)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *, void *,
- void *, void *, void *);
-typedef void (*microtask_t14)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *, void *,
- void *, void *, void *, void *);
-typedef void (*microtask_t15)(int *, int *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *, void *,
- void *, void *, void *, void *, void *);
+template <size_t> using microtask_argument_t = void *;
+
+template <size_t... Indices>
+static void invokeMicrotask(microtask_t pkfn, int *gtid, int *tid,
+ void *p_argv[], std::index_sequence<Indices...>) {
+ // WebAssembly's `call_indirect` requires the callee type to exactly match the
+ // call site. Cast the variadic microtask_t to the fixed-arity signature that
+ // matches argc before invoking it.
+ using typed_microtask_t =
+ void (*)(int *, int *, microtask_argument_t<Indices>...);
+ (*(typed_microtask_t)pkfn)(gtid, tid, p_argv[Indices]...);
+}
----------------
sbc100 wrote:
You could land this templatization as a separate cleanup PR first?
https://github.com/llvm/llvm-project/pull/211071
More information about the Openmp-commits
mailing list