aboutsummaryrefslogtreecommitdiff
path: root/src/type.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-09-14 21:58:22 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-09-14 21:58:22 -0700
commit0395b35cee8d4082cc40b0dcd0298f797f42309d (patch)
treec4592f4e4cdb555836bb422d485b2c134e3f7547 /src/type.zig
parent5d14590ed15ce23e7ef8032f8075dcfe76ba9dd8 (diff)
downloadzig-0395b35cee8d4082cc40b0dcd0298f797f42309d.tar.gz
zig-0395b35cee8d4082cc40b0dcd0298f797f42309d.zip
stage2: implement cmpxchg and improve comptime eval
* Implement Sema for `@cmpxchgWeak` and `@cmpxchgStrong`. Both runtime and comptime codepaths are implement. * Implement Codegen for LLVM backend and C backend. * Add LazySrcLoc.node_offset_builtin_call_argX 3...5 * Sema: rework comptime control flow. - `error.ComptimeReturn` is used to signal that a comptime function call has returned a result (stored in the Inlining struct). `analyzeCall` notices this and handles the result. - The ZIR instructions `break_inline`, `block_inline`, `condbr_inline` are now redundant and can be deleted. `break`, `block`, and `condbr` function equivalently inside a comptime scope. - The ZIR instructions `loop` and `repeat` also are modified to directly perform comptime control flow inside a comptime scope, skipping an unnecessary mechanism for analysis of runtime code. This makes Zig perform closer to an interpreter when evaluating comptime code. * Sema: zirRetErrValue looks at Sema.ret_fn_ty rather than sema.func for adding to the inferred error set. This fixes a bug for inlined/comptime function calls. * Implement ZIR printing for cmpxchg. * stage1: make cmpxchg respect --single-threaded - Our LLVM C++ API wrapper failed to expose this boolean flag before. * Fix AIR printing for struct fields showing incorrect liveness data.
Diffstat (limited to 'src/type.zig')
-rw-r--r--src/type.zig29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/type.zig b/src/type.zig
index 4d6ff3be0f..2403893133 100644
--- a/src/type.zig
+++ b/src/type.zig
@@ -2886,6 +2886,35 @@ pub const Type = extern union {
}
}
+ /// Returns the integer tag type of the enum.
+ pub fn enumTagType(ty: Type, buffer: *Payload.Bits) Type {
+ switch (ty.tag()) {
+ .enum_full, .enum_nonexhaustive => {
+ const enum_full = ty.cast(Payload.EnumFull).?.data;
+ return enum_full.tag_ty;
+ },
+ .enum_simple => {
+ const enum_simple = ty.castTag(.enum_simple).?.data;
+ buffer.* = .{
+ .base = .{ .tag = .int_unsigned },
+ .data = std.math.log2_int_ceil(usize, enum_simple.fields.count()),
+ };
+ return Type.initPayload(&buffer.base);
+ },
+ .atomic_order,
+ .atomic_rmw_op,
+ .calling_convention,
+ .float_mode,
+ .reduce_op,
+ .call_options,
+ .export_options,
+ .extern_options,
+ => @panic("TODO resolve std.builtin types"),
+
+ else => unreachable,
+ }
+ }
+
pub fn isNonexhaustiveEnum(ty: Type) bool {
return switch (ty.tag()) {
.enum_nonexhaustive => true,