diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2022-03-02 13:35:15 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2022-03-02 13:35:15 -0700 |
| commit | 220708e7c3f437958fbf8376975b70542b9ac199 (patch) | |
| tree | 46aba172a40fc29fc9d376bbc316855cc2438ead /src/type.zig | |
| parent | 446324a1d82514157f5a11a6ca775711bc48c419 (diff) | |
| download | zig-220708e7c3f437958fbf8376975b70542b9ac199.tar.gz zig-220708e7c3f437958fbf8376975b70542b9ac199.zip | |
LLVM: aggregate_init supports structs
in addition to tuples
Diffstat (limited to 'src/type.zig')
| -rw-r--r-- | src/type.zig | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/src/type.zig b/src/type.zig index 3c08ed5b63..e1e6a0ada2 100644 --- a/src/type.zig +++ b/src/type.zig @@ -4479,6 +4479,55 @@ pub const Type = extern union { } } + pub fn structFieldAlign(ty: Type, index: usize, target: Target) u32 { + switch (ty.tag()) { + .@"struct" => { + const struct_obj = ty.castTag(.@"struct").?.data; + assert(struct_obj.layout != .Packed); + return struct_obj.fields.values()[index].normalAlignment(target); + }, + .@"union", .union_tagged => { + const union_obj = ty.cast(Payload.Union).?.data; + return union_obj.fields.values()[index].normalAlignment(target); + }, + .tuple => return ty.castTag(.tuple).?.data.types[index].abiAlignment(target), + .anon_struct => return ty.castTag(.anon_struct).?.data.types[index].abiAlignment(target), + else => unreachable, + } + } + + pub fn structFieldValueComptime(ty: Type, index: usize) ?Value { + switch (ty.tag()) { + .@"struct" => { + const struct_obj = ty.castTag(.@"struct").?.data; + assert(struct_obj.layout != .Packed); + const field = struct_obj.fields.values()[index]; + if (field.is_comptime) { + return field.default_val; + } else { + return null; + } + }, + .tuple => { + const val = ty.castTag(.tuple).?.data.values[index]; + if (val.tag() == .unreachable_value) { + return null; + } else { + return val; + } + }, + .anon_struct => { + const val = ty.castTag(.anon_struct).?.data.values[index]; + if (val.tag() == .unreachable_value) { + return null; + } else { + return val; + } + }, + else => unreachable, + } + } + pub const FieldOffset = struct { field: usize, offset: u64, |
