aboutsummaryrefslogtreecommitdiff
path: root/src/Compilation.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2025-01-13 22:30:03 -0800
committerAndrew Kelley <andrew@ziglang.org>2025-01-15 15:11:36 -0800
commitf89ef2f7cd1dd4291156e94716df60795a7ee48c (patch)
tree109c972f76a208aa810808f33a0fa0cd0ec1f94d /src/Compilation.zig
parent9285f91ccc20bb14b75dad08d1bae1b95e0c6b23 (diff)
downloadzig-f89ef2f7cd1dd4291156e94716df60795a7ee48c.tar.gz
zig-f89ef2f7cd1dd4291156e94716df60795a7ee48c.zip
Compilation.saveState implement saving wasm linker state
Diffstat (limited to 'src/Compilation.zig')
-rw-r--r--src/Compilation.zig112
1 files changed, 111 insertions, 1 deletions
diff --git a/src/Compilation.zig b/src/Compilation.zig
index 732873e5b9..5827fb8306 100644
--- a/src/Compilation.zig
+++ b/src/Compilation.zig
@@ -3059,8 +3059,118 @@ pub fn saveState(comp: *Compilation) !void {
//// TODO: compilation errors
//// TODO: namespaces
//// TODO: decls
- //// TODO: linker state
}
+
+ // linker state
+ switch (lf.tag) {
+ .wasm => {
+ const wasm = lf.cast(.wasm).?;
+ const is_obj = comp.config.output_mode == .Obj;
+ try bufs.ensureUnusedCapacity(83);
+ addBuf(&bufs, wasm.string_bytes.items);
+ // TODO make it well-defined memory layout
+ //addBuf(&bufs, mem.sliceAsBytes(wasm.objects.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.func_types.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_function_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_function_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_functions.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_global_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_global_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_globals.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_table_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_table_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_tables.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_memory_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_memory_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_memories.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.tag)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.offset)));
+ // TODO handle the union safety field
+ //addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.pointee)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.addend)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_init_funcs.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_data_segments.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_datas.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_data_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_data_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_custom_segments.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_custom_segments.values()));
+ // TODO make it well-defined memory layout
+ // addBuf(&bufs, mem.sliceAsBytes(wasm.object_comdats.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations_table.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations_table.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_comdat_symbols.items(.kind)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_comdat_symbols.items(.index)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.tag)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.offset)));
+ // TODO handle the union safety field
+ //addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.pointee)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.addend)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.uav_fixups.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.nav_fixups.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.func_table_fixups.items));
+ if (is_obj) {
+ addBuf(&bufs, mem.sliceAsBytes(wasm.navs_obj.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.navs_obj.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_obj.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_obj.values()));
+ } else {
+ addBuf(&bufs, mem.sliceAsBytes(wasm.navs_exe.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.navs_exe.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_exe.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_exe.values()));
+ }
+ addBuf(&bufs, mem.sliceAsBytes(wasm.overaligned_uavs.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.overaligned_uavs.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.zcu_funcs.keys()));
+ // TODO handle the union safety field
+ // addBuf(&bufs, mem.sliceAsBytes(wasm.zcu_funcs.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.nav_exports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.nav_exports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.uav_exports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.uav_exports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.missing_exports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.function_exports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.function_exports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.global_exports.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.functions.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.function_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.function_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.data_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.data_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.data_segments.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.globals.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.global_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.global_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.tables.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.table_imports.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.table_imports.values()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.zcu_indirect_function_set.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_indirect_function_import_set.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.object_indirect_function_set.keys()));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.mir_instructions.items(.tag)));
+ // TODO handle the union safety field
+ //addBuf(&bufs, mem.sliceAsBytes(wasm.mir_instructions.items(.data)));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.mir_extra.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.all_zcu_locals.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.tag_name_bytes.items));
+ addBuf(&bufs, mem.sliceAsBytes(wasm.tag_name_offs.items));
+
+ // TODO add as header fields
+ // entry_resolution: FunctionImport.Resolution
+ // function_exports_len: u32
+ // global_exports_len: u32
+ // functions_end_prelink: u32
+ // globals_end_prelink: u32
+ // error_name_table_ref_count: u32
+ // tag_name_table_ref_count: u32
+ // any_tls_relocs: bool
+ // any_passive_inits: bool
+ },
+ else => log.err("TODO implement saving linker state for {s}", .{@tagName(lf.tag)}),
+ }
+
var basename_buf: [255]u8 = undefined;
const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{
comp.root_name,