summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/c-writer.cc6
-rw-r--r--src/prebuilt/wasm2c_source_declarations.cc16
-rw-r--r--src/template/wasm2c.declarations.c8
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 {