From f1c33fae7c86a47bd3a3507aa73ef0e8aa420160 Mon Sep 17 00:00:00 2001 From: Christian Nieves Date: Wed, 5 Mar 2025 21:39:21 +0000 Subject: [PATCH 1/5] Alter how segments are loaded --- src/c-writer.cc | 68 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 50 insertions(+), 18 deletions(-) diff --git a/src/c-writer.cc b/src/c-writer.cc index 9370dbd68..18df621be 100644 --- a/src/c-writer.cc +++ b/src/c-writer.cc @@ -2242,6 +2242,46 @@ void CWriter::WriteDataInitializers() { Write(CloseBrace(), ";", Newline()); } + Write(Newline(), + "static const u8* active_data_segment_data_ptrs[] = ", OpenBrace()); + for (const DataSegment* data_segment : module_->data_segments) { + if (data_segment->kind != SegmentKind::Active || + data_segment->data.empty()) { + continue; + } + Write("data_segment_data_", + GlobalName(ModuleFieldType::DataSegment, data_segment->name), ",", + Newline()); + } + Write(CloseBrace(), ";", Newline()); + + Write(Newline(), + "static const u32 active_data_segment_offsets[] = ", OpenBrace()); + for (const DataSegment* data_segment : module_->data_segments) { + if (data_segment->kind != SegmentKind::Active || + data_segment->data.empty()) { + continue; + } + WriteInitExpr(data_segment->offset); + Write(", // data_segment_data_", + GlobalName(ModuleFieldType::DataSegment, data_segment->name), + Newline()); + } + Write(CloseBrace(), ";", Newline()); + + Write(Newline(), + "static const size_t active_data_segment_sizes[] = ", OpenBrace()); + for (const DataSegment* data_segment : module_->data_segments) { + if (data_segment->kind != SegmentKind::Active || + data_segment->data.empty()) { + continue; + } + Write(data_segment->data.size(), ", // data_segment_data_", + GlobalName(ModuleFieldType::DataSegment, data_segment->name), + Newline()); + } + Write(CloseBrace(), ";", Newline()); + Write(Newline(), "static void init_memories(", ModuleInstanceTypeName(), "* instance) ", OpenBrace()); if (module_->memories.size() > module_->num_memory_imports) { @@ -2262,24 +2302,16 @@ void CWriter::WriteDataInitializers() { } } - for (const DataSegment* data_segment : module_->data_segments) { - if (data_segment->kind != SegmentKind::Active) { - continue; - } - const Memory* memory = - module_->memories[module_->GetMemoryIndex(data_segment->memory_var)]; - Write("LOAD_DATA(", - ExternalInstanceRef(ModuleFieldType::Memory, memory->name), ", "); - WriteInitExpr(data_segment->offset); - if (data_segment->data.empty()) { - Write(", NULL, 0"); - } else { - Write(", data_segment_data_", - GlobalName(ModuleFieldType::DataSegment, data_segment->name), ", ", - data_segment->data.size()); - } - Write(");", Newline()); - } + Write( + "for (int i = 0; i < sizeof(active_data_segment_data_ptrs) / " + "sizeof(active_data_segment_data_ptrs[0]); i++) ", + OpenBrace(), Newline()); + + const Memory* memory = module_->memories[0]; + + Write("LOAD_DATA(", + ExternalInstanceRef(ModuleFieldType::Memory, memory->name), ", "); + Write(CloseBrace(), Newline()); Write(CloseBrace(), Newline()); From 8127bef0fa342fe248665536b30efcb4617642da Mon Sep 17 00:00:00 2001 From: Christian Nieves Date: Thu, 6 Mar 2025 17:34:31 +0000 Subject: [PATCH 2/5] Add tests --- src/c-writer.cc | 5 ++++- test/wasm2c/check-imports.txt | 13 +++++++++++++ test/wasm2c/export-names.txt | 13 +++++++++++++ test/wasm2c/hello.txt | 17 ++++++++++++++++- 4 files changed, 46 insertions(+), 2 deletions(-) diff --git a/src/c-writer.cc b/src/c-writer.cc index 18df621be..aec1c5349 100644 --- a/src/c-writer.cc +++ b/src/c-writer.cc @@ -2310,7 +2310,10 @@ void CWriter::WriteDataInitializers() { const Memory* memory = module_->memories[0]; Write("LOAD_DATA(", - ExternalInstanceRef(ModuleFieldType::Memory, memory->name), ", "); + ExternalInstanceRef(ModuleFieldType::Memory, memory->name), + ", active_data_segment_offsets[i], active_data_segment_data_ptrs[i], " + "active_data_segment_sizes[i]);", + Newline()); Write(CloseBrace(), Newline()); Write(CloseBrace(), Newline()); diff --git a/test/wasm2c/check-imports.txt b/test/wasm2c/check-imports.txt index c22ce7177..256f7f857 100644 --- a/test/wasm2c/check-imports.txt +++ b/test/wasm2c/check-imports.txt @@ -834,7 +834,20 @@ static u32 wrap_w2c_test_f1(void *instance) { return w2c_test_f1(instance); } +static const u8* active_data_segment_data_ptrs[] = { +}; + +static const u32 active_data_segment_offsets[] = { +}; + +static const size_t active_data_segment_sizes[] = { +}; + static void init_memories(w2c_test* instance) { + for (int i = 0; i < sizeof(active_data_segment_data_ptrs) / sizeof(active_data_segment_data_ptrs[0]); i++) { + + LOAD_DATA((*instance->w2c_env_0x5F_linear_memory), active_data_segment_offsets[i], active_data_segment_data_ptrs[i], active_data_segment_sizes[i]); + } } static const wasm_elem_segment_expr_t elem_segment_exprs_w2c_test_e0[] = { diff --git a/test/wasm2c/export-names.txt b/test/wasm2c/export-names.txt index dedf4c56c..d586bc1a3 100644 --- a/test/wasm2c/export-names.txt +++ b/test/wasm2c/export-names.txt @@ -826,7 +826,20 @@ static void w2c_test__0(w2c_test*); FUNC_TYPE_T(w2c_test_t0) = "\x36\xa9\xe7\xf1\xc9\x5b\x82\xff\xb9\x97\x43\xe0\xc5\xc4\xce\x95\xd8\x3c\x9a\x43\x0a\xac\x59\xf8\x4e\xf3\xcb\xfa\xb6\x14\x50\x68"; +static const u8* active_data_segment_data_ptrs[] = { +}; + +static const u32 active_data_segment_offsets[] = { +}; + +static const size_t active_data_segment_sizes[] = { +}; + static void init_memories(w2c_test* instance) { + for (int i = 0; i < sizeof(active_data_segment_data_ptrs) / sizeof(active_data_segment_data_ptrs[0]); i++) { + + LOAD_DATA((*instance->w2c_0x5Cmodule_import0x200x2A0x2F), active_data_segment_offsets[i], active_data_segment_data_ptrs[i], active_data_segment_sizes[i]); + } } /* export: '' */ diff --git a/test/wasm2c/hello.txt b/test/wasm2c/hello.txt index 84e9ec125..46e502492 100644 --- a/test/wasm2c/hello.txt +++ b/test/wasm2c/hello.txt @@ -844,9 +844,24 @@ static const u8 data_segment_data_w2c_test_d0[] = { 0x2e, 0x0a, }; +static const u8* active_data_segment_data_ptrs[] = { + data_segment_data_w2c_test_d0, +}; + +static const u32 active_data_segment_offsets[] = { + 8u, // data_segment_data_w2c_test_d0 +}; + +static const size_t active_data_segment_sizes[] = { + 14, // data_segment_data_w2c_test_d0 +}; + static void init_memories(w2c_test* instance) { wasm_rt_allocate_memory(&instance->w2c_memory, 1, 65536, 0, 65536); - LOAD_DATA(instance->w2c_memory, 8u, data_segment_data_w2c_test_d0, 14); + for (int i = 0; i < sizeof(active_data_segment_data_ptrs) / sizeof(active_data_segment_data_ptrs[0]); i++) { + + LOAD_DATA(instance->w2c_memory, active_data_segment_offsets[i], active_data_segment_data_ptrs[i], active_data_segment_sizes[i]); + } } static void init_data_instances(w2c_test *instance) { From 489760227c69e2b622477b033c06eaf529392b53 Mon Sep 17 00:00:00 2001 From: Christian Nieves Date: Fri, 14 Mar 2025 15:01:37 +0000 Subject: [PATCH 3/5] testing stuf --- src/c-writer.cc | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/c-writer.cc b/src/c-writer.cc index aec1c5349..e47c797cf 100644 --- a/src/c-writer.cc +++ b/src/c-writer.cc @@ -2242,6 +2242,7 @@ void CWriter::WriteDataInitializers() { Write(CloseBrace(), ";", Newline()); } + Write("// squk", Newline()); Write(Newline(), "static const u8* active_data_segment_data_ptrs[] = ", OpenBrace()); for (const DataSegment* data_segment : module_->data_segments) { @@ -2256,31 +2257,32 @@ void CWriter::WriteDataInitializers() { Write(CloseBrace(), ";", Newline()); Write(Newline(), - "static const u32 active_data_segment_offsets[] = ", OpenBrace()); + "static const size_t active_data_segment_sizes[] = ", OpenBrace()); for (const DataSegment* data_segment : module_->data_segments) { if (data_segment->kind != SegmentKind::Active || data_segment->data.empty()) { continue; } - WriteInitExpr(data_segment->offset); - Write(", // data_segment_data_", + Write(data_segment->data.size(), ", // data_segment_data_", GlobalName(ModuleFieldType::DataSegment, data_segment->name), Newline()); } Write(CloseBrace(), ";", Newline()); Write(Newline(), - "static const size_t active_data_segment_sizes[] = ", OpenBrace()); + "static const u32 active_data_segment_offsets[] = ", OpenBrace()); for (const DataSegment* data_segment : module_->data_segments) { if (data_segment->kind != SegmentKind::Active || data_segment->data.empty()) { continue; } - Write(data_segment->data.size(), ", // data_segment_data_", + WriteInitExpr(data_segment->offset); + Write(", // data_segment_data_", GlobalName(ModuleFieldType::DataSegment, data_segment->name), Newline()); } Write(CloseBrace(), ";", Newline()); + Write("// squk", Newline()); Write(Newline(), "static void init_memories(", ModuleInstanceTypeName(), "* instance) ", OpenBrace()); From 355d46ebc92744d67d6f2894f98cb9115411208b Mon Sep 17 00:00:00 2001 From: Christian Nieves Date: Mon, 17 Mar 2025 17:35:07 +0000 Subject: [PATCH 4/5] Remove comments --- src/c-writer.cc | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/c-writer.cc b/src/c-writer.cc index e47c797cf..789d67c67 100644 --- a/src/c-writer.cc +++ b/src/c-writer.cc @@ -2242,7 +2242,6 @@ void CWriter::WriteDataInitializers() { Write(CloseBrace(), ";", Newline()); } - Write("// squk", Newline()); Write(Newline(), "static const u8* active_data_segment_data_ptrs[] = ", OpenBrace()); for (const DataSegment* data_segment : module_->data_segments) { @@ -2282,7 +2281,6 @@ void CWriter::WriteDataInitializers() { Newline()); } Write(CloseBrace(), ";", Newline()); - Write("// squk", Newline()); Write(Newline(), "static void init_memories(", ModuleInstanceTypeName(), "* instance) ", OpenBrace()); From f6e78d585faaa86bf4e3c5ee2660f68670aaec5e Mon Sep 17 00:00:00 2001 From: Christian Nieves Date: Mon, 17 Mar 2025 17:40:21 +0000 Subject: [PATCH 5/5] Update test --- test/wasm2c/check-imports.txt | 4 ++-- test/wasm2c/export-names.txt | 4 ++-- test/wasm2c/hello.txt | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/test/wasm2c/check-imports.txt b/test/wasm2c/check-imports.txt index 256f7f857..3f1b576f4 100644 --- a/test/wasm2c/check-imports.txt +++ b/test/wasm2c/check-imports.txt @@ -837,10 +837,10 @@ static u32 wrap_w2c_test_f1(void *instance) { static const u8* active_data_segment_data_ptrs[] = { }; -static const u32 active_data_segment_offsets[] = { +static const size_t active_data_segment_sizes[] = { }; -static const size_t active_data_segment_sizes[] = { +static const u32 active_data_segment_offsets[] = { }; static void init_memories(w2c_test* instance) { diff --git a/test/wasm2c/export-names.txt b/test/wasm2c/export-names.txt index d586bc1a3..aaf86f1cd 100644 --- a/test/wasm2c/export-names.txt +++ b/test/wasm2c/export-names.txt @@ -829,10 +829,10 @@ FUNC_TYPE_T(w2c_test_t0) = "\x36\xa9\xe7\xf1\xc9\x5b\x82\xff\xb9\x97\x43\xe0\xc5 static const u8* active_data_segment_data_ptrs[] = { }; -static const u32 active_data_segment_offsets[] = { +static const size_t active_data_segment_sizes[] = { }; -static const size_t active_data_segment_sizes[] = { +static const u32 active_data_segment_offsets[] = { }; static void init_memories(w2c_test* instance) { diff --git a/test/wasm2c/hello.txt b/test/wasm2c/hello.txt index 46e502492..a5b8626b2 100644 --- a/test/wasm2c/hello.txt +++ b/test/wasm2c/hello.txt @@ -848,14 +848,14 @@ static const u8* active_data_segment_data_ptrs[] = { data_segment_data_w2c_test_d0, }; -static const u32 active_data_segment_offsets[] = { - 8u, // data_segment_data_w2c_test_d0 -}; - static const size_t active_data_segment_sizes[] = { 14, // data_segment_data_w2c_test_d0 }; +static const u32 active_data_segment_offsets[] = { + 8u, // data_segment_data_w2c_test_d0 +}; + static void init_memories(w2c_test* instance) { wasm_rt_allocate_memory(&instance->w2c_memory, 1, 65536, 0, 65536); for (int i = 0; i < sizeof(active_data_segment_data_ptrs) / sizeof(active_data_segment_data_ptrs[0]); i++) {