[Openmp-commits] [openmp] [OpenMP] Simplify generic microtask dispatch (PR #214004)
via Openmp-commits
openmp-commits at lists.llvm.org
Tue Aug 4 10:47:41 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]...);
+}
-// we really only need the case with 1 argument, because CLANG always build
-// a struct of pointers to shared variables referenced in the outlined function
----------------
arsnyder16 wrote:
was added 12 years ago to [z_Linux_util.c](https://github.com/llvm/llvm-project/commit/3051f9761ef43877ec3017d955999e07cb0b09ac#r194945222)
https://github.com/llvm/llvm-project/pull/214004
More information about the Openmp-commits
mailing list