authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-13 22:30:03-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-15 15:11:36-08:00
logf89ef2f7cd1dd4291156e94716df60795a7ee48c
tree109c972f76a208aa810808f33a0fa0cd0ec1f94d
parent9285f91ccc20bb14b75dad08d1bae1b95e0c6b23

Compilation.saveState implement saving wasm linker state


3 files changed, 112 insertions(+), 16 deletions(-)

src/Compilation.zig+111-1
...@@ -3059,8 +3059,118 @@ pub fn saveState(comp: *Compilation) !void {...@@ -3059,8 +3059,118 @@ pub fn saveState(comp: *Compilation) !void {
3059 //// TODO: compilation errors3059 //// TODO: compilation errors
3060 //// TODO: namespaces3060 //// TODO: namespaces
3061 //// TODO: decls3061 //// TODO: decls
3062 //// TODO: linker state
3063 }3062 }
3063
3064 // linker state
3065 switch (lf.tag) {
3066 .wasm => {
3067 const wasm = lf.cast(.wasm).?;
3068 const is_obj = comp.config.output_mode == .Obj;
3069 try bufs.ensureUnusedCapacity(83);
3070 addBuf(&bufs, wasm.string_bytes.items);
3071 // TODO make it well-defined memory layout
3072 //addBuf(&bufs, mem.sliceAsBytes(wasm.objects.items));
3073 addBuf(&bufs, mem.sliceAsBytes(wasm.func_types.keys()));
3074 addBuf(&bufs, mem.sliceAsBytes(wasm.object_function_imports.keys()));
3075 addBuf(&bufs, mem.sliceAsBytes(wasm.object_function_imports.values()));
3076 addBuf(&bufs, mem.sliceAsBytes(wasm.object_functions.items));
3077 addBuf(&bufs, mem.sliceAsBytes(wasm.object_global_imports.keys()));
3078 addBuf(&bufs, mem.sliceAsBytes(wasm.object_global_imports.values()));
3079 addBuf(&bufs, mem.sliceAsBytes(wasm.object_globals.items));
3080 addBuf(&bufs, mem.sliceAsBytes(wasm.object_table_imports.keys()));
3081 addBuf(&bufs, mem.sliceAsBytes(wasm.object_table_imports.values()));
3082 addBuf(&bufs, mem.sliceAsBytes(wasm.object_tables.items));
3083 addBuf(&bufs, mem.sliceAsBytes(wasm.object_memory_imports.keys()));
3084 addBuf(&bufs, mem.sliceAsBytes(wasm.object_memory_imports.values()));
3085 addBuf(&bufs, mem.sliceAsBytes(wasm.object_memories.items));
3086 addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.tag)));
3087 addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.offset)));
3088 // TODO handle the union safety field
3089 //addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.pointee)));
3090 addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations.items(.addend)));
3091 addBuf(&bufs, mem.sliceAsBytes(wasm.object_init_funcs.items));
3092 addBuf(&bufs, mem.sliceAsBytes(wasm.object_data_segments.items));
3093 addBuf(&bufs, mem.sliceAsBytes(wasm.object_datas.items));
3094 addBuf(&bufs, mem.sliceAsBytes(wasm.object_data_imports.keys()));
3095 addBuf(&bufs, mem.sliceAsBytes(wasm.object_data_imports.values()));
3096 addBuf(&bufs, mem.sliceAsBytes(wasm.object_custom_segments.keys()));
3097 addBuf(&bufs, mem.sliceAsBytes(wasm.object_custom_segments.values()));
3098 // TODO make it well-defined memory layout
3099 // addBuf(&bufs, mem.sliceAsBytes(wasm.object_comdats.items));
3100 addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations_table.keys()));
3101 addBuf(&bufs, mem.sliceAsBytes(wasm.object_relocations_table.values()));
3102 addBuf(&bufs, mem.sliceAsBytes(wasm.object_comdat_symbols.items(.kind)));
3103 addBuf(&bufs, mem.sliceAsBytes(wasm.object_comdat_symbols.items(.index)));
3104 addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.tag)));
3105 addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.offset)));
3106 // TODO handle the union safety field
3107 //addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.pointee)));
3108 addBuf(&bufs, mem.sliceAsBytes(wasm.out_relocs.items(.addend)));
3109 addBuf(&bufs, mem.sliceAsBytes(wasm.uav_fixups.items));
3110 addBuf(&bufs, mem.sliceAsBytes(wasm.nav_fixups.items));
3111 addBuf(&bufs, mem.sliceAsBytes(wasm.func_table_fixups.items));
3112 if (is_obj) {
3113 addBuf(&bufs, mem.sliceAsBytes(wasm.navs_obj.keys()));
3114 addBuf(&bufs, mem.sliceAsBytes(wasm.navs_obj.values()));
3115 addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_obj.keys()));
3116 addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_obj.values()));
3117 } else {
3118 addBuf(&bufs, mem.sliceAsBytes(wasm.navs_exe.keys()));
3119 addBuf(&bufs, mem.sliceAsBytes(wasm.navs_exe.values()));
3120 addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_exe.keys()));
3121 addBuf(&bufs, mem.sliceAsBytes(wasm.uavs_exe.values()));
3122 }
3123 addBuf(&bufs, mem.sliceAsBytes(wasm.overaligned_uavs.keys()));
3124 addBuf(&bufs, mem.sliceAsBytes(wasm.overaligned_uavs.values()));
3125 addBuf(&bufs, mem.sliceAsBytes(wasm.zcu_funcs.keys()));
3126 // TODO handle the union safety field
3127 // addBuf(&bufs, mem.sliceAsBytes(wasm.zcu_funcs.values()));
3128 addBuf(&bufs, mem.sliceAsBytes(wasm.nav_exports.keys()));
3129 addBuf(&bufs, mem.sliceAsBytes(wasm.nav_exports.values()));
3130 addBuf(&bufs, mem.sliceAsBytes(wasm.uav_exports.keys()));
3131 addBuf(&bufs, mem.sliceAsBytes(wasm.uav_exports.values()));
3132 addBuf(&bufs, mem.sliceAsBytes(wasm.imports.keys()));
3133 addBuf(&bufs, mem.sliceAsBytes(wasm.missing_exports.keys()));
3134 addBuf(&bufs, mem.sliceAsBytes(wasm.function_exports.keys()));
3135 addBuf(&bufs, mem.sliceAsBytes(wasm.function_exports.values()));
3136 addBuf(&bufs, mem.sliceAsBytes(wasm.global_exports.items));
3137 addBuf(&bufs, mem.sliceAsBytes(wasm.functions.keys()));
3138 addBuf(&bufs, mem.sliceAsBytes(wasm.function_imports.keys()));
3139 addBuf(&bufs, mem.sliceAsBytes(wasm.function_imports.values()));
3140 addBuf(&bufs, mem.sliceAsBytes(wasm.data_imports.keys()));
3141 addBuf(&bufs, mem.sliceAsBytes(wasm.data_imports.values()));
3142 addBuf(&bufs, mem.sliceAsBytes(wasm.data_segments.keys()));
3143 addBuf(&bufs, mem.sliceAsBytes(wasm.globals.keys()));
3144 addBuf(&bufs, mem.sliceAsBytes(wasm.global_imports.keys()));
3145 addBuf(&bufs, mem.sliceAsBytes(wasm.global_imports.values()));
3146 addBuf(&bufs, mem.sliceAsBytes(wasm.tables.keys()));
3147 addBuf(&bufs, mem.sliceAsBytes(wasm.table_imports.keys()));
3148 addBuf(&bufs, mem.sliceAsBytes(wasm.table_imports.values()));
3149 addBuf(&bufs, mem.sliceAsBytes(wasm.zcu_indirect_function_set.keys()));
3150 addBuf(&bufs, mem.sliceAsBytes(wasm.object_indirect_function_import_set.keys()));
3151 addBuf(&bufs, mem.sliceAsBytes(wasm.object_indirect_function_set.keys()));
3152 addBuf(&bufs, mem.sliceAsBytes(wasm.mir_instructions.items(.tag)));
3153 // TODO handle the union safety field
3154 //addBuf(&bufs, mem.sliceAsBytes(wasm.mir_instructions.items(.data)));
3155 addBuf(&bufs, mem.sliceAsBytes(wasm.mir_extra.items));
3156 addBuf(&bufs, mem.sliceAsBytes(wasm.all_zcu_locals.items));
3157 addBuf(&bufs, mem.sliceAsBytes(wasm.tag_name_bytes.items));
3158 addBuf(&bufs, mem.sliceAsBytes(wasm.tag_name_offs.items));
3159
3160 // TODO add as header fields
3161 // entry_resolution: FunctionImport.Resolution
3162 // function_exports_len: u32
3163 // global_exports_len: u32
3164 // functions_end_prelink: u32
3165 // globals_end_prelink: u32
3166 // error_name_table_ref_count: u32
3167 // tag_name_table_ref_count: u32
3168 // any_tls_relocs: bool
3169 // any_passive_inits: bool
3170 },
3171 else => log.err("TODO implement saving linker state for {s}", .{@tagName(lf.tag)}),
3172 }
3173
3064 var basename_buf: [255]u8 = undefined;3174 var basename_buf: [255]u8 = undefined;
3065 const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{3175 const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{
3066 comp.root_name,3176 comp.root_name,
src/link/Wasm.zig-14
...@@ -199,7 +199,6 @@ uav_exports: std.AutoArrayHashMapUnmanaged(UavExport, Zcu.Export.Index) = .empty...@@ -199,7 +199,6 @@ uav_exports: std.AutoArrayHashMapUnmanaged(UavExport, Zcu.Export.Index) = .empty
199imports: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, void) = .empty,199imports: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, void) = .empty,
200200
201dwarf: ?Dwarf = null,201dwarf: ?Dwarf = null,
202debug_sections: DebugSections = .{},
203202
204flush_buffer: Flush = .{},203flush_buffer: Flush = .{},
205204
...@@ -940,19 +939,6 @@ pub const UavExport = extern struct {...@@ -940,19 +939,6 @@ pub const UavExport = extern struct {
940 uav_index: InternPool.Index,939 uav_index: InternPool.Index,
941};940};
942941
943const DebugSections = struct {
944 abbrev: DebugSection = .{},
945 info: DebugSection = .{},
946 line: DebugSection = .{},
947 loc: DebugSection = .{},
948 pubnames: DebugSection = .{},
949 pubtypes: DebugSection = .{},
950 ranges: DebugSection = .{},
951 str: DebugSection = .{},
952};
953
954const DebugSection = struct {};
955
956pub const FunctionImport = extern struct {942pub const FunctionImport = extern struct {
957 flags: SymbolFlags,943 flags: SymbolFlags,
958 module_name: OptionalString,944 module_name: OptionalString,
src/link/Wasm/Object.zig+1-1
...@@ -856,7 +856,7 @@ pub fn parse(...@@ -856,7 +856,7 @@ pub fn parse(
856 start_function = @enumFromInt(functions_start + index);856 start_function = @enumFromInt(functions_start + index);
857 },857 },
858 .element => {858 .element => {
859 log.warn("unimplemented: element section in {} {s}", .{ path, archive_member_name.? });859 log.warn("unimplemented: element section in {} {?s}", .{ path, archive_member_name });
860 pos = section_end;860 pos = section_end;
861 },861 },
862 .code => {862 .code => {