LLVM OpenMP* Runtime Library
Loading...
Searching...
No Matches
kmp_invoke_microtask.cpp
1#include "kmp.h"
2
3#include <utility>
4
5#if !(KMP_ARCH_X86 || KMP_ARCH_X86_64 || KMP_MIC || KMP_ARCH_AARCH64 || \
6 KMP_ARCH_PPC64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
7 KMP_ARCH_ARM || KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_PPC_XCOFF || \
8 KMP_ARCH_AARCH64_32)
9
10template <size_t> using microtask_argument_t = void *;
11
12template <size_t... Indices>
13static void invokeMicrotask(microtask_t pkfn, int *gtid, int *tid,
14 void *p_argv[], std::index_sequence<Indices...>) {
15 // WebAssembly's `call_indirect` requires the callee type to exactly match the
16 // call site. Cast the variadic microtask_t to the fixed-arity signature that
17 // matches argc before invoking it.
18 using typed_microtask_t =
19 void (*)(int *, int *, microtask_argument_t<Indices>...);
20 (*(typed_microtask_t)pkfn)(gtid, tid, p_argv[Indices]...);
21}
22
23// Keep a bounded set of exact signatures for targets that cannot dynamically
24// construct a variable-argument microtask call.
25int __kmp_invoke_microtask(microtask_t pkfn, int gtid, int tid, int argc,
26 void *p_argv[]
27#if OMPT_SUPPORT
28 ,
29 void **exit_frame_ptr
30#endif
31) {
32#if OMPT_SUPPORT
33 *exit_frame_ptr = OMPT_GET_FRAME_ADDRESS(0);
34#endif
35
36#define KMP_INVOKE_MICROTASK_CASE(N) \
37 case N: \
38 invokeMicrotask(pkfn, &gtid, &tid, p_argv, std::make_index_sequence<N>{}); \
39 break
40
41 switch (argc) {
42 KMP_INVOKE_MICROTASK_CASE(0);
43 KMP_INVOKE_MICROTASK_CASE(1);
44 KMP_INVOKE_MICROTASK_CASE(2);
45 KMP_INVOKE_MICROTASK_CASE(3);
46 KMP_INVOKE_MICROTASK_CASE(4);
47 KMP_INVOKE_MICROTASK_CASE(5);
48 KMP_INVOKE_MICROTASK_CASE(6);
49 KMP_INVOKE_MICROTASK_CASE(7);
50 KMP_INVOKE_MICROTASK_CASE(8);
51 KMP_INVOKE_MICROTASK_CASE(9);
52 KMP_INVOKE_MICROTASK_CASE(10);
53 KMP_INVOKE_MICROTASK_CASE(11);
54 KMP_INVOKE_MICROTASK_CASE(12);
55 KMP_INVOKE_MICROTASK_CASE(13);
56 KMP_INVOKE_MICROTASK_CASE(14);
57 KMP_INVOKE_MICROTASK_CASE(15);
58 KMP_INVOKE_MICROTASK_CASE(16);
59 KMP_INVOKE_MICROTASK_CASE(17);
60 KMP_INVOKE_MICROTASK_CASE(18);
61 KMP_INVOKE_MICROTASK_CASE(19);
62 KMP_INVOKE_MICROTASK_CASE(20);
63 KMP_INVOKE_MICROTASK_CASE(21);
64 KMP_INVOKE_MICROTASK_CASE(22);
65 KMP_INVOKE_MICROTASK_CASE(23);
66 KMP_INVOKE_MICROTASK_CASE(24);
67 KMP_INVOKE_MICROTASK_CASE(25);
68 KMP_INVOKE_MICROTASK_CASE(26);
69 KMP_INVOKE_MICROTASK_CASE(27);
70 KMP_INVOKE_MICROTASK_CASE(28);
71 KMP_INVOKE_MICROTASK_CASE(29);
72 KMP_INVOKE_MICROTASK_CASE(30);
73 KMP_INVOKE_MICROTASK_CASE(31);
74 KMP_INVOKE_MICROTASK_CASE(32);
75 default:
76 fprintf(stderr, "Too many args to microtask: %d!\n", argc);
77 fflush(stderr);
78 exit(-1);
79 }
80
81#undef KMP_INVOKE_MICROTASK_CASE
82
83 return 1;
84}
85
86#endif