authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-08 22:18:54-08:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2025-01-15 15:11:36-08:00
log7a4d4357e85ddd26c03a49e9bbff7da688f96ca7
tree984d62a8bee8d53bf89105ebc2ea4b8571492b82
parent21a28885615dd9ea168c003caa65ff80a145eab7

wasm linker: don't try to lower nav zcu data before updateNav is called


1 files changed, 15 insertions(+), 46 deletions(-)

src/link/Wasm.zig+15-46
...@@ -178,7 +178,7 @@ preloaded_strings: PreloadedStrings,...@@ -178,7 +178,7 @@ preloaded_strings: PreloadedStrings,
178178
179/// This field is used when emitting an object; `navs_exe` used otherwise.179/// This field is used when emitting an object; `navs_exe` used otherwise.
180navs_obj: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataObj) = .empty,180navs_obj: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataObj) = .empty,
181/// This field is unused when emitting an object; `navs_exe` used otherwise.181/// This field is unused when emitting an object; `navs_obj` used otherwise.
182navs_exe: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataExe) = .empty,182navs_exe: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataExe) = .empty,
183/// Tracks all InternPool values referenced by codegen. Needed for outputting183/// Tracks all InternPool values referenced by codegen. Needed for outputting
184/// the data segment. This one does not track ref count because object files184/// the data segment. This one does not track ref count because object files
...@@ -794,7 +794,6 @@ pub const ZcuDataExe = extern struct {...@@ -794,7 +794,6 @@ pub const ZcuDataExe = extern struct {
794/// are populated.794/// are populated.
795const ZcuDataStarts = struct {795const ZcuDataStarts = struct {
796 uavs_i: u32,796 uavs_i: u32,
797 navs_i: u32,
798797
799 fn init(wasm: *const Wasm) ZcuDataStarts {798 fn init(wasm: *const Wasm) ZcuDataStarts {
800 const comp = wasm.base.comp;799 const comp = wasm.base.comp;
...@@ -805,14 +804,12 @@ const ZcuDataStarts = struct {...@@ -805,14 +804,12 @@ const ZcuDataStarts = struct {
805 fn initObj(wasm: *const Wasm) ZcuDataStarts {804 fn initObj(wasm: *const Wasm) ZcuDataStarts {
806 return .{805 return .{
807 .uavs_i = @intCast(wasm.uavs_obj.entries.len),806 .uavs_i = @intCast(wasm.uavs_obj.entries.len),
808 .navs_i = @intCast(wasm.navs_obj.entries.len),
809 };807 };
810 }808 }
811809
812 fn initExe(wasm: *const Wasm) ZcuDataStarts {810 fn initExe(wasm: *const Wasm) ZcuDataStarts {
813 return .{811 return .{
814 .uavs_i = @intCast(wasm.uavs_exe.entries.len),812 .uavs_i = @intCast(wasm.uavs_exe.entries.len),
815 .navs_i = @intCast(wasm.navs_exe.entries.len),
816 };813 };
817 }814 }
818815
...@@ -823,51 +820,19 @@ const ZcuDataStarts = struct {...@@ -823,51 +820,19 @@ const ZcuDataStarts = struct {
823 }820 }
824821
825 fn finishObj(zds: ZcuDataStarts, wasm: *Wasm, pt: Zcu.PerThread) !void {822 fn finishObj(zds: ZcuDataStarts, wasm: *Wasm, pt: Zcu.PerThread) !void {
826 const zcu = wasm.base.comp.zcu.?;
827 const ip = &zcu.intern_pool;
828 var uavs_i = zds.uavs_i;823 var uavs_i = zds.uavs_i;
829 var navs_i = zds.navs_i;824 while (uavs_i < wasm.uavs_obj.entries.len) : (uavs_i += 1) {
830 while (true) {825 // Call to `lowerZcuData` here possibly creates more entries in these tables.
831 while (navs_i < wasm.navs_obj.entries.len) : (navs_i += 1) {826 wasm.uavs_obj.values()[uavs_i] = try lowerZcuData(wasm, pt, wasm.uavs_obj.keys()[uavs_i]);
832 const elem_nav = ip.getNav(wasm.navs_obj.keys()[navs_i]);
833 const elem_nav_init = switch (ip.indexToKey(elem_nav.status.fully_resolved.val)) {
834 .variable => |variable| variable.init,
835 else => elem_nav.status.fully_resolved.val,
836 };
837 // Call to `lowerZcuData` here possibly creates more entries in these tables.
838 wasm.navs_obj.values()[navs_i] = try lowerZcuData(wasm, pt, elem_nav_init);
839 }
840 while (uavs_i < wasm.uavs_obj.entries.len) : (uavs_i += 1) {
841 // Call to `lowerZcuData` here possibly creates more entries in these tables.
842 wasm.uavs_obj.values()[uavs_i] = try lowerZcuData(wasm, pt, wasm.uavs_obj.keys()[uavs_i]);
843 }
844 if (navs_i >= wasm.navs_obj.entries.len) break;
845 }827 }
846 }828 }
847829
848 fn finishExe(zds: ZcuDataStarts, wasm: *Wasm, pt: Zcu.PerThread) !void {830 fn finishExe(zds: ZcuDataStarts, wasm: *Wasm, pt: Zcu.PerThread) !void {
849 const zcu = wasm.base.comp.zcu.?;
850 const ip = &zcu.intern_pool;
851 var uavs_i = zds.uavs_i;831 var uavs_i = zds.uavs_i;
852 var navs_i = zds.navs_i;832 while (uavs_i < wasm.uavs_exe.entries.len) : (uavs_i += 1) {
853 while (true) {833 // Call to `lowerZcuData` here possibly creates more entries in these tables.
854 while (navs_i < wasm.navs_exe.entries.len) : (navs_i += 1) {834 const zcu_data = try lowerZcuData(wasm, pt, wasm.uavs_exe.keys()[uavs_i]);
855 const elem_nav = ip.getNav(wasm.navs_exe.keys()[navs_i]);835 wasm.uavs_exe.values()[uavs_i].code = zcu_data.code;
856 const elem_nav_init = switch (ip.indexToKey(elem_nav.status.fully_resolved.val)) {
857 .variable => |variable| variable.init,
858 else => elem_nav.status.fully_resolved.val,
859 };
860 // Call to `lowerZcuData` here possibly creates more entries in these tables.
861 const zcu_data = try lowerZcuData(wasm, pt, elem_nav_init);
862 assert(zcu_data.relocs.len == 0);
863 wasm.navs_exe.values()[navs_i].code = zcu_data.code;
864 }
865 while (uavs_i < wasm.uavs_exe.entries.len) : (uavs_i += 1) {
866 // Call to `lowerZcuData` here possibly creates more entries in these tables.
867 const zcu_data = try lowerZcuData(wasm, pt, wasm.uavs_exe.keys()[uavs_i]);
868 wasm.uavs_exe.values()[uavs_i].code = zcu_data.code;
869 }
870 if (navs_i >= wasm.navs_exe.entries.len) break;
871 }836 }
872 }837 }
873};838};
...@@ -3135,7 +3100,7 @@ pub fn updateNav(wasm: *Wasm, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index...@@ -3135,7 +3100,7 @@ pub fn updateNav(wasm: *Wasm, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index
3135 .variable => |variable| .{ variable.init, variable.owner_nav },3100 .variable => |variable| .{ variable.init, variable.owner_nav },
3136 else => .{ nav.status.fully_resolved.val, nav_index },3101 else => .{ nav.status.fully_resolved.val, nav_index },
3137 };3102 };
3138 //log.debug("updateNav {} {}", .{ nav.fqn.fmt(ip), chased_nav_index });3103 //log.debug("updateNav {} {d}", .{ nav.fqn.fmt(ip), chased_nav_index });
3139 assert(!wasm.imports.contains(chased_nav_index));3104 assert(!wasm.imports.contains(chased_nav_index));
31403105
3141 if (nav_init != .none and !Value.fromInterned(nav_init).typeOf(zcu).hasRuntimeBits(zcu)) {3106 if (nav_init != .none and !Value.fromInterned(nav_init).typeOf(zcu).hasRuntimeBits(zcu)) {
...@@ -3149,11 +3114,15 @@ pub fn updateNav(wasm: *Wasm, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index...@@ -3149,11 +3114,15 @@ pub fn updateNav(wasm: *Wasm, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index
31493114
3150 if (is_obj) {3115 if (is_obj) {
3151 const zcu_data_starts: ZcuDataStarts = .initObj(wasm);3116 const zcu_data_starts: ZcuDataStarts = .initObj(wasm);
3152 _ = try refNavObj(wasm, chased_nav_index); // Possibly creates an entry in `Wasm.navs_obj`.3117 const navs_i = try refNavObj(wasm, chased_nav_index);
3118 const zcu_data = try lowerZcuData(wasm, pt, nav_init);
3119 navs_i.value(wasm).* = zcu_data;
3153 try zcu_data_starts.finishObj(wasm, pt);3120 try zcu_data_starts.finishObj(wasm, pt);
3154 } else {3121 } else {
3155 const zcu_data_starts: ZcuDataStarts = .initExe(wasm);3122 const zcu_data_starts: ZcuDataStarts = .initExe(wasm);
3156 _ = try refNavExe(wasm, chased_nav_index); // Possibly creates an entry in `Wasm.navs_exe`.3123 const navs_i = try refNavExe(wasm, chased_nav_index);
3124 const zcu_data = try lowerZcuData(wasm, pt, nav_init);
3125 navs_i.value(wasm).code = zcu_data.code;
3157 try zcu_data_starts.finishExe(wasm, pt);3126 try zcu_data_starts.finishExe(wasm, pt);
3158 }3127 }
3159}3128}