@@ -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 ,
0 commit comments