| ... | @@ -258,7 +258,7 @@ pub const Value = struct { | ... | @@ -258,7 +258,7 @@ pub const Value = struct { |
| 258 | } | 258 | } |
| 259 | | 259 | |
| 260 | pub fn castTag(self: Value, comptime t: Tag) ?*t.Type() { | 260 | pub fn castTag(self: Value, comptime t: Tag) ?*t.Type() { |
| 261 | assert(self.ip_index == .none); | 261 | if (self.ip_index != .none) return null; |
| 262 | | 262 | |
| 263 | if (@enumToInt(self.legacy.tag_if_small_enough) < Tag.no_payload_count) | 263 | if (@enumToInt(self.legacy.tag_if_small_enough) < Tag.no_payload_count) |
| 264 | return null; | 264 | return null; |
| ... | @@ -2806,24 +2806,30 @@ pub const Value = struct { | ... | @@ -2806,24 +2806,30 @@ pub const Value = struct { |
| 2806 | } | 2806 | } |
| 2807 | | 2807 | |
| 2808 | pub fn isPtrToThreadLocal(val: Value, mod: *Module) bool { | 2808 | pub fn isPtrToThreadLocal(val: Value, mod: *Module) bool { |
| 2809 | return switch (val.tag()) { | 2809 | return switch (val.ip_index) { |
| 2810 | .variable => false, | 2810 | .none => switch (val.tag()) { |
| | 2811 | .variable => false, |
| | 2812 | else => val.isPtrToThreadLocalInner(mod), |
| | 2813 | }, |
| 2811 | else => val.isPtrToThreadLocalInner(mod), | 2814 | else => val.isPtrToThreadLocalInner(mod), |
| 2812 | }; | 2815 | }; |
| 2813 | } | 2816 | } |
| 2814 | | 2817 | |
| 2815 | fn isPtrToThreadLocalInner(val: Value, mod: *Module) bool { | 2818 | fn isPtrToThreadLocalInner(val: Value, mod: *Module) bool { |
| 2816 | return switch (val.tag()) { | 2819 | return switch (val.ip_index) { |
| 2817 | .slice => val.castTag(.slice).?.data.ptr.isPtrToThreadLocalInner(mod), | 2820 | .none => switch (val.tag()) { |
| 2818 | .comptime_field_ptr => val.castTag(.comptime_field_ptr).?.data.field_val.isPtrToThreadLocalInner(mod), | 2821 | .slice => val.castTag(.slice).?.data.ptr.isPtrToThreadLocalInner(mod), |
| 2819 | .elem_ptr => val.castTag(.elem_ptr).?.data.array_ptr.isPtrToThreadLocalInner(mod), | 2822 | .comptime_field_ptr => val.castTag(.comptime_field_ptr).?.data.field_val.isPtrToThreadLocalInner(mod), |
| 2820 | .field_ptr => val.castTag(.field_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), | 2823 | .elem_ptr => val.castTag(.elem_ptr).?.data.array_ptr.isPtrToThreadLocalInner(mod), |
| 2821 | .eu_payload_ptr => val.castTag(.eu_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), | 2824 | .field_ptr => val.castTag(.field_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), |
| 2822 | .opt_payload_ptr => val.castTag(.opt_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), | 2825 | .eu_payload_ptr => val.castTag(.eu_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), |
| 2823 | .decl_ref => mod.declPtr(val.castTag(.decl_ref).?.data).val.isPtrToThreadLocalInner(mod), | 2826 | .opt_payload_ptr => val.castTag(.opt_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), |
| 2824 | .decl_ref_mut => mod.declPtr(val.castTag(.decl_ref_mut).?.data.decl_index).val.isPtrToThreadLocalInner(mod), | 2827 | .decl_ref => mod.declPtr(val.castTag(.decl_ref).?.data).val.isPtrToThreadLocalInner(mod), |
| 2825 | | 2828 | .decl_ref_mut => mod.declPtr(val.castTag(.decl_ref_mut).?.data.decl_index).val.isPtrToThreadLocalInner(mod), |
| 2826 | .variable => val.castTag(.variable).?.data.is_threadlocal, | 2829 | |
| | 2830 | .variable => val.castTag(.variable).?.data.is_threadlocal, |
| | 2831 | else => false, |
| | 2832 | }, |
| 2827 | else => false, | 2833 | else => false, |
| 2828 | }; | 2834 | }; |
| 2829 | } | 2835 | } |