Skip to content

Commit a9c497c

Browse files
committed
Compilation.saveState implement saving wasm linker state
1 parent 0ac5444 commit a9c497c

File tree

3 files changed

+112
-16
lines changed

3 files changed

+112
-16
lines changed

src/Compilation.zig

Lines changed: 111 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3059,8 +3059,118 @@ pub fn saveState(comp: *Compilation) !void {
30593059
//// TODO: compilation errors
30603060
//// TODO: namespaces
30613061
//// TODO: decls
3062-
//// TODO: linker state
30633062
}
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+
30643174
var basename_buf: [255]u8 = undefined;
30653175
const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{
30663176
comp.root_name,

src/link/Wasm.zig

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -199,7 +199,6 @@ uav_exports: std.AutoArrayHashMapUnmanaged(UavExport, Zcu.Export.Index) = .empty
199199
imports: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, void) = .empty,
200200

201201
dwarf: ?Dwarf = null,
202-
debug_sections: DebugSections = .{},
203202

204203
flush_buffer: Flush = .{},
205204

@@ -940,19 +939,6 @@ pub const UavExport = extern struct {
940939
uav_index: InternPool.Index,
941940
};
942941

943-
const 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-
954-
const DebugSection = struct {};
955-
956942
pub const FunctionImport = extern struct {
957943
flags: SymbolFlags,
958944
module_name: OptionalString,

src/link/Wasm/Object.zig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -856,7 +856,7 @@ pub fn parse(
856856
start_function = @enumFromInt(functions_start + index);
857857
},
858858
.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 });
860860
pos = section_end;
861861
},
862862
.code => {

0 commit comments

Comments
 (0)