aboutsummaryrefslogtreecommitdiff
path: root/src/Module.zig
diff options
context:
space:
mode:
authorJimmi Holst Christensen <jhc@dismail.de>2022-01-07 18:58:40 +0100
committerJimmi Holst Christensen <jhc@dismail.de>2022-01-07 22:10:36 +0100
commit9d6bef49a5fc2a5387734fa8d8cc698f0da8d5fa (patch)
tree86304781ddc0b37b2b7881b54f72fb789660c7eb /src/Module.zig
parentd5093b6c1395d4a60a923e1911321784ce368bda (diff)
downloadzig-9d6bef49a5fc2a5387734fa8d8cc698f0da8d5fa.tar.gz
zig-9d6bef49a5fc2a5387734fa8d8cc698f0da8d5fa.zip
Add two more resolution status' to Struct and Union
resolveTypeForCodegen is called when we needed to resolve a type fully, even through pointer. This commit fully implements this, even through pointer fields on structs and unions. The function has now also been renamed to resolveTypeFully
Diffstat (limited to 'src/Module.zig')
-rw-r--r--src/Module.zig42
1 files changed, 41 insertions, 1 deletions
diff --git a/src/Module.zig b/src/Module.zig
index 0cbf75c735..8c14f080d2 100644
--- a/src/Module.zig
+++ b/src/Module.zig
@@ -831,6 +831,10 @@ pub const Struct = struct {
have_field_types,
layout_wip,
have_layout,
+ fully_resolved_wip,
+ // The types and all its fields have had their layout resolved. Even through pointer,
+ // which `have_layout` does not ensure.
+ fully_resolved,
},
/// If true, definitely nonzero size at runtime. If false, resolving the fields
/// is necessary to determine whether it has bits at runtime.
@@ -889,6 +893,22 @@ pub const Struct = struct {
.have_field_types,
.layout_wip,
.have_layout,
+ .fully_resolved_wip,
+ .fully_resolved,
+ => true,
+ };
+ }
+
+ pub fn haveLayout(s: Struct) bool {
+ return switch (s.status) {
+ .none,
+ .field_types_wip,
+ .have_field_types,
+ .layout_wip,
+ => false,
+ .have_layout,
+ .fully_resolved_wip,
+ .fully_resolved,
=> true,
};
}
@@ -1003,6 +1023,10 @@ pub const Union = struct {
have_field_types,
layout_wip,
have_layout,
+ fully_resolved_wip,
+ // The types and all its fields have had their layout resolved. Even through pointer,
+ // which `have_layout` does not ensure.
+ fully_resolved,
},
pub const Field = struct {
@@ -1033,6 +1057,8 @@ pub const Union = struct {
.have_field_types,
.layout_wip,
.have_layout,
+ .fully_resolved_wip,
+ .fully_resolved,
=> true,
};
}
@@ -1102,8 +1128,22 @@ pub const Union = struct {
tag_size: u64,
};
+ pub fn haveLayout(u: Union) bool {
+ return switch (u.status) {
+ .none,
+ .field_types_wip,
+ .have_field_types,
+ .layout_wip,
+ => false,
+ .have_layout,
+ .fully_resolved_wip,
+ .fully_resolved,
+ => true,
+ };
+ }
+
pub fn getLayout(u: Union, target: Target, have_tag: bool) Layout {
- assert(u.status == .have_layout);
+ assert(u.haveLayout());
var most_aligned_field: u32 = undefined;
var most_aligned_field_size: u64 = undefined;
var biggest_field: u32 = undefined;