| ... | ... | @@ -3059,8 +3059,118 @@ pub fn saveState(comp: *Compilation) !void { |
| 3059 | 3059 | //// TODO: compilation errors |
| 3060 | 3060 | //// TODO: namespaces |
| 3061 | 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 | 3174 | var basename_buf: [255]u8 = undefined; |
| 3065 | 3175 | const basename = std.fmt.bufPrint(&basename_buf, "{s}.zcs", .{ |
| 3066 | 3176 | comp.root_name, |