diff --git a/src/c-writer.cc b/src/c-writer.cc index 9370dbd68..789d67c67 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 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 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 void init_memories(", ModuleInstanceTypeName(), "* instance) ", OpenBrace()); if (module_->memories.size() > module_->num_memory_imports) { @@ -2262,24 +2302,19 @@ 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), + ", 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..3f1b576f4 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 size_t active_data_segment_sizes[] = { +}; + +static const u32 active_data_segment_offsets[] = { +}; + 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..aaf86f1cd 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 size_t active_data_segment_sizes[] = { +}; + +static const u32 active_data_segment_offsets[] = { +}; + 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..a5b8626b2 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 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); - 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) {