From f3ab743edc4feca7ccf27a12ab70ade2ed369c8c Mon Sep 17 00:00:00 2001 From: MacroModel Date: Fri, 10 Jul 2026 16:42:18 +0800 Subject: [PATCH 1/4] Refactor WebAssembly 1.1 feature flags and improve error handling - Updated feature flag checks in various files to use `disable_*` instead of `enable_*` for better clarity and consistency in feature management. - Enhanced error handling logic to ensure proper validation of WebAssembly 1.1 features, improving robustness against unsupported operations. - Refactored related documentation to clarify the implications of enabling and disabling specific WebAssembly features, aiding user understanding. - Improved overall code maintainability by streamlining feature flag management and enhancing the clarity of error reporting mechanisms. --- .../wasm1p1/features/data_count_section.h | 2 +- .../standard/wasm1p1/features/data_section.h | 4 +- .../wasm/standard/wasm1p1/features/def.h | 41 +-- .../wasm1p1/features/element_section.h | 4 +- .../wasm/standard/wasm1p1/features/types.h | 6 +- .../translate/opcode/wasm1p1_cases.h | 18 +- .../translate/opcode/wasm1p1_cases.h | 44 ++-- .../single_func_validation_dispatch.h | 4 +- .../translate.h | 38 +-- .../uwvm/cmdline/callback/wasm_feature.h | 177 +++++++------ src/uwvm2/uwvm/cmdline/params.h | 15 +- src/uwvm2/uwvm/cmdline/params/wasm_feature.h | 179 ++++++++----- src/uwvm2/uwvm/runtime/initializer/init.h | 16 +- .../validation/standard/wasm1p1/validator.h | 74 +++--- .../0001.concept/wasm1p1_feature_list.cc | 245 +++++++++--------- .../wasm1p1_parser_section_details.cc | 46 ++-- .../wasm1p1_runtime_initilizer.cc | 28 +- .../wasm1p1_validator_fuzzer.cc | 12 +- .../wasm1p1_validator_wabt_fuzzer.cc | 18 +- ...sm1p1_select_polymorphic_unknown_result.cc | 6 +- .../wasm1p1_select_t_empty_result_types.cc | 6 +- ..._empty_result_types_without_multi_value.cc | 12 +- .../wasm1p1_table_fill_bulk_memory_feature.cc | 8 +- .../lazy/uwvm_int_lazy_wasm1p1_alignment.cc | 8 +- .../uwvm_int_lazy_wasm1p1_full_interpreter.cc | 11 +- .../strict/uwvm_int_translate_strict_common.h | 13 +- ...date_wasm1p1_validator_alignment_strict.cc | 18 +- .../llvm_jit_cache_integration.cc | 4 +- test/0014.llvm_jit/llvm_jit_verify_compile.cc | 6 +- .../llvm_jit_wasm1p1_clang_cpp_matrix.cc | 8 +- tools/section_details_p3_guard/p3_guard.py | 2 +- 31 files changed, 576 insertions(+), 497 deletions(-) diff --git a/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_count_section.h b/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_count_section.h index 4279842d8..b646ae3ac 100644 --- a/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_count_section.h +++ b/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_count_section.h @@ -63,7 +63,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1p1::features ::std::byte const* const sec_id_module_ptr) UWVM_THROWS { auto const& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - if(!para.enable_bulk_memory) [[unlikely]] + if(para.disable_bulk_memory) [[unlikely]] { err.err_curr = sec_id_module_ptr; err.err_selectable.wasm1p1_feature_required.value = diff --git a/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_section.h b/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_section.h index 58c837c94..d224574d2 100644 --- a/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_section.h +++ b/src/uwvm2/parser/wasm/standard/wasm1p1/features/data_section.h @@ -417,7 +417,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1::features } case ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1_data_type_t::passive: { - if(!para.enable_bulk_memory) [[unlikely]] + if(para.disable_bulk_memory) [[unlikely]] { err.err_curr = section_curr; err.err_selectable.wasm1p1_feature_required.value = static_cast(fdt_type); @@ -432,7 +432,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1::features } case ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1_data_type_t::active_explicit: { - if(!para.enable_bulk_memory) [[unlikely]] + if(para.disable_bulk_memory) [[unlikely]] { err.err_curr = section_curr; err.err_selectable.wasm1p1_feature_required.value = static_cast(fdt_type); diff --git a/src/uwvm2/parser/wasm/standard/wasm1p1/features/def.h b/src/uwvm2/parser/wasm/standard/wasm1p1/features/def.h index 644e1d0e4..8bb498a40 100644 --- a/src/uwvm2/parser/wasm/standard/wasm1p1/features/def.h +++ b/src/uwvm2/parser/wasm/standard/wasm1p1/features/def.h @@ -49,30 +49,31 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1p1::features struct wasm1p1; /// @brief Runtime switches for independent WebAssembly 1.1 feature groups. + /// @details The disable_* fields are false by default, so WebAssembly 1.1 features are enabled unless the user explicitly disables them. /// @details The explicit_* fields record CLI ownership so the feature collection and its subfeatures can report conflicts deterministically. /// @warning Extension point: every new wasm1.1 subfeature flag needs CLI ownership, feature conflict handling, parser gating, and ECO output. struct wasm_binfmt1p1_feature_parameter { - bool enable_multi_value{}; - bool enable_reference_types{}; - bool enable_bulk_memory{}; - bool enable_sign_extension{}; - bool enable_nontrapping_float_to_int{}; - bool enable_simd{}; - - bool explicit_feature_1p1{}; - bool explicit_enable_multi_value{}; - bool explicit_enable_reference_types{}; - bool explicit_enable_bulk_memory{}; - bool explicit_enable_sign_extension{}; - bool explicit_enable_nontrapping_float_to_int{}; - bool explicit_enable_simd{}; + bool disable_multi_value{}; + bool disable_reference_types{}; + bool disable_bulk_memory{}; + bool disable_sign_extension{}; + bool disable_nontrapping_float_to_int{}; + bool disable_simd{}; + + bool explicit_feature_mvp{}; + bool explicit_disable_multi_value{}; + bool explicit_disable_reference_types{}; + bool explicit_disable_bulk_memory{}; + bool explicit_disable_sign_extension{}; + bool explicit_disable_nontrapping_float_to_int{}; + bool explicit_disable_simd{}; wasm1p1_parser_limit_t parser_limit{}; - /// @brief Preserve wasm1 validation when wasm1p1 is compiled in but the runtime flags are still disabled. - bool controllable_allow_multi_result_vector{true}; - bool controllable_allow_multi_table{true}; + /// @brief Re-enable wasm1 validation when a wasm1p1 feature that relaxes MVP syntax is explicitly disabled. + bool controllable_allow_multi_result_vector{}; + bool controllable_allow_multi_table{}; }; /// @brief Get the const wasm1.1 feature parameter from a parser feature-parameter tuple. @@ -105,9 +106,9 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1p1::features case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::i64: [[fallthrough]]; case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::f32: [[fallthrough]]; case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::f64: return true; - case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::v128: return para.enable_simd; + case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::v128: return !para.disable_simd; case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::funcref: [[fallthrough]]; - case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::externref: return para.enable_reference_types; + case ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::externref: return !para.disable_reference_types; default: return false; } } @@ -126,7 +127,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1p1::features // funcref remains the MVP table element type. Reference-typed locals/globals are gated by value_type_enabled instead. return true; } - case ::uwvm2::parser::wasm::standard::wasm1p1::type::reference_type::externref: return para.enable_reference_types; + case ::uwvm2::parser::wasm::standard::wasm1p1::type::reference_type::externref: return !para.disable_reference_types; default: return false; } } diff --git a/src/uwvm2/parser/wasm/standard/wasm1p1/features/element_section.h b/src/uwvm2/parser/wasm/standard/wasm1p1/features/element_section.h index 0a6d479f3..aa8975560 100644 --- a/src/uwvm2/parser/wasm/standard/wasm1p1/features/element_section.h +++ b/src/uwvm2/parser/wasm/standard/wasm1p1/features/element_section.h @@ -772,7 +772,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1::features auto const require_bulk_memory = [&]() UWVM_THROWS { - if(!para.enable_bulk_memory) [[unlikely]] + if(para.disable_bulk_memory) [[unlikely]] { err.err_curr = section_curr; err.err_selectable.wasm1p1_feature_required.value = static_cast(fet_type); @@ -785,7 +785,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1::features auto const require_reference_types = [&]() UWVM_THROWS { - if(!para.enable_reference_types) [[unlikely]] + if(para.disable_reference_types) [[unlikely]] { err.err_curr = section_curr; err.err_selectable.wasm1p1_feature_required.value = static_cast(fet_type); diff --git a/src/uwvm2/parser/wasm/standard/wasm1p1/features/types.h b/src/uwvm2/parser/wasm/standard/wasm1p1/features/types.h index 84a0babe9..2eb58fb27 100644 --- a/src/uwvm2/parser/wasm/standard/wasm1p1/features/types.h +++ b/src/uwvm2/parser/wasm/standard/wasm1p1/features/types.h @@ -608,7 +608,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1::features case static_cast<::uwvm2::parser::wasm::standard::wasm1::type::op_basic_type>(0xD0u): { auto const& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - if(!para.enable_reference_types) [[unlikely]] + if(para.disable_reference_types) [[unlikely]] { err.err_curr = section_curr; err.err_selectable.wasm1p1_feature_required.value = 0xD0u; @@ -675,7 +675,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1::features case static_cast<::uwvm2::parser::wasm::standard::wasm1::type::op_basic_type>(0xD2u): { auto const& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - if(!para.enable_reference_types) [[unlikely]] + if(para.disable_reference_types) [[unlikely]] { err.err_curr = section_curr; err.err_selectable.wasm1p1_feature_required.value = 0xD2u; @@ -744,7 +744,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::parser::wasm::standard::wasm1::features case static_cast<::uwvm2::parser::wasm::standard::wasm1::type::op_basic_type>(0xFDu): { auto const& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - if(!para.enable_simd) [[unlikely]] + if(para.disable_simd) [[unlikely]] { err.err_curr = section_curr; err.err_selectable.wasm1p1_feature_required.value = 0xFDu; diff --git a/src/uwvm2/runtime/compiler/llvm_jit/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h b/src/uwvm2/runtime/compiler/llvm_jit/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h index 72e1389b9..92651a4e5 100644 --- a/src/uwvm2/runtime/compiler/llvm_jit/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h +++ b/src/uwvm2/runtime/compiler/llvm_jit/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h @@ -21,7 +21,7 @@ case static_cast(wasm1p1_code::select_t): return static_cast<::uwvm2::parser::wasm::standard::wasm1p1::type::value_type>(type) == ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::v128 && - wasm1p1_para.enable_simd; + !wasm1p1_para.disable_simd; }}; auto const validate_select_condition{[&](concrete_operand_t cond) constexpr UWVM_THROWS @@ -142,7 +142,7 @@ case static_cast(wasm1p1_code::select_t): case static_cast(wasm1p1_code::i32_extend8_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_byte(wasm1p1_code::i32_extend8_s), @@ -176,7 +176,7 @@ case static_cast(wasm1p1_code::i32_extend8_s): case static_cast(wasm1p1_code::i32_extend16_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_byte(wasm1p1_code::i32_extend16_s), @@ -210,7 +210,7 @@ case static_cast(wasm1p1_code::i32_extend16_s): case static_cast(wasm1p1_code::i64_extend8_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_byte(wasm1p1_code::i64_extend8_s), @@ -244,7 +244,7 @@ case static_cast(wasm1p1_code::i64_extend8_s): case static_cast(wasm1p1_code::i64_extend16_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_byte(wasm1p1_code::i64_extend16_s), @@ -278,7 +278,7 @@ case static_cast(wasm1p1_code::i64_extend16_s): case static_cast(wasm1p1_code::i64_extend32_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_byte(wasm1p1_code::i64_extend32_s), @@ -323,7 +323,7 @@ case static_cast(wasm1p1_code::numeric_prefix): curr_operand_stack_value_type operand_type, curr_operand_stack_value_type result_type) constexpr UWVM_THROWS { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -507,7 +507,7 @@ case static_cast(wasm1p1_code::numeric_prefix): break; case wasm1p1_numeric_code::memory_copy: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -524,7 +524,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::memory_fill: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, diff --git a/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h b/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h index cb927a13c..8432dd163 100644 --- a/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h +++ b/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/opcode/wasm1p1_cases.h @@ -6,7 +6,7 @@ case static_cast(wasm1p1_code::table_get): auto const op_begin{code_curr}; ++code_curr; - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::table_get), @@ -34,7 +34,7 @@ case static_cast(wasm1p1_code::table_set): auto const op_begin{code_curr}; ++code_curr; - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::table_set), @@ -231,7 +231,7 @@ case static_cast(wasm1p1_code::select_t): case static_cast(wasm1p1_code::i32_extend8_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::i32_extend8_s), @@ -247,7 +247,7 @@ case static_cast(wasm1p1_code::i32_extend8_s): case static_cast(wasm1p1_code::i32_extend16_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::i32_extend16_s), @@ -263,7 +263,7 @@ case static_cast(wasm1p1_code::i32_extend16_s): case static_cast(wasm1p1_code::i64_extend8_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::i64_extend8_s), @@ -279,7 +279,7 @@ case static_cast(wasm1p1_code::i64_extend8_s): case static_cast(wasm1p1_code::i64_extend16_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::i64_extend16_s), @@ -295,7 +295,7 @@ case static_cast(wasm1p1_code::i64_extend16_s): case static_cast(wasm1p1_code::i64_extend32_s): { auto const op_begin{code_curr}; - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::i64_extend32_s), @@ -313,7 +313,7 @@ case static_cast(wasm1p1_code::ref_null): auto const op_begin{code_curr}; ++code_curr; - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::ref_null), @@ -355,7 +355,7 @@ case static_cast(wasm1p1_code::ref_is_null): auto const op_begin{code_curr}; ++code_curr; - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::ref_is_null), @@ -397,7 +397,7 @@ case static_cast(wasm1p1_code::ref_func): auto const op_begin{code_curr}; ++code_curr; - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::ref_func), @@ -423,7 +423,7 @@ case static_cast(wasm1p1_code::simd_prefix): auto const op_begin{code_curr}; ++code_curr; - if(!wasm1p1_para.enable_simd) [[unlikely]] + if(wasm1p1_para.disable_simd) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, opcode_u32(wasm1p1_code::simd_prefix), @@ -2224,7 +2224,7 @@ case static_cast(wasm1p1_code::numeric_prefix): curr_operand_stack_value_type out_type, auto fptr) constexpr UWVM_THROWS { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2308,7 +2308,7 @@ case static_cast(wasm1p1_code::numeric_prefix): break; case wasm1p1_numeric_code::memory_init: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2332,7 +2332,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::data_drop: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2349,7 +2349,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::memory_copy: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2370,7 +2370,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::memory_fill: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2389,7 +2389,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::table_init: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2428,7 +2428,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::elem_drop: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2445,7 +2445,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::table_copy: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2480,7 +2480,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::table_grow: { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2526,7 +2526,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::table_size: { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, @@ -2545,7 +2545,7 @@ case static_cast(wasm1p1_code::numeric_prefix): } case wasm1p1_numeric_code::table_fill: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, subopcode, diff --git a/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/single_func_validation_dispatch.h b/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/single_func_validation_dispatch.h index 8d9d4c317..26f709d64 100644 --- a/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/single_func_validation_dispatch.h +++ b/src/uwvm2/runtime/compiler/uwvm_int/compile_all_from_uwvm/translate/single_func_validation_dispatch.h @@ -54,7 +54,7 @@ auto const is_untyped_select_value_type{[&](curr_operand_stack_value_type type) { return true; } - return type == curr_operand_stack_value_type::v128 && wasm1p1_para.enable_simd; + return type == curr_operand_stack_value_type::v128 && !wasm1p1_para.disable_simd; }}; auto const fail_wasm1p1_feature_required{ @@ -226,7 +226,7 @@ auto const parse_block_type{ if(blocktype >= 0) { - if(!wasm1p1_para.enable_multi_value) [[unlikely]] + if(wasm1p1_para.disable_multi_value) [[unlikely]] { fail_wasm1p1_feature_required(op_begin, static_cast(blocktype), diff --git a/src/uwvm2/runtime/compiler/uwvm_int/compile_cu_from_lazy_validator/translate.h b/src/uwvm2/runtime/compiler/uwvm_int/compile_cu_from_lazy_validator/translate.h index acd2c04c6..8b9166e47 100644 --- a/src/uwvm2/runtime/compiler/uwvm_int/compile_cu_from_lazy_validator/translate.h +++ b/src/uwvm2/runtime/compiler/uwvm_int/compile_cu_from_lazy_validator/translate.h @@ -457,7 +457,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case -5: { - if(!wasm1p1_para.enable_simd) [[unlikely]] + if(wasm1p1_para.disable_simd) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -471,7 +471,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from case -16: case -17: { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { auto const vt{blocktype == -16 ? ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::funcref : ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::externref}; @@ -491,7 +491,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from if(blocktype >= 0) { - if(!wasm1p1_para.enable_multi_value) [[unlikely]] + if(wasm1p1_para.disable_multi_value) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -850,7 +850,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from case static_cast(wasm1p1_code::table_get): case static_cast(wasm1p1_code::table_set): { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -867,7 +867,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from case static_cast(wasm1p1_code::i64_extend16_s): case static_cast(wasm1p1_code::i64_extend32_s): { - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -879,7 +879,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case static_cast(wasm1p1_code::ref_null): { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -907,7 +907,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case static_cast(wasm1p1_code::ref_is_null): { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -919,7 +919,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case static_cast(wasm1p1_code::ref_func): { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -950,7 +950,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from case wasm1p1_numeric_code::i64_trunc_sat_f64_s: case wasm1p1_numeric_code::i64_trunc_sat_f64_u: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -962,7 +962,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::memory_init: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -976,7 +976,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::data_drop: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -989,7 +989,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::memory_copy: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -1003,7 +1003,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::memory_fill: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -1016,7 +1016,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::table_init: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -1034,7 +1034,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::elem_drop: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -1051,7 +1051,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::table_copy: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -1066,7 +1066,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from case wasm1p1_numeric_code::table_grow: case wasm1p1_numeric_code::table_size: { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -1079,7 +1079,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case wasm1p1_numeric_code::table_fill: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fail_lazy_feature_required(op_begin, err, @@ -1101,7 +1101,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::runtime::compiler::uwvm_int::compile_cu_from } case static_cast(wasm1p1_code::simd_prefix): { - if(!wasm1p1_para.enable_simd) [[unlikely]] + if(wasm1p1_para.disable_simd) [[unlikely]] { fail_lazy_feature_required(op_begin, err, diff --git a/src/uwvm2/uwvm/cmdline/callback/wasm_feature.h b/src/uwvm2/uwvm/cmdline/callback/wasm_feature.h index 81914d50c..5996c555a 100644 --- a/src/uwvm2/uwvm/cmdline/callback/wasm_feature.h +++ b/src/uwvm2/uwvm/cmdline/callback/wasm_feature.h @@ -68,34 +68,28 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details return parameter_return_type::return_m1_imme; } - /// @brief Return whether any independent wasm1.1 subfeature was explicitly selected. - inline constexpr bool any_subfeature_was_explicitly_enabled(auto const& para) noexcept + /// @brief Disable the complete wasm1.1 feature collection and restore MVP runtime guards. + inline constexpr void apply_mvp_feature_set(auto& para) noexcept { - return para.explicit_enable_multi_value || para.explicit_enable_reference_types || para.explicit_enable_bulk_memory || - para.explicit_enable_sign_extension || para.explicit_enable_nontrapping_float_to_int || para.explicit_enable_simd; + para.disable_multi_value = true; + para.disable_reference_types = true; + para.disable_bulk_memory = true; + para.disable_sign_extension = true; + para.disable_nontrapping_float_to_int = true; + para.disable_simd = true; + para.controllable_allow_multi_result_vector = true; + para.controllable_allow_multi_table = true; } - /// @brief Return the first explicitly selected subfeature name for conflict diagnostics. - inline constexpr ::uwvm2::utils::container::u8string_view first_explicit_subfeature_name(auto const& para) noexcept + /// @brief Enable the complete wasm1.1 feature collection and relax MVP runtime guards. + inline constexpr void apply_wasm1p1_feature_set(auto& para) noexcept { - if(para.explicit_enable_multi_value) { return u8"--wasm-feature-enable-multi-value"; } - if(para.explicit_enable_reference_types) { return u8"--wasm-feature-enable-reference-types"; } - if(para.explicit_enable_bulk_memory) { return u8"--wasm-feature-enable-bulk-memory"; } - if(para.explicit_enable_sign_extension) { return u8"--wasm-feature-enable-sign-extension"; } - if(para.explicit_enable_nontrapping_float_to_int) { return u8"--wasm-feature-enable-nontrapping-float-to-int"; } - if(para.explicit_enable_simd) { return u8"--wasm-feature-enable-simd"; } - return {}; - } - - /// @brief Enable the complete wasm1.1 feature collection and relax its runtime MVP guards. - inline constexpr void enable_1p1_feature_set(auto& para) noexcept - { - para.enable_multi_value = true; - para.enable_reference_types = true; - para.enable_bulk_memory = true; - para.enable_sign_extension = true; - para.enable_nontrapping_float_to_int = true; - para.enable_simd = true; + para.disable_multi_value = false; + para.disable_reference_types = false; + para.disable_bulk_memory = false; + para.disable_sign_extension = false; + para.disable_nontrapping_float_to_int = false; + para.disable_simd = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; } @@ -106,40 +100,51 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details #else UWVM_GNU_COLD inline constexpr #endif - /// @brief Handle --wasm-feature-1p1 and reject already-selected subfeatures. - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_1p1_callback( + /// @brief Handle --wasm-feature-mvp. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_mvp_callback( [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - if(wasm_feature_details::any_subfeature_was_explicitly_enabled(para)) [[unlikely]] - { - return wasm_feature_details::print_conflict(para_curr->str, wasm_feature_details::first_explicit_subfeature_name(para)); - } + if(para.explicit_feature_mvp) [[unlikely]] { return wasm_feature_details::print_conflict(para_curr->str, u8"--wasm-feature-mvp"); } - para.explicit_feature_1p1 = true; - wasm_feature_details::enable_1p1_feature_set(para); + para.explicit_feature_mvp = true; + wasm_feature_details::apply_mvp_feature_set(para); return wasm_feature_details::parameter_return_type::def; } - /// @brief Enable one independent wasm feature and reject collection/subfeature conflicts. - inline constexpr ::uwvm2::utils::cmdline::parameter_return_type enable_single_wasm_feature(::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, - ::uwvm2::utils::container::u8string_view feature_name, - bool& explicit_flag, - bool& enable_flag, - bool disable_multi_result_check, - bool disable_multi_table_check) noexcept +#if defined(UWVM_MODULE) + extern "C++" UWVM_GNU_COLD +#else + UWVM_GNU_COLD inline constexpr +#endif + /// @brief Handle --wasm-feature-wasm1.1. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_wasm1p1_callback( + [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, + [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, + [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - if(para.explicit_feature_1p1) [[unlikely]] { return wasm_feature_details::print_conflict(para_curr->str, u8"--wasm-feature-1p1"); } + wasm_feature_details::apply_wasm1p1_feature_set(para); + return wasm_feature_details::parameter_return_type::def; + } + /// @brief Disable one independent wasm feature. + inline constexpr ::uwvm2::utils::cmdline::parameter_return_type disable_single_wasm_feature(::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, + ::uwvm2::utils::container::u8string_view feature_name, + bool& explicit_flag, + bool& disable_flag, + bool enable_multi_result_check, + bool enable_multi_table_check) noexcept + { + auto& para{wasm_feature_details::wasm1p1_parameter()}; if(explicit_flag) [[unlikely]] { return wasm_feature_details::print_conflict(para_curr->str, feature_name); } explicit_flag = true; - enable_flag = true; - if(disable_multi_result_check) { para.controllable_allow_multi_result_vector = false; } - if(disable_multi_table_check) { para.controllable_allow_multi_table = false; } + disable_flag = true; + if(enable_multi_result_check) { para.controllable_allow_multi_result_vector = true; } + if(enable_multi_table_check) { para.controllable_allow_multi_table = true; } return wasm_feature_details::parameter_return_type::def; } @@ -148,19 +153,19 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details #else UWVM_GNU_COLD inline constexpr #endif - /// @brief Handle --wasm-feature-enable-multi-value. - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_enable_multi_value_callback( + /// @brief Handle --wasm-feature-disable-multi-value. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_disable_multi_value_callback( [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - return enable_single_wasm_feature(para_curr, - u8"--wasm-feature-enable-multi-value", - para.explicit_enable_multi_value, - para.enable_multi_value, - true, - false); + return disable_single_wasm_feature(para_curr, + u8"--wasm-feature-disable-multi-value", + para.explicit_disable_multi_value, + para.disable_multi_value, + true, + false); } #if defined(UWVM_MODULE) @@ -168,19 +173,19 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details #else UWVM_GNU_COLD inline constexpr #endif - /// @brief Handle --wasm-feature-enable-reference-types. - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_enable_reference_types_callback( + /// @brief Handle --wasm-feature-disable-reference-types. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_disable_reference_types_callback( [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - return enable_single_wasm_feature(para_curr, - u8"--wasm-feature-enable-reference-types", - para.explicit_enable_reference_types, - para.enable_reference_types, - false, - true); + return disable_single_wasm_feature(para_curr, + u8"--wasm-feature-disable-reference-types", + para.explicit_disable_reference_types, + para.disable_reference_types, + false, + true); } #if defined(UWVM_MODULE) @@ -188,19 +193,19 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details #else UWVM_GNU_COLD inline constexpr #endif - /// @brief Handle --wasm-feature-enable-bulk-memory. - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_enable_bulk_memory_callback( + /// @brief Handle --wasm-feature-disable-bulk-memory. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_disable_bulk_memory_callback( [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - return enable_single_wasm_feature(para_curr, - u8"--wasm-feature-enable-bulk-memory", - para.explicit_enable_bulk_memory, - para.enable_bulk_memory, - false, - false); + return disable_single_wasm_feature(para_curr, + u8"--wasm-feature-disable-bulk-memory", + para.explicit_disable_bulk_memory, + para.disable_bulk_memory, + false, + false); } #if defined(UWVM_MODULE) @@ -208,19 +213,19 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details #else UWVM_GNU_COLD inline constexpr #endif - /// @brief Handle --wasm-feature-enable-sign-extension. - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_enable_sign_extension_callback( + /// @brief Handle --wasm-feature-disable-sign-extension. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_disable_sign_extension_callback( [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - return enable_single_wasm_feature(para_curr, - u8"--wasm-feature-enable-sign-extension", - para.explicit_enable_sign_extension, - para.enable_sign_extension, - false, - false); + return disable_single_wasm_feature(para_curr, + u8"--wasm-feature-disable-sign-extension", + para.explicit_disable_sign_extension, + para.disable_sign_extension, + false, + false); } #if defined(UWVM_MODULE) @@ -228,19 +233,19 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details #else UWVM_GNU_COLD inline constexpr #endif - /// @brief Handle --wasm-feature-enable-nontrapping-float-to-int. - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_enable_nontrapping_float_to_int_callback( + /// @brief Handle --wasm-feature-disable-nontrapping-float-to-int. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_disable_nontrapping_float_to_int_callback( [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - return enable_single_wasm_feature(para_curr, - u8"--wasm-feature-enable-nontrapping-float-to-int", - para.explicit_enable_nontrapping_float_to_int, - para.enable_nontrapping_float_to_int, - false, - false); + return disable_single_wasm_feature(para_curr, + u8"--wasm-feature-disable-nontrapping-float-to-int", + para.explicit_disable_nontrapping_float_to_int, + para.disable_nontrapping_float_to_int, + false, + false); } #if defined(UWVM_MODULE) @@ -248,14 +253,14 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params::details #else UWVM_GNU_COLD inline constexpr #endif - /// @brief Handle --wasm-feature-enable-simd. - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_enable_simd_callback( + /// @brief Handle --wasm-feature-disable-simd. + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_disable_simd_callback( [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_begin, ::uwvm2::utils::cmdline::parameter_parsing_results * para_curr, [[maybe_unused]] ::uwvm2::utils::cmdline::parameter_parsing_results * para_end) noexcept { auto& para{wasm_feature_details::wasm1p1_parameter()}; - return enable_single_wasm_feature(para_curr, u8"--wasm-feature-enable-simd", para.explicit_enable_simd, para.enable_simd, false, false); + return disable_single_wasm_feature(para_curr, u8"--wasm-feature-disable-simd", para.explicit_disable_simd, para.disable_simd, false, false); } } diff --git a/src/uwvm2/uwvm/cmdline/params.h b/src/uwvm2/uwvm/cmdline/params.h index 563c17b37..e85074a74 100644 --- a/src/uwvm2/uwvm/cmdline/params.h +++ b/src/uwvm2/uwvm/cmdline/params.h @@ -70,13 +70,14 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_set_memory_limit), ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_set_parser_limit), ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_set_initializer_limit), - ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_1p1), - ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_enable_multi_value), - ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_enable_reference_types), - ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_enable_bulk_memory), - ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_enable_sign_extension), - ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_enable_nontrapping_float_to_int), - ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_enable_simd), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_mvp), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_wasm1p1), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_disable_multi_value), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_disable_reference_types), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_disable_bulk_memory), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_disable_sign_extension), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_disable_nontrapping_float_to_int), + ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_feature_disable_simd), #if defined(UWVM_SUPPORT_WEAK_SYMBOL) ::std::addressof(::uwvm2::uwvm::cmdline::params::wasm_list_weak_symbol_module), #endif diff --git a/src/uwvm2/uwvm/cmdline/params/wasm_feature.h b/src/uwvm2/uwvm/cmdline/params/wasm_feature.h index c2216ce30..4829a31e7 100644 --- a/src/uwvm2/uwvm/cmdline/params/wasm_feature.h +++ b/src/uwvm2/uwvm/cmdline/params/wasm_feature.h @@ -29,32 +29,59 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params { namespace details { - inline bool wasm_feature_1p1_is_exist{}; - inline bool wasm_feature_enable_multi_value_is_exist{}; - inline bool wasm_feature_enable_reference_types_is_exist{}; - inline bool wasm_feature_enable_bulk_memory_is_exist{}; - inline bool wasm_feature_enable_sign_extension_is_exist{}; - inline bool wasm_feature_enable_nontrapping_float_to_int_is_exist{}; - inline bool wasm_feature_enable_simd_is_exist{}; + inline bool wasm_feature_mvp_is_exist{}; + inline bool wasm_feature_wasm1p1_is_exist{}; + inline bool wasm_feature_disable_multi_value_is_exist{}; + inline bool wasm_feature_disable_reference_types_is_exist{}; + inline bool wasm_feature_disable_bulk_memory_is_exist{}; + inline bool wasm_feature_disable_sign_extension_is_exist{}; + inline bool wasm_feature_disable_nontrapping_float_to_int_is_exist{}; + inline bool wasm_feature_disable_simd_is_exist{}; + + inline constexpr ::uwvm2::utils::container::array<::uwvm2::utils::container::u8string_view, 4uz> wasm_feature_mvp_alias{ + u8"-WFmvp", + u8"-WFwasmmvp", + u8"-WFwasm1", + u8"-WF1"}; + inline constexpr ::uwvm2::utils::container::array<::uwvm2::utils::container::u8string_view, 4uz> wasm_feature_wasm1p1_alias{ + u8"-WF1.1", + u8"-WF1p1", + u8"-WFwasm1.1", + u8"-WFwasm1p1"}; + inline constexpr ::uwvm2::utils::container::u8string_view wasm_feature_disable_multi_value_alias{u8"-WFD-multi-value"}; + inline constexpr ::uwvm2::utils::container::u8string_view wasm_feature_disable_reference_types_alias{u8"-WFD-reference-types"}; + inline constexpr ::uwvm2::utils::container::u8string_view wasm_feature_disable_bulk_memory_alias{u8"-WFD-bulk-memory"}; + inline constexpr ::uwvm2::utils::container::u8string_view wasm_feature_disable_sign_extension_alias{u8"-WFD-sign-extension"}; + inline constexpr ::uwvm2::utils::container::u8string_view wasm_feature_disable_nontrapping_float_to_int_alias{u8"-WFD-nontrapping-float-to-int"}; + inline constexpr ::uwvm2::utils::container::u8string_view wasm_feature_disable_simd_alias{u8"-WFD-simd"}; #if defined(UWVM_MODULE) extern "C++" #else inline constexpr #endif - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_1p1_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_mvp_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, ::uwvm2::utils::cmdline::parameter_parsing_results*, ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; +#if defined(UWVM_MODULE) + extern "C++" +#else + inline constexpr +#endif + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_wasm1p1_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; + #if defined(UWVM_MODULE) extern "C++" #else inline constexpr #endif ::uwvm2::utils::cmdline::parameter_return_type - wasm_feature_enable_multi_value_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; + wasm_feature_disable_multi_value_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; #if defined(UWVM_MODULE) extern "C++" @@ -62,9 +89,9 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params inline constexpr #endif ::uwvm2::utils::cmdline::parameter_return_type - wasm_feature_enable_reference_types_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; + wasm_feature_disable_reference_types_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; #if defined(UWVM_MODULE) extern "C++" @@ -72,9 +99,9 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params inline constexpr #endif ::uwvm2::utils::cmdline::parameter_return_type - wasm_feature_enable_bulk_memory_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; + wasm_feature_disable_bulk_memory_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; #if defined(UWVM_MODULE) extern "C++" @@ -82,9 +109,9 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params inline constexpr #endif ::uwvm2::utils::cmdline::parameter_return_type - wasm_feature_enable_sign_extension_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; + wasm_feature_disable_sign_extension_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; #if defined(UWVM_MODULE) extern "C++" @@ -92,77 +119,95 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::cmdline::params inline constexpr #endif ::uwvm2::utils::cmdline::parameter_return_type - wasm_feature_enable_nontrapping_float_to_int_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; + wasm_feature_disable_nontrapping_float_to_int_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; #if defined(UWVM_MODULE) extern "C++" #else inline constexpr #endif - ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_enable_simd_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*, - ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; + ::uwvm2::utils::cmdline::parameter_return_type wasm_feature_disable_simd_callback(::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*, + ::uwvm2::utils::cmdline::parameter_parsing_results*) noexcept; } // namespace details #if defined(__clang__) # pragma clang diagnostic push # pragma clang diagnostic ignored "-Wbraced-scalar-init" #endif - /// @brief Command-line switch that enables the full WebAssembly 1.1 feature collection. - inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_1p1{.name{u8"--wasm-feature-1p1"}, - .describe{u8"Enable the WebAssembly 1.1 feature set."}, - .handle{::std::addressof(details::wasm_feature_1p1_callback)}, - .is_exist{::std::addressof(details::wasm_feature_1p1_is_exist)}, + /// @brief Command-line switch that disables the WebAssembly 1.1 feature collection and enforces MVP gates. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_mvp{.name{u8"--wasm-feature-mvp"}, + .describe{u8"Disable WebAssembly 1.1 features and enforce the WebAssembly MVP feature set."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{ + details::wasm_feature_mvp_alias.data(), details::wasm_feature_mvp_alias.size()}}, + .handle{::std::addressof(details::wasm_feature_mvp_callback)}, + .is_exist{::std::addressof(details::wasm_feature_mvp_is_exist)}, .cate{::uwvm2::utils::cmdline::categorization::wasm}}; - /// @brief Command-line switch that enables only the multi-value feature. - inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_enable_multi_value{ - .name{u8"--wasm-feature-enable-multi-value"}, - .describe{u8"Enable the WebAssembly multi-value feature."}, - .handle{::std::addressof(details::wasm_feature_enable_multi_value_callback)}, - .is_exist{::std::addressof(details::wasm_feature_enable_multi_value_is_exist)}, + /// @brief Command-line switch that enables the WebAssembly 1.1 feature collection. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_wasm1p1{ + .name{u8"--wasm-feature-wasm1.1"}, + .describe{u8"Enable the WebAssembly 1.1 feature set."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{details::wasm_feature_wasm1p1_alias.data(), details::wasm_feature_wasm1p1_alias.size()}}, + .handle{::std::addressof(details::wasm_feature_wasm1p1_callback)}, + .is_exist{::std::addressof(details::wasm_feature_wasm1p1_is_exist)}, + .cate{::uwvm2::utils::cmdline::categorization::wasm}}; + + /// @brief Command-line switch that disables only the multi-value feature. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_disable_multi_value{ + .name{u8"--wasm-feature-disable-multi-value"}, + .describe{u8"Disable the WebAssembly multi-value feature."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{::std::addressof(details::wasm_feature_disable_multi_value_alias), 1uz}}, + .handle{::std::addressof(details::wasm_feature_disable_multi_value_callback)}, + .is_exist{::std::addressof(details::wasm_feature_disable_multi_value_is_exist)}, .cate{::uwvm2::utils::cmdline::categorization::wasm}}; - /// @brief Command-line switch that enables only the reference-types feature. - inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_enable_reference_types{ - .name{u8"--wasm-feature-enable-reference-types"}, - .describe{u8"Enable the WebAssembly reference-types feature."}, - .handle{::std::addressof(details::wasm_feature_enable_reference_types_callback)}, - .is_exist{::std::addressof(details::wasm_feature_enable_reference_types_is_exist)}, + /// @brief Command-line switch that disables only the reference-types feature. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_disable_reference_types{ + .name{u8"--wasm-feature-disable-reference-types"}, + .describe{u8"Disable the WebAssembly reference-types feature."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{::std::addressof(details::wasm_feature_disable_reference_types_alias), 1uz}}, + .handle{::std::addressof(details::wasm_feature_disable_reference_types_callback)}, + .is_exist{::std::addressof(details::wasm_feature_disable_reference_types_is_exist)}, .cate{::uwvm2::utils::cmdline::categorization::wasm}}; - /// @brief Command-line switch that enables only the bulk-memory feature. - inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_enable_bulk_memory{ - .name{u8"--wasm-feature-enable-bulk-memory"}, - .describe{u8"Enable the WebAssembly bulk-memory feature."}, - .handle{::std::addressof(details::wasm_feature_enable_bulk_memory_callback)}, - .is_exist{::std::addressof(details::wasm_feature_enable_bulk_memory_is_exist)}, + /// @brief Command-line switch that disables only the bulk-memory feature. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_disable_bulk_memory{ + .name{u8"--wasm-feature-disable-bulk-memory"}, + .describe{u8"Disable the WebAssembly bulk-memory feature."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{::std::addressof(details::wasm_feature_disable_bulk_memory_alias), 1uz}}, + .handle{::std::addressof(details::wasm_feature_disable_bulk_memory_callback)}, + .is_exist{::std::addressof(details::wasm_feature_disable_bulk_memory_is_exist)}, .cate{::uwvm2::utils::cmdline::categorization::wasm}}; - /// @brief Command-line switch that enables only the sign-extension-operators feature. - inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_enable_sign_extension{ - .name{u8"--wasm-feature-enable-sign-extension"}, - .describe{u8"Enable the WebAssembly sign-extension-operators feature."}, - .handle{::std::addressof(details::wasm_feature_enable_sign_extension_callback)}, - .is_exist{::std::addressof(details::wasm_feature_enable_sign_extension_is_exist)}, + /// @brief Command-line switch that disables only the sign-extension-operators feature. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_disable_sign_extension{ + .name{u8"--wasm-feature-disable-sign-extension"}, + .describe{u8"Disable the WebAssembly sign-extension-operators feature."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{::std::addressof(details::wasm_feature_disable_sign_extension_alias), 1uz}}, + .handle{::std::addressof(details::wasm_feature_disable_sign_extension_callback)}, + .is_exist{::std::addressof(details::wasm_feature_disable_sign_extension_is_exist)}, .cate{::uwvm2::utils::cmdline::categorization::wasm}}; - /// @brief Command-line switch that enables only the non-trapping float-to-int conversion feature. - inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_enable_nontrapping_float_to_int{ - .name{u8"--wasm-feature-enable-nontrapping-float-to-int"}, - .describe{u8"Enable the WebAssembly non-trapping float-to-int conversion feature."}, - .handle{::std::addressof(details::wasm_feature_enable_nontrapping_float_to_int_callback)}, - .is_exist{::std::addressof(details::wasm_feature_enable_nontrapping_float_to_int_is_exist)}, + /// @brief Command-line switch that disables only the non-trapping float-to-int conversion feature. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_disable_nontrapping_float_to_int{ + .name{u8"--wasm-feature-disable-nontrapping-float-to-int"}, + .describe{u8"Disable the WebAssembly non-trapping float-to-int conversion feature."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{::std::addressof(details::wasm_feature_disable_nontrapping_float_to_int_alias), 1uz}}, + .handle{::std::addressof(details::wasm_feature_disable_nontrapping_float_to_int_callback)}, + .is_exist{::std::addressof(details::wasm_feature_disable_nontrapping_float_to_int_is_exist)}, .cate{::uwvm2::utils::cmdline::categorization::wasm}}; - /// @brief Command-line switch that enables only the SIMD feature. - inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_enable_simd{.name{u8"--wasm-feature-enable-simd"}, - .describe{u8"Enable the WebAssembly SIMD feature."}, - .handle{::std::addressof(details::wasm_feature_enable_simd_callback)}, - .is_exist{::std::addressof(details::wasm_feature_enable_simd_is_exist)}, - .cate{::uwvm2::utils::cmdline::categorization::wasm}}; + /// @brief Command-line switch that disables only the SIMD feature. + inline constexpr ::uwvm2::utils::cmdline::parameter wasm_feature_disable_simd{.name{u8"--wasm-feature-disable-simd"}, + .describe{u8"Disable the WebAssembly SIMD feature."}, + .alias{::uwvm2::utils::cmdline::kns_u8_str_scatter_t{ + ::std::addressof(details::wasm_feature_disable_simd_alias), 1uz}}, + .handle{::std::addressof(details::wasm_feature_disable_simd_callback)}, + .is_exist{::std::addressof(details::wasm_feature_disable_simd_is_exist)}, + .cate{::uwvm2::utils::cmdline::categorization::wasm}}; #if defined(__clang__) # pragma clang diagnostic pop #endif diff --git a/src/uwvm2/uwvm/runtime/initializer/init.h b/src/uwvm2/uwvm/runtime/initializer/init.h index 1903925c8..9855f9ef6 100644 --- a/src/uwvm2/uwvm/runtime/initializer/init.h +++ b/src/uwvm2/uwvm/runtime/initializer/init.h @@ -251,14 +251,14 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::runtime::initializer auto const opcode{static_cast<::uwvm2::parser::wasm::standard::wasm1::type::op_basic_type>(op.opcode)}; if(opcode == 0xD0u || opcode == 0xD2u) { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(::uwvm2::parser::wasm::base::wasm1p1_feature_kind::reference_types, subject, opcode); } } else if(opcode == 0xFDu) { - if(!wasm1p1_para.enable_simd) [[unlikely]] + if(wasm1p1_para.disable_simd) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(::uwvm2::parser::wasm::base::wasm1p1_feature_kind::simd, subject, opcode); } @@ -345,7 +345,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::runtime::initializer check_wasm1p1_initializer_const_expr(global.expr, fs_para, u8"local global initializer"); } - if(datacountsec.present && !wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(datacountsec.present && wasm1p1_para.disable_bulk_memory) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(feature_kind::bulk_memory, u8"data count section", @@ -355,7 +355,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::runtime::initializer for(auto const& data: datasec.datas) { - if((data.type == data_type::passive || data.type == data_type::active_explicit) && !wasm1p1_para.enable_bulk_memory) [[unlikely]] + if((data.type == data_type::passive || data.type == data_type::active_explicit) && wasm1p1_para.disable_bulk_memory) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(feature_kind::bulk_memory, u8"data segment", @@ -371,7 +371,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::runtime::initializer case element_type::passive_funcidx: [[fallthrough]]; case element_type::declarative_funcidx: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(feature_kind::bulk_memory, u8"element segment", @@ -383,7 +383,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::runtime::initializer case element_type::active_implicit_expr: [[fallthrough]]; case element_type::active_explicit_expr: { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(feature_kind::reference_types, u8"element segment", @@ -394,13 +394,13 @@ UWVM_MODULE_EXPORT namespace uwvm2::uwvm::runtime::initializer case element_type::passive_expr: [[fallthrough]]; case element_type::declarative_expr: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(feature_kind::bulk_memory, u8"element segment", static_cast(elem.type)); } - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { fatal_wasm1p1_initializer_feature_required(feature_kind::reference_types, u8"element segment", diff --git a/src/uwvm2/validation/standard/wasm1p1/validator.h b/src/uwvm2/validation/standard/wasm1p1/validator.h index 38bf30c38..aad19bb04 100644 --- a/src/uwvm2/validation/standard/wasm1p1/validator.h +++ b/src/uwvm2/validation/standard/wasm1p1/validator.h @@ -562,7 +562,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } auto const vt{static_cast<::uwvm2::parser::wasm::standard::wasm1p1::type::value_type>(type)}; - return vt == ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::v128 && wasm1p1_para.enable_simd; + return vt == ::uwvm2::parser::wasm::standard::wasm1p1::type::value_type::v128 && !wasm1p1_para.disable_simd; }}; auto const push_value_types{[&](block_result_type types) constexpr @@ -739,7 +739,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 if(blocktype >= 0) { - if(!wasm1p1_para.enable_multi_value) [[unlikely]] + if(wasm1p1_para.disable_multi_value) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -2458,7 +2458,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 // [safe ] unsafe (could be the section_end) // ^^ code_curr - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -2494,7 +2494,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 // [safe ] unsafe (could be the section_end) // ^^ code_curr - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4288,7 +4288,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case static_cast(wasm1p1_code::i32_extend8_s): { - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { details::fail_feature_required(code_curr, err, @@ -4301,7 +4301,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case static_cast(wasm1p1_code::i32_extend16_s): { - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { details::fail_feature_required(code_curr, err, @@ -4314,7 +4314,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case static_cast(wasm1p1_code::i64_extend8_s): { - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { details::fail_feature_required(code_curr, err, @@ -4327,7 +4327,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case static_cast(wasm1p1_code::i64_extend16_s): { - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { details::fail_feature_required(code_curr, err, @@ -4340,7 +4340,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case static_cast(wasm1p1_code::i64_extend32_s): { - if(!wasm1p1_para.enable_sign_extension) [[unlikely]] + if(wasm1p1_para.disable_sign_extension) [[unlikely]] { details::fail_feature_required(code_curr, err, @@ -4364,7 +4364,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 // [ safe ] unsafe (could be the section_end) // ^^ code_curr - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4402,7 +4402,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 // [ safe ] unsafe (could be the section_end) // ^^ code_curr - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4439,7 +4439,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 // [ safe ] unsafe (could be the section_end) // ^^ code_curr - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4475,7 +4475,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 { case wasm1p1_numeric_code::i32_trunc_sat_f32_s: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4491,7 +4491,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::i32_trunc_sat_f32_u: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4507,7 +4507,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::i32_trunc_sat_f64_s: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4523,7 +4523,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::i32_trunc_sat_f64_u: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4539,7 +4539,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::i64_trunc_sat_f32_s: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4555,7 +4555,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::i64_trunc_sat_f32_u: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4571,7 +4571,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::i64_trunc_sat_f64_s: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4587,7 +4587,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::i64_trunc_sat_f64_u: { - if(!wasm1p1_para.enable_nontrapping_float_to_int) [[unlikely]] + if(wasm1p1_para.disable_nontrapping_float_to_int) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4603,7 +4603,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::memory_init: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4624,7 +4624,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::data_drop: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4642,7 +4642,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::memory_copy: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4659,7 +4659,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::memory_fill: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4674,7 +4674,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::table_init: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4714,7 +4714,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::elem_drop: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4732,7 +4732,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::table_copy: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4770,7 +4770,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::table_grow: { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4818,7 +4818,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::table_size: { - if(!wasm1p1_para.enable_reference_types) [[unlikely]] + if(wasm1p1_para.disable_reference_types) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4837,7 +4837,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 } case wasm1p1_numeric_code::table_fill: { - if(!wasm1p1_para.enable_bulk_memory) [[unlikely]] + if(wasm1p1_para.disable_bulk_memory) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -4917,7 +4917,7 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 // [safe] unsafe (could be the section_end) // ^^ code_curr - if(!wasm1p1_para.enable_simd) [[unlikely]] + if(wasm1p1_para.disable_simd) [[unlikely]] { details::fail_feature_required(op_begin, err, @@ -5567,12 +5567,12 @@ UWVM_MODULE_EXPORT namespace uwvm2::validation::standard::wasm1p1 if constexpr((::std::same_as<::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1, Fs> || ...)) { auto& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - para.enable_multi_value = true; - para.enable_reference_types = true; - para.enable_bulk_memory = true; - para.enable_sign_extension = true; - para.enable_nontrapping_float_to_int = true; - para.enable_simd = true; + para.disable_multi_value = false; + para.disable_reference_types = false; + para.disable_bulk_memory = false; + para.disable_sign_extension = false; + para.disable_nontrapping_float_to_int = false; + para.disable_simd = false; } ::uwvm2::validation::standard::wasm1p1::validate_code(code_version, module_storage, function_index, code_begin, code_end, err, fs_para); diff --git a/test/0001.parser/0001.concept/wasm1p1_feature_list.cc b/test/0001.parser/0001.concept/wasm1p1_feature_list.cc index d086d8828..dbd0cd463 100644 --- a/test/0001.parser/0001.concept/wasm1p1_feature_list.cc +++ b/test/0001.parser/0001.concept/wasm1p1_feature_list.cc @@ -64,123 +64,122 @@ namespace test inline void expect_no_explicit_subfeatures(auto const& p1_para) { - expect(!p1_para.explicit_enable_multi_value, "multi-value explicit flag should be disabled"); - expect(!p1_para.explicit_enable_reference_types, "reference-types explicit flag should be disabled"); - expect(!p1_para.explicit_enable_bulk_memory, "bulk-memory explicit flag should be disabled"); - expect(!p1_para.explicit_enable_sign_extension, "sign-extension explicit flag should be disabled"); - expect(!p1_para.explicit_enable_nontrapping_float_to_int, "nontrapping explicit flag should be disabled"); - expect(!p1_para.explicit_enable_simd, "simd explicit flag should be disabled"); + expect(!p1_para.explicit_disable_multi_value, "multi-value explicit disable flag should be unset"); + expect(!p1_para.explicit_disable_reference_types, "reference-types explicit disable flag should be unset"); + expect(!p1_para.explicit_disable_bulk_memory, "bulk-memory explicit disable flag should be unset"); + expect(!p1_para.explicit_disable_sign_extension, "sign-extension explicit disable flag should be unset"); + expect(!p1_para.explicit_disable_nontrapping_float_to_int, "nontrapping explicit disable flag should be unset"); + expect(!p1_para.explicit_disable_simd, "simd explicit disable flag should be unset"); } - inline void expect_no_enabled_subfeatures(auto const& p1_para) + inline void expect_all_wasm1p1_features_enabled(auto const& p1_para) { - expect(!p1_para.enable_multi_value, "multi-value should be disabled"); - expect(!p1_para.enable_reference_types, "reference-types should be disabled"); - expect(!p1_para.enable_bulk_memory, "bulk-memory should be disabled"); - expect(!p1_para.enable_sign_extension, "sign-extension should be disabled"); - expect(!p1_para.enable_nontrapping_float_to_int, "nontrapping should be disabled"); - expect(!p1_para.enable_simd, "simd should be disabled"); + expect(!p1_para.disable_multi_value, "multi-value should be enabled"); + expect(!p1_para.disable_reference_types, "reference-types should be enabled"); + expect(!p1_para.disable_bulk_memory, "bulk-memory should be enabled"); + expect(!p1_para.disable_sign_extension, "sign-extension should be enabled"); + expect(!p1_para.disable_nontrapping_float_to_int, "nontrapping should be enabled"); + expect(!p1_para.disable_simd, "simd should be enabled"); } - inline void expect_default_mvp_feature_state(auto const& p1_para) + inline void expect_default_wasm1p1_feature_state(auto const& p1_para) { - expect(!p1_para.explicit_feature_1p1, "wasm1p1 collection should not be explicit by default"); + expect(!p1_para.explicit_feature_mvp, "mvp collection should not be explicit by default"); expect_no_explicit_subfeatures(p1_para); - expect_no_enabled_subfeatures(p1_para); - expect(p1_para.controllable_allow_multi_result_vector, "default state must keep MVP single-result validation"); - expect(p1_para.controllable_allow_multi_table, "default state must keep MVP single-table validation"); + expect_all_wasm1p1_features_enabled(p1_para); + expect(!p1_para.controllable_allow_multi_result_vector, "default wasm1p1 state should allow multi-result validation"); + expect(!p1_para.controllable_allow_multi_table, "default wasm1p1 state should allow multi-table validation"); } - inline void expect_only_multi_value_enabled(auto const& p1_para) + inline void expect_only_multi_value_disabled(auto const& p1_para) { - expect(p1_para.enable_multi_value, "multi-value was not enabled"); - expect(!p1_para.enable_reference_types, "multi-value switch enabled reference-types"); - expect(!p1_para.enable_bulk_memory, "multi-value switch enabled bulk-memory"); - expect(!p1_para.enable_sign_extension, "multi-value switch enabled sign-extension"); - expect(!p1_para.enable_nontrapping_float_to_int, "multi-value switch enabled nontrapping"); - expect(!p1_para.enable_simd, "multi-value switch enabled simd"); - expect(p1_para.explicit_enable_multi_value, "multi-value explicit flag was not set"); - expect(!p1_para.controllable_allow_multi_result_vector, "multi-value should relax the MVP single-result check"); - expect(p1_para.controllable_allow_multi_table, "multi-value should not relax the MVP single-table check"); + expect(p1_para.disable_multi_value, "multi-value was not disabled"); + expect(!p1_para.disable_reference_types, "multi-value switch disabled reference-types"); + expect(!p1_para.disable_bulk_memory, "multi-value switch disabled bulk-memory"); + expect(!p1_para.disable_sign_extension, "multi-value switch disabled sign-extension"); + expect(!p1_para.disable_nontrapping_float_to_int, "multi-value switch disabled nontrapping"); + expect(!p1_para.disable_simd, "multi-value switch disabled simd"); + expect(p1_para.explicit_disable_multi_value, "multi-value explicit disable flag was not set"); + expect(p1_para.controllable_allow_multi_result_vector, "multi-value disable should restore the MVP single-result check"); + expect(!p1_para.controllable_allow_multi_table, "multi-value disable should not restore the MVP single-table check"); } - inline void expect_only_reference_types_enabled(auto const& p1_para) + inline void expect_only_reference_types_disabled(auto const& p1_para) { - expect(!p1_para.enable_multi_value, "reference-types switch enabled multi-value"); - expect(p1_para.enable_reference_types, "reference-types was not enabled"); - expect(!p1_para.enable_bulk_memory, "reference-types switch enabled bulk-memory"); - expect(!p1_para.enable_sign_extension, "reference-types switch enabled sign-extension"); - expect(!p1_para.enable_nontrapping_float_to_int, "reference-types switch enabled nontrapping"); - expect(!p1_para.enable_simd, "reference-types switch enabled simd"); - expect(p1_para.explicit_enable_reference_types, "reference-types explicit flag was not set"); - expect(p1_para.controllable_allow_multi_result_vector, "reference-types should not relax the MVP single-result check"); - expect(!p1_para.controllable_allow_multi_table, "reference-types should relax the MVP single-table check"); + expect(!p1_para.disable_multi_value, "reference-types switch disabled multi-value"); + expect(p1_para.disable_reference_types, "reference-types was not disabled"); + expect(!p1_para.disable_bulk_memory, "reference-types switch disabled bulk-memory"); + expect(!p1_para.disable_sign_extension, "reference-types switch disabled sign-extension"); + expect(!p1_para.disable_nontrapping_float_to_int, "reference-types switch disabled nontrapping"); + expect(!p1_para.disable_simd, "reference-types switch disabled simd"); + expect(p1_para.explicit_disable_reference_types, "reference-types explicit disable flag was not set"); + expect(!p1_para.controllable_allow_multi_result_vector, "reference-types disable should not restore the MVP single-result check"); + expect(p1_para.controllable_allow_multi_table, "reference-types disable should restore the MVP single-table check"); } - inline void expect_only_bulk_memory_enabled(auto const& p1_para) + inline void expect_only_bulk_memory_disabled(auto const& p1_para) { - expect(!p1_para.enable_multi_value, "bulk-memory switch enabled multi-value"); - expect(!p1_para.enable_reference_types, "bulk-memory switch enabled reference-types"); - expect(p1_para.enable_bulk_memory, "bulk-memory was not enabled"); - expect(!p1_para.enable_sign_extension, "bulk-memory switch enabled sign-extension"); - expect(!p1_para.enable_nontrapping_float_to_int, "bulk-memory switch enabled nontrapping"); - expect(!p1_para.enable_simd, "bulk-memory switch enabled simd"); - expect(p1_para.explicit_enable_bulk_memory, "bulk-memory explicit flag was not set"); - expect(p1_para.controllable_allow_multi_result_vector, "bulk-memory should not relax the MVP single-result check"); - expect(p1_para.controllable_allow_multi_table, "bulk-memory should not relax the MVP single-table check"); + expect(!p1_para.disable_multi_value, "bulk-memory switch disabled multi-value"); + expect(!p1_para.disable_reference_types, "bulk-memory switch disabled reference-types"); + expect(p1_para.disable_bulk_memory, "bulk-memory was not disabled"); + expect(!p1_para.disable_sign_extension, "bulk-memory switch disabled sign-extension"); + expect(!p1_para.disable_nontrapping_float_to_int, "bulk-memory switch disabled nontrapping"); + expect(!p1_para.disable_simd, "bulk-memory switch disabled simd"); + expect(p1_para.explicit_disable_bulk_memory, "bulk-memory explicit disable flag was not set"); + expect(!p1_para.controllable_allow_multi_result_vector, "bulk-memory disable should not restore the MVP single-result check"); + expect(!p1_para.controllable_allow_multi_table, "bulk-memory disable should not restore the MVP single-table check"); } - inline void expect_only_sign_extension_enabled(auto const& p1_para) + inline void expect_only_sign_extension_disabled(auto const& p1_para) { - expect(!p1_para.enable_multi_value, "sign-extension switch enabled multi-value"); - expect(!p1_para.enable_reference_types, "sign-extension switch enabled reference-types"); - expect(!p1_para.enable_bulk_memory, "sign-extension switch enabled bulk-memory"); - expect(p1_para.enable_sign_extension, "sign-extension was not enabled"); - expect(!p1_para.enable_nontrapping_float_to_int, "sign-extension switch enabled nontrapping"); - expect(!p1_para.enable_simd, "sign-extension switch enabled simd"); - expect(p1_para.explicit_enable_sign_extension, "sign-extension explicit flag was not set"); - expect(p1_para.controllable_allow_multi_result_vector, "sign-extension should not relax the MVP single-result check"); - expect(p1_para.controllable_allow_multi_table, "sign-extension should not relax the MVP single-table check"); + expect(!p1_para.disable_multi_value, "sign-extension switch disabled multi-value"); + expect(!p1_para.disable_reference_types, "sign-extension switch disabled reference-types"); + expect(!p1_para.disable_bulk_memory, "sign-extension switch disabled bulk-memory"); + expect(p1_para.disable_sign_extension, "sign-extension was not disabled"); + expect(!p1_para.disable_nontrapping_float_to_int, "sign-extension switch disabled nontrapping"); + expect(!p1_para.disable_simd, "sign-extension switch disabled simd"); + expect(p1_para.explicit_disable_sign_extension, "sign-extension explicit disable flag was not set"); + expect(!p1_para.controllable_allow_multi_result_vector, "sign-extension disable should not restore the MVP single-result check"); + expect(!p1_para.controllable_allow_multi_table, "sign-extension disable should not restore the MVP single-table check"); } - inline void expect_only_nontrapping_enabled(auto const& p1_para) + inline void expect_only_nontrapping_disabled(auto const& p1_para) { - expect(!p1_para.enable_multi_value, "nontrapping switch enabled multi-value"); - expect(!p1_para.enable_reference_types, "nontrapping switch enabled reference-types"); - expect(!p1_para.enable_bulk_memory, "nontrapping switch enabled bulk-memory"); - expect(!p1_para.enable_sign_extension, "nontrapping switch enabled sign-extension"); - expect(p1_para.enable_nontrapping_float_to_int, "nontrapping was not enabled"); - expect(!p1_para.enable_simd, "nontrapping switch enabled simd"); - expect(p1_para.explicit_enable_nontrapping_float_to_int, "nontrapping explicit flag was not set"); - expect(p1_para.controllable_allow_multi_result_vector, "nontrapping should not relax the MVP single-result check"); - expect(p1_para.controllable_allow_multi_table, "nontrapping should not relax the MVP single-table check"); + expect(!p1_para.disable_multi_value, "nontrapping switch disabled multi-value"); + expect(!p1_para.disable_reference_types, "nontrapping switch disabled reference-types"); + expect(!p1_para.disable_bulk_memory, "nontrapping switch disabled bulk-memory"); + expect(!p1_para.disable_sign_extension, "nontrapping switch disabled sign-extension"); + expect(p1_para.disable_nontrapping_float_to_int, "nontrapping was not disabled"); + expect(!p1_para.disable_simd, "nontrapping switch disabled simd"); + expect(p1_para.explicit_disable_nontrapping_float_to_int, "nontrapping explicit disable flag was not set"); + expect(!p1_para.controllable_allow_multi_result_vector, "nontrapping disable should not restore the MVP single-result check"); + expect(!p1_para.controllable_allow_multi_table, "nontrapping disable should not restore the MVP single-table check"); } - inline void expect_only_simd_enabled(auto const& p1_para) + inline void expect_only_simd_disabled(auto const& p1_para) { - expect(!p1_para.enable_multi_value, "simd switch enabled multi-value"); - expect(!p1_para.enable_reference_types, "simd switch enabled reference-types"); - expect(!p1_para.enable_bulk_memory, "simd switch enabled bulk-memory"); - expect(!p1_para.enable_sign_extension, "simd switch enabled sign-extension"); - expect(!p1_para.enable_nontrapping_float_to_int, "simd switch enabled nontrapping"); - expect(p1_para.enable_simd, "simd was not enabled"); - expect(p1_para.explicit_enable_simd, "simd explicit flag was not set"); - expect(p1_para.controllable_allow_multi_result_vector, "simd should not relax the MVP single-result check"); - expect(p1_para.controllable_allow_multi_table, "simd should not relax the MVP single-table check"); + expect(!p1_para.disable_multi_value, "simd switch disabled multi-value"); + expect(!p1_para.disable_reference_types, "simd switch disabled reference-types"); + expect(!p1_para.disable_bulk_memory, "simd switch disabled bulk-memory"); + expect(!p1_para.disable_sign_extension, "simd switch disabled sign-extension"); + expect(!p1_para.disable_nontrapping_float_to_int, "simd switch disabled nontrapping"); + expect(p1_para.disable_simd, "simd was not disabled"); + expect(p1_para.explicit_disable_simd, "simd explicit disable flag was not set"); + expect(!p1_para.controllable_allow_multi_result_vector, "simd disable should not restore the MVP single-result check"); + expect(!p1_para.controllable_allow_multi_table, "simd disable should not restore the MVP single-table check"); } - inline void expect_full_wasm1p1_enabled(auto const& p1_para) + inline void expect_mvp_feature_state(auto const& p1_para) { - expect(p1_para.explicit_feature_1p1, "wasm1p1 collection explicit flag was not set"); - expect_no_explicit_subfeatures(p1_para); - expect(p1_para.enable_multi_value, "wasm1p1 collection did not enable multi-value"); - expect(p1_para.enable_reference_types, "wasm1p1 collection did not enable reference-types"); - expect(p1_para.enable_bulk_memory, "wasm1p1 collection did not enable bulk-memory"); - expect(p1_para.enable_sign_extension, "wasm1p1 collection did not enable sign-extension"); - expect(p1_para.enable_nontrapping_float_to_int, "wasm1p1 collection did not enable nontrapping"); - expect(p1_para.enable_simd, "wasm1p1 collection did not enable simd"); - expect(!p1_para.controllable_allow_multi_result_vector, "wasm1p1 collection should relax the MVP single-result check"); - expect(!p1_para.controllable_allow_multi_table, "wasm1p1 collection should relax the MVP single-table check"); + expect(p1_para.explicit_feature_mvp, "mvp collection explicit flag was not set"); + expect(p1_para.disable_multi_value, "mvp collection did not disable multi-value"); + expect(p1_para.disable_reference_types, "mvp collection did not disable reference-types"); + expect(p1_para.disable_bulk_memory, "mvp collection did not disable bulk-memory"); + expect(p1_para.disable_sign_extension, "mvp collection did not disable sign-extension"); + expect(p1_para.disable_nontrapping_float_to_int, "mvp collection did not disable nontrapping"); + expect(p1_para.disable_simd, "mvp collection did not disable simd"); + expect(p1_para.controllable_allow_multi_result_vector, "mvp collection should restore the MVP single-result check"); + expect(p1_para.controllable_allow_multi_table, "mvp collection should restore the MVP single-table check"); } inline void expect_callback_success(::uwvm2::utils::cmdline::handle_func_type callback, char const* label) @@ -196,35 +195,44 @@ namespace test namespace callbacks = ::uwvm2::uwvm::cmdline::params::details; reset_cli_wasm_parameter(); - expect_default_mvp_feature_state(cli_wasm1p1_parameter()); + expect_default_wasm1p1_feature_state(cli_wasm1p1_parameter()); + + reset_cli_wasm_parameter(); + expect_callback_success(callbacks::wasm_feature_disable_multi_value_callback, "multi-value callback failed"); + expect_only_multi_value_disabled(cli_wasm1p1_parameter()); reset_cli_wasm_parameter(); - expect_callback_success(callbacks::wasm_feature_enable_multi_value_callback, "multi-value callback failed"); - expect_only_multi_value_enabled(cli_wasm1p1_parameter()); + expect_callback_success(callbacks::wasm_feature_disable_reference_types_callback, "reference-types callback failed"); + expect_only_reference_types_disabled(cli_wasm1p1_parameter()); reset_cli_wasm_parameter(); - expect_callback_success(callbacks::wasm_feature_enable_reference_types_callback, "reference-types callback failed"); - expect_only_reference_types_enabled(cli_wasm1p1_parameter()); + expect_callback_success(callbacks::wasm_feature_disable_bulk_memory_callback, "bulk-memory callback failed"); + expect_only_bulk_memory_disabled(cli_wasm1p1_parameter()); reset_cli_wasm_parameter(); - expect_callback_success(callbacks::wasm_feature_enable_bulk_memory_callback, "bulk-memory callback failed"); - expect_only_bulk_memory_enabled(cli_wasm1p1_parameter()); + expect_callback_success(callbacks::wasm_feature_disable_sign_extension_callback, "sign-extension callback failed"); + expect_only_sign_extension_disabled(cli_wasm1p1_parameter()); reset_cli_wasm_parameter(); - expect_callback_success(callbacks::wasm_feature_enable_sign_extension_callback, "sign-extension callback failed"); - expect_only_sign_extension_enabled(cli_wasm1p1_parameter()); + expect_callback_success(callbacks::wasm_feature_disable_nontrapping_float_to_int_callback, "nontrapping callback failed"); + expect_only_nontrapping_disabled(cli_wasm1p1_parameter()); reset_cli_wasm_parameter(); - expect_callback_success(callbacks::wasm_feature_enable_nontrapping_float_to_int_callback, "nontrapping callback failed"); - expect_only_nontrapping_enabled(cli_wasm1p1_parameter()); + expect_callback_success(callbacks::wasm_feature_disable_simd_callback, "simd callback failed"); + expect_only_simd_disabled(cli_wasm1p1_parameter()); reset_cli_wasm_parameter(); - expect_callback_success(callbacks::wasm_feature_enable_simd_callback, "simd callback failed"); - expect_only_simd_enabled(cli_wasm1p1_parameter()); + expect_callback_success(callbacks::wasm_feature_wasm1p1_callback, "wasm1p1 collection callback failed"); + expect_default_wasm1p1_feature_state(cli_wasm1p1_parameter()); reset_cli_wasm_parameter(); - expect_callback_success(callbacks::wasm_feature_1p1_callback, "wasm1p1 collection callback failed"); - expect_full_wasm1p1_enabled(cli_wasm1p1_parameter()); + expect_callback_success(callbacks::wasm_feature_mvp_callback, "mvp collection callback failed"); + expect_mvp_feature_state(cli_wasm1p1_parameter()); + + expect_callback_success(callbacks::wasm_feature_wasm1p1_callback, "wasm1p1 re-enable callback failed"); + expect_all_wasm1p1_features_enabled(cli_wasm1p1_parameter()); + expect(!cli_wasm1p1_parameter().controllable_allow_multi_result_vector, "wasm1p1 re-enable should relax the MVP single-result check"); + expect(!cli_wasm1p1_parameter().controllable_allow_multi_table, "wasm1p1 re-enable should relax the MVP single-table check"); } inline void test_parser_feature_defaults() @@ -236,21 +244,20 @@ namespace test ::uwvm2::parser::wasm::concepts::feature_parameter_t fs_para{}; auto const& p1_para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - expect_default_mvp_feature_state(p1_para); + expect_default_wasm1p1_feature_state(p1_para); expect(::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::i32, fs_para), "i32 should remain MVP"); expect(::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::i64, fs_para), "i64 should remain MVP"); expect(::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::f32, fs_para), "f32 should remain MVP"); expect(::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::f64, fs_para), "f64 should remain MVP"); - expect(!::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::v128, fs_para), - "v128 should require simd"); - expect(!::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::funcref, fs_para), - "funcref locals/globals should require reference-types"); - expect(!::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::externref, fs_para), - "externref should require reference-types"); + expect(::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::v128, fs_para), "v128 should be enabled by default"); + expect(::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::funcref, fs_para), + "funcref locals/globals should be enabled by default"); + expect(::uwvm2::parser::wasm::standard::wasm1p1::features::value_type_enabled(value_type::externref, fs_para), + "externref should be enabled by default"); expect(::uwvm2::parser::wasm::standard::wasm1p1::features::reference_type_enabled(reference_type::funcref, fs_para), "funcref table element type should remain MVP"); - expect(!::uwvm2::parser::wasm::standard::wasm1p1::features::reference_type_enabled(reference_type::externref, fs_para), - "externref table element type should require reference-types"); + expect(::uwvm2::parser::wasm::standard::wasm1p1::features::reference_type_enabled(reference_type::externref, fs_para), + "externref table element type should be enabled by default"); } /// @brief Parse the minimal empty module with the requested parser feature list. @@ -283,12 +290,12 @@ int main() ::uwvm2::parser::wasm::concepts::feature_parameter_t wasm1p1_para{}; auto& p1_para{::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(wasm1p1_para)}; - p1_para.enable_multi_value = true; - p1_para.enable_reference_types = true; - p1_para.enable_bulk_memory = true; - p1_para.enable_sign_extension = true; - p1_para.enable_nontrapping_float_to_int = true; - p1_para.enable_simd = true; + p1_para.disable_multi_value = false; + p1_para.disable_reference_types = false; + p1_para.disable_bulk_memory = false; + p1_para.disable_sign_extension = false; + p1_para.disable_nontrapping_float_to_int = false; + p1_para.disable_simd = false; p1_para.controllable_allow_multi_result_vector = false; p1_para.controllable_allow_multi_table = false; test::parse_empty_module(wasm1p1_para); diff --git a/test/0001.parser/0001.concept/wasm1p1_parser_section_details.cc b/test/0001.parser/0001.concept/wasm1p1_parser_section_details.cc index c1ed2946f..d68a54666 100644 --- a/test/0001.parser/0001.concept/wasm1p1_parser_section_details.cc +++ b/test/0001.parser/0001.concept/wasm1p1_parser_section_details.cc @@ -275,12 +275,12 @@ namespace test inline void enable_all_wasm1p1_features(Para& fs_para) noexcept { auto& p1_para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - p1_para.enable_multi_value = true; - p1_para.enable_reference_types = true; - p1_para.enable_bulk_memory = true; - p1_para.enable_sign_extension = true; - p1_para.enable_nontrapping_float_to_int = true; - p1_para.enable_simd = true; + p1_para.disable_multi_value = false; + p1_para.disable_reference_types = false; + p1_para.disable_bulk_memory = false; + p1_para.disable_sign_extension = false; + p1_para.disable_nontrapping_float_to_int = false; + p1_para.disable_simd = false; p1_para.controllable_allow_multi_result_vector = false; p1_para.controllable_allow_multi_table = false; } @@ -331,7 +331,7 @@ namespace test } } - inline void test_default_mvp_feature_rejections() + inline void test_mvp_feature_rejections() { using wasm1 = ::uwvm2::parser::wasm::standard::wasm1::features::wasm1; using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; @@ -340,34 +340,50 @@ namespace test auto multi_result_module{build_multi_result_type_module()}; feature_para_t default_multi_para{}; + expect_parse_success(multi_result_module, default_multi_para, "default wasm1p1 parser rejected multi-result type"); + + feature_para_t mvp_multi_para{}; + auto& mvp_multi_p1{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(mvp_multi_para)}; + mvp_multi_p1.disable_multi_value = true; + mvp_multi_p1.controllable_allow_multi_result_vector = true; expect_parse_error( - multi_result_module, default_multi_para, error_code::wasm1_not_allow_multi_value, "default parser accepted multi-result type"); + multi_result_module, mvp_multi_para, error_code::wasm1_not_allow_multi_value, "mvp parser accepted multi-result type"); feature_para_t multi_value_para{}; auto& multi_value_p1{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(multi_value_para)}; - multi_value_p1.enable_multi_value = true; + multi_value_p1.disable_multi_value = false; multi_value_p1.controllable_allow_multi_result_vector = false; expect_parse_success(multi_result_module, multi_value_para, "multi-value parser switch did not allow multi-result type"); auto two_table_module{build_two_table_module()}; feature_para_t default_table_para{}; - expect_parse_error( - two_table_module, default_table_para, error_code::wasm1_not_allow_multi_table, "default parser accepted multiple tables"); + expect_parse_success(two_table_module, default_table_para, "default wasm1p1 parser rejected multiple tables"); + + feature_para_t mvp_table_para{}; + auto& mvp_table_p1{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(mvp_table_para)}; + mvp_table_p1.disable_reference_types = true; + mvp_table_p1.controllable_allow_multi_table = true; + expect_parse_error(two_table_module, mvp_table_para, error_code::wasm1_not_allow_multi_table, "mvp parser accepted multiple tables"); feature_para_t reference_types_para{}; auto& reference_types_p1{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(reference_types_para)}; - reference_types_p1.enable_reference_types = true; + reference_types_p1.disable_reference_types = false; reference_types_p1.controllable_allow_multi_table = false; expect_parse_success(two_table_module, reference_types_para, "reference-types parser switch did not allow multiple tables"); auto data_count_module{build_data_count_zero_module()}; feature_para_t default_bulk_para{}; + expect_parse_success(data_count_module, default_bulk_para, "default wasm1p1 parser rejected data-count section"); + + feature_para_t mvp_bulk_para{}; + auto& mvp_bulk_p1{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(mvp_bulk_para)}; + mvp_bulk_p1.disable_bulk_memory = true; expect_parse_error( - data_count_module, default_bulk_para, error_code::wasm1p1_feature_required, "default parser accepted data-count section"); + data_count_module, mvp_bulk_para, error_code::wasm1p1_feature_required, "mvp parser accepted data-count section"); feature_para_t bulk_memory_para{}; auto& bulk_memory_p1{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(bulk_memory_para)}; - bulk_memory_p1.enable_bulk_memory = true; + bulk_memory_p1.disable_bulk_memory = false; expect_parse_success(data_count_module, bulk_memory_para, "bulk-memory parser switch did not allow data-count section"); } #endif @@ -440,7 +456,7 @@ int main() test::assert_printable_all_chars(section_details(datasec, module_storage.sections)); #ifdef UWVM_CPP_EXCEPTIONS - test::test_default_mvp_feature_rejections(); + test::test_mvp_feature_rejections(); { ::uwvm2::parser::wasm::concepts::feature_parameter_t limited_para{}; diff --git a/test/0009.libfuzzer/wasm1p1_runtime_initilizer.cc b/test/0009.libfuzzer/wasm1p1_runtime_initilizer.cc index 66ae2e16c..fc247e975 100644 --- a/test/0009.libfuzzer/wasm1p1_runtime_initilizer.cc +++ b/test/0009.libfuzzer/wasm1p1_runtime_initilizer.cc @@ -47,26 +47,26 @@ namespace if((mode & 0x40u) != 0u) { - para.enable_multi_value = true; - para.enable_reference_types = true; - para.enable_bulk_memory = true; - para.enable_sign_extension = true; - para.enable_nontrapping_float_to_int = true; - para.enable_simd = true; + para.disable_multi_value = false; + para.disable_reference_types = false; + para.disable_bulk_memory = false; + para.disable_sign_extension = false; + para.disable_nontrapping_float_to_int = false; + para.disable_simd = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; return; } - para.enable_multi_value = (mode & 0x01u) != 0u; - para.enable_reference_types = (mode & 0x02u) != 0u; - para.enable_bulk_memory = (mode & 0x04u) != 0u; - para.enable_sign_extension = (mode & 0x08u) != 0u; - para.enable_nontrapping_float_to_int = (mode & 0x10u) != 0u; - para.enable_simd = (mode & 0x20u) != 0u; + para.disable_multi_value = (mode & 0x01u) == 0u; + para.disable_reference_types = (mode & 0x02u) == 0u; + para.disable_bulk_memory = (mode & 0x04u) == 0u; + para.disable_sign_extension = (mode & 0x08u) == 0u; + para.disable_nontrapping_float_to_int = (mode & 0x10u) == 0u; + para.disable_simd = (mode & 0x20u) == 0u; - if(para.enable_multi_value) { para.controllable_allow_multi_result_vector = false; } - if(para.enable_reference_types) { para.controllable_allow_multi_table = false; } + para.controllable_allow_multi_result_vector = para.disable_multi_value; + para.controllable_allow_multi_table = para.disable_reference_types; } [[nodiscard]] inline constexpr bool check_resource_limits(auto const& module_storage) noexcept diff --git a/test/0009.libfuzzer/wasm1p1_validator_fuzzer.cc b/test/0009.libfuzzer/wasm1p1_validator_fuzzer.cc index b494a5a81..2a59a4d78 100644 --- a/test/0009.libfuzzer/wasm1p1_validator_fuzzer.cc +++ b/test/0009.libfuzzer/wasm1p1_validator_fuzzer.cc @@ -41,12 +41,12 @@ namespace inline constexpr void enable_all_wasm1p1_features(fs_para_t& fs_para) noexcept { auto& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - para.enable_multi_value = true; - para.enable_reference_types = true; - para.enable_bulk_memory = true; - para.enable_sign_extension = true; - para.enable_nontrapping_float_to_int = true; - para.enable_simd = true; + para.disable_multi_value = false; + para.disable_reference_types = false; + para.disable_bulk_memory = false; + para.disable_sign_extension = false; + para.disable_nontrapping_float_to_int = false; + para.disable_simd = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; } diff --git a/test/0009.libfuzzer/wasm1p1_validator_wabt_fuzzer.cc b/test/0009.libfuzzer/wasm1p1_validator_wabt_fuzzer.cc index 89e820585..4860c66f5 100644 --- a/test/0009.libfuzzer/wasm1p1_validator_wabt_fuzzer.cc +++ b/test/0009.libfuzzer/wasm1p1_validator_wabt_fuzzer.cc @@ -109,15 +109,15 @@ namespace inline constexpr void configure_uwvm_wasm1p1_features(fs_para_t& fs_para, feature_config_t const config) noexcept { auto& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - para.enable_multi_value = config.multi_value; - para.enable_reference_types = config.reference_types; - para.enable_bulk_memory = config.bulk_memory; - para.enable_sign_extension = config.sign_extension; - para.enable_nontrapping_float_to_int = config.nontrapping_float_to_int; - para.enable_simd = config.simd; - - if(config.multi_value) { para.controllable_allow_multi_result_vector = false; } - if(config.reference_types) { para.controllable_allow_multi_table = false; } + para.disable_multi_value = !config.multi_value; + para.disable_reference_types = !config.reference_types; + para.disable_bulk_memory = !config.bulk_memory; + para.disable_sign_extension = !config.sign_extension; + para.disable_nontrapping_float_to_int = !config.nontrapping_float_to_int; + para.disable_simd = !config.simd; + + para.controllable_allow_multi_result_vector = para.disable_multi_value; + para.controllable_allow_multi_table = para.disable_reference_types; } [[nodiscard]] static validation_result_t validate_with_uwvm(::std::uint8_t const* data, ::std::size_t size, feature_config_t const config) diff --git a/test/0012.validator/wasm1p1_select_polymorphic_unknown_result.cc b/test/0012.validator/wasm1p1_select_polymorphic_unknown_result.cc index a924d55e0..32b4de8af 100644 --- a/test/0012.validator/wasm1p1_select_polymorphic_unknown_result.cc +++ b/test/0012.validator/wasm1p1_select_polymorphic_unknown_result.cc @@ -27,9 +27,9 @@ namespace inline constexpr void configure_features(fs_para_t& fs_para) noexcept { auto& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - para.enable_multi_value = true; - para.enable_reference_types = true; - para.enable_bulk_memory = true; + para.disable_multi_value = false; + para.disable_reference_types = false; + para.disable_bulk_memory = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; } diff --git a/test/0012.validator/wasm1p1_select_t_empty_result_types.cc b/test/0012.validator/wasm1p1_select_t_empty_result_types.cc index 83c029ae4..e0ea8859e 100644 --- a/test/0012.validator/wasm1p1_select_t_empty_result_types.cc +++ b/test/0012.validator/wasm1p1_select_t_empty_result_types.cc @@ -27,9 +27,9 @@ namespace inline constexpr void configure_features(fs_para_t& fs_para) noexcept { auto& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - para.enable_multi_value = true; - para.enable_reference_types = true; - para.enable_bulk_memory = true; + para.disable_multi_value = false; + para.disable_reference_types = false; + para.disable_bulk_memory = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; } diff --git a/test/0012.validator/wasm1p1_select_t_empty_result_types_without_multi_value.cc b/test/0012.validator/wasm1p1_select_t_empty_result_types_without_multi_value.cc index 8f38c4fc6..d21fbee43 100644 --- a/test/0012.validator/wasm1p1_select_t_empty_result_types_without_multi_value.cc +++ b/test/0012.validator/wasm1p1_select_t_empty_result_types_without_multi_value.cc @@ -28,12 +28,12 @@ namespace inline constexpr void configure_features(fs_para_t& fs_para) noexcept { auto& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - para.enable_multi_value = false; - para.enable_reference_types = false; - para.enable_bulk_memory = true; - para.enable_sign_extension = true; - para.enable_nontrapping_float_to_int = true; - para.enable_simd = true; + para.disable_multi_value = true; + para.disable_reference_types = true; + para.disable_bulk_memory = false; + para.disable_sign_extension = false; + para.disable_nontrapping_float_to_int = false; + para.disable_simd = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; } diff --git a/test/0012.validator/wasm1p1_table_fill_bulk_memory_feature.cc b/test/0012.validator/wasm1p1_table_fill_bulk_memory_feature.cc index 033b40be7..e7a71638c 100644 --- a/test/0012.validator/wasm1p1_table_fill_bulk_memory_feature.cc +++ b/test/0012.validator/wasm1p1_table_fill_bulk_memory_feature.cc @@ -28,10 +28,10 @@ namespace inline constexpr void configure_features(fs_para_t& fs_para) noexcept { auto& para{::uwvm2::parser::wasm::standard::wasm1p1::features::get_wasm1p1_parameter(fs_para)}; - para.enable_multi_value = true; - para.enable_reference_types = false; - para.enable_bulk_memory = true; - para.enable_sign_extension = true; + para.disable_multi_value = false; + para.disable_reference_types = true; + para.disable_bulk_memory = false; + para.disable_sign_extension = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; } diff --git a/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_alignment.cc b/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_alignment.cc index fed56ccb0..67aeea997 100644 --- a/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_alignment.cc +++ b/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_alignment.cc @@ -39,9 +39,11 @@ namespace auto out{strict::make_wasm1p1_feature_parameter()}; using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; auto& para{::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out)}; - para.enable_multi_value = multi_value; - para.enable_reference_types = reference_types; - para.enable_bulk_memory = bulk_memory; + para.disable_multi_value = !multi_value; + para.disable_reference_types = !reference_types; + para.disable_bulk_memory = !bulk_memory; + para.controllable_allow_multi_result_vector = para.disable_multi_value; + para.controllable_allow_multi_table = para.disable_reference_types; return out; } diff --git a/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_full_interpreter.cc b/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_full_interpreter.cc index 1ab0a0e44..a944750ab 100644 --- a/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_full_interpreter.cc +++ b/test/0013.uwvm_int/lazy/uwvm_int_lazy_wasm1p1_full_interpreter.cc @@ -19,7 +19,8 @@ namespace auto out{strict::make_wasm1p1_feature_parameter()}; using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; auto& para{::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out)}; - para.enable_reference_types = enabled; + para.disable_reference_types = !enabled; + para.controllable_allow_multi_table = para.disable_reference_types; return out; } @@ -28,7 +29,7 @@ namespace auto out{strict::make_wasm1p1_feature_parameter()}; using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; auto& para{::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out)}; - para.enable_sign_extension = enabled; + para.disable_sign_extension = !enabled; return out; } @@ -37,7 +38,7 @@ namespace auto out{strict::make_wasm1p1_feature_parameter()}; using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; auto& para{::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out)}; - para.enable_bulk_memory = enabled; + para.disable_bulk_memory = !enabled; return out; } @@ -46,7 +47,7 @@ namespace auto out{strict::make_wasm1p1_feature_parameter()}; using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; auto& para{::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out)}; - para.enable_nontrapping_float_to_int = enabled; + para.disable_nontrapping_float_to_int = !enabled; return out; } @@ -55,7 +56,7 @@ namespace auto out{strict::make_wasm1p1_feature_parameter()}; using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; auto& para{::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out)}; - para.enable_simd = enabled; + para.disable_simd = !enabled; return out; } diff --git a/test/0013.uwvm_int/strict/uwvm_int_translate_strict_common.h b/test/0013.uwvm_int/strict/uwvm_int_translate_strict_common.h index c4f5d4ee8..323e04035 100644 --- a/test/0013.uwvm_int/strict/uwvm_int_translate_strict_common.h +++ b/test/0013.uwvm_int/strict/uwvm_int_translate_strict_common.h @@ -128,13 +128,12 @@ namespace uwvm2test::uwvm_int_strict using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; wasm_feature_parameter_t out{}; auto& para = ::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out); - para.enable_multi_value = true; - para.enable_reference_types = true; - para.enable_bulk_memory = true; - para.enable_sign_extension = true; - para.enable_nontrapping_float_to_int = true; - para.enable_simd = true; - para.explicit_feature_1p1 = true; + para.disable_multi_value = false; + para.disable_reference_types = false; + para.disable_bulk_memory = false; + para.disable_sign_extension = false; + para.disable_nontrapping_float_to_int = false; + para.disable_simd = false; para.controllable_allow_multi_result_vector = false; para.controllable_allow_multi_table = false; return out; diff --git a/test/0013.uwvm_int/strict/validate/uwvm_int_validate_wasm1p1_validator_alignment_strict.cc b/test/0013.uwvm_int/strict/validate/uwvm_int_validate_wasm1p1_validator_alignment_strict.cc index 3dc802c34..aabe12c43 100644 --- a/test/0013.uwvm_int/strict/validate/uwvm_int_validate_wasm1p1_validator_alignment_strict.cc +++ b/test/0013.uwvm_int/strict/validate/uwvm_int_validate_wasm1p1_validator_alignment_strict.cc @@ -33,9 +33,11 @@ namespace auto out = make_wasm1p1_feature_parameter(); using wasm1p1 = ::uwvm2::parser::wasm::standard::wasm1p1::features::wasm1p1; auto& para = ::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(out); - para.enable_multi_value = multi_value; - para.enable_reference_types = reference_types; - para.enable_bulk_memory = bulk_memory; + para.disable_multi_value = !multi_value; + para.disable_reference_types = !reference_types; + para.disable_bulk_memory = !bulk_memory; + para.controllable_allow_multi_result_vector = para.disable_multi_value; + para.controllable_allow_multi_table = para.disable_reference_types; return out; } @@ -411,11 +413,11 @@ namespace auto& nontrapping_para = ::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(nontrapping_disabled_features); auto& simd_para = ::uwvm2::parser::wasm::concepts::get_curr_feature_parameter(simd_disabled_features); - ref_para.enable_reference_types = false; - sign_para.enable_sign_extension = false; - bulk_para.enable_bulk_memory = false; - nontrapping_para.enable_nontrapping_float_to_int = false; - simd_para.enable_simd = false; + ref_para.disable_reference_types = true; + sign_para.disable_sign_extension = true; + bulk_para.disable_bulk_memory = true; + nontrapping_para.disable_nontrapping_float_to_int = true; + simd_para.disable_simd = true; UWVM2TEST_REQUIRE(compile_expect_error_with_features(full::build_invalid_ref_feature_module(), u8"uwvm2test_strict_full_ref_feature", diff --git a/test/0014.llvm_jit/llvm_jit_cache_integration.cc b/test/0014.llvm_jit/llvm_jit_cache_integration.cc index f67538dce..d6ee54237 100644 --- a/test/0014.llvm_jit/llvm_jit_cache_integration.cc +++ b/test/0014.llvm_jit/llvm_jit_cache_integration.cc @@ -969,7 +969,7 @@ namespace auto const scalar_cache_dir{artifact_dir / "cache-wasm1p1-feature-smoke"}; constexpr ::std::string_view wasm1p1_feature_args{ - "-Rjit --wasm-feature-enable-sign-extension --wasm-feature-enable-nontrapping-float-to-int"}; + "-Rjit --wasm-feature-wasm1.1"}; if(!run_cached_mode_twice(uwvm_path, artifact_dir, scalar_wasm_path, @@ -984,7 +984,7 @@ namespace if(!write_fixture(multivalue_wasm_path, wasm1p1_multivalue_start_wasm.data(), wasm1p1_multivalue_start_wasm.size())) { return false; } auto const multivalue_cache_dir{artifact_dir / "cache-wasm1p1-multivalue-smoke"}; - constexpr ::std::string_view wasm1p1_multivalue_feature_args{"-Rjit --wasm-feature-enable-multi-value"}; + constexpr ::std::string_view wasm1p1_multivalue_feature_args{"-Rjit --wasm-feature-wasm1.1"}; return run_cached_mode_twice(uwvm_path, artifact_dir, multivalue_wasm_path, diff --git a/test/0014.llvm_jit/llvm_jit_verify_compile.cc b/test/0014.llvm_jit/llvm_jit_verify_compile.cc index c855d4fd8..cbf0ef525 100644 --- a/test/0014.llvm_jit/llvm_jit_verify_compile.cc +++ b/test/0014.llvm_jit/llvm_jit_verify_compile.cc @@ -50,10 +50,10 @@ namespace 0x47u, 0x04u, 0x40u, 0x00u, 0x0bu, 0x0bu}; inline constexpr ::std::string_view wasm1p1_scalar_runtime_args{ - "--runtime-llvm-jit-cache-path disable --wasm-feature-enable-sign-extension --wasm-feature-enable-nontrapping-float-to-int"}; + "--runtime-llvm-jit-cache-path disable --wasm-feature-wasm1.1"}; inline constexpr ::std::string_view wasm1p1_all_runtime_args{ - "--runtime-llvm-jit-cache-path disable --wasm-feature-1p1"}; + "--runtime-llvm-jit-cache-path disable --wasm-feature-wasm1.1"}; // WebAssembly 1.1 scalar edge fixture. This covers every sign-extension // opcode and every saturating float-to-int opcode at clamp/NaN boundaries. @@ -140,7 +140,7 @@ namespace 0x10u, 0x00u, 0x6au, 0x41u, 0x2au, 0x47u, 0x04u, 0x40u, 0x00u, 0x0bu, 0x0bu}; inline constexpr ::std::string_view wasm1p1_multivalue_runtime_args{ - "--runtime-llvm-jit-cache-path disable --wasm-feature-enable-multi-value"}; + "--runtime-llvm-jit-cache-path disable --wasm-feature-wasm1.1"}; // Generated from: // (module diff --git a/test/0014.llvm_jit/llvm_jit_wasm1p1_clang_cpp_matrix.cc b/test/0014.llvm_jit/llvm_jit_wasm1p1_clang_cpp_matrix.cc index 97d90f340..4b5ff36b6 100644 --- a/test/0014.llvm_jit/llvm_jit_wasm1p1_clang_cpp_matrix.cc +++ b/test/0014.llvm_jit/llvm_jit_wasm1p1_clang_cpp_matrix.cc @@ -64,11 +64,11 @@ int main() )cpp"}; inline constexpr ::std::string_view wasm1p1_feature_args{ - "--runtime-llvm-jit-cache-path disable --wasm-feature-1p1"}; + "--runtime-llvm-jit-cache-path disable --wasm-feature-wasm1.1"}; inline constexpr ::std::string_view wasm1p1_explicit_feature_args{ - "--runtime-llvm-jit-cache-path disable --wasm-feature-enable-bulk-memory --wasm-feature-enable-sign-extension " - "--wasm-feature-enable-nontrapping-float-to-int"}; + "--runtime-llvm-jit-cache-path disable --wasm-feature-wasm1.1 " + "--wasm-feature-wasm1.1"}; [[nodiscard]] ::std::string quote_argument(::std::filesystem::path const& path) { @@ -458,7 +458,7 @@ int main() return false; } - auto const cache_args{::std::string{"--runtime-llvm-jit-cache-path path "} + quote_argument(cache_dir) + " --wasm-feature-1p1"}; + auto const cache_args{::std::string{"--runtime-llvm-jit-cache-path path "} + quote_argument(cache_dir) + " --wasm-feature-wasm1.1"}; for(auto const& mode: {::std::pair{::std::string_view{"cached-full"}, ::std::string_view{"-Rcm full -Rcc jit"}}, ::std::pair{::std::string_view{"cached-lazy-verification"}, ::std::string_view{"-Rcm lazy+verification -Rcc jit"}}, ::std::pair{::std::string_view{"cached-tiered"}, ::std::string_view{"-Rtiered"}}}) diff --git a/tools/section_details_p3_guard/p3_guard.py b/tools/section_details_p3_guard/p3_guard.py index d76d202d6..43bb8cbe2 100755 --- a/tools/section_details_p3_guard/p3_guard.py +++ b/tools/section_details_p3_guard/p3_guard.py @@ -196,7 +196,7 @@ def binary_path(root: Path) -> Path: def command(binary: Path, case: Case) -> list[str]: args = [str(binary)] if case.feature_1p1: - args.append("--wasm-feature-1p1") + args.append("--wasm-feature-wasm1.1") args.extend(["--mode", "section-details", str(case.path)]) return args From ecab4b0faf36aa2d74bd0e145d01a27e7414f9e2 Mon Sep 17 00:00:00 2001 From: MacroModel Date: Fri, 10 Jul 2026 16:46:10 +0800 Subject: [PATCH 2/4] Enhance FreeBSD CI workflow with swapfile configuration - Added a new environment variable `freebsd_swapfile_mb` to configure the swapfile size for FreeBSD CI jobs, improving memory management during builds. - Updated the CI script to create and enable a swapfile before executing build commands, ensuring sufficient memory resources are available for the build process. - Enhanced error handling in the build script to provide better diagnostics in case of failures related to memory allocation and swap management. --- .github/workflows/ci.yml | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c0a490eea..3bf341a5d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -386,6 +386,7 @@ jobs: env: version: "14.3" freebsd_vm_memory: "8G" + freebsd_swapfile_mb: "4096" strategy: matrix: compiler: ["CLANG"] @@ -443,6 +444,21 @@ jobs: version: ${{ env.version }} memory: ${{ env.freebsd_vm_memory }} run: | - bash -c "source ~/.xmake/profile && xmake b -rv -j1 || { rc=\$?; swapinfo || true; dmesg | tail -n 80 || true; exit \$rc; }" + bash <<'FREEBSD_CI_SWAP' + set -eux + swapfile=/usr/swap0 + sudo dd if=/dev/zero of="${swapfile}" bs=1m count=${{ env.freebsd_swapfile_mb }} + sudo chmod 0600 "${swapfile}" + swapdev="$(sudo mdconfig -a -t vnode -f "${swapfile}")" + case "${swapdev}" in + /dev/*) ;; + md*) swapdev="/dev/${swapdev}" ;; + *) swapdev="/dev/md${swapdev}" ;; + esac + sudo swapon "${swapdev}" + swapinfo + df -h / /usr || true + FREEBSD_CI_SWAP + bash -c "source ~/.xmake/profile && xmake b -rv -j1 || { rc=\$?; swapinfo || true; df -h / /usr || true; dmesg | tail -n 80 || true; exit \$rc; }" bash -c "source ~/.xmake/profile && export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 && xmake run uwvm --version" bash -c "source ~/.xmake/profile && export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 && xmake test -v -j1" From 3968272920b9ea753008c316d02cb6a6ba508c65 Mon Sep 17 00:00:00 2001 From: MacroModel Date: Fri, 10 Jul 2026 17:29:04 +0800 Subject: [PATCH 3/4] Refactor fast_io_float_ext_fuzzer.cc by removing simulated __float80 implementation - Eliminated the custom __float80 struct and its associated operator overloads, streamlining the codebase. - Removed numeric_limits specialization for __float80, enhancing clarity and maintainability. - Updated the exercise_parsed_token function to ensure compatibility with existing types, improving overall robustness. - Added necessary includes for concepts to support modern C++ features. --- .../fast_io_float_ext_fuzzer.cc | 101 +----------------- 1 file changed, 2 insertions(+), 99 deletions(-) diff --git a/test/0009.libfuzzer/fast_io_float_ext_fuzzer.cc b/test/0009.libfuzzer/fast_io_float_ext_fuzzer.cc index 46c3abe20..4bb9accac 100644 --- a/test/0009.libfuzzer/fast_io_float_ext_fuzzer.cc +++ b/test/0009.libfuzzer/fast_io_float_ext_fuzzer.cc @@ -1,107 +1,9 @@ #include +#include #include #include #include -#if !defined(__SIZEOF_FLOAT80__) && LDBL_MANT_DIG == 64 && LDBL_MAX_EXP == 16384 -#define UWVM2_FAST_IO_FLOAT80_SIMULATED 1 -#define __SIZEOF_FLOAT80__ 16 -struct __float80 -{ - unsigned char bytes[16]{}; - - constexpr __float80() = default; - constexpr explicit __float80(double) noexcept : bytes{} {} -}; - -[[nodiscard]] constexpr __float80 operator-(__float80 value) noexcept -{ - value.bytes[9] = static_cast(value.bytes[9] ^ 0x80u); - return value; -} - -[[nodiscard]] constexpr __float80 uwvm2_make_simulated_float80(::std::uint_least64_t mantissa, - ::std::uint_least16_t exponent) noexcept -{ - __float80 value{}; - for(::std::size_t index{}; index != sizeof(::std::uint_least64_t); ++index) - { - value.bytes[index] = static_cast(mantissa >> (index * 8u)); - } - value.bytes[8] = static_cast(exponent); - value.bytes[9] = static_cast(exponent >> 8u); - return value; -} - -namespace std -{ - -template <> -class numeric_limits<__float80> -{ -public: - static constexpr bool is_specialized = true; - static constexpr bool is_signed = true; - static constexpr bool is_integer = false; - static constexpr bool is_exact = false; - static constexpr bool has_infinity = true; - static constexpr bool has_quiet_NaN = true; - static constexpr bool has_signaling_NaN = true; - static constexpr bool is_iec559 = true; - static constexpr bool is_bounded = true; - static constexpr bool is_modulo = false; - static constexpr int digits = 64; - static constexpr int digits10 = 18; - static constexpr int max_digits10 = 21; - static constexpr int radix = 2; - static constexpr int min_exponent = -16381; - static constexpr int min_exponent10 = -4931; - static constexpr int max_exponent = 16384; - static constexpr int max_exponent10 = 4932; - static constexpr float_denorm_style has_denorm = denorm_present; - static constexpr bool has_denorm_loss = false; - static constexpr float_round_style round_style = round_to_nearest; - static constexpr bool tinyness_before = false; - static constexpr bool traps = false; - - [[nodiscard]] static constexpr __float80 min() noexcept - { - return uwvm2_make_simulated_float80(::std::uint_least64_t{1} << 63u, 1u); - } - - [[nodiscard]] static constexpr __float80 denorm_min() noexcept - { - return uwvm2_make_simulated_float80(1u, 0u); - } - - [[nodiscard]] static constexpr __float80 max() noexcept - { - return uwvm2_make_simulated_float80(~::std::uint_least64_t{}, 0x7ffeu); - } - - [[nodiscard]] static constexpr __float80 lowest() noexcept { return -max(); } - - [[nodiscard]] static constexpr __float80 infinity() noexcept - { - return uwvm2_make_simulated_float80(::std::uint_least64_t{1} << 63u, 0x7fffu); - } - - [[nodiscard]] static constexpr __float80 quiet_NaN() noexcept - { - return uwvm2_make_simulated_float80((::std::uint_least64_t{1} << 63u) | - (::std::uint_least64_t{1} << 62u), - 0x7fffu); - } - - [[nodiscard]] static constexpr __float80 signaling_NaN() noexcept - { - return uwvm2_make_simulated_float80((::std::uint_least64_t{1} << 63u) | 1u, 0x7fffu); - } -}; - -} // namespace std -#endif - #include #include #include @@ -590,6 +492,7 @@ void run_hex_scan_template_matrix(T expected) template void exercise_parsed_token(::std::string_view text, T parsed) { + static_cast(text); #if defined(__SIZEOF_FLOAT80__) if constexpr(::std::same_as) { expect_strtold_float80_oracle(text, parsed); } #endif From 363639fcf4fc1076225c6680ff987eae341b76bc Mon Sep 17 00:00:00 2001 From: MacroModel Date: Fri, 10 Jul 2026 17:33:22 +0800 Subject: [PATCH 4/4] Update FreeBSD CI workflow to optimize memory management and build process - Reduced the FreeBSD swapfile size from 4096MB to 2048MB for improved resource allocation during CI jobs. - Added cleanup commands to the CI script to optimize package management and reduce disk usage. - Enhanced build configuration commands to include additional flags for better performance and debugging information. - Implemented cleanup steps for build artifacts to ensure a more efficient CI environment. --- .github/workflows/ci.yml | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3bf341a5d..987ad9939 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -386,7 +386,7 @@ jobs: env: version: "14.3" freebsd_vm_memory: "8G" - freebsd_swapfile_mb: "4096" + freebsd_swapfile_mb: "2048" strategy: matrix: compiler: ["CLANG"] @@ -421,10 +421,11 @@ jobs: memory: ${{ env.freebsd_vm_memory }} run: | bash -c "sudo pkg install -y llvm21 gmake unzip libunwind" + bash -c "sudo pkg clean -ay" bash -c "sudo ln -sf $(command -v llvm-config21) /usr/local/bin/llvm-config" bash -c "curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh -o xmake-get.sh" bash -c "bash xmake-get.sh" - bash -c "source ~/.xmake/profile && xmake f -y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --use-llvm-compiler=y --sdk="$(llvm-config21 --prefix)" --march=none --static=none --includedirs=/usr/local/include --linkdirs=/usr/local/lib --syslinks=unwind" + bash -c "source ~/.xmake/profile && xmake f -y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --use-llvm-compiler=y --sdk="$(llvm-config21 --prefix)" --march=none --static=none --strip=symbol --cxflags=-g1 --includedirs=/usr/local/include --linkdirs=/usr/local/lib --syslinks=unwind" - name: Configure if: matrix.compiler == 'GCC' uses: cross-platform-actions/action@v0.30.0 @@ -434,9 +435,10 @@ jobs: memory: ${{ env.freebsd_vm_memory }} run: | bash -c "sudo pkg install -y gcc16-devel gmake unzip" + bash -c "sudo pkg clean -ay" bash -c "curl -fsSL https://raw.githubusercontent.com/tboox/xmake/master/scripts/get.sh -o xmake-get.sh" bash -c "bash xmake-get.sh" - bash -c "source ~/.xmake/profile && xmake f -y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --cc=gcc16 --cxx=g++16 --ld=g++16 --march=none --static=none" + bash -c "source ~/.xmake/profile && xmake f -y -m ${{ matrix.mode }} --policies=${{ matrix.policies }} --cc=gcc16 --cxx=g++16 --ld=g++16 --march=none --static=none --strip=symbol --cxflags=-g1" - name: Build and check uses: cross-platform-actions/action@v0.30.0 with: @@ -461,4 +463,7 @@ jobs: FREEBSD_CI_SWAP bash -c "source ~/.xmake/profile && xmake b -rv -j1 || { rc=\$?; swapinfo || true; df -h / /usr || true; dmesg | tail -n 80 || true; exit \$rc; }" bash -c "source ~/.xmake/profile && export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 && xmake run uwvm --version" + bash -c "source ~/.xmake/profile && xmake clean -y uwvm || true" + bash -c "source ~/.xmake/profile && xmake clean -y uwvm_runtime || true" + bash -c "df -h / /usr || true" bash -c "source ~/.xmake/profile && export UBSAN_OPTIONS=halt_on_error=1:print_stacktrace=1 && xmake test -v -j1"