Skip to content

Commit 6d71aff

Browse files
committed
Alter how segments are loaded
1 parent ad72048 commit 6d71aff

File tree

1 file changed

+51
-18
lines changed

1 file changed

+51
-18
lines changed

src/c-writer.cc

Lines changed: 51 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -2242,6 +2242,46 @@ void CWriter::WriteDataInitializers() {
22422242
Write(CloseBrace(), ";", Newline());
22432243
}
22442244

2245+
Write(Newline(),
2246+
"static const u8* active_data_segment_data_ptrs[] = ", OpenBrace());
2247+
for (const DataSegment* data_segment : module_->data_segments) {
2248+
if (data_segment->kind != SegmentKind::Active ||
2249+
data_segment->data.empty()) {
2250+
continue;
2251+
}
2252+
Write("data_segment_data_",
2253+
GlobalName(ModuleFieldType::DataSegment, data_segment->name), ",",
2254+
Newline());
2255+
}
2256+
Write(CloseBrace(), ";", Newline());
2257+
2258+
Write(Newline(),
2259+
"static const u32 active_data_segment_offsets[] = ", OpenBrace());
2260+
for (const DataSegment* data_segment : module_->data_segments) {
2261+
if (data_segment->kind != SegmentKind::Active ||
2262+
data_segment->data.empty()) {
2263+
continue;
2264+
}
2265+
WriteInitExpr(data_segment->offset);
2266+
Write(", // data_segment_data_",
2267+
GlobalName(ModuleFieldType::DataSegment, data_segment->name),
2268+
Newline());
2269+
}
2270+
Write(CloseBrace(), ";", Newline());
2271+
2272+
Write(Newline(),
2273+
"static const size_t active_data_segment_sizes[] = ", OpenBrace());
2274+
for (const DataSegment* data_segment : module_->data_segments) {
2275+
if (data_segment->kind != SegmentKind::Active ||
2276+
data_segment->data.empty()) {
2277+
continue;
2278+
}
2279+
Write(data_segment->data.size(), ", // data_segment_data_",
2280+
GlobalName(ModuleFieldType::DataSegment, data_segment->name),
2281+
Newline());
2282+
}
2283+
Write(CloseBrace(), ";", Newline());
2284+
22452285
Write(Newline(), "static void init_memories(", ModuleInstanceTypeName(),
22462286
"* instance) ", OpenBrace());
22472287
if (module_->memories.size() > module_->num_memory_imports) {
@@ -2262,24 +2302,17 @@ void CWriter::WriteDataInitializers() {
22622302
}
22632303
}
22642304

2265-
for (const DataSegment* data_segment : module_->data_segments) {
2266-
if (data_segment->kind != SegmentKind::Active) {
2267-
continue;
2268-
}
2269-
const Memory* memory =
2270-
module_->memories[module_->GetMemoryIndex(data_segment->memory_var)];
2271-
Write("LOAD_DATA(",
2272-
ExternalInstanceRef(ModuleFieldType::Memory, memory->name), ", ");
2273-
WriteInitExpr(data_segment->offset);
2274-
if (data_segment->data.empty()) {
2275-
Write(", NULL, 0");
2276-
} else {
2277-
Write(", data_segment_data_",
2278-
GlobalName(ModuleFieldType::DataSegment, data_segment->name), ", ",
2279-
data_segment->data.size());
2280-
}
2281-
Write(");", Newline());
2282-
}
2305+
Write(
2306+
"for (int i = 0; i < sizeof(active_data_segment_data_ptrs) / "
2307+
"sizeof(active_data_segment_data_ptrs[0]); i++) ",
2308+
OpenBrace(), Newline());
2309+
2310+
const Memory* memory = module_->memories[0];
2311+
2312+
Write("LOAD_DATA(",
2313+
ExternalInstanceRef(ModuleFieldType::Memory, memory->name), ", ");
2314+
WriteInitExpr(data_segment->offset);
2315+
Write(CloseBrace(), Newline());
22832316

22842317
Write(CloseBrace(), Newline());
22852318

0 commit comments

Comments
 (0)