| ... | @@ -178,7 +178,7 @@ preloaded_strings: PreloadedStrings, | ... | @@ -178,7 +178,7 @@ preloaded_strings: PreloadedStrings, |
| 178 | | 178 | |
| 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. |
| 180 | navs_obj: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataObj) = .empty, | 180 | navs_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. |
| 182 | navs_exe: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataExe) = .empty, | 182 | navs_exe: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataExe) = .empty, |
| 183 | /// Tracks all InternPool values referenced by codegen. Needed for outputting | 183 | /// Tracks all InternPool values referenced by codegen. Needed for outputting |
| 184 | /// the data segment. This one does not track ref count because object files | 184 | /// 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. |
| 795 | const ZcuDataStarts = struct { | 795 | const ZcuDataStarts = struct { |
| 796 | uavs_i: u32, | 796 | uavs_i: u32, |
| 797 | navs_i: u32, | | |
| 798 | | 797 | |
| 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 | } |
| 811 | | 809 | |
| 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 | } |
| 818 | | 815 | |
| ... | @@ -823,51 +820,19 @@ const ZcuDataStarts = struct { | ... | @@ -823,51 +820,19 @@ const ZcuDataStarts = struct { |
| 823 | } | 820 | } |
| 824 | | 821 | |
| 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 | } |
| 847 | | 829 | |
| 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)); |
| 3140 | | 3105 | |
| 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 |
| 3149 | | 3114 | |
| 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 | } |