| ... | @@ -3059,8 +3059,118 @@ pub fn saveState(comp: *Compilation) !void { | ... | @@ -3059,8 +3059,118 @@ pub fn saveState(comp: *Compilation) !void { |
| 3059 | //// TODO: compilation errors | 3059 | //// TODO: compilation errors |
| 3060 | //// TODO: namespaces | 3060 | //// TODO: namespaces |
| 3061 | //// TODO: decls | 3061 | //// 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, |