@@ -2610,6 +2610,43 @@ int __kmp_get_load_balance(int max) {
2610
2610
KMP_ARCH_PPC64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
2611
2611
KMP_ARCH_ARM || KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_PPC_XCOFF)
2612
2612
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
+
2613
2650
// we really only need the case with 1 argument, because CLANG always build
2614
2651
// a struct of pointers to shared variables referenced in the outlined function
2615
2652
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,
2629
2666
fflush (stderr);
2630
2667
exit (-1 );
2631
2668
case 0 :
2632
- (*pkfn)(>id, &tid);
2669
+ (*(microtask_t0) pkfn)(>id, &tid);
2633
2670
break ;
2634
2671
case 1 :
2635
- (*pkfn)(>id, &tid, p_argv[0 ]);
2672
+ (*(microtask_t1) pkfn)(>id, &tid, p_argv[0 ]);
2636
2673
break ;
2637
2674
case 2 :
2638
- (*pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ]);
2675
+ (*(microtask_t2) pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ]);
2639
2676
break ;
2640
2677
case 3 :
2641
- (*pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ]);
2678
+ (*(microtask_t3) pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ]);
2642
2679
break ;
2643
2680
case 4 :
2644
- (*pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ], p_argv[3 ]);
2681
+ (*(microtask_t4)pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ],
2682
+ p_argv[3 ]);
2645
2683
break ;
2646
2684
case 5 :
2647
- (*pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ], p_argv[3 ], p_argv[4 ]);
2685
+ (*(microtask_t5)pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ],
2686
+ p_argv[3 ], p_argv[4 ]);
2648
2687
break ;
2649
2688
case 6 :
2650
- (*pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ], p_argv[ 3 ], p_argv[ 4 ],
2651
- p_argv[5 ]);
2689
+ (*(microtask_t6) pkfn)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ],
2690
+ p_argv[ 3 ], p_argv[ 4 ], p_argv[5 ]);
2652
2691
break ;
2653
2692
case 7 :
2654
- (*pkfn)(>id, &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)(>id, &tid, p_argv[0 ], p_argv[1 ], p_argv[2 ],
2694
+ p_argv[ 3 ], p_argv[ 4 ], p_argv[5 ], p_argv[6 ]);
2656
2695
break ;
2657
2696
case 8 :
2658
- (*pkfn)(>id, &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)(>id, &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 ]);
2660
2700
break ;
2661
2701
case 9 :
2662
- (*pkfn)(>id, &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)(>id, &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 ]);
2664
2705
break ;
2665
2706
case 10 :
2666
- (*pkfn)(>id, &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)(>id, &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 ]);
2668
2710
break ;
2669
2711
case 11 :
2670
- (*pkfn)(>id, &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)(>id, &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 ]);
2672
2715
break ;
2673
2716
case 12 :
2674
- (*pkfn)(>id, &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)(>id, &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 ]);
2677
2721
break ;
2678
2722
case 13 :
2679
- (*pkfn)(>id, &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)(>id, &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 ]);
2682
2727
break ;
2683
2728
case 14 :
2684
- (*pkfn)(>id, &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)(>id, &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 ]);
2687
2733
break ;
2688
2734
case 15 :
2689
- (*pkfn)(>id, &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)(>id, &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 ]);
2692
2739
break ;
2693
2740
}
2694
2741
0 commit comments