Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 18 additions & 10 deletions src/prebuilt/wasm2c_simd_source_declarations.cc
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
const char* s_simd_source_declarations = R"w2c_template(#if WASM_RT_MEMCHECK_GUARD_PAGES
const char* s_simd_source_declarations = R"w2c_template(#if WASM_RT_MEMCHECK_BOUNDS_CHECK || \
)w2c_template"
R"w2c_template(#ifdef __GNUC__
R"w2c_template( WASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var)
)w2c_template"
R"w2c_template(#elif defined(__GNUC__) && WASM_RT_MEMCHECK_GUARD_PAGES
)w2c_template"
R"w2c_template(#if defined(__x86_64__)
)w2c_template"
Expand All @@ -10,25 +14,29 @@ R"w2c_template(#elif defined(__aarch64__)
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
)w2c_template"
R"w2c_template(#elif defined(__riscv)
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"vr"(var));
)w2c_template"
R"w2c_template(#elif defined(__s390x__)
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"d"(var));
)w2c_template"
R"w2c_template(#endif
R"w2c_template(#else
)w2c_template"
R"w2c_template(#endif
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"f"(var));
)w2c_template"
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
#ifndef SIMD_FORCE_READ
R"w2c_template(#else
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var)
R"w2c_template(#error \
)w2c_template"
R"w2c_template(#endif
R"w2c_template( "Guard page mode for Wasm not supported on this platform because SIMD_FORCE_READ could not be instantiated." \
)w2c_template"
R"w2c_template(
// TODO: equivalent constraint for ARM and other architectures
R"w2c_template( "Either enable specify -DWASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION=1 during compilation or use -DWASM_RT_MEMCHECK_BOUNDS_CHECK=1 to use bounds check mode"
)w2c_template"
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
// The below SIMD operations copy to a local variable first as the
Expand Down
113 changes: 49 additions & 64 deletions src/prebuilt/wasm2c_source_declarations.cc
Original file line number Diff line number Diff line change
Expand Up @@ -311,120 +311,105 @@ R"w2c_template(#define MEMCHECK_DEFAULT32(mem, local_memory_size, a, t) \
)w2c_template"
R"w2c_template( WASM_RT_CHECK_BASE(mem);
)w2c_template"
R"w2c_template(
// When using guard pages, reads have to be immediately consumed so that OOB
)w2c_template"
R"w2c_template(// trap checks are applied in the right place, and not optimized away.
)w2c_template"
R"w2c_template(#ifdef __GNUC__
)w2c_template"
R"w2c_template(#define FORCE_READ_INT(var) __asm__("" ::"r"(var));
)w2c_template"
R"w2c_template(
#if defined(__i386__) || defined(__x86_64__)
)w2c_template"
R"w2c_template(#if defined(__SSE__)
R"w2c_template(#else
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "x"
R"w2c_template(#if WASM_RT_USE_LOCAL_MEMORY_BASE_SIZE_FOR_THIS_MODULE
)w2c_template"
R"w2c_template(#else // No SSE, old x87
R"w2c_template(#define MEMCHECK_DEFAULT32(mem, local_memory_size, a, t) \
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
R"w2c_template( WASM_RT_CHECK_BASE(mem); \
)w2c_template"
R"w2c_template(#endif
R"w2c_template( if (UNLIKELY(a + (uint64_t)sizeof(t) > local_memory_size)) \
)w2c_template"
R"w2c_template(#elif (defined(__arm__) || defined(__aarch64__)) && defined(__ARM_FP) && \
R"w2c_template( TRAP(OOB);
)w2c_template"
R"w2c_template( ((__ARM_FP & 0x4) != 0)
R"w2c_template(#else
)w2c_template"
R"w2c_template(#ifdef __aarch64__
R"w2c_template(#define MEMCHECK_DEFAULT32(mem, local_memory_size, a, t) \
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "w"
R"w2c_template( WASM_RT_CHECK_BASE(mem); \
)w2c_template"
R"w2c_template(#else
R"w2c_template( if (UNLIKELY(a + (uint64_t)sizeof(t) > mem->size)) \
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "t"
R"w2c_template( TRAP(OOB);
)w2c_template"
R"w2c_template(#endif
)w2c_template"
R"w2c_template(#elif defined(__mips__) && defined(__clang__) && !defined(__mips_soft_float)
)w2c_template"
R"w2c_template(// Clang before v18 uses hard floats which has a different constraint
R"w2c_template(#endif
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
R"w2c_template(
// MEMCHECK_GENERAL can be used for any memory
)w2c_template"
R"w2c_template(#elif (defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)) || \
R"w2c_template(#define MEMCHECK_GENERAL(mem, a, t) \
)w2c_template"
R"w2c_template( !(defined(_SOFT_FLOAT) || defined(__NO_FPRS__))
R"w2c_template( WASM_RT_CHECK_BASE(mem); \
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
R"w2c_template( RANGE_CHECK(mem, a, sizeof(t));
)w2c_template"
R"w2c_template(#elif defined(__riscv) && defined(__riscv_flen) && (__riscv_flen >= 32)
R"w2c_template(
// When using guard pages, reads have to be immediately consumed so that OOB
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
R"w2c_template(// trap checks are applied in the right place, and not optimized away. This is
)w2c_template"
R"w2c_template(#elif defined(__s390__) || defined(__s390x__)
R"w2c_template(// done using FORCE_READ_INT/FORCE_READ_FLOAT
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
R"w2c_template(#if WASM_RT_MEMCHECK_BOUNDS_CHECK || \
)w2c_template"
R"w2c_template(#else
R"w2c_template( WASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "r"
R"w2c_template(#define FORCE_READ_INT(var)
)w2c_template"
R"w2c_template(#endif
R"w2c_template(#define FORCE_READ_FLOAT(var)
)w2c_template"
R"w2c_template(
#define FORCE_READ_FLOAT(var) __asm__("" ::FORCE_READ_FLOAT_CONSTRAINT(var));
R"w2c_template(#elif defined(__GNUC__) && WASM_RT_MEMCHECK_GUARD_PAGES
)w2c_template"
R"w2c_template(#endif
R"w2c_template(#define FORCE_READ_INT(var) __asm__("" ::"r"(var))
)w2c_template"
R"w2c_template(
#else
#if defined(__x86_64__) || defined(_M_X64)
)w2c_template"
R"w2c_template(#if WASM_RT_USE_LOCAL_MEMORY_BASE_SIZE_FOR_THIS_MODULE
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "x"
)w2c_template"
R"w2c_template(#define MEMCHECK_DEFAULT32(mem, local_memory_size, a, t) \
R"w2c_template(#elif defined(__aarch64__) && defined(__ARM_FP) && ((__ARM_FP & 0x4) != 0)
)w2c_template"
R"w2c_template( WASM_RT_CHECK_BASE(mem); \
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "w"
)w2c_template"
R"w2c_template( if (UNLIKELY(a + (uint64_t)sizeof(t) > local_memory_size)) \
R"w2c_template(#elif defined(__mips__) && defined(__clang__) && !defined(__mips_soft_float)
)w2c_template"
R"w2c_template( TRAP(OOB);
R"w2c_template(// Clang before v18 uses hard floats which has a different constraint
)w2c_template"
R"w2c_template(#else
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
)w2c_template"
R"w2c_template(#define MEMCHECK_DEFAULT32(mem, local_memory_size, a, t) \
R"w2c_template(#elif (defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)) && \
)w2c_template"
R"w2c_template( WASM_RT_CHECK_BASE(mem); \
R"w2c_template( !(defined(_SOFT_FLOAT) || defined(__NO_FPRS__))
)w2c_template"
R"w2c_template( if (UNLIKELY(a + (uint64_t)sizeof(t) > mem->size)) \
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
)w2c_template"
R"w2c_template( TRAP(OOB);
R"w2c_template(#elif defined(__riscv) && defined(__riscv_flen) && (__riscv_flen >= 32)
)w2c_template"
R"w2c_template(#endif
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
)w2c_template"
R"w2c_template(#endif
R"w2c_template(#elif defined(__s390__) || defined(__s390x__)
)w2c_template"
R"w2c_template(
// MEMCHECK_GENERAL can be used for any memory
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "f"
)w2c_template"
R"w2c_template(#define MEMCHECK_GENERAL(mem, a, t) \
R"w2c_template(#else
)w2c_template"
R"w2c_template( WASM_RT_CHECK_BASE(mem); \
R"w2c_template(#define FORCE_READ_FLOAT_CONSTRAINT "r"
)w2c_template"
R"w2c_template( RANGE_CHECK(mem, a, sizeof(t));
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
#ifndef FORCE_READ_INT
#define FORCE_READ_FLOAT(var) __asm__("" ::FORCE_READ_FLOAT_CONSTRAINT(var))
)w2c_template"
R"w2c_template(#define FORCE_READ_INT(var)
R"w2c_template(#else
)w2c_template"
R"w2c_template(#endif
R"w2c_template(#error \
)w2c_template"
R"w2c_template(
#ifndef FORCE_READ_FLOAT
R"w2c_template( "Guard page mode for Wasm not supported on this platform because FORCE_READ_INT/FORCE_READ_FLOAT could not be instantiated." \
)w2c_template"
R"w2c_template(#define FORCE_READ_FLOAT(var)
R"w2c_template( "Either enable specify -DWASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION=1 during compilation or use -DWASM_RT_MEMCHECK_BOUNDS_CHECK=1 to use bounds check mode"
)w2c_template"
R"w2c_template(#endif
)w2c_template"
Expand Down
69 changes: 30 additions & 39 deletions src/template/wasm2c.declarations.c
Original file line number Diff line number Diff line change
Expand Up @@ -165,42 +165,6 @@ static inline uint64_t checked_add_u64(uint64_t a, uint64_t b) {
#if WASM_RT_MEMCHECK_GUARD_PAGES
#define MEMCHECK_DEFAULT32(mem, local_memory_size, a, t) \
WASM_RT_CHECK_BASE(mem);

// When using guard pages, reads have to be immediately consumed so that OOB
// trap checks are applied in the right place, and not optimized away.
#ifdef __GNUC__
#define FORCE_READ_INT(var) __asm__("" ::"r"(var));

#if defined(__i386__) || defined(__x86_64__)
#if defined(__SSE__)
#define FORCE_READ_FLOAT_CONSTRAINT "x"
#else // No SSE, old x87
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#endif
#elif (defined(__arm__) || defined(__aarch64__)) && defined(__ARM_FP) && \
((__ARM_FP & 0x4) != 0)
#ifdef __aarch64__
#define FORCE_READ_FLOAT_CONSTRAINT "w"
#else
#define FORCE_READ_FLOAT_CONSTRAINT "t"
#endif
#elif defined(__mips__) && defined(__clang__) && !defined(__mips_soft_float)
// Clang before v18 uses hard floats which has a different constraint
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#elif (defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)) || \
!(defined(_SOFT_FLOAT) || defined(__NO_FPRS__))
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#elif defined(__riscv) && defined(__riscv_flen) && (__riscv_flen >= 32)
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#elif defined(__s390__) || defined(__s390x__)
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#else
#define FORCE_READ_FLOAT_CONSTRAINT "r"
#endif

#define FORCE_READ_FLOAT(var) __asm__("" ::FORCE_READ_FLOAT_CONSTRAINT(var));
#endif

#else
#if WASM_RT_USE_LOCAL_MEMORY_BASE_SIZE_FOR_THIS_MODULE
#define MEMCHECK_DEFAULT32(mem, local_memory_size, a, t) \
Expand All @@ -220,12 +184,39 @@ static inline uint64_t checked_add_u64(uint64_t a, uint64_t b) {
WASM_RT_CHECK_BASE(mem); \
RANGE_CHECK(mem, a, sizeof(t));

#ifndef FORCE_READ_INT
// When using guard pages, reads have to be immediately consumed so that OOB
// trap checks are applied in the right place, and not optimized away. This is
// done using FORCE_READ_INT/FORCE_READ_FLOAT
#if WASM_RT_MEMCHECK_BOUNDS_CHECK || \
WASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION
Comment thread
shravanrn marked this conversation as resolved.
#define FORCE_READ_INT(var)
#define FORCE_READ_FLOAT(var)
#elif defined(__GNUC__) && WASM_RT_MEMCHECK_GUARD_PAGES
#define FORCE_READ_INT(var) __asm__("" ::"r"(var))

#if defined(__x86_64__) || defined(_M_X64)
#define FORCE_READ_FLOAT_CONSTRAINT "x"
#elif defined(__aarch64__) && defined(__ARM_FP) && ((__ARM_FP & 0x4) != 0)
#define FORCE_READ_FLOAT_CONSTRAINT "w"
#elif defined(__mips__) && defined(__clang__) && !defined(__mips_soft_float)
// Clang before v18 uses hard floats which has a different constraint
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#elif (defined(__powerpc__) || defined(__ppc__) || defined(__PPC__)) && \
!(defined(_SOFT_FLOAT) || defined(__NO_FPRS__))
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#elif defined(__riscv) && defined(__riscv_flen) && (__riscv_flen >= 32)
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#elif defined(__s390__) || defined(__s390x__)
#define FORCE_READ_FLOAT_CONSTRAINT "f"
#else
#define FORCE_READ_FLOAT_CONSTRAINT "r"
#endif

#ifndef FORCE_READ_FLOAT
#define FORCE_READ_FLOAT(var)
#define FORCE_READ_FLOAT(var) __asm__("" ::FORCE_READ_FLOAT_CONSTRAINT(var))
#else
#error \
"Guard page mode for Wasm not supported on this platform because FORCE_READ_INT/FORCE_READ_FLOAT could not be instantiated." \
"Either enable specify -DWASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION=1 during compilation or use -DWASM_RT_MEMCHECK_BOUNDS_CHECK=1 to use bounds check mode"
#endif

static inline void load_data(u8* dest, const u8* src, size_t n) {
Expand Down
21 changes: 12 additions & 9 deletions src/template/wasm2c_simd.declarations.c
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
#if WASM_RT_MEMCHECK_GUARD_PAGES
#ifdef __GNUC__
#if WASM_RT_MEMCHECK_BOUNDS_CHECK || \
WASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION
#define SIMD_FORCE_READ(var)
#elif defined(__GNUC__) && WASM_RT_MEMCHECK_GUARD_PAGES
#if defined(__x86_64__)
#define SIMD_FORCE_READ(var) __asm__("" ::"x"(var));
#elif defined(__aarch64__)
#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
#elif defined(__riscv)
#define SIMD_FORCE_READ(var) __asm__("" ::"vr"(var));
#elif defined(__s390x__)
#define SIMD_FORCE_READ(var) __asm__("" ::"d"(var));
#else
#define SIMD_FORCE_READ(var) __asm__("" ::"f"(var));
#endif
#else
#error \
"Guard page mode for Wasm not supported on this platform because SIMD_FORCE_READ could not be instantiated." \
"Either enable specify -DWASM_RT_NONCONFORMING_ALLOW_OOB_READ_ELIMINATION=1 during compilation or use -DWASM_RT_MEMCHECK_BOUNDS_CHECK=1 to use bounds check mode"
#endif
#endif

#ifndef SIMD_FORCE_READ
#define SIMD_FORCE_READ(var)
#endif

// TODO: equivalent constraint for ARM and other architectures

// The below SIMD operations copy to a local variable first as the
// MEM_ADDR_MEMOP maybe segment pointers if WASM_RT_USE_SEGUE_FOR_THIS_MODULE is
Expand Down
Loading
Loading