diff options
Diffstat (limited to 'src/value.zig')
| -rw-r--r-- | src/value.zig | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/value.zig b/src/value.zig index a727df5d22..792ec5068f 100644 --- a/src/value.zig +++ b/src/value.zig @@ -2806,6 +2806,29 @@ pub const Value = extern union { }; } + pub fn isPtrToThreadLocal(val: Value, mod: *Module) bool { + return switch (val.tag()) { + .variable => false, + else => val.isPtrToThreadLocalInner(mod), + }; + } + + fn isPtrToThreadLocalInner(val: Value, mod: *Module) bool { + return switch (val.tag()) { + .slice => val.castTag(.slice).?.data.ptr.isPtrToThreadLocalInner(mod), + .comptime_field_ptr => val.castTag(.comptime_field_ptr).?.data.field_val.isPtrToThreadLocalInner(mod), + .elem_ptr => val.castTag(.elem_ptr).?.data.array_ptr.isPtrToThreadLocalInner(mod), + .field_ptr => val.castTag(.field_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), + .eu_payload_ptr => val.castTag(.eu_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), + .opt_payload_ptr => val.castTag(.opt_payload_ptr).?.data.container_ptr.isPtrToThreadLocalInner(mod), + .decl_ref => mod.declPtr(val.castTag(.decl_ref).?.data).val.isPtrToThreadLocalInner(mod), + .decl_ref_mut => mod.declPtr(val.castTag(.decl_ref_mut).?.data.decl_index).val.isPtrToThreadLocalInner(mod), + + .variable => val.castTag(.variable).?.data.is_threadlocal, + else => false, + }; + } + // Asserts that the provided start/end are in-bounds. pub fn sliceArray( val: Value, |
