| ... | ... | @@ -235,11 +235,6 @@ global_imports: std.AutoArrayHashMapUnmanaged(String, GlobalImportId) = .empty, |
| 235 | 235 | tables: std.AutoArrayHashMapUnmanaged(TableImport.Resolution, void) = .empty, |
| 236 | 236 | table_imports: std.AutoArrayHashMapUnmanaged(String, TableImport.Index) = .empty, |
| 237 | 237 | |
| 238 | | /// Ordered list of data segments that will appear in the final binary. |
| 239 | | /// When sorted, to-be-merged segments will be made adjacent. |
| 240 | | /// Values are offset relative to segment start. |
| 241 | | data_segments: std.AutoArrayHashMapUnmanaged(Wasm.DataSegment.Id, void) = .empty, |
| 242 | | |
| 243 | 238 | error_name_table_ref_count: u32 = 0, |
| 244 | 239 | |
| 245 | 240 | /// Set to true if any `GLOBAL_INDEX` relocation is encountered with |
| ... | ... | @@ -2360,7 +2355,6 @@ pub fn deinit(wasm: *Wasm) void { |
| 2360 | 2355 | wasm.global_exports.deinit(gpa); |
| 2361 | 2356 | wasm.global_imports.deinit(gpa); |
| 2362 | 2357 | wasm.table_imports.deinit(gpa); |
| 2363 | | wasm.data_segments.deinit(gpa); |
| 2364 | 2358 | wasm.symbol_table.deinit(gpa); |
| 2365 | 2359 | wasm.out_relocs.deinit(gpa); |
| 2366 | 2360 | wasm.uav_fixups.deinit(gpa); |
| ... | ... | @@ -2416,13 +2410,13 @@ pub fn updateNav(wasm: *Wasm, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index |
| 2416 | 2410 | const gpa = comp.gpa; |
| 2417 | 2411 | const is_obj = comp.config.output_mode == .Obj; |
| 2418 | 2412 | |
| 2419 | | const nav_init = switch (ip.indexToKey(nav.status.resolved.val)) { |
| 2413 | const nav_init, const chased_nav_index = switch (ip.indexToKey(nav.status.resolved.val)) { |
| 2420 | 2414 | .func => return, // global const which is a function alias |
| 2421 | 2415 | .@"extern" => |ext| { |
| 2422 | 2416 | if (is_obj) { |
| 2423 | | assert(!wasm.navs_obj.contains(nav_index)); |
| 2417 | assert(!wasm.navs_obj.contains(ext.owner_nav)); |
| 2424 | 2418 | } else { |
| 2425 | | assert(!wasm.navs_exe.contains(nav_index)); |
| 2419 | assert(!wasm.navs_exe.contains(ext.owner_nav)); |
| 2426 | 2420 | } |
| 2427 | 2421 | const name = try wasm.internString(ext.name.toSlice(ip)); |
| 2428 | 2422 | if (ext.lib_name.toSlice(ip)) |ext_name| _ = try wasm.internString(ext_name); |
| ... | ... | @@ -2436,27 +2430,28 @@ pub fn updateNav(wasm: *Wasm, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index |
| 2436 | 2430 | } |
| 2437 | 2431 | return; |
| 2438 | 2432 | }, |
| 2439 | | .variable => |variable| variable.init, |
| 2440 | | else => nav.status.resolved.val, |
| 2433 | .variable => |variable| .{ variable.init, variable.owner_nav }, |
| 2434 | else => .{ nav.status.resolved.val, nav_index }, |
| 2441 | 2435 | }; |
| 2442 | | assert(!wasm.imports.contains(nav_index)); |
| 2436 | log.debug("updateNav {} {}", .{ nav.fqn.fmt(ip), chased_nav_index }); |
| 2437 | assert(!wasm.imports.contains(chased_nav_index)); |
| 2443 | 2438 | |
| 2444 | 2439 | if (nav_init != .none and !Value.fromInterned(nav_init).typeOf(zcu).hasRuntimeBits(zcu)) { |
| 2445 | 2440 | if (is_obj) { |
| 2446 | | assert(!wasm.navs_obj.contains(nav_index)); |
| 2441 | assert(!wasm.navs_obj.contains(chased_nav_index)); |
| 2447 | 2442 | } else { |
| 2448 | | assert(!wasm.navs_exe.contains(nav_index)); |
| 2443 | assert(!wasm.navs_exe.contains(chased_nav_index)); |
| 2449 | 2444 | } |
| 2450 | 2445 | return; |
| 2451 | 2446 | } |
| 2452 | 2447 | |
| 2453 | 2448 | if (is_obj) { |
| 2454 | 2449 | const zcu_data_starts: ZcuDataStarts = .initObj(wasm); |
| 2455 | | _ = try refNavObj(wasm, nav_index); // Possibly creates an entry in `Wasm.navs_obj`. |
| 2450 | _ = try refNavObj(wasm, chased_nav_index); // Possibly creates an entry in `Wasm.navs_obj`. |
| 2456 | 2451 | try zcu_data_starts.finishObj(wasm, pt); |
| 2457 | 2452 | } else { |
| 2458 | 2453 | const zcu_data_starts: ZcuDataStarts = .initExe(wasm); |
| 2459 | | _ = try refNavExe(wasm, nav_index); // Possibly creates an entry in `Wasm.navs_exe`. |
| 2454 | _ = try refNavExe(wasm, chased_nav_index); // Possibly creates an entry in `Wasm.navs_exe`. |
| 2460 | 2455 | try zcu_data_starts.finishExe(wasm, pt); |
| 2461 | 2456 | } |
| 2462 | 2457 | } |
| ... | ... | @@ -2820,12 +2815,8 @@ pub fn flushModule( |
| 2820 | 2815 | const globals_end_zcu: u32 = @intCast(wasm.globals.entries.len); |
| 2821 | 2816 | defer wasm.globals.shrinkRetainingCapacity(globals_end_zcu); |
| 2822 | 2817 | |
| 2823 | | const data_segments_end_zcu: u32 = @intCast(wasm.data_segments.entries.len); |
| 2824 | | defer wasm.data_segments.shrinkRetainingCapacity(data_segments_end_zcu); |
| 2825 | | |
| 2826 | 2818 | wasm.flush_buffer.clear(); |
| 2827 | 2819 | try wasm.flush_buffer.missing_exports.reinit(gpa, wasm.missing_exports.keys(), &.{}); |
| 2828 | | try wasm.flush_buffer.data_segments.reinit(gpa, wasm.data_segments.keys(), &.{}); |
| 2829 | 2820 | try wasm.flush_buffer.function_imports.reinit(gpa, wasm.function_imports.keys(), wasm.function_imports.values()); |
| 2830 | 2821 | try wasm.flush_buffer.global_imports.reinit(gpa, wasm.global_imports.keys(), wasm.global_imports.values()); |
| 2831 | 2822 | |
| ... | ... | @@ -3427,16 +3418,13 @@ pub fn refUavObj(wasm: *Wasm, ip_index: InternPool.Index) !UavsObjIndex { |
| 3427 | 3418 | const comp = wasm.base.comp; |
| 3428 | 3419 | const gpa = comp.gpa; |
| 3429 | 3420 | assert(comp.config.output_mode == .Obj); |
| 3430 | | try wasm.data_segments.ensureUnusedCapacity(gpa, 1); |
| 3431 | 3421 | const gop = try wasm.uavs_obj.getOrPut(gpa, ip_index); |
| 3432 | 3422 | if (!gop.found_existing) gop.value_ptr.* = .{ |
| 3433 | 3423 | // Lowering the value is delayed to avoid recursion. |
| 3434 | 3424 | .code = undefined, |
| 3435 | 3425 | .relocs = undefined, |
| 3436 | 3426 | }; |
| 3437 | | const uav_index: UavsObjIndex = @enumFromInt(gop.index); |
| 3438 | | wasm.data_segments.putAssumeCapacity(.pack(wasm, .{ .uav_obj = uav_index }), {}); |
| 3439 | | return uav_index; |
| 3427 | return @enumFromInt(gop.index); |
| 3440 | 3428 | } |
| 3441 | 3429 | |
| 3442 | 3430 | pub fn refUavExe(wasm: *Wasm, ip_index: InternPool.Index) !UavsExeIndex { |
| ... | ... | @@ -3453,9 +3441,7 @@ pub fn refUavExe(wasm: *Wasm, ip_index: InternPool.Index) !UavsExeIndex { |
| 3453 | 3441 | .count = 1, |
| 3454 | 3442 | }; |
| 3455 | 3443 | } |
| 3456 | | const uav_index: UavsExeIndex = @enumFromInt(gop.index); |
| 3457 | | try wasm.data_segments.put(gpa, .pack(wasm, .{ .uav_exe = uav_index }), {}); |
| 3458 | | return uav_index; |
| 3444 | return @enumFromInt(gop.index); |
| 3459 | 3445 | } |
| 3460 | 3446 | |
| 3461 | 3447 | pub fn refNavObj(wasm: *Wasm, nav_index: InternPool.Nav.Index) !NavsObjIndex { |
| ... | ... | @@ -3468,9 +3454,7 @@ pub fn refNavObj(wasm: *Wasm, nav_index: InternPool.Nav.Index) !NavsObjIndex { |
| 3468 | 3454 | .code = undefined, |
| 3469 | 3455 | .relocs = undefined, |
| 3470 | 3456 | }; |
| 3471 | | const navs_obj_index: NavsObjIndex = @enumFromInt(gop.index); |
| 3472 | | try wasm.data_segments.put(gpa, .pack(wasm, .{ .nav_obj = navs_obj_index }), {}); |
| 3473 | | return navs_obj_index; |
| 3457 | return @enumFromInt(gop.index); |
| 3474 | 3458 | } |
| 3475 | 3459 | |
| 3476 | 3460 | pub fn refNavExe(wasm: *Wasm, nav_index: InternPool.Nav.Index) !NavsExeIndex { |
| ... | ... | @@ -3487,9 +3471,7 @@ pub fn refNavExe(wasm: *Wasm, nav_index: InternPool.Nav.Index) !NavsExeIndex { |
| 3487 | 3471 | .count = 0, |
| 3488 | 3472 | }; |
| 3489 | 3473 | } |
| 3490 | | const navs_exe_index: NavsExeIndex = @enumFromInt(gop.index); |
| 3491 | | try wasm.data_segments.put(gpa, .pack(wasm, .{ .nav_exe = navs_exe_index }), {}); |
| 3492 | | return navs_exe_index; |
| 3474 | return @enumFromInt(gop.index); |
| 3493 | 3475 | } |
| 3494 | 3476 | |
| 3495 | 3477 | /// Asserts it is called after `Flush.data_segments` is fully populated and sorted. |
| ... | ... | @@ -3506,7 +3488,9 @@ pub fn navAddr(wasm: *Wasm, nav_index: InternPool.Nav.Index) u32 { |
| 3506 | 3488 | assert(wasm.flush_buffer.memory_layout_finished); |
| 3507 | 3489 | const comp = wasm.base.comp; |
| 3508 | 3490 | assert(comp.config.output_mode != .Obj); |
| 3509 | | const ds_id: DataSegment.Id = .pack(wasm, .{ .nav_exe = @enumFromInt(wasm.navs_exe.getIndex(nav_index).?) }); |
| 3491 | const navs_exe_index: NavsExeIndex = @enumFromInt(wasm.navs_exe.getIndex(nav_index).?); |
| 3492 | log.debug("navAddr {s} {}", .{ navs_exe_index.name(wasm), nav_index }); |
| 3493 | const ds_id: DataSegment.Id = .pack(wasm, .{ .nav_exe = navs_exe_index }); |
| 3510 | 3494 | return wasm.flush_buffer.data_segments.get(ds_id).?; |
| 3511 | 3495 | } |
| 3512 | 3496 | |