Skip to content

Commit d836608

Browse files
authored
[openmp][wasm] Fix microtask type mismatch (#84355)
When OpenMP is compiled for WebAssembly (see #71297), it invokes a microtask via a `switch` statement that dispatches to the `void *` microtask pointer with spelled-out arguments (not varargs). As #83329 points out, however, this can result in a type mismatch when the indirect call is executed by WebAssembly; WebAssembly expects the called pointer to have the precise type of the call site. This change fixes the issue by bringing back the approach in [D142593] of type-casting all the `switch` arms to the precise type. This fixes #83329. [D142593]: https://reviews.llvm.org/D142593
1 parent a75d0a3 commit d836608

File tree

1 file changed

+77
-30
lines changed

1 file changed

+77
-30
lines changed

openmp/runtime/src/z_Linux_util.cpp

Lines changed: 77 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2610,6 +2610,43 @@ int __kmp_get_load_balance(int max) {
26102610
KMP_ARCH_PPC64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
26112611
KMP_ARCH_ARM || KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_PPC_XCOFF)
26122612

2613+
// Because WebAssembly will use `call_indirect` to invoke the microtask and
2614+
// WebAssembly indirect calls check that the called signature is a precise
2615+
// match, we need to cast each microtask function pointer back from `void *` to
2616+
// its original type.
2617+
typedef void (*microtask_t0)(int *, int *);
2618+
typedef void (*microtask_t1)(int *, int *, void *);
2619+
typedef void (*microtask_t2)(int *, int *, void *, void *);
2620+
typedef void (*microtask_t3)(int *, int *, void *, void *, void *);
2621+
typedef void (*microtask_t4)(int *, int *, void *, void *, void *, void *);
2622+
typedef void (*microtask_t5)(int *, int *, void *, void *, void *, void *,
2623+
void *);
2624+
typedef void (*microtask_t6)(int *, int *, void *, void *, void *, void *,
2625+
void *, void *);
2626+
typedef void (*microtask_t7)(int *, int *, void *, void *, void *, void *,
2627+
void *, void *, void *);
2628+
typedef void (*microtask_t8)(int *, int *, void *, void *, void *, void *,
2629+
void *, void *, void *, void *);
2630+
typedef void (*microtask_t9)(int *, int *, void *, void *, void *, void *,
2631+
void *, void *, void *, void *, void *);
2632+
typedef void (*microtask_t10)(int *, int *, void *, void *, void *, void *,
2633+
void *, void *, void *, void *, void *, void *);
2634+
typedef void (*microtask_t11)(int *, int *, void *, void *, void *, void *,
2635+
void *, void *, void *, void *, void *, void *,
2636+
void *);
2637+
typedef void (*microtask_t12)(int *, int *, void *, void *, void *, void *,
2638+
void *, void *, void *, void *, void *, void *,
2639+
void *, void *);
2640+
typedef void (*microtask_t13)(int *, int *, void *, void *, void *, void *,
2641+
void *, void *, void *, void *, void *, void *,
2642+
void *, void *, void *);
2643+
typedef void (*microtask_t14)(int *, int *, void *, void *, void *, void *,
2644+
void *, void *, void *, void *, void *, void *,
2645+
void *, void *, void *, void *);
2646+
typedef void (*microtask_t15)(int *, int *, void *, void *, void *, void *,
2647+
void *, void *, void *, void *, void *, void *,
2648+
void *, void *, void *, void *, void *);
2649+
26132650
// we really only need the case with 1 argument, because CLANG always build
26142651
// a struct of pointers to shared variables referenced in the outlined function
26152652
int __kmp_invoke_microtask(microtask_t pkfn, int gtid, int tid, int argc,
@@ -2629,66 +2666,76 @@ int __kmp_invoke_microtask(microtask_t pkfn, int gtid, int tid, int argc,
26292666
fflush(stderr);
26302667
exit(-1);
26312668
case 0:
2632-
(*pkfn)(&gtid, &tid);
2669+
(*(microtask_t0)pkfn)(&gtid, &tid);
26332670
break;
26342671
case 1:
2635-
(*pkfn)(&gtid, &tid, p_argv[0]);
2672+
(*(microtask_t1)pkfn)(&gtid, &tid, p_argv[0]);
26362673
break;
26372674
case 2:
2638-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1]);
2675+
(*(microtask_t2)pkfn)(&gtid, &tid, p_argv[0], p_argv[1]);
26392676
break;
26402677
case 3:
2641-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2]);
2678+
(*(microtask_t3)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2]);
26422679
break;
26432680
case 4:
2644-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3]);
2681+
(*(microtask_t4)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2682+
p_argv[3]);
26452683
break;
26462684
case 5:
2647-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4]);
2685+
(*(microtask_t5)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2686+
p_argv[3], p_argv[4]);
26482687
break;
26492688
case 6:
2650-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2651-
p_argv[5]);
2689+
(*(microtask_t6)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2690+
p_argv[3], p_argv[4], p_argv[5]);
26522691
break;
26532692
case 7:
2654-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2655-
p_argv[5], p_argv[6]);
2693+
(*(microtask_t7)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2694+
p_argv[3], p_argv[4], p_argv[5], p_argv[6]);
26562695
break;
26572696
case 8:
2658-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2659-
p_argv[5], p_argv[6], p_argv[7]);
2697+
(*(microtask_t8)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2698+
p_argv[3], p_argv[4], p_argv[5], p_argv[6],
2699+
p_argv[7]);
26602700
break;
26612701
case 9:
2662-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2663-
p_argv[5], p_argv[6], p_argv[7], p_argv[8]);
2702+
(*(microtask_t9)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2703+
p_argv[3], p_argv[4], p_argv[5], p_argv[6], p_argv[7],
2704+
p_argv[8]);
26642705
break;
26652706
case 10:
2666-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2667-
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9]);
2707+
(*(microtask_t10)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2708+
p_argv[3], p_argv[4], p_argv[5], p_argv[6],
2709+
p_argv[7], p_argv[8], p_argv[9]);
26682710
break;
26692711
case 11:
2670-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2671-
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10]);
2712+
(*(microtask_t11)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2713+
p_argv[3], p_argv[4], p_argv[5], p_argv[6],
2714+
p_argv[7], p_argv[8], p_argv[9], p_argv[10]);
26722715
break;
26732716
case 12:
2674-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2675-
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2676-
p_argv[11]);
2717+
(*(microtask_t12)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2718+
p_argv[3], p_argv[4], p_argv[5], p_argv[6],
2719+
p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2720+
p_argv[11]);
26772721
break;
26782722
case 13:
2679-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2680-
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2681-
p_argv[11], p_argv[12]);
2723+
(*(microtask_t13)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2724+
p_argv[3], p_argv[4], p_argv[5], p_argv[6],
2725+
p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2726+
p_argv[11], p_argv[12]);
26822727
break;
26832728
case 14:
2684-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2685-
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2686-
p_argv[11], p_argv[12], p_argv[13]);
2729+
(*(microtask_t14)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2730+
p_argv[3], p_argv[4], p_argv[5], p_argv[6],
2731+
p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2732+
p_argv[11], p_argv[12], p_argv[13]);
26872733
break;
26882734
case 15:
2689-
(*pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2], p_argv[3], p_argv[4],
2690-
p_argv[5], p_argv[6], p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2691-
p_argv[11], p_argv[12], p_argv[13], p_argv[14]);
2735+
(*(microtask_t15)pkfn)(&gtid, &tid, p_argv[0], p_argv[1], p_argv[2],
2736+
p_argv[3], p_argv[4], p_argv[5], p_argv[6],
2737+
p_argv[7], p_argv[8], p_argv[9], p_argv[10],
2738+
p_argv[11], p_argv[12], p_argv[13], p_argv[14]);
26922739
break;
26932740
}
26942741

0 commit comments

Comments
 (0)