Skip to content

Commit 86b71be

Browse files
[openmp][wasm] Conditionally compile many features in WebAssembly
This change sets up definitions for the many preprocessor conditions used in OpenMP and compiles out features that will not be supported in a WebAssembly target. The `KMP_ARCH_WASM` target is tied to `wasm32` and ensures 32-bit pointers are used. The `KMP_OS_WASI` target is more tricky: it attempts to cover the subset of functionality that is compilable by both Emscripten and wasi-sdk. Since Emscripten currently has support for more of libc than wasi-sdk, the "WASI" name is used to indicate that only the wasi-sdk subset is used here. This change follows along the same lines as [D142593], though it takes things a bit further, compiles with multiple toolchains (Emscripten _and_ wasi-sdk), handles some new cases, and avoids for now the `microtask_*` changes from that PR. Many thanks to @arsnyder16 for providing some initial indication that this all was possible! [D142593]: https://reviews.llvm.org/D142593 Co-authored-by: Atanas Atanasov <[email protected]>
1 parent e058742 commit 86b71be

File tree

9 files changed

+116
-52
lines changed

9 files changed

+116
-52
lines changed

openmp/runtime/src/kmp.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,15 @@
6363
#undef KMP_CANCEL_THREADS
6464
#endif
6565

66+
// Some WASI targets (e.g., wasm32-wasi-threads) do not support thread
67+
// cancellation.
68+
#if KMP_OS_WASI
69+
#undef KMP_CANCEL_THREADS
70+
#endif
71+
72+
#if !KMP_OS_WASI
6673
#include <signal.h>
74+
#endif
6775
#include <stdarg.h>
6876
#include <stddef.h>
6977
#include <stdio.h>
@@ -124,7 +132,7 @@ class kmp_stats_list;
124132
#endif
125133
#include "kmp_i18n.h"
126134

127-
#define KMP_HANDLE_SIGNALS (KMP_OS_UNIX || KMP_OS_WINDOWS)
135+
#define KMP_HANDLE_SIGNALS ((KMP_OS_UNIX && !KMP_OS_WASI) || KMP_OS_WINDOWS)
128136

129137
#include "kmp_wrapper_malloc.h"
130138
#if KMP_OS_UNIX
@@ -601,7 +609,9 @@ typedef int PACKED_REDUCTION_METHOD_T;
601609
#endif
602610

603611
#if KMP_OS_UNIX
612+
#if !KMP_OS_WASI
604613
#include <dlfcn.h>
614+
#endif
605615
#include <pthread.h>
606616
#endif
607617

@@ -1340,6 +1350,10 @@ extern kmp_uint64 __kmp_now_nsec();
13401350
/* TODO: tune for KMP_OS_SOLARIS */
13411351
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
13421352
#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
1353+
#elif KMP_OS_WASI
1354+
/* TODO: tune for KMP_OS_WASI */
1355+
#define KMP_INIT_WAIT 1024U /* initial number of spin-tests */
1356+
#define KMP_NEXT_WAIT 512U /* susequent number of spin-tests */
13431357
#endif
13441358

13451359
#if KMP_ARCH_X86 || KMP_ARCH_X86_64

openmp/runtime/src/kmp_ftn_entry.h

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -593,7 +593,7 @@ int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_THREAD_NUM)(void) {
593593
return 0;
594594
}
595595
--gtid; // We keep (gtid+1) in TLS
596-
#elif KMP_OS_LINUX
596+
#elif KMP_OS_LINUX || KMP_OS_WASI
597597
#ifdef KMP_TDATA_GTID
598598
if (__kmp_gtid_mode >= 3) {
599599
if ((gtid = __kmp_gtid) == KMP_GTID_DNE) {
@@ -1043,7 +1043,7 @@ void FTN_STDCALL KMP_EXPAND_NAME(FTN_SET_DEFAULT_DEVICE)(int KMP_DEREF arg) {
10431043
int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void)
10441044
KMP_WEAK_ATTRIBUTE_EXTERNAL;
10451045
int FTN_STDCALL KMP_EXPAND_NAME(FTN_GET_NUM_DEVICES)(void) {
1046-
#if KMP_MIC || KMP_OS_DARWIN || defined(KMP_STUB)
1046+
#if KMP_MIC || KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
10471047
return 0;
10481048
#else
10491049
int (*fptr)();
@@ -1558,7 +1558,7 @@ typedef void *omp_interop_t;
15581558

15591559
// libomptarget, if loaded, provides this function
15601560
int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) {
1561-
#if KMP_OS_DARWIN || defined(KMP_STUB)
1561+
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
15621562
return 0;
15631563
#else
15641564
int (*fptr)(const omp_interop_t);
@@ -1573,7 +1573,7 @@ int FTN_STDCALL FTN_GET_NUM_INTEROP_PROPERTIES(const omp_interop_t interop) {
15731573
intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop,
15741574
omp_interop_property_t property_id,
15751575
int *err) {
1576-
#if KMP_OS_DARWIN || defined(KMP_STUB)
1576+
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
15771577
return 0;
15781578
#else
15791579
intptr_t (*fptr)(const omp_interop_t, omp_interop_property_t, int *);
@@ -1587,7 +1587,7 @@ intptr_t FTN_STDCALL FTN_GET_INTEROP_INT(const omp_interop_t interop,
15871587
void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop,
15881588
omp_interop_property_t property_id,
15891589
int *err) {
1590-
#if KMP_OS_DARWIN || defined(KMP_STUB)
1590+
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
15911591
return nullptr;
15921592
#else
15931593
void *(*fptr)(const omp_interop_t, omp_interop_property_t, int *);
@@ -1601,7 +1601,7 @@ void *FTN_STDCALL FTN_GET_INTEROP_PTR(const omp_interop_t interop,
16011601
const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop,
16021602
omp_interop_property_t property_id,
16031603
int *err) {
1604-
#if KMP_OS_DARWIN || defined(KMP_STUB)
1604+
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
16051605
return nullptr;
16061606
#else
16071607
const char *(*fptr)(const omp_interop_t, omp_interop_property_t, int *);
@@ -1614,7 +1614,7 @@ const char *FTN_STDCALL FTN_GET_INTEROP_STR(const omp_interop_t interop,
16141614
// libomptarget, if loaded, provides this function
16151615
const char *FTN_STDCALL FTN_GET_INTEROP_NAME(
16161616
const omp_interop_t interop, omp_interop_property_t property_id) {
1617-
#if KMP_OS_DARWIN || defined(KMP_STUB)
1617+
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
16181618
return nullptr;
16191619
#else
16201620
const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
@@ -1627,7 +1627,7 @@ const char *FTN_STDCALL FTN_GET_INTEROP_NAME(
16271627
// libomptarget, if loaded, provides this function
16281628
const char *FTN_STDCALL FTN_GET_INTEROP_TYPE_DESC(
16291629
const omp_interop_t interop, omp_interop_property_t property_id) {
1630-
#if KMP_OS_DARWIN || defined(KMP_STUB)
1630+
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
16311631
return nullptr;
16321632
#else
16331633
const char *(*fptr)(const omp_interop_t, omp_interop_property_t);
@@ -1640,7 +1640,7 @@ const char *FTN_STDCALL FTN_GET_INTEROP_TYPE_DESC(
16401640
// libomptarget, if loaded, provides this function
16411641
const char *FTN_STDCALL FTN_GET_INTEROP_RC_DESC(
16421642
const omp_interop_t interop, omp_interop_property_t property_id) {
1643-
#if KMP_OS_DARWIN || defined(KMP_STUB)
1643+
#if KMP_OS_DARWIN || KMP_OS_WASI || defined(KMP_STUB)
16441644
return nullptr;
16451645
#else
16461646
const char *(*fptr)(const omp_interop_t, omp_interop_property_t);

openmp/runtime/src/kmp_gsupport.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ void KMP_EXPAND_NAME(KMP_API_NAME_GOMP_ORDERED_END)(void) {
356356
// They come in two flavors: 64-bit unsigned, and either 32-bit signed
357357
// (IA-32 architecture) or 64-bit signed (Intel(R) 64).
358358

359-
#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS
359+
#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM
360360
#define KMP_DISPATCH_INIT __kmp_aux_dispatch_init_4
361361
#define KMP_DISPATCH_FINI_CHUNK __kmp_aux_dispatch_fini_chunk_4
362362
#define KMP_DISPATCH_NEXT __kmpc_dispatch_next_4

openmp/runtime/src/kmp_os.h

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@
7575
#error Unknown compiler
7676
#endif
7777

78-
#if (KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_FREEBSD)
78+
#if (KMP_OS_LINUX || KMP_OS_WINDOWS || KMP_OS_FREEBSD) && !KMP_OS_WASI
7979
#define KMP_AFFINITY_SUPPORTED 1
8080
#if KMP_OS_WINDOWS && KMP_ARCH_X86_64
8181
#define KMP_GROUP_AFFINITY 1
@@ -176,7 +176,7 @@ typedef unsigned long long kmp_uint64;
176176
#define KMP_UINT64_SPEC "llu"
177177
#endif /* KMP_OS_UNIX */
178178

179-
#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS
179+
#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM
180180
#define KMP_SIZE_T_SPEC KMP_UINT32_SPEC
181181
#elif KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || \
182182
KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
@@ -186,7 +186,7 @@ typedef unsigned long long kmp_uint64;
186186
#error "Can't determine size_t printf format specifier."
187187
#endif
188188

189-
#if KMP_ARCH_X86 || KMP_ARCH_ARM
189+
#if KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_WASM
190190
#define KMP_SIZE_T_MAX (0xFFFFFFFF)
191191
#else
192192
#define KMP_SIZE_T_MAX (0xFFFFFFFFFFFFFFFF)
@@ -215,8 +215,8 @@ typedef kmp_uint32 kmp_uint;
215215
#define KMP_INT_MIN ((kmp_int32)0x80000000)
216216

217217
// stdarg handling
218-
#if (KMP_ARCH_ARM || KMP_ARCH_X86_64 || KMP_ARCH_AARCH64) && \
219-
(KMP_OS_FREEBSD || KMP_OS_LINUX)
218+
#if (KMP_ARCH_ARM || KMP_ARCH_X86_64 || KMP_ARCH_AARCH64 || KMP_ARCH_WASM) && \
219+
(KMP_OS_FREEBSD || KMP_OS_LINUX || KMP_OS_WASI)
220220
typedef va_list *kmp_va_list;
221221
#define kmp_va_deref(ap) (*(ap))
222222
#define kmp_va_addr_of(ap) (&(ap))
@@ -1146,7 +1146,7 @@ extern kmp_real64 __kmp_xchg_real64(volatile kmp_real64 *p, kmp_real64 v);
11461146
KMP_COMPARE_AND_STORE_REL64((volatile kmp_int64 *)(volatile void *)&(a), \
11471147
(kmp_int64)(b), (kmp_int64)(c))
11481148

1149-
#if KMP_ARCH_X86 || KMP_ARCH_MIPS
1149+
#if KMP_ARCH_X86 || KMP_ARCH_MIPS || KMP_ARCH_WASM
11501150
// What about ARM?
11511151
#define TCR_PTR(a) ((void *)TCR_4(a))
11521152
#define TCW_PTR(a, b) TCW_4((a), (b))
@@ -1288,6 +1288,9 @@ bool __kmp_atomic_compare_store_rel(std::atomic<T> *p, T expected, T desired) {
12881288
extern void *__kmp_lookup_symbol(const char *name, bool next = false);
12891289
#define KMP_DLSYM(name) __kmp_lookup_symbol(name)
12901290
#define KMP_DLSYM_NEXT(name) __kmp_lookup_symbol(name, true)
1291+
#elif KMP_OS_WASI
1292+
#define KMP_DLSYM(name) nullptr
1293+
#define KMP_DLSYM_NEXT(name) nullptr
12911294
#else
12921295
#define KMP_DLSYM(name) dlsym(RTLD_DEFAULT, name)
12931296
#define KMP_DLSYM_NEXT(name) dlsym(RTLD_NEXT, name)

openmp/runtime/src/kmp_platform.h

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#define KMP_OS_WINDOWS 0
2525
#define KMP_OS_HURD 0
2626
#define KMP_OS_SOLARIS 0
27+
#define KMP_OS_WASI 0
2728
#define KMP_OS_UNIX 0 /* disjunction of KMP_OS_LINUX, KMP_OS_DARWIN etc. */
2829

2930
#ifdef _WIN32
@@ -76,14 +77,20 @@
7677
#define KMP_OS_SOLARIS 1
7778
#endif
7879

80+
#if (defined __wasi__) || (defined __EMSCRIPTEN__)
81+
#undef KMP_OS_WASI
82+
#define KMP_OS_WASI 1
83+
#endif
84+
7985
#if (1 != KMP_OS_LINUX + KMP_OS_DRAGONFLY + KMP_OS_FREEBSD + KMP_OS_NETBSD + \
8086
KMP_OS_OPENBSD + KMP_OS_DARWIN + KMP_OS_WINDOWS + KMP_OS_HURD + \
81-
KMP_OS_SOLARIS)
87+
KMP_OS_SOLARIS + KMP_OS_WASI)
8288
#error Unknown OS
8389
#endif
8490

8591
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
86-
KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD || KMP_OS_SOLARIS
92+
KMP_OS_OPENBSD || KMP_OS_DARWIN || KMP_OS_HURD || KMP_OS_SOLARIS || \
93+
KMP_OS_WASI
8794
#undef KMP_OS_UNIX
8895
#define KMP_OS_UNIX 1
8996
#endif
@@ -196,6 +203,10 @@
196203
#define KMP_ARCH_ARM 1
197204
#endif
198205

206+
#if defined(__wasm32__)
207+
#define KMP_ARCH_WASM 1
208+
#endif
209+
199210
#if defined(__MIC__) || defined(__MIC2__)
200211
#define KMP_MIC 1
201212
#if __MIC2__ || __KNC__
@@ -212,7 +223,8 @@
212223
#endif
213224

214225
/* Specify 32 bit architectures here */
215-
#define KMP_32_BIT_ARCH (KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS)
226+
#define KMP_32_BIT_ARCH \
227+
(KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_MIPS || KMP_ARCH_WASM)
216228

217229
// Platforms which support Intel(R) Many Integrated Core Architecture
218230
#define KMP_MIC_SUPPORTED \
@@ -222,7 +234,7 @@
222234
#if (1 != KMP_ARCH_X86 + KMP_ARCH_X86_64 + KMP_ARCH_ARM + KMP_ARCH_PPC64 + \
223235
KMP_ARCH_AARCH64 + KMP_ARCH_MIPS + KMP_ARCH_MIPS64 + \
224236
KMP_ARCH_RISCV64 + KMP_ARCH_LOONGARCH64 + KMP_ARCH_VE + \
225-
KMP_ARCH_S390X)
237+
KMP_ARCH_S390X + KMP_ARCH_WASM)
226238
#error Unknown or unsupported architecture
227239
#endif
228240

openmp/runtime/src/kmp_runtime.cpp

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,9 @@ static char *ProfileTraceFile = nullptr;
4747
#include <process.h>
4848
#endif
4949

50-
#if KMP_OS_WINDOWS
51-
// windows does not need include files as it doesn't use shared memory
50+
#ifndef KMP_USE_SHM
51+
// Windows and WASI do not need these include files as they don't use shared
52+
// memory.
5253
#else
5354
#include <sys/mman.h>
5455
#include <sys/stat.h>
@@ -446,26 +447,26 @@ void __kmp_abort_process() {
446447
__kmp_dump_debug_buffer();
447448
}
448449

449-
if (KMP_OS_WINDOWS) {
450-
// Let other threads know of abnormal termination and prevent deadlock
451-
// if abort happened during library initialization or shutdown
452-
__kmp_global.g.g_abort = SIGABRT;
453-
454-
/* On Windows* OS by default abort() causes pop-up error box, which stalls
455-
nightly testing. Unfortunately, we cannot reliably suppress pop-up error
456-
boxes. _set_abort_behavior() works well, but this function is not
457-
available in VS7 (this is not problem for DLL, but it is a problem for
458-
static OpenMP RTL). SetErrorMode (and so, timelimit utility) does not
459-
help, at least in some versions of MS C RTL.
460-
461-
It seems following sequence is the only way to simulate abort() and
462-
avoid pop-up error box. */
463-
raise(SIGABRT);
464-
_exit(3); // Just in case, if signal ignored, exit anyway.
465-
} else {
466-
__kmp_unregister_library();
467-
abort();
468-
}
450+
#if KMP_OS_WINDOWS
451+
// Let other threads know of abnormal termination and prevent deadlock
452+
// if abort happened during library initialization or shutdown
453+
__kmp_global.g.g_abort = SIGABRT;
454+
455+
/* On Windows* OS by default abort() causes pop-up error box, which stalls
456+
nightly testing. Unfortunately, we cannot reliably suppress pop-up error
457+
boxes. _set_abort_behavior() works well, but this function is not
458+
available in VS7 (this is not problem for DLL, but it is a problem for
459+
static OpenMP RTL). SetErrorMode (and so, timelimit utility) does not
460+
help, at least in some versions of MS C RTL.
461+
462+
It seems following sequence is the only way to simulate abort() and
463+
avoid pop-up error box. */
464+
raise(SIGABRT);
465+
_exit(3); // Just in case, if signal ignored, exit anyway.
466+
#else
467+
__kmp_unregister_library();
468+
abort();
469+
#endif
469470

470471
__kmp_infinite_loop();
471472
__kmp_release_bootstrap_lock(&__kmp_exit_lock);
@@ -8895,11 +8896,11 @@ __kmp_determine_reduction_method(
88958896

88968897
#if KMP_ARCH_X86_64 || KMP_ARCH_PPC64 || KMP_ARCH_AARCH64 || \
88978898
KMP_ARCH_MIPS64 || KMP_ARCH_RISCV64 || KMP_ARCH_LOONGARCH64 || \
8898-
KMP_ARCH_VE || KMP_ARCH_S390X
8899+
KMP_ARCH_VE || KMP_ARCH_S390X || KMP_ARCH_WASM
88998900

89008901
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
89018902
KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD || \
8902-
KMP_OS_SOLARIS
8903+
KMP_OS_SOLARIS || KMP_OS_WASI
89038904

89048905
int teamsize_cutoff = 4;
89058906

@@ -8924,12 +8925,14 @@ __kmp_determine_reduction_method(
89248925
#error "Unknown or unsupported OS"
89258926
#endif // KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD ||
89268927
// KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_DARWIN || KMP_OS_HURD ||
8927-
// KMP_OS_SOLARIS
8928+
// KMP_OS_SOLARIS || KMP_OS_WASI
89288929

8929-
#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS
8930+
#elif KMP_ARCH_X86 || KMP_ARCH_ARM || KMP_ARCH_AARCH || KMP_ARCH_MIPS || \
8931+
KMP_ARCH_WASM
89308932

89318933
#if KMP_OS_LINUX || KMP_OS_DRAGONFLY || KMP_OS_FREEBSD || KMP_OS_NETBSD || \
8932-
KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_HURD || KMP_OS_SOLARIS
8934+
KMP_OS_OPENBSD || KMP_OS_WINDOWS || KMP_OS_HURD || KMP_OS_SOLARIS || \
8935+
KMP_OS_WASI
89338936

89348937
// basic tuning
89358938

openmp/runtime/src/kmp_utility.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,8 @@ void __kmp_expand_host_name(char *buffer, size_t size) {
294294
if (!GetComputerNameA(buffer, &s))
295295
KMP_STRCPY_S(buffer, size, unknown);
296296
}
297+
#elif KMP_OS_WASI
298+
KMP_STRCPY_S(buffer, size, unknown);
297299
#else
298300
buffer[size - 2] = 0;
299301
if (gethostname(buffer, size) || buffer[size - 2] != 0)

openmp/runtime/src/z_Linux_asm.S

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2441,7 +2441,27 @@ KMP_PREFIX_UNDERSCORE(__kmp_unnamed_critical_addr):
24412441
#if KMP_OS_LINUX
24422442
# if KMP_ARCH_ARM || KMP_ARCH_AARCH64
24432443
.section .note.GNU-stack,"",%progbits
2444-
# else
2444+
# elif !KMP_ARCH_WASM
24452445
.section .note.GNU-stack,"",@progbits
24462446
# endif
24472447
#endif
2448+
2449+
#if KMP_ARCH_WASM
2450+
.data
2451+
.global .gomp_critical_user_
2452+
.global .gomp_critical_user_.var
2453+
.global .gomp_critical_user_.reduction.var
2454+
.global __kmp_unnamed_critical_addr
2455+
.gomp_critical_user_:
2456+
.zero 4
2457+
.size .gomp_critical_user_, 4
2458+
.gomp_critical_user_.var:
2459+
.zero 4
2460+
.size .gomp_critical_user_.var, 4
2461+
.gomp_critical_user_.reduction.var:
2462+
.zero 4
2463+
.size .gomp_critical_user_.reduction.var, 4
2464+
__kmp_unnamed_critical_addr:
2465+
.4byte .gomp_critical_user_
2466+
.size __kmp_unnamed_critical_addr, 4
2467+
#endif

0 commit comments

Comments
 (0)