aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2022-03-02 13:35:15 -0700
committerAndrew Kelley <andrew@ziglang.org>2022-03-02 13:35:15 -0700
commit220708e7c3f437958fbf8376975b70542b9ac199 (patch)
tree46aba172a40fc29fc9d376bbc316855cc2438ead /src/type.zig
parent446324a1d82514157f5a11a6ca775711bc48c419 (diff)
downloadzig-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.zig49
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,