| ... | ... | @@ -178,7 +178,7 @@ preloaded_strings: PreloadedStrings, |
| 178 | 178 | |
| 179 | 179 | /// This field is used when emitting an object; `navs_exe` used otherwise. |
| 180 | 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 | 182 | navs_exe: std.AutoArrayHashMapUnmanaged(InternPool.Nav.Index, ZcuDataExe) = .empty, |
| 183 | 183 | /// Tracks all InternPool values referenced by codegen. Needed for outputting |
| 184 | 184 | /// the data segment. This one does not track ref count because object files |
| ... | ... | @@ -794,7 +794,6 @@ pub const ZcuDataExe = extern struct { |
| 794 | 794 | /// are populated. |
| 795 | 795 | const ZcuDataStarts = struct { |
| 796 | 796 | uavs_i: u32, |
| 797 | | navs_i: u32, |
| 798 | 797 | |
| 799 | 798 | fn init(wasm: *const Wasm) ZcuDataStarts { |
| 800 | 799 | const comp = wasm.base.comp; |
| ... | ... | @@ -805,14 +804,12 @@ const ZcuDataStarts = struct { |
| 805 | 804 | fn initObj(wasm: *const Wasm) ZcuDataStarts { |
| 806 | 805 | return .{ |
| 807 | 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 | 810 | fn initExe(wasm: *const Wasm) ZcuDataStarts { |
| 813 | 811 | return .{ |
| 814 | 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 | 820 | } |
| 824 | 821 | |
| 825 | 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 | 823 | var uavs_i = zds.uavs_i; |
| 829 | | var navs_i = zds.navs_i; |
| 830 | | while (true) { |
| 831 | | while (navs_i < wasm.navs_obj.entries.len) : (navs_i += 1) { |
| 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; |
| 824 | while (uavs_i < wasm.uavs_obj.entries.len) : (uavs_i += 1) { |
| 825 | // Call to `lowerZcuData` here possibly creates more entries in these tables. |
| 826 | wasm.uavs_obj.values()[uavs_i] = try lowerZcuData(wasm, pt, wasm.uavs_obj.keys()[uavs_i]); |
| 845 | 827 | } |
| 846 | 828 | } |
| 847 | 829 | |
| 848 | 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 | 831 | var uavs_i = zds.uavs_i; |
| 852 | | var navs_i = zds.navs_i; |
| 853 | | while (true) { |
| 854 | | while (navs_i < wasm.navs_exe.entries.len) : (navs_i += 1) { |
| 855 | | const elem_nav = ip.getNav(wasm.navs_exe.keys()[navs_i]); |
| 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; |
| 832 | while (uavs_i < wasm.uavs_exe.entries.len) : (uavs_i += 1) { |
| 833 | // Call to `lowerZcuData` here possibly creates more entries in these tables. |
| 834 | const zcu_data = try lowerZcuData(wasm, pt, wasm.uavs_exe.keys()[uavs_i]); |
| 835 | wasm.uavs_exe.values()[uavs_i].code = zcu_data.code; |
| 871 | 836 | } |
| 872 | 837 | } |
| 873 | 838 | }; |
| ... | ... | @@ -3135,7 +3100,7 @@ pub fn updateNav(wasm: *Wasm, pt: Zcu.PerThread, nav_index: InternPool.Nav.Index |
| 3135 | 3100 | .variable => |variable| .{ variable.init, variable.owner_nav }, |
| 3136 | 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 | 3104 | assert(!wasm.imports.contains(chased_nav_index)); |
| 3140 | 3105 | |
| 3141 | 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 | 3114 | |
| 3150 | 3115 | if (is_obj) { |
| 3151 | 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 | 3120 | try zcu_data_starts.finishObj(wasm, pt); |
| 3154 | 3121 | } else { |
| 3155 | 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 | 3126 | try zcu_data_starts.finishExe(wasm, pt); |
| 3158 | 3127 | } |
| 3159 | 3128 | } |