diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/c-writer.cc | 6 | ||||
-rw-r--r-- | src/prebuilt/wasm2c_source_declarations.cc | 16 | ||||
-rw-r--r-- | src/template/wasm2c.declarations.c | 8 |
3 files changed, 28 insertions, 2 deletions
diff --git a/src/c-writer.cc b/src/c-writer.cc index 986ace55..cbffa1d4 100644 --- a/src/c-writer.cc +++ b/src/c-writer.cc @@ -2449,7 +2449,9 @@ bool CWriter::IsSingleUnsharedMemory() { void CWriter::InstallSegueBase(Memory* memory, bool save_old_value) { NonIndented([&] { Write("#if WASM_RT_USE_SEGUE", Newline()); }); if (save_old_value) { + NonIndented([&] { Write("#if !WASM_RT_SEGUE_FREE_SEGMENT", Newline()); }); Write("void* segue_saved_base = wasm_rt_segue_read_base();", Newline()); + NonIndented([&] { Write("#endif", Newline()); }); } auto primary_memory = ExternalInstanceRef(ModuleFieldType::Memory, memory->name); @@ -2458,7 +2460,9 @@ void CWriter::InstallSegueBase(Memory* memory, bool save_old_value) { } void CWriter::RestoreSegueBase() { - NonIndented([&] { Write("#if WASM_RT_USE_SEGUE", Newline()); }); + NonIndented([&] { + Write("#if WASM_RT_USE_SEGUE && !WASM_RT_SEGUE_FREE_SEGMENT", Newline()); + }); Write("wasm_rt_segue_write_base(segue_saved_base);", Newline()); NonIndented([&] { Write("#endif", Newline()); }); } diff --git a/src/prebuilt/wasm2c_source_declarations.cc b/src/prebuilt/wasm2c_source_declarations.cc index 000b25c8..86c07ded 100644 --- a/src/prebuilt/wasm2c_source_declarations.cc +++ b/src/prebuilt/wasm2c_source_declarations.cc @@ -115,7 +115,21 @@ R"w2c_template(} )w2c_template" R"w2c_template(static inline void wasm_rt_segue_write_base(void* base) { )w2c_template" -R"w2c_template( if (wasm_rt_fsgsbase_inst_supported) { +R"w2c_template(#if WASM_RT_SEGUE_FREE_SEGMENT +)w2c_template" +R"w2c_template( if (wasm_rt_last_segment_val == base) { +)w2c_template" +R"w2c_template( return; +)w2c_template" +R"w2c_template( } +)w2c_template" +R"w2c_template( + wasm_rt_last_segment_val = base; +)w2c_template" +R"w2c_template(#endif +)w2c_template" +R"w2c_template( + if (wasm_rt_fsgsbase_inst_supported) { )w2c_template" R"w2c_template( __builtin_ia32_wrgsbase64((uintptr_t)base); )w2c_template" diff --git a/src/template/wasm2c.declarations.c b/src/template/wasm2c.declarations.c index efe9dbbe..43cd1d1b 100644 --- a/src/template/wasm2c.declarations.c +++ b/src/template/wasm2c.declarations.c @@ -58,6 +58,14 @@ static inline void* wasm_rt_segue_read_base() { } } static inline void wasm_rt_segue_write_base(void* base) { +#if WASM_RT_SEGUE_FREE_SEGMENT + if (wasm_rt_last_segment_val == base) { + return; + } + + wasm_rt_last_segment_val = base; +#endif + if (wasm_rt_fsgsbase_inst_supported) { __builtin_ia32_wrgsbase64((uintptr_t)base); } else { |