authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-07 08:31:00+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-07 10:30:56+02:00
logc6076a136099c9a87aa1fee1b797b8c944198c5c
treeebac2271d5121626c0cde652dbf90ee4523cd148
parent7000316113e44ab9c6bdacaef17915d25fb764ed
signaturelock-open Commit is signed but in an unrecognized format.

self hosted compiler: use enum literals


17 files changed, 609 insertions(+), 621 deletions(-)

src-self-hosted/arg.zig+5-5
......@@ -119,9 +119,9 @@ pub const Args = struct {
119119
120120 // MergeN creation disallows 0 length flag entry (doesn't make sense)
121121 switch (flag_args) {
122 FlagArg.None => unreachable,
123 FlagArg.Single => |inner| try prev.append(inner),
124 FlagArg.Many => |inner| try prev.appendSlice(inner.toSliceConst()),
122 .None => unreachable,
123 .Single => |inner| try prev.append(inner),
124 .Many => |inner| try prev.appendSlice(inner.toSliceConst()),
125125 }
126126
127127 _ = try parsed.flags.put(flag_name_trimmed, FlagArg{ .Many = prev });
......@@ -158,7 +158,7 @@ pub const Args = struct {
158158 pub fn single(self: *Args, name: []const u8) ?[]const u8 {
159159 if (self.flags.get(name)) |entry| {
160160 switch (entry.value) {
161 FlagArg.Single => |inner| {
161 .Single => |inner| {
162162 return inner;
163163 },
164164 else => @panic("attempted to retrieve flag with wrong type"),
......@@ -172,7 +172,7 @@ pub const Args = struct {
172172 pub fn many(self: *Args, name: []const u8) []const []const u8 {
173173 if (self.flags.get(name)) |entry| {
174174 switch (entry.value) {
175 FlagArg.Many => |inner| {
175 .Many => |inner| {
176176 return inner.toSliceConst();
177177 },
178178 else => @panic("attempted to retrieve flag with wrong type"),
src-self-hosted/c_int.zig+9-9
......@@ -19,56 +19,56 @@ pub const CInt = struct {
1919
2020 pub const list = [_]CInt{
2121 CInt{
22 .id = Id.Short,
22 .id = .Short,
2323 .zig_name = "c_short",
2424 .c_name = "short",
2525 .is_signed = true,
2626 },
2727 CInt{
28 .id = Id.UShort,
28 .id = .UShort,
2929 .zig_name = "c_ushort",
3030 .c_name = "unsigned short",
3131 .is_signed = false,
3232 },
3333 CInt{
34 .id = Id.Int,
34 .id = .Int,
3535 .zig_name = "c_int",
3636 .c_name = "int",
3737 .is_signed = true,
3838 },
3939 CInt{
40 .id = Id.UInt,
40 .id = .UInt,
4141 .zig_name = "c_uint",
4242 .c_name = "unsigned int",
4343 .is_signed = false,
4444 },
4545 CInt{
46 .id = Id.Long,
46 .id = .Long,
4747 .zig_name = "c_long",
4848 .c_name = "long",
4949 .is_signed = true,
5050 },
5151 CInt{
52 .id = Id.ULong,
52 .id = .ULong,
5353 .zig_name = "c_ulong",
5454 .c_name = "unsigned long",
5555 .is_signed = false,
5656 },
5757 CInt{
58 .id = Id.LongLong,
58 .id = .LongLong,
5959 .zig_name = "c_longlong",
6060 .c_name = "long long",
6161 .is_signed = true,
6262 },
6363 CInt{
64 .id = Id.ULongLong,
64 .id = .ULongLong,
6565 .zig_name = "c_ulonglong",
6666 .c_name = "unsigned long long",
6767 .is_signed = false,
6868 },
6969 };
7070
71 pub fn sizeInBits(id: CInt.Id, self: Target) u32 {
71 pub fn sizeInBits(id: Id, self: Target) u32 {
7272 const arch = self.getArch();
7373 switch (self.getOs()) {
7474 .freestanding => switch (self.getArch()) {
src-self-hosted/codegen.zig+16-17
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const builtin = @import("builtin");
32const Compilation = @import("compilation.zig").Compilation;
43const llvm = @import("llvm.zig");
54const c = @import("c.zig");
......@@ -31,7 +30,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
3130 llvm.SetTarget(module, comp.llvm_triple.ptr());
3231 llvm.SetDataLayout(module, comp.target_layout_str);
3332
34 if (comp.target.getObjectFormat() == builtin.ObjectFormat.coff) {
33 if (comp.target.getObjectFormat() == .coff) {
3534 llvm.AddModuleCodeViewFlag(module);
3635 } else {
3736 llvm.AddModuleDebugInfoFlag(module);
......@@ -59,7 +58,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
5958 comp.name.ptr(),
6059 comp.root_package.root_src_dir.ptr(),
6160 ) orelse return error.OutOfMemory;
62 const is_optimized = comp.build_mode != builtin.Mode.Debug;
61 const is_optimized = comp.build_mode != .Debug;
6362 const compile_unit = llvm.CreateCompileUnit(
6463 dibuilder,
6564 DW.LANG_C99,
......@@ -105,8 +104,8 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
105104
106105 assert(comp.emit_file_type == Compilation.Emit.Binary); // TODO support other types
107106
108 const is_small = comp.build_mode == builtin.Mode.ReleaseSmall;
109 const is_debug = comp.build_mode == builtin.Mode.Debug;
107 const is_small = comp.build_mode == .ReleaseSmall;
108 const is_debug = comp.build_mode == .Debug;
110109
111110 var err_msg: [*]u8 = undefined;
112111 // TODO integrate this with evented I/O
......@@ -114,7 +113,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
114113 comp.target_machine,
115114 module,
116115 output_path.ptr(),
117 llvm.EmitBinary,
116 .EmitBinary,
118117 &err_msg,
119118 is_debug,
120119 is_small,
......@@ -234,8 +233,8 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code)
234233 // create debug variable declarations for variables and allocate all local variables
235234 for (var_list) |var_scope, i| {
236235 const var_type = switch (var_scope.data) {
237 Scope.Var.Data.Const => unreachable,
238 Scope.Var.Data.Param => |param| param.typ,
236 .Const => unreachable,
237 .Param => |param| param.typ,
239238 };
240239 // if (!type_has_bits(var->value->type)) {
241240 // continue;
......@@ -266,7 +265,7 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code)
266265 var_scope.data.Param.llvm_value = llvm.GetParam(llvm_fn, @intCast(c_uint, i));
267266 } else {
268267 // gen_type = var->value->type;
269 var_scope.data.Param.llvm_value = try renderAlloca(ofile, var_type, var_scope.name, Type.Pointer.Align.Abi);
268 var_scope.data.Param.llvm_value = try renderAlloca(ofile, var_type, var_scope.name, .Abi);
270269 }
271270 // if (var->decl_node) {
272271 // var->di_loc_var = ZigLLVMCreateParameterVariable(g->dbuilder, get_di_scope(g, var->parent_scope),
......@@ -300,8 +299,8 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code)
300299 ofile,
301300 llvm_param,
302301 scope_var.data.Param.llvm_value,
303 Type.Pointer.Align.Abi,
304 Type.Pointer.Vol.Non,
302 .Abi,
303 .Non,
305304 );
306305 }
307306
......@@ -383,8 +382,8 @@ fn renderLoadUntyped(
383382) !*llvm.Value {
384383 const result = llvm.BuildLoad(ofile.builder, ptr, name) orelse return error.OutOfMemory;
385384 switch (vol) {
386 Type.Pointer.Vol.Non => {},
387 Type.Pointer.Vol.Volatile => llvm.SetVolatile(result, 1),
385 .Non => {},
386 .Volatile => llvm.SetVolatile(result, 1),
388387 }
389388 llvm.SetAlignment(result, resolveAlign(ofile, alignment, llvm.GetElementType(llvm.TypeOf(ptr))));
390389 return result;
......@@ -414,8 +413,8 @@ pub fn renderStoreUntyped(
414413) !*llvm.Value {
415414 const result = llvm.BuildStore(ofile.builder, value, ptr) orelse return error.OutOfMemory;
416415 switch (vol) {
417 Type.Pointer.Vol.Non => {},
418 Type.Pointer.Vol.Volatile => llvm.SetVolatile(result, 1),
416 .Non => {},
417 .Volatile => llvm.SetVolatile(result, 1),
419418 }
420419 llvm.SetAlignment(result, resolveAlign(ofile, alignment, llvm.TypeOf(value)));
421420 return result;
......@@ -445,7 +444,7 @@ pub fn renderAlloca(
445444
446445pub fn resolveAlign(ofile: *ObjectFile, alignment: Type.Pointer.Align, llvm_type: *llvm.Type) u32 {
447446 return switch (alignment) {
448 Type.Pointer.Align.Abi => return llvm.ABIAlignmentOfType(ofile.comp.target_data_ref, llvm_type),
449 Type.Pointer.Align.Override => |a| a,
447 .Abi => return llvm.ABIAlignmentOfType(ofile.comp.target_data_ref, llvm_type),
448 .Override => |a| a,
450449 };
451450}
src-self-hosted/compilation.zig+29-29
......@@ -5,7 +5,7 @@ const Allocator = mem.Allocator;
55const Buffer = std.Buffer;
66const llvm = @import("llvm.zig");
77const c = @import("c.zig");
8const builtin = @import("builtin");
8const builtin = std.builtin;
99const Target = std.Target;
1010const warn = std.debug.warn;
1111const Token = std.zig.Token;
......@@ -481,7 +481,7 @@ pub const Compilation = struct {
481481 comp.zig_std_dir = try std.fs.path.join(comp.arena(), [_][]const u8{ zig_lib_dir, "std" });
482482
483483 const opt_level = switch (build_mode) {
484 builtin.Mode.Debug => llvm.CodeGenLevelNone,
484 .Debug => llvm.CodeGenLevelNone,
485485 else => llvm.CodeGenLevelAggressive,
486486 };
487487
......@@ -594,11 +594,11 @@ pub const Compilation = struct {
594594 .base = Type{
595595 .name = "type",
596596 .base = Value{
597 .id = Value.Id.Type,
597 .id = .Type,
598598 .typ = undefined,
599599 .ref_count = std.atomic.Int(usize).init(3), // 3 because it references itself twice
600600 },
601 .id = builtin.TypeId.Type,
601 .id = .Type,
602602 .abi_alignment = Type.AbiAlignment.init(),
603603 },
604604 .value = undefined,
......@@ -612,11 +612,11 @@ pub const Compilation = struct {
612612 .base = Type{
613613 .name = "void",
614614 .base = Value{
615 .id = Value.Id.Type,
615 .id = .Type,
616616 .typ = &Type.MetaType.get(comp).base,
617617 .ref_count = std.atomic.Int(usize).init(1),
618618 },
619 .id = builtin.TypeId.Void,
619 .id = .Void,
620620 .abi_alignment = Type.AbiAlignment.init(),
621621 },
622622 };
......@@ -627,11 +627,11 @@ pub const Compilation = struct {
627627 .base = Type{
628628 .name = "noreturn",
629629 .base = Value{
630 .id = Value.Id.Type,
630 .id = .Type,
631631 .typ = &Type.MetaType.get(comp).base,
632632 .ref_count = std.atomic.Int(usize).init(1),
633633 },
634 .id = builtin.TypeId.NoReturn,
634 .id = .NoReturn,
635635 .abi_alignment = Type.AbiAlignment.init(),
636636 },
637637 };
......@@ -642,11 +642,11 @@ pub const Compilation = struct {
642642 .base = Type{
643643 .name = "comptime_int",
644644 .base = Value{
645 .id = Value.Id.Type,
645 .id = .Type,
646646 .typ = &Type.MetaType.get(comp).base,
647647 .ref_count = std.atomic.Int(usize).init(1),
648648 },
649 .id = builtin.TypeId.ComptimeInt,
649 .id = .ComptimeInt,
650650 .abi_alignment = Type.AbiAlignment.init(),
651651 },
652652 };
......@@ -657,11 +657,11 @@ pub const Compilation = struct {
657657 .base = Type{
658658 .name = "bool",
659659 .base = Value{
660 .id = Value.Id.Type,
660 .id = .Type,
661661 .typ = &Type.MetaType.get(comp).base,
662662 .ref_count = std.atomic.Int(usize).init(1),
663663 },
664 .id = builtin.TypeId.Bool,
664 .id = .Bool,
665665 .abi_alignment = Type.AbiAlignment.init(),
666666 },
667667 };
......@@ -670,7 +670,7 @@ pub const Compilation = struct {
670670 comp.void_value = try comp.arena().create(Value.Void);
671671 comp.void_value.* = Value.Void{
672672 .base = Value{
673 .id = Value.Id.Void,
673 .id = .Void,
674674 .typ = &Type.Void.get(comp).base,
675675 .ref_count = std.atomic.Int(usize).init(1),
676676 },
......@@ -679,7 +679,7 @@ pub const Compilation = struct {
679679 comp.true_value = try comp.arena().create(Value.Bool);
680680 comp.true_value.* = Value.Bool{
681681 .base = Value{
682 .id = Value.Id.Bool,
682 .id = .Bool,
683683 .typ = &Type.Bool.get(comp).base,
684684 .ref_count = std.atomic.Int(usize).init(1),
685685 },
......@@ -689,7 +689,7 @@ pub const Compilation = struct {
689689 comp.false_value = try comp.arena().create(Value.Bool);
690690 comp.false_value.* = Value.Bool{
691691 .base = Value{
692 .id = Value.Id.Bool,
692 .id = .Bool,
693693 .typ = &Type.Bool.get(comp).base,
694694 .ref_count = std.atomic.Int(usize).init(1),
695695 },
......@@ -699,7 +699,7 @@ pub const Compilation = struct {
699699 comp.noreturn_value = try comp.arena().create(Value.NoReturn);
700700 comp.noreturn_value.* = Value.NoReturn{
701701 .base = Value{
702 .id = Value.Id.NoReturn,
702 .id = .NoReturn,
703703 .typ = &Type.NoReturn.get(comp).base,
704704 .ref_count = std.atomic.Int(usize).init(1),
705705 },
......@@ -711,11 +711,11 @@ pub const Compilation = struct {
711711 .base = Type{
712712 .name = cint.zig_name,
713713 .base = Value{
714 .id = Value.Id.Type,
714 .id = .Type,
715715 .typ = &Type.MetaType.get(comp).base,
716716 .ref_count = std.atomic.Int(usize).init(1),
717717 },
718 .id = builtin.TypeId.Int,
718 .id = .Int,
719719 .abi_alignment = Type.AbiAlignment.init(),
720720 },
721721 .key = Type.Int.Key{
......@@ -732,11 +732,11 @@ pub const Compilation = struct {
732732 .base = Type{
733733 .name = "u8",
734734 .base = Value{
735 .id = Value.Id.Type,
735 .id = .Type,
736736 .typ = &Type.MetaType.get(comp).base,
737737 .ref_count = std.atomic.Int(usize).init(1),
738738 },
739 .id = builtin.TypeId.Int,
739 .id = .Int,
740740 .abi_alignment = Type.AbiAlignment.init(),
741741 },
742742 .key = Type.Int.Key{
......@@ -884,15 +884,15 @@ pub const Compilation = struct {
884884 while (ast_it.next()) |decl_ptr| {
885885 const decl = decl_ptr.*;
886886 switch (decl.id) {
887 ast.Node.Id.Comptime => {
887 .Comptime => {
888888 const comptime_node = @fieldParentPtr(ast.Node.Comptime, "base", decl);
889889
890890 // TODO connect existing comptime decls to updated source files
891891
892892 try self.prelink_group.call(addCompTimeBlock, self, tree_scope, &decl_scope.base, comptime_node);
893893 },
894 ast.Node.Id.VarDecl => @panic("TODO"),
895 ast.Node.Id.FnProto => {
894 .VarDecl => @panic("TODO"),
895 .FnProto => {
896896 const fn_proto = @fieldParentPtr(ast.Node.FnProto, "base", decl);
897897
898898 const name = if (fn_proto.name_token) |name_token| tree_scope.tree.tokenSlice(name_token) else {
......@@ -945,7 +945,7 @@ pub const Compilation = struct {
945945 try group.call(addTopLevelDecl, self, &fn_decl.base, locked_table);
946946 }
947947 },
948 ast.Node.Id.TestDecl => @panic("TODO"),
948 .TestDecl => @panic("TODO"),
949949 else => unreachable,
950950 }
951951 }
......@@ -1285,12 +1285,12 @@ fn parseVisibToken(tree: *ast.Tree, optional_token_index: ?ast.TokenIndex) Visib
12851285/// The function that actually does the generation.
12861286async fn generateDecl(comp: *Compilation, decl: *Decl) !void {
12871287 switch (decl.id) {
1288 Decl.Id.Var => @panic("TODO"),
1289 Decl.Id.Fn => {
1288 .Var => @panic("TODO"),
1289 .Fn => {
12901290 const fn_decl = @fieldParentPtr(Decl.Fn, "base", decl);
12911291 return generateDeclFn(comp, fn_decl);
12921292 },
1293 Decl.Id.CompTime => @panic("TODO"),
1293 .CompTime => @panic("TODO"),
12941294 }
12951295}
12961296
......@@ -1385,8 +1385,8 @@ async fn analyzeFnType(
13851385 fn_proto: *ast.Node.FnProto,
13861386) !*Type.Fn {
13871387 const return_type_node = switch (fn_proto.return_type) {
1388 ast.Node.FnProto.ReturnType.Explicit => |n| n,
1389 ast.Node.FnProto.ReturnType.InferErrorSet => |n| n,
1388 .Explicit => |n| n,
1389 .InferErrorSet => |n| n,
13901390 };
13911391 const return_type = try comp.analyzeTypeExpr(tree_scope, scope, return_type_node);
13921392 return_type.base.deref(comp);
src-self-hosted/decl.zig+8-11
......@@ -29,7 +29,7 @@ pub const Decl = struct {
2929
3030 pub fn isExported(base: *const Decl, tree: *ast.Tree) bool {
3131 switch (base.id) {
32 Id.Fn => {
32 .Fn => {
3333 const fn_decl = @fieldParentPtr(Fn, "base", base);
3434 return fn_decl.isExported(tree);
3535 },
......@@ -39,7 +39,7 @@ pub const Decl = struct {
3939
4040 pub fn getSpan(base: *const Decl) errmsg.Span {
4141 switch (base.id) {
42 Id.Fn => {
42 .Fn => {
4343 const fn_decl = @fieldParentPtr(Fn, "base", base);
4444 const fn_proto = fn_decl.fn_proto;
4545 const start = fn_proto.fn_token;
......@@ -69,21 +69,18 @@ pub const Decl = struct {
6969
7070 pub const Fn = struct {
7171 base: Decl,
72 value: Val,
73 fn_proto: *ast.Node.FnProto,
74
75 // TODO https://github.com/ziglang/zig/issues/683 and then make this anonymous
76 pub const Val = union(enum) {
77 Unresolved: void,
72 value: union(enum) {
73 Unresolved,
7874 Fn: *Value.Fn,
7975 FnProto: *Value.FnProto,
80 };
76 },
77 fn_proto: *ast.Node.FnProto,
8178
8279 pub fn externLibName(self: Fn, tree: *ast.Tree) ?[]const u8 {
8380 return if (self.fn_proto.extern_export_inline_token) |tok_index| x: {
8481 const token = tree.tokens.at(tok_index);
8582 break :x switch (token.id) {
86 Token.Id.Extern => tree.tokenSlicePtr(token),
83 .Extern => tree.tokenSlicePtr(token),
8784 else => null,
8885 };
8986 } else null;
......@@ -92,7 +89,7 @@ pub const Decl = struct {
9289 pub fn isExported(self: Fn, tree: *ast.Tree) bool {
9390 if (self.fn_proto.extern_export_inline_token) |tok_index| {
9491 const token = tree.tokens.at(tok_index);
95 return token.id == Token.Id.Keyword_export;
92 return token.id == .Keyword_export;
9693 } else {
9794 return false;
9895 }
src-self-hosted/errmsg.zig+16-16
......@@ -62,17 +62,17 @@ pub const Msg = struct {
6262
6363 pub fn destroy(self: *Msg) void {
6464 switch (self.data) {
65 Data.Cli => |cli| {
65 .Cli => |cli| {
6666 cli.allocator.free(self.text);
6767 cli.allocator.free(self.realpath);
6868 cli.allocator.destroy(self);
6969 },
70 Data.PathAndTree => |path_and_tree| {
70 .PathAndTree => |path_and_tree| {
7171 path_and_tree.allocator.free(self.text);
7272 path_and_tree.allocator.free(self.realpath);
7373 path_and_tree.allocator.destroy(self);
7474 },
75 Data.ScopeAndComp => |scope_and_comp| {
75 .ScopeAndComp => |scope_and_comp| {
7676 scope_and_comp.tree_scope.base.deref(scope_and_comp.compilation);
7777 scope_and_comp.compilation.gpa().free(self.text);
7878 scope_and_comp.compilation.gpa().free(self.realpath);
......@@ -83,11 +83,11 @@ pub const Msg = struct {
8383
8484 fn getAllocator(self: *const Msg) *mem.Allocator {
8585 switch (self.data) {
86 Data.Cli => |cli| return cli.allocator,
87 Data.PathAndTree => |path_and_tree| {
86 .Cli => |cli| return cli.allocator,
87 .PathAndTree => |path_and_tree| {
8888 return path_and_tree.allocator;
8989 },
90 Data.ScopeAndComp => |scope_and_comp| {
90 .ScopeAndComp => |scope_and_comp| {
9191 return scope_and_comp.compilation.gpa();
9292 },
9393 }
......@@ -95,11 +95,11 @@ pub const Msg = struct {
9595
9696 pub fn getTree(self: *const Msg) *ast.Tree {
9797 switch (self.data) {
98 Data.Cli => unreachable,
99 Data.PathAndTree => |path_and_tree| {
98 .Cli => unreachable,
99 .PathAndTree => |path_and_tree| {
100100 return path_and_tree.tree;
101101 },
102 Data.ScopeAndComp => |scope_and_comp| {
102 .ScopeAndComp => |scope_and_comp| {
103103 return scope_and_comp.tree_scope.tree;
104104 },
105105 }
......@@ -107,9 +107,9 @@ pub const Msg = struct {
107107
108108 pub fn getSpan(self: *const Msg) Span {
109109 return switch (self.data) {
110 Data.Cli => unreachable,
111 Data.PathAndTree => |path_and_tree| path_and_tree.span,
112 Data.ScopeAndComp => |scope_and_comp| scope_and_comp.span,
110 .Cli => unreachable,
111 .PathAndTree => |path_and_tree| path_and_tree.span,
112 .ScopeAndComp => |scope_and_comp| scope_and_comp.span,
113113 };
114114 }
115115
......@@ -230,7 +230,7 @@ pub const Msg = struct {
230230
231231 pub fn printToStream(msg: *const Msg, stream: var, color_on: bool) !void {
232232 switch (msg.data) {
233 Data.Cli => {
233 .Cli => {
234234 try stream.print("{}:-:-: error: {}\n", msg.realpath, msg.text);
235235 return;
236236 },
......@@ -279,9 +279,9 @@ pub const Msg = struct {
279279
280280 pub fn printToFile(msg: *const Msg, file: fs.File, color: Color) !void {
281281 const color_on = switch (color) {
282 Color.Auto => file.isTty(),
283 Color.On => true,
284 Color.Off => false,
282 .Auto => file.isTty(),
283 .On => true,
284 .Off => false,
285285 };
286286 var stream = &file.outStream().stream;
287287 return msg.printToStream(stream, color_on);
src-self-hosted/ir.zig+203-204
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const builtin = @import("builtin");
32const Compilation = @import("compilation.zig").Compilation;
43const Scope = @import("scope.zig").Scope;
54const ast = std.zig.ast;
......@@ -33,13 +32,13 @@ pub const IrVal = union(enum) {
3332
3433 pub fn dump(self: IrVal) void {
3534 switch (self) {
36 IrVal.Unknown => std.debug.warn("Unknown"),
37 IrVal.KnownType => |typ| {
35 .Unknown => std.debug.warn("Unknown"),
36 .KnownType => |typ| {
3837 std.debug.warn("KnownType(");
3938 typ.dump();
4039 std.debug.warn(")");
4140 },
42 IrVal.KnownValue => |value| {
41 .KnownValue => |value| {
4342 std.debug.warn("KnownValue(");
4443 value.dump();
4544 std.debug.warn(")");
......@@ -113,37 +112,37 @@ pub const Inst = struct {
113112
114113 pub async fn analyze(base: *Inst, ira: *Analyze) Analyze.Error!*Inst {
115114 switch (base.id) {
116 Id.Return => return @fieldParentPtr(Return, "base", base).analyze(ira),
117 Id.Const => return @fieldParentPtr(Const, "base", base).analyze(ira),
118 Id.Call => return @fieldParentPtr(Call, "base", base).analyze(ira),
119 Id.DeclRef => return @fieldParentPtr(DeclRef, "base", base).analyze(ira),
120 Id.Ref => return @fieldParentPtr(Ref, "base", base).analyze(ira),
121 Id.DeclVar => return @fieldParentPtr(DeclVar, "base", base).analyze(ira),
122 Id.CheckVoidStmt => return @fieldParentPtr(CheckVoidStmt, "base", base).analyze(ira),
123 Id.Phi => return @fieldParentPtr(Phi, "base", base).analyze(ira),
124 Id.Br => return @fieldParentPtr(Br, "base", base).analyze(ira),
125 Id.AddImplicitReturnType => return @fieldParentPtr(AddImplicitReturnType, "base", base).analyze(ira),
126 Id.PtrType => return @fieldParentPtr(PtrType, "base", base).analyze(ira),
127 Id.VarPtr => return @fieldParentPtr(VarPtr, "base", base).analyze(ira),
128 Id.LoadPtr => return @fieldParentPtr(LoadPtr, "base", base).analyze(ira),
115 .Return => return @fieldParentPtr(Return, "base", base).analyze(ira),
116 .Const => return @fieldParentPtr(Const, "base", base).analyze(ira),
117 .Call => return @fieldParentPtr(Call, "base", base).analyze(ira),
118 .DeclRef => return @fieldParentPtr(DeclRef, "base", base).analyze(ira),
119 .Ref => return @fieldParentPtr(Ref, "base", base).analyze(ira),
120 .DeclVar => return @fieldParentPtr(DeclVar, "base", base).analyze(ira),
121 .CheckVoidStmt => return @fieldParentPtr(CheckVoidStmt, "base", base).analyze(ira),
122 .Phi => return @fieldParentPtr(Phi, "base", base).analyze(ira),
123 .Br => return @fieldParentPtr(Br, "base", base).analyze(ira),
124 .AddImplicitReturnType => return @fieldParentPtr(AddImplicitReturnType, "base", base).analyze(ira),
125 .PtrType => return @fieldParentPtr(PtrType, "base", base).analyze(ira),
126 .VarPtr => return @fieldParentPtr(VarPtr, "base", base).analyze(ira),
127 .LoadPtr => return @fieldParentPtr(LoadPtr, "base", base).analyze(ira),
129128 }
130129 }
131130
132131 pub fn render(base: *Inst, ofile: *ObjectFile, fn_val: *Value.Fn) (error{OutOfMemory}!?*llvm.Value) {
133132 switch (base.id) {
134 Id.Return => return @fieldParentPtr(Return, "base", base).render(ofile, fn_val),
135 Id.Const => return @fieldParentPtr(Const, "base", base).render(ofile, fn_val),
136 Id.Call => return @fieldParentPtr(Call, "base", base).render(ofile, fn_val),
137 Id.VarPtr => return @fieldParentPtr(VarPtr, "base", base).render(ofile, fn_val),
138 Id.LoadPtr => return @fieldParentPtr(LoadPtr, "base", base).render(ofile, fn_val),
139 Id.DeclRef => unreachable,
140 Id.PtrType => unreachable,
141 Id.Ref => @panic("TODO"),
142 Id.DeclVar => @panic("TODO"),
143 Id.CheckVoidStmt => @panic("TODO"),
144 Id.Phi => @panic("TODO"),
145 Id.Br => @panic("TODO"),
146 Id.AddImplicitReturnType => @panic("TODO"),
133 .Return => return @fieldParentPtr(Return, "base", base).render(ofile, fn_val),
134 .Const => return @fieldParentPtr(Const, "base", base).render(ofile, fn_val),
135 .Call => return @fieldParentPtr(Call, "base", base).render(ofile, fn_val),
136 .VarPtr => return @fieldParentPtr(VarPtr, "base", base).render(ofile, fn_val),
137 .LoadPtr => return @fieldParentPtr(LoadPtr, "base", base).render(ofile, fn_val),
138 .DeclRef => unreachable,
139 .PtrType => unreachable,
140 .Ref => @panic("TODO"),
141 .DeclVar => @panic("TODO"),
142 .CheckVoidStmt => @panic("TODO"),
143 .Phi => @panic("TODO"),
144 .Br => @panic("TODO"),
145 .AddImplicitReturnType => @panic("TODO"),
147146 }
148147 }
149148
......@@ -165,7 +164,7 @@ pub const Inst = struct {
165164 param.ref_count -= 1;
166165 const child = param.child orelse return error.SemanticAnalysisFailed;
167166 switch (child.val) {
168 IrVal.Unknown => return error.SemanticAnalysisFailed,
167 .Unknown => return error.SemanticAnalysisFailed,
169168 else => return child,
170169 }
171170 }
......@@ -213,9 +212,9 @@ pub const Inst = struct {
213212 /// asserts that the type is known
214213 fn getKnownType(self: *Inst) *Type {
215214 switch (self.val) {
216 IrVal.KnownType => |typ| return typ,
217 IrVal.KnownValue => |value| return value.typ,
218 IrVal.Unknown => unreachable,
215 .KnownType => |typ| return typ,
216 .KnownValue => |value| return value.typ,
217 .Unknown => unreachable,
219218 }
220219 }
221220
......@@ -225,14 +224,14 @@ pub const Inst = struct {
225224
226225 pub fn isNoReturn(base: *const Inst) bool {
227226 switch (base.val) {
228 IrVal.Unknown => return false,
229 IrVal.KnownValue => |x| return x.typ.id == Type.Id.NoReturn,
230 IrVal.KnownType => |typ| return typ.id == Type.Id.NoReturn,
227 .Unknown => return false,
228 .KnownValue => |x| return x.typ.id == .NoReturn,
229 .KnownType => |typ| return typ.id == .NoReturn,
231230 }
232231 }
233232
234233 pub fn isCompTime(base: *const Inst) bool {
235 return base.val == IrVal.KnownValue;
234 return base.val == .KnownValue;
236235 }
237236
238237 pub fn linkToParent(self: *Inst, parent: *Inst) void {
......@@ -445,8 +444,8 @@ pub const Inst = struct {
445444 .child_type = elem_type,
446445 .mut = self.params.mut,
447446 .vol = self.params.volatility,
448 .size = Type.Pointer.Size.One,
449 .alignment = Type.Pointer.Align.Abi,
447 .size = .One,
448 .alignment = .Abi,
450449 });
451450 // TODO: potentially set the hint that this is a stack pointer. But it might not be - this
452451 // could be a ref of a global, for example
......@@ -479,20 +478,20 @@ pub const Inst = struct {
479478 else => return error.SemanticAnalysisFailed,
480479 };
481480 switch (self.params.decl.id) {
482 Decl.Id.CompTime => unreachable,
483 Decl.Id.Var => return error.Unimplemented,
484 Decl.Id.Fn => {
481 .CompTime => unreachable,
482 .Var => return error.Unimplemented,
483 .Fn => {
485484 const fn_decl = @fieldParentPtr(Decl.Fn, "base", self.params.decl);
486485 const decl_val = switch (fn_decl.value) {
487 Decl.Fn.Val.Unresolved => unreachable,
488 Decl.Fn.Val.Fn => |fn_val| &fn_val.base,
489 Decl.Fn.Val.FnProto => |fn_proto| &fn_proto.base,
486 .Unresolved => unreachable,
487 .Fn => |fn_val| &fn_val.base,
488 .FnProto => |fn_proto| &fn_proto.base,
490489 };
491490 switch (self.params.lval) {
492 LVal.None => {
491 .None => {
493492 return ira.irb.buildConstValue(self.base.scope, self.base.span, decl_val);
494493 },
495 LVal.Ptr => return error.Unimplemented,
494 .Ptr => return error.Unimplemented,
496495 }
497496 },
498497 }
......@@ -519,20 +518,20 @@ pub const Inst = struct {
519518
520519 pub async fn analyze(self: *const VarPtr, ira: *Analyze) !*Inst {
521520 switch (self.params.var_scope.data) {
522 Scope.Var.Data.Const => @panic("TODO"),
523 Scope.Var.Data.Param => |param| {
521 .Const => @panic("TODO"),
522 .Param => |param| {
524523 const new_inst = try ira.irb.build(
525 Inst.VarPtr,
524 .VarPtr,
526525 self.base.scope,
527526 self.base.span,
528527 Inst.VarPtr.Params{ .var_scope = self.params.var_scope },
529528 );
530529 const ptr_type = try Type.Pointer.get(ira.irb.comp, Type.Pointer.Key{
531530 .child_type = param.typ,
532 .mut = Type.Pointer.Mut.Const,
533 .vol = Type.Pointer.Vol.Non,
534 .size = Type.Pointer.Size.One,
535 .alignment = Type.Pointer.Align.Abi,
531 .mut = .Const,
532 .vol = .Non,
533 .size = .One,
534 .alignment = .Abi,
536535 });
537536 new_inst.val = IrVal{ .KnownType = &ptr_type.base };
538537 return new_inst;
......@@ -542,8 +541,8 @@ pub const Inst = struct {
542541
543542 pub fn render(self: *VarPtr, ofile: *ObjectFile, fn_val: *Value.Fn) *llvm.Value {
544543 switch (self.params.var_scope.data) {
545 Scope.Var.Data.Const => unreachable, // turned into Inst.Const in analyze pass
546 Scope.Var.Data.Param => |param| return param.llvm_value,
544 .Const => unreachable, // turned into Inst.Const in analyze pass
545 .Param => |param| return param.llvm_value,
547546 }
548547 }
549548 };
......@@ -567,7 +566,7 @@ pub const Inst = struct {
567566 pub async fn analyze(self: *const LoadPtr, ira: *Analyze) !*Inst {
568567 const target = try self.params.target.getAsParam();
569568 const target_type = target.getKnownType();
570 if (target_type.id != Type.Id.Pointer) {
569 if (target_type.id != .Pointer) {
571570 try ira.addCompileError(self.base.span, "dereference of non pointer type '{}'", target_type.name);
572571 return error.SemanticAnalysisFailed;
573572 }
......@@ -715,7 +714,7 @@ pub const Inst = struct {
715714
716715 pub fn analyze(self: *const CheckVoidStmt, ira: *Analyze) !*Inst {
717716 const target = try self.params.target.getAsParam();
718 if (target.getKnownType().id != Type.Id.Void) {
717 if (target.getKnownType().id != .Void) {
719718 try ira.addCompileError(self.base.span, "expression value is ignored");
720719 return error.SemanticAnalysisFailed;
721720 }
......@@ -838,7 +837,7 @@ pub const Inst = struct {
838837 const target = try self.params.target.getAsParam();
839838 const target_type = target.getKnownType();
840839 switch (target_type.id) {
841 Type.Id.ErrorUnion => {
840 .ErrorUnion => {
842841 return error.Unimplemented;
843842 // if (instr_is_comptime(value)) {
844843 // ConstExprValue *err_union_val = ir_resolve_const(ira, value, UndefBad);
......@@ -868,7 +867,7 @@ pub const Inst = struct {
868867 // ir_build_test_err_from(&ira->new_irb, &instruction->base, value);
869868 // return ira->codegen->builtin_types.entry_bool;
870869 },
871 Type.Id.ErrorSet => {
870 .ErrorSet => {
872871 return ira.irb.buildConstBool(self.base.scope, self.base.span, true);
873872 },
874873 else => {
......@@ -1081,120 +1080,120 @@ pub const Builder = struct {
10811080
10821081 pub async fn genNode(irb: *Builder, node: *ast.Node, scope: *Scope, lval: LVal) Error!*Inst {
10831082 switch (node.id) {
1084 ast.Node.Id.Root => unreachable,
1085 ast.Node.Id.Use => unreachable,
1086 ast.Node.Id.TestDecl => unreachable,
1087 ast.Node.Id.VarDecl => return error.Unimplemented,
1088 ast.Node.Id.Defer => return error.Unimplemented,
1089 ast.Node.Id.InfixOp => return error.Unimplemented,
1090 ast.Node.Id.PrefixOp => {
1083 .Root => unreachable,
1084 .Use => unreachable,
1085 .TestDecl => unreachable,
1086 .VarDecl => return error.Unimplemented,
1087 .Defer => return error.Unimplemented,
1088 .InfixOp => return error.Unimplemented,
1089 .PrefixOp => {
10911090 const prefix_op = @fieldParentPtr(ast.Node.PrefixOp, "base", node);
10921091 switch (prefix_op.op) {
1093 ast.Node.PrefixOp.Op.AddressOf => return error.Unimplemented,
1094 ast.Node.PrefixOp.Op.ArrayType => |n| return error.Unimplemented,
1095 ast.Node.PrefixOp.Op.Await => return error.Unimplemented,
1096 ast.Node.PrefixOp.Op.BitNot => return error.Unimplemented,
1097 ast.Node.PrefixOp.Op.BoolNot => return error.Unimplemented,
1098 ast.Node.PrefixOp.Op.Cancel => return error.Unimplemented,
1099 ast.Node.PrefixOp.Op.OptionalType => return error.Unimplemented,
1100 ast.Node.PrefixOp.Op.Negation => return error.Unimplemented,
1101 ast.Node.PrefixOp.Op.NegationWrap => return error.Unimplemented,
1102 ast.Node.PrefixOp.Op.Resume => return error.Unimplemented,
1103 ast.Node.PrefixOp.Op.PtrType => |ptr_info| {
1092 .AddressOf => return error.Unimplemented,
1093 .ArrayType => |n| return error.Unimplemented,
1094 .Await => return error.Unimplemented,
1095 .BitNot => return error.Unimplemented,
1096 .BoolNot => return error.Unimplemented,
1097 .Cancel => return error.Unimplemented,
1098 .OptionalType => return error.Unimplemented,
1099 .Negation => return error.Unimplemented,
1100 .NegationWrap => return error.Unimplemented,
1101 .Resume => return error.Unimplemented,
1102 .PtrType => |ptr_info| {
11041103 const inst = try irb.genPtrType(prefix_op, ptr_info, scope);
11051104 return irb.lvalWrap(scope, inst, lval);
11061105 },
1107 ast.Node.PrefixOp.Op.SliceType => |ptr_info| return error.Unimplemented,
1108 ast.Node.PrefixOp.Op.Try => return error.Unimplemented,
1106 .SliceType => |ptr_info| return error.Unimplemented,
1107 .Try => return error.Unimplemented,
11091108 }
11101109 },
1111 ast.Node.Id.SuffixOp => {
1110 .SuffixOp => {
11121111 const suffix_op = @fieldParentPtr(ast.Node.SuffixOp, "base", node);
11131112 switch (suffix_op.op) {
1114 @TagType(ast.Node.SuffixOp.Op).Call => |*call| {
1113 .Call => |*call| {
11151114 const inst = try irb.genCall(suffix_op, call, scope);
11161115 return irb.lvalWrap(scope, inst, lval);
11171116 },
1118 @TagType(ast.Node.SuffixOp.Op).ArrayAccess => |n| return error.Unimplemented,
1119 @TagType(ast.Node.SuffixOp.Op).Slice => |slice| return error.Unimplemented,
1120 @TagType(ast.Node.SuffixOp.Op).ArrayInitializer => |init_list| return error.Unimplemented,
1121 @TagType(ast.Node.SuffixOp.Op).StructInitializer => |init_list| return error.Unimplemented,
1122 @TagType(ast.Node.SuffixOp.Op).Deref => return error.Unimplemented,
1123 @TagType(ast.Node.SuffixOp.Op).UnwrapOptional => return error.Unimplemented,
1117 .ArrayAccess => |n| return error.Unimplemented,
1118 .Slice => |slice| return error.Unimplemented,
1119 .ArrayInitializer => |init_list| return error.Unimplemented,
1120 .StructInitializer => |init_list| return error.Unimplemented,
1121 .Deref => return error.Unimplemented,
1122 .UnwrapOptional => return error.Unimplemented,
11241123 }
11251124 },
1126 ast.Node.Id.Switch => return error.Unimplemented,
1127 ast.Node.Id.While => return error.Unimplemented,
1128 ast.Node.Id.For => return error.Unimplemented,
1129 ast.Node.Id.If => return error.Unimplemented,
1130 ast.Node.Id.ControlFlowExpression => {
1125 .Switch => return error.Unimplemented,
1126 .While => return error.Unimplemented,
1127 .For => return error.Unimplemented,
1128 .If => return error.Unimplemented,
1129 .ControlFlowExpression => {
11311130 const control_flow_expr = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", node);
11321131 return irb.genControlFlowExpr(control_flow_expr, scope, lval);
11331132 },
1134 ast.Node.Id.Suspend => return error.Unimplemented,
1135 ast.Node.Id.VarType => return error.Unimplemented,
1136 ast.Node.Id.ErrorType => return error.Unimplemented,
1137 ast.Node.Id.FnProto => return error.Unimplemented,
1138 ast.Node.Id.PromiseType => return error.Unimplemented,
1139 ast.Node.Id.IntegerLiteral => {
1133 .Suspend => return error.Unimplemented,
1134 .VarType => return error.Unimplemented,
1135 .ErrorType => return error.Unimplemented,
1136 .FnProto => return error.Unimplemented,
1137 .PromiseType => return error.Unimplemented,
1138 .IntegerLiteral => {
11401139 const int_lit = @fieldParentPtr(ast.Node.IntegerLiteral, "base", node);
11411140 return irb.lvalWrap(scope, try irb.genIntLit(int_lit, scope), lval);
11421141 },
1143 ast.Node.Id.FloatLiteral => return error.Unimplemented,
1144 ast.Node.Id.StringLiteral => {
1142 .FloatLiteral => return error.Unimplemented,
1143 .StringLiteral => {
11451144 const str_lit = @fieldParentPtr(ast.Node.StringLiteral, "base", node);
11461145 const inst = try irb.genStrLit(str_lit, scope);
11471146 return irb.lvalWrap(scope, inst, lval);
11481147 },
1149 ast.Node.Id.MultilineStringLiteral => return error.Unimplemented,
1150 ast.Node.Id.CharLiteral => return error.Unimplemented,
1151 ast.Node.Id.BoolLiteral => return error.Unimplemented,
1152 ast.Node.Id.NullLiteral => return error.Unimplemented,
1153 ast.Node.Id.UndefinedLiteral => return error.Unimplemented,
1154 ast.Node.Id.Unreachable => return error.Unimplemented,
1155 ast.Node.Id.Identifier => {
1148 .MultilineStringLiteral => return error.Unimplemented,
1149 .CharLiteral => return error.Unimplemented,
1150 .BoolLiteral => return error.Unimplemented,
1151 .NullLiteral => return error.Unimplemented,
1152 .UndefinedLiteral => return error.Unimplemented,
1153 .Unreachable => return error.Unimplemented,
1154 .Identifier => {
11561155 const identifier = @fieldParentPtr(ast.Node.Identifier, "base", node);
11571156 return irb.genIdentifier(identifier, scope, lval);
11581157 },
1159 ast.Node.Id.GroupedExpression => {
1158 .GroupedExpression => {
11601159 const grouped_expr = @fieldParentPtr(ast.Node.GroupedExpression, "base", node);
11611160 return irb.genNode(grouped_expr.expr, scope, lval);
11621161 },
1163 ast.Node.Id.BuiltinCall => return error.Unimplemented,
1164 ast.Node.Id.ErrorSetDecl => return error.Unimplemented,
1165 ast.Node.Id.ContainerDecl => return error.Unimplemented,
1166 ast.Node.Id.Asm => return error.Unimplemented,
1167 ast.Node.Id.Comptime => return error.Unimplemented,
1168 ast.Node.Id.Block => {
1162 .BuiltinCall => return error.Unimplemented,
1163 .ErrorSetDecl => return error.Unimplemented,
1164 .ContainerDecl => return error.Unimplemented,
1165 .Asm => return error.Unimplemented,
1166 .Comptime => return error.Unimplemented,
1167 .Block => {
11691168 const block = @fieldParentPtr(ast.Node.Block, "base", node);
11701169 const inst = try irb.genBlock(block, scope);
11711170 return irb.lvalWrap(scope, inst, lval);
11721171 },
1173 ast.Node.Id.DocComment => return error.Unimplemented,
1174 ast.Node.Id.SwitchCase => return error.Unimplemented,
1175 ast.Node.Id.SwitchElse => return error.Unimplemented,
1176 ast.Node.Id.Else => return error.Unimplemented,
1177 ast.Node.Id.Payload => return error.Unimplemented,
1178 ast.Node.Id.PointerPayload => return error.Unimplemented,
1179 ast.Node.Id.PointerIndexPayload => return error.Unimplemented,
1180 ast.Node.Id.ContainerField => return error.Unimplemented,
1181 ast.Node.Id.ErrorTag => return error.Unimplemented,
1182 ast.Node.Id.AsmInput => return error.Unimplemented,
1183 ast.Node.Id.AsmOutput => return error.Unimplemented,
1184 ast.Node.Id.ParamDecl => return error.Unimplemented,
1185 ast.Node.Id.FieldInitializer => return error.Unimplemented,
1186 ast.Node.Id.EnumLiteral => return error.Unimplemented,
1172 .DocComment => return error.Unimplemented,
1173 .SwitchCase => return error.Unimplemented,
1174 .SwitchElse => return error.Unimplemented,
1175 .Else => return error.Unimplemented,
1176 .Payload => return error.Unimplemented,
1177 .PointerPayload => return error.Unimplemented,
1178 .PointerIndexPayload => return error.Unimplemented,
1179 .ContainerField => return error.Unimplemented,
1180 .ErrorTag => return error.Unimplemented,
1181 .AsmInput => return error.Unimplemented,
1182 .AsmOutput => return error.Unimplemented,
1183 .ParamDecl => return error.Unimplemented,
1184 .FieldInitializer => return error.Unimplemented,
1185 .EnumLiteral => return error.Unimplemented,
11871186 }
11881187 }
11891188
11901189 async fn genCall(irb: *Builder, suffix_op: *ast.Node.SuffixOp, call: *ast.Node.SuffixOp.Op.Call, scope: *Scope) !*Inst {
1191 const fn_ref = try irb.genNode(suffix_op.lhs, scope, LVal.None);
1190 const fn_ref = try irb.genNode(suffix_op.lhs, scope, .None);
11921191
11931192 const args = try irb.arena().alloc(*Inst, call.params.len);
11941193 var it = call.params.iterator(0);
11951194 var i: usize = 0;
11961195 while (it.next()) |arg_node_ptr| : (i += 1) {
1197 args[i] = try irb.genNode(arg_node_ptr.*, scope, LVal.None);
1196 args[i] = try irb.genNode(arg_node_ptr.*, scope, .None);
11981197 }
11991198
12001199 //bool is_async = node->data.fn_call_expr.is_async;
......@@ -1239,7 +1238,7 @@ pub const Builder = struct {
12391238 //} else {
12401239 // align_value = nullptr;
12411240 //}
1242 const child_type = try irb.genNode(prefix_op.rhs, scope, LVal.None);
1241 const child_type = try irb.genNode(prefix_op.rhs, scope, .None);
12431242
12441243 //uint32_t bit_offset_start = 0;
12451244 //if (node->data.pointer_type.bit_offset_start != nullptr) {
......@@ -1273,9 +1272,9 @@ pub const Builder = struct {
12731272
12741273 return irb.build(Inst.PtrType, scope, Span.node(&prefix_op.base), Inst.PtrType.Params{
12751274 .child_type = child_type,
1276 .mut = Type.Pointer.Mut.Mut,
1277 .vol = Type.Pointer.Vol.Non,
1278 .size = Type.Pointer.Size.Many,
1275 .mut = .Mut,
1276 .vol = .Non,
1277 .size = .Many,
12791278 .alignment = null,
12801279 });
12811280 }
......@@ -1287,15 +1286,15 @@ pub const Builder = struct {
12871286 var scope = target_scope;
12881287 while (true) {
12891288 switch (scope.id) {
1290 Scope.Id.CompTime => return true,
1291 Scope.Id.FnDef => return false,
1292 Scope.Id.Decls => unreachable,
1293 Scope.Id.Root => unreachable,
1294 Scope.Id.AstTree => unreachable,
1295 Scope.Id.Block,
1296 Scope.Id.Defer,
1297 Scope.Id.DeferExpr,
1298 Scope.Id.Var,
1289 .CompTime => return true,
1290 .FnDef => return false,
1291 .Decls => unreachable,
1292 .Root => unreachable,
1293 .AstTree => unreachable,
1294 .Block,
1295 .Defer,
1296 .DeferExpr,
1297 .Var,
12991298 => scope = scope.parent.?,
13001299 }
13011300 }
......@@ -1374,8 +1373,8 @@ pub const Builder = struct {
13741373 const ptr_val = try Value.Ptr.createArrayElemPtr(
13751374 irb.comp,
13761375 array_val,
1377 Type.Pointer.Mut.Const,
1378 Type.Pointer.Size.Many,
1376 .Const,
1377 .Many,
13791378 0,
13801379 );
13811380 defer ptr_val.base.deref(irb.comp);
......@@ -1438,7 +1437,7 @@ pub const Builder = struct {
14381437 child_scope = &defer_child_scope.base;
14391438 continue;
14401439 }
1441 const statement_value = try irb.genNode(statement_node, child_scope, LVal.None);
1440 const statement_value = try irb.genNode(statement_node, child_scope, .None);
14421441
14431442 is_continuation_unreachable = statement_value.isNoReturn();
14441443 if (is_continuation_unreachable) {
......@@ -1481,7 +1480,7 @@ pub const Builder = struct {
14811480 try block_scope.incoming_values.append(
14821481 try irb.buildConstVoid(parent_scope, Span.token(block.rbrace), true),
14831482 );
1484 _ = try irb.genDefersForBlock(child_scope, outer_block_scope, Scope.Defer.Kind.ScopeExit);
1483 _ = try irb.genDefersForBlock(child_scope, outer_block_scope, .ScopeExit);
14851484
14861485 _ = try irb.buildGen(Inst.Br, parent_scope, Span.token(block.rbrace), Inst.Br.Params{
14871486 .dest_block = block_scope.end_block,
......@@ -1496,7 +1495,7 @@ pub const Builder = struct {
14961495 });
14971496 }
14981497
1499 _ = try irb.genDefersForBlock(child_scope, outer_block_scope, Scope.Defer.Kind.ScopeExit);
1498 _ = try irb.genDefersForBlock(child_scope, outer_block_scope, .ScopeExit);
15001499 return irb.buildConstVoid(child_scope, Span.token(block.rbrace), true);
15011500 }
15021501
......@@ -1507,9 +1506,9 @@ pub const Builder = struct {
15071506 lval: LVal,
15081507 ) !*Inst {
15091508 switch (control_flow_expr.kind) {
1510 ast.Node.ControlFlowExpression.Kind.Break => |arg| return error.Unimplemented,
1511 ast.Node.ControlFlowExpression.Kind.Continue => |arg| return error.Unimplemented,
1512 ast.Node.ControlFlowExpression.Kind.Return => {
1509 .Break => |arg| return error.Unimplemented,
1510 .Continue => |arg| return error.Unimplemented,
1511 .Return => {
15131512 const src_span = Span.token(control_flow_expr.ltoken);
15141513 if (scope.findFnDef() == null) {
15151514 try irb.comp.addCompileError(
......@@ -1534,7 +1533,7 @@ pub const Builder = struct {
15341533
15351534 const outer_scope = irb.begin_scope.?;
15361535 const return_value = if (control_flow_expr.rhs) |rhs| blk: {
1537 break :blk try irb.genNode(rhs, scope, LVal.None);
1536 break :blk try irb.genNode(rhs, scope, .None);
15381537 } else blk: {
15391538 break :blk try irb.buildConstVoid(scope, src_span, true);
15401539 };
......@@ -1545,7 +1544,7 @@ pub const Builder = struct {
15451544 const err_block = try irb.createBasicBlock(scope, c"ErrRetErr");
15461545 const ok_block = try irb.createBasicBlock(scope, c"ErrRetOk");
15471546 if (!have_err_defers) {
1548 _ = try irb.genDefersForBlock(scope, outer_scope, Scope.Defer.Kind.ScopeExit);
1547 _ = try irb.genDefersForBlock(scope, outer_scope, .ScopeExit);
15491548 }
15501549
15511550 const is_err = try irb.build(
......@@ -1568,7 +1567,7 @@ pub const Builder = struct {
15681567
15691568 try irb.setCursorAtEndAndAppendBlock(err_block);
15701569 if (have_err_defers) {
1571 _ = try irb.genDefersForBlock(scope, outer_scope, Scope.Defer.Kind.ErrorExit);
1570 _ = try irb.genDefersForBlock(scope, outer_scope, .ErrorExit);
15721571 }
15731572 if (irb.comp.have_err_ret_tracing and !irb.isCompTime(scope)) {
15741573 _ = try irb.build(Inst.SaveErrRetAddr, scope, src_span, Inst.SaveErrRetAddr.Params{});
......@@ -1580,7 +1579,7 @@ pub const Builder = struct {
15801579
15811580 try irb.setCursorAtEndAndAppendBlock(ok_block);
15821581 if (have_err_defers) {
1583 _ = try irb.genDefersForBlock(scope, outer_scope, Scope.Defer.Kind.ScopeExit);
1582 _ = try irb.genDefersForBlock(scope, outer_scope, .ScopeExit);
15841583 }
15851584 _ = try irb.build(Inst.Br, scope, src_span, Inst.Br.Params{
15861585 .dest_block = ret_stmt_block,
......@@ -1590,7 +1589,7 @@ pub const Builder = struct {
15901589 try irb.setCursorAtEndAndAppendBlock(ret_stmt_block);
15911590 return irb.genAsyncReturn(scope, src_span, return_value, false);
15921591 } else {
1593 _ = try irb.genDefersForBlock(scope, outer_scope, Scope.Defer.Kind.ScopeExit);
1592 _ = try irb.genDefersForBlock(scope, outer_scope, .ScopeExit);
15941593 return irb.genAsyncReturn(scope, src_span, return_value, false);
15951594 }
15961595 },
......@@ -1616,8 +1615,8 @@ pub const Builder = struct {
16161615 switch (lval) {
16171616 // if (lval == LValPtr) {
16181617 // return ir_build_ref(irb, scope, node, value, false, false);
1619 LVal.Ptr => return error.Unimplemented,
1620 LVal.None => return irb.buildConstValue(scope, src_span, &primitive_type.base),
1618 .Ptr => return error.Unimplemented,
1619 .None => return irb.buildConstValue(scope, src_span, &primitive_type.base),
16211620 }
16221621 }
16231622 } else |err| switch (err) {
......@@ -1629,22 +1628,22 @@ pub const Builder = struct {
16291628 }
16301629
16311630 switch (irb.findIdent(scope, name)) {
1632 Ident.Decl => |decl| {
1631 .Decl => |decl| {
16331632 return irb.build(Inst.DeclRef, scope, src_span, Inst.DeclRef.Params{
16341633 .decl = decl,
16351634 .lval = lval,
16361635 });
16371636 },
1638 Ident.VarScope => |var_scope| {
1637 .VarScope => |var_scope| {
16391638 const var_ptr = try irb.build(Inst.VarPtr, scope, src_span, Inst.VarPtr.Params{ .var_scope = var_scope });
16401639 switch (lval) {
1641 LVal.Ptr => return var_ptr,
1642 LVal.None => {
1640 .Ptr => return var_ptr,
1641 .None => {
16431642 return irb.build(Inst.LoadPtr, scope, src_span, Inst.LoadPtr.Params{ .target = var_ptr });
16441643 },
16451644 }
16461645 },
1647 Ident.NotFound => {},
1646 .NotFound => {},
16481647 }
16491648
16501649 //if (node->owner->any_imports_failed) {
......@@ -1671,25 +1670,25 @@ pub const Builder = struct {
16711670 var scope = inner_scope;
16721671 while (scope != outer_scope) {
16731672 switch (scope.id) {
1674 Scope.Id.Defer => {
1673 .Defer => {
16751674 const defer_scope = @fieldParentPtr(Scope.Defer, "base", scope);
16761675 switch (defer_scope.kind) {
1677 Scope.Defer.Kind.ScopeExit => result.scope_exit += 1,
1678 Scope.Defer.Kind.ErrorExit => result.error_exit += 1,
1676 .ScopeExit => result.scope_exit += 1,
1677 .ErrorExit => result.error_exit += 1,
16791678 }
16801679 scope = scope.parent orelse break;
16811680 },
1682 Scope.Id.FnDef => break,
1681 .FnDef => break,
16831682
1684 Scope.Id.CompTime,
1685 Scope.Id.Block,
1686 Scope.Id.Decls,
1687 Scope.Id.Root,
1688 Scope.Id.Var,
1683 .CompTime,
1684 .Block,
1685 .Decls,
1686 .Root,
1687 .Var,
16891688 => scope = scope.parent orelse break,
16901689
1691 Scope.Id.DeferExpr => unreachable,
1692 Scope.Id.AstTree => unreachable,
1690 .DeferExpr => unreachable,
1691 .AstTree => unreachable,
16931692 }
16941693 }
16951694 return result;
......@@ -1705,18 +1704,18 @@ pub const Builder = struct {
17051704 var is_noreturn = false;
17061705 while (true) {
17071706 switch (scope.id) {
1708 Scope.Id.Defer => {
1707 .Defer => {
17091708 const defer_scope = @fieldParentPtr(Scope.Defer, "base", scope);
17101709 const generate = switch (defer_scope.kind) {
1711 Scope.Defer.Kind.ScopeExit => true,
1712 Scope.Defer.Kind.ErrorExit => gen_kind == Scope.Defer.Kind.ErrorExit,
1710 .ScopeExit => true,
1711 .ErrorExit => gen_kind == .ErrorExit,
17131712 };
17141713 if (generate) {
17151714 const defer_expr_scope = defer_scope.defer_expr_scope;
17161715 const instruction = try irb.genNode(
17171716 defer_expr_scope.expr_node,
17181717 &defer_expr_scope.base,
1719 LVal.None,
1718 .None,
17201719 );
17211720 if (instruction.isNoReturn()) {
17221721 is_noreturn = true;
......@@ -1730,32 +1729,32 @@ pub const Builder = struct {
17301729 }
17311730 }
17321731 },
1733 Scope.Id.FnDef,
1734 Scope.Id.Decls,
1735 Scope.Id.Root,
1732 .FnDef,
1733 .Decls,
1734 .Root,
17361735 => return is_noreturn,
17371736
1738 Scope.Id.CompTime,
1739 Scope.Id.Block,
1740 Scope.Id.Var,
1737 .CompTime,
1738 .Block,
1739 .Var,
17411740 => scope = scope.parent orelse return is_noreturn,
17421741
1743 Scope.Id.DeferExpr => unreachable,
1744 Scope.Id.AstTree => unreachable,
1742 .DeferExpr => unreachable,
1743 .AstTree => unreachable,
17451744 }
17461745 }
17471746 }
17481747
17491748 pub fn lvalWrap(irb: *Builder, scope: *Scope, instruction: *Inst, lval: LVal) !*Inst {
17501749 switch (lval) {
1751 LVal.None => return instruction,
1752 LVal.Ptr => {
1750 .None => return instruction,
1751 .Ptr => {
17531752 // We needed a pointer to a value, but we got a value. So we create
17541753 // an instruction which just makes a const pointer of it.
17551754 return irb.build(Inst.Ref, scope, instruction.span, Inst.Ref.Params{
17561755 .target = instruction,
1757 .mut = Type.Pointer.Mut.Const,
1758 .volatility = Type.Pointer.Vol.Non,
1756 .mut = .Const,
1757 .volatility = .Non,
17591758 });
17601759 },
17611760 }
......@@ -1781,9 +1780,9 @@ pub const Builder = struct {
17811780 .scope = scope,
17821781 .debug_id = self.next_debug_id,
17831782 .val = switch (I.ir_val_init) {
1784 IrVal.Init.Unknown => IrVal.Unknown,
1785 IrVal.Init.NoReturn => IrVal{ .KnownValue = &Value.NoReturn.get(self.comp).base },
1786 IrVal.Init.Void => IrVal{ .KnownValue = &Value.Void.get(self.comp).base },
1783 .Unknown => IrVal.Unknown,
1784 .NoReturn => IrVal{ .KnownValue = &Value.NoReturn.get(self.comp).base },
1785 .Void => IrVal{ .KnownValue = &Value.Void.get(self.comp).base },
17871786 },
17881787 .ref_count = 0,
17891788 .span = span,
......@@ -1813,9 +1812,9 @@ pub const Builder = struct {
18131812 for (@field(inst.params, @memberName(I.Params, i))) |other|
18141813 other.ref(self);
18151814 },
1816 Type.Pointer.Mut,
1817 Type.Pointer.Vol,
1818 Type.Pointer.Size,
1815 .Mut,
1816 .Vol,
1817 .Size,
18191818 LVal,
18201819 *Decl,
18211820 *Scope.Var,
......@@ -1915,8 +1914,8 @@ pub const Builder = struct {
19151914 var s = scope;
19161915 while (true) {
19171916 switch (s.id) {
1918 Scope.Id.Root => return Ident.NotFound,
1919 Scope.Id.Decls => {
1917 .Root => return .NotFound,
1918 .Decls => {
19201919 const decls = @fieldParentPtr(Scope.Decls, "base", s);
19211920 const locked_table = decls.table.acquireRead();
19221921 defer locked_table.release();
......@@ -1924,7 +1923,7 @@ pub const Builder = struct {
19241923 return Ident{ .Decl = entry.value };
19251924 }
19261925 },
1927 Scope.Id.Var => {
1926 .Var => {
19281927 const var_scope = @fieldParentPtr(Scope.Var, "base", s);
19291928 if (mem.eql(u8, var_scope.name, name)) {
19301929 return Ident{ .VarScope = var_scope };
......@@ -2047,7 +2046,7 @@ const Analyze = struct {
20472046 fn implicitCast(self: *Analyze, target: *Inst, optional_dest_type: ?*Type) Analyze.Error!*Inst {
20482047 const dest_type = optional_dest_type orelse return target;
20492048 const from_type = target.getKnownType();
2050 if (from_type == dest_type or from_type.id == Type.Id.NoReturn) return target;
2049 if (from_type == dest_type or from_type.id == .NoReturn) return target;
20512050 return self.analyzeCast(target, target, dest_type);
20522051 }
20532052
......@@ -2311,7 +2310,7 @@ const Analyze = struct {
23112310 //}
23122311
23132312 // cast from comptime-known integer to another integer where the value fits
2314 if (target.isCompTime() and (from_type.id == Type.Id.Int or from_type.id == Type.Id.ComptimeInt)) cast: {
2313 if (target.isCompTime() and (from_type.id == .Int or from_type.id == .ComptimeInt)) cast: {
23152314 const target_val = target.val.KnownValue;
23162315 const from_int = &target_val.cast(Value.Int).?.big_int;
23172316 const fits = fits: {
......@@ -2534,7 +2533,7 @@ pub async fn gen(
25342533 entry_block.ref(&irb); // Entry block gets a reference because we enter it to begin.
25352534 try irb.setCursorAtEndAndAppendBlock(entry_block);
25362535
2537 const result = try irb.genNode(body_node, scope, LVal.None);
2536 const result = try irb.genNode(body_node, scope, .None);
25382537 if (!result.isNoReturn()) {
25392538 // no need for save_err_ret_addr because this cannot return error
25402539 _ = try irb.genAsyncReturn(scope, Span.token(body_node.lastToken()), result, true);
src-self-hosted/libc_installation.zig+8-8
......@@ -73,7 +73,7 @@ pub const LibCInstallation = struct {
7373 if (std.mem.eql(u8, name, key)) {
7474 found_keys[i].found = true;
7575 switch (@typeInfo(@typeOf(@field(self, key)))) {
76 builtin.TypeId.Optional => {
76 .Optional => {
7777 if (value.len == 0) {
7878 @field(self, key) = null;
7979 } else {
......@@ -208,7 +208,7 @@ pub const LibCInstallation = struct {
208208 }
209209
210210 switch (exec_result.term) {
211 std.ChildProcess.Term.Exited => |code| {
211 .Exited => |code| {
212212 if (code != 0) return error.CCompilerExitCode;
213213 },
214214 else => {
......@@ -284,9 +284,9 @@ pub const LibCInstallation = struct {
284284 const stream = &std.io.BufferOutStream.init(&result_buf).stream;
285285 try stream.print("{}\\Lib\\{}\\ucrt\\", search.path, search.version);
286286 switch (builtin.arch) {
287 builtin.Arch.i386 => try stream.write("x86"),
288 builtin.Arch.x86_64 => try stream.write("x64"),
289 builtin.Arch.aarch64 => try stream.write("arm"),
287 .i386 => try stream.write("x86"),
288 .x86_64 => try stream.write("x64"),
289 .aarch64 => try stream.write("arm"),
290290 else => return error.UnsupportedArchitecture,
291291 }
292292 const ucrt_lib_path = try fs.path.join(
......@@ -362,9 +362,9 @@ pub const LibCInstallation = struct {
362362 const stream = &std.io.BufferOutStream.init(&result_buf).stream;
363363 try stream.print("{}\\Lib\\{}\\um\\", search.path, search.version);
364364 switch (builtin.arch) {
365 builtin.Arch.i386 => try stream.write("x86\\"),
366 builtin.Arch.x86_64 => try stream.write("x64\\"),
367 builtin.Arch.aarch64 => try stream.write("arm\\"),
365 .i386 => try stream.write("x86\\"),
366 .x86_64 => try stream.write("x64\\"),
367 .aarch64 => try stream.write("arm\\"),
368368 else => return error.UnsupportedArchitecture,
369369 }
370370 const kernel32_path = try fs.path.join(
src-self-hosted/link.zig+42-43
......@@ -1,10 +1,9 @@
11const std = @import("std");
22const mem = std.mem;
33const c = @import("c.zig");
4const builtin = @import("builtin");
5const ObjectFormat = builtin.ObjectFormat;
64const Compilation = @import("compilation.zig").Compilation;
75const Target = std.Target;
6const ObjectFormat = Target.ObjectFormat;
87const LibCInstallation = @import("libc_installation.zig").LibCInstallation;
98const assert = std.debug.assert;
109
......@@ -26,7 +25,7 @@ pub async fn link(comp: *Compilation) !void {
2625 .comp = comp,
2726 .arena = std.heap.ArenaAllocator.init(comp.gpa()),
2827 .args = undefined,
29 .link_in_crt = comp.haveLibC() and comp.kind == Compilation.Kind.Exe,
28 .link_in_crt = comp.haveLibC() and comp.kind == .Exe,
3029 .link_err = {},
3130 .link_msg = undefined,
3231 .libc = undefined,
......@@ -41,13 +40,13 @@ pub async fn link(comp: *Compilation) !void {
4140 } else {
4241 ctx.out_file_path = try std.Buffer.init(&ctx.arena.allocator, comp.name.toSliceConst());
4342 switch (comp.kind) {
44 Compilation.Kind.Exe => {
43 .Exe => {
4544 try ctx.out_file_path.append(comp.target.exeFileExt());
4645 },
47 Compilation.Kind.Lib => {
46 .Lib => {
4847 try ctx.out_file_path.append(comp.target.libFileExt(comp.is_static));
4948 },
50 Compilation.Kind.Obj => {
49 .Obj => {
5150 try ctx.out_file_path.append(comp.target.objFileExt());
5251 },
5352 }
......@@ -121,21 +120,21 @@ fn linkDiagCallbackErrorable(ctx: *Context, msg: []const u8) !void {
121120
122121fn toExternObjectFormatType(ofmt: ObjectFormat) c.ZigLLVM_ObjectFormatType {
123122 return switch (ofmt) {
124 ObjectFormat.unknown => c.ZigLLVM_UnknownObjectFormat,
125 ObjectFormat.coff => c.ZigLLVM_COFF,
126 ObjectFormat.elf => c.ZigLLVM_ELF,
127 ObjectFormat.macho => c.ZigLLVM_MachO,
128 ObjectFormat.wasm => c.ZigLLVM_Wasm,
123 .unknown => c.ZigLLVM_UnknownObjectFormat,
124 .coff => c.ZigLLVM_COFF,
125 .elf => c.ZigLLVM_ELF,
126 .macho => c.ZigLLVM_MachO,
127 .wasm => c.ZigLLVM_Wasm,
129128 };
130129}
131130
132131fn constructLinkerArgs(ctx: *Context) !void {
133132 switch (ctx.comp.target.getObjectFormat()) {
134 ObjectFormat.unknown => unreachable,
135 ObjectFormat.coff => return constructLinkerArgsCoff(ctx),
136 ObjectFormat.elf => return constructLinkerArgsElf(ctx),
137 ObjectFormat.macho => return constructLinkerArgsMachO(ctx),
138 ObjectFormat.wasm => return constructLinkerArgsWasm(ctx),
133 .unknown => unreachable,
134 .coff => return constructLinkerArgsCoff(ctx),
135 .elf => return constructLinkerArgsElf(ctx),
136 .macho => return constructLinkerArgsMachO(ctx),
137 .wasm => return constructLinkerArgsWasm(ctx),
139138 }
140139}
141140
......@@ -324,9 +323,9 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
324323 }
325324
326325 switch (ctx.comp.target.getArch()) {
327 builtin.Arch.i386 => try ctx.args.append(c"-MACHINE:X86"),
328 builtin.Arch.x86_64 => try ctx.args.append(c"-MACHINE:X64"),
329 builtin.Arch.aarch64 => try ctx.args.append(c"-MACHINE:ARM"),
326 .i386 => try ctx.args.append(c"-MACHINE:X86"),
327 .x86_64 => try ctx.args.append(c"-MACHINE:X64"),
328 .aarch64 => try ctx.args.append(c"-MACHINE:ARM"),
330329 else => return error.UnsupportedLinkArchitecture,
331330 }
332331
......@@ -336,7 +335,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
336335 try ctx.args.append(c"/SUBSYSTEM:console");
337336 }
338337
339 const is_library = ctx.comp.kind == Compilation.Kind.Lib;
338 const is_library = ctx.comp.kind == .Lib;
340339
341340 const out_arg = try std.fmt.allocPrint(&ctx.arena.allocator, "-OUT:{}\x00", ctx.out_file_path.toSliceConst());
342341 try ctx.args.append(out_arg.ptr);
......@@ -349,7 +348,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
349348
350349 if (ctx.link_in_crt) {
351350 const lib_str = if (ctx.comp.is_static) "lib" else "";
352 const d_str = if (ctx.comp.build_mode == builtin.Mode.Debug) "d" else "";
351 const d_str = if (ctx.comp.build_mode == .Debug) "d" else "";
353352
354353 if (ctx.comp.is_static) {
355354 const cmt_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "libcmt{}.lib\x00", d_str);
......@@ -400,7 +399,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
400399 try addFnObjects(ctx);
401400
402401 switch (ctx.comp.kind) {
403 Compilation.Kind.Exe, Compilation.Kind.Lib => {
402 .Exe, .Lib => {
404403 if (!ctx.comp.haveLibC()) {
405404 @panic("TODO");
406405 //Buf *builtin_o_path = build_o(g, "builtin");
......@@ -412,7 +411,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
412411 //Buf *compiler_rt_o_path = build_compiler_rt(g);
413412 //lj->args.append(buf_ptr(compiler_rt_o_path));
414413 },
415 Compilation.Kind.Obj => {},
414 .Obj => {},
416415 }
417416
418417 //Buf *def_contents = buf_alloc();
......@@ -469,7 +468,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
469468 try ctx.args.append(c"-export_dynamic");
470469 }
471470
472 const is_lib = ctx.comp.kind == Compilation.Kind.Lib;
471 const is_lib = ctx.comp.kind == .Lib;
473472 const shared = !ctx.comp.is_static and is_lib;
474473 if (ctx.comp.is_static) {
475474 try ctx.args.append(c"-static");
......@@ -512,14 +511,14 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
512511
513512 const platform = try DarwinPlatform.get(ctx.comp);
514513 switch (platform.kind) {
515 DarwinPlatform.Kind.MacOS => try ctx.args.append(c"-macosx_version_min"),
516 DarwinPlatform.Kind.IPhoneOS => try ctx.args.append(c"-iphoneos_version_min"),
517 DarwinPlatform.Kind.IPhoneOSSimulator => try ctx.args.append(c"-ios_simulator_version_min"),
514 .MacOS => try ctx.args.append(c"-macosx_version_min"),
515 .IPhoneOS => try ctx.args.append(c"-iphoneos_version_min"),
516 .IPhoneOSSimulator => try ctx.args.append(c"-ios_simulator_version_min"),
518517 }
519518 const ver_str = try std.fmt.allocPrint(&ctx.arena.allocator, "{}.{}.{}\x00", platform.major, platform.minor, platform.micro);
520519 try ctx.args.append(ver_str.ptr);
521520
522 if (ctx.comp.kind == Compilation.Kind.Exe) {
521 if (ctx.comp.kind == .Exe) {
523522 if (ctx.comp.is_static) {
524523 try ctx.args.append(c"-no_pie");
525524 } else {
......@@ -542,7 +541,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
542541 try ctx.args.append(c"-lcrt0.o");
543542 } else {
544543 switch (platform.kind) {
545 DarwinPlatform.Kind.MacOS => {
544 .MacOS => {
546545 if (platform.versionLessThan(10, 5)) {
547546 try ctx.args.append(c"-lcrt1.o");
548547 } else if (platform.versionLessThan(10, 6)) {
......@@ -551,8 +550,8 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
551550 try ctx.args.append(c"-lcrt1.10.6.o");
552551 }
553552 },
554 DarwinPlatform.Kind.IPhoneOS => {
555 if (ctx.comp.target.getArch() == builtin.Arch.aarch64) {
553 .IPhoneOS => {
554 if (ctx.comp.target.getArch() == .aarch64) {
556555 // iOS does not need any crt1 files for arm64
557556 } else if (platform.versionLessThan(3, 1)) {
558557 try ctx.args.append(c"-lcrt1.o");
......@@ -560,7 +559,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
560559 try ctx.args.append(c"-lcrt1.3.1.o");
561560 }
562561 },
563 DarwinPlatform.Kind.IPhoneOSSimulator => {}, // no crt1.o needed
562 .IPhoneOSSimulator => {}, // no crt1.o needed
564563 }
565564 }
566565
......@@ -605,7 +604,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
605604 try ctx.args.append(c"dynamic_lookup");
606605 }
607606
608 if (platform.kind == DarwinPlatform.Kind.MacOS) {
607 if (platform.kind == .MacOS) {
609608 if (platform.versionLessThan(10, 5)) {
610609 try ctx.args.append(c"-lgcc_s.10.4");
611610 } else if (platform.versionLessThan(10, 6)) {
......@@ -659,17 +658,17 @@ const DarwinPlatform = struct {
659658 fn get(comp: *Compilation) !DarwinPlatform {
660659 var result: DarwinPlatform = undefined;
661660 const ver_str = switch (comp.darwin_version_min) {
662 Compilation.DarwinVersionMin.MacOS => |ver| blk: {
663 result.kind = Kind.MacOS;
661 .MacOS => |ver| blk: {
662 result.kind = .MacOS;
664663 break :blk ver;
665664 },
666 Compilation.DarwinVersionMin.Ios => |ver| blk: {
667 result.kind = Kind.IPhoneOS;
665 .Ios => |ver| blk: {
666 result.kind = .IPhoneOS;
668667 break :blk ver;
669668 },
670 Compilation.DarwinVersionMin.None => blk: {
669 .None => blk: {
671670 assert(comp.target.getOs() == .macosx);
672 result.kind = Kind.MacOS;
671 result.kind = .MacOS;
673672 break :blk "10.14";
674673 },
675674 };
......@@ -686,11 +685,11 @@ const DarwinPlatform = struct {
686685 return error.InvalidDarwinVersionString;
687686 }
688687
689 if (result.kind == Kind.IPhoneOS) {
688 if (result.kind == .IPhoneOS) {
690689 switch (comp.target.getArch()) {
691 builtin.Arch.i386,
692 builtin.Arch.x86_64,
693 => result.kind = Kind.IPhoneOSSimulator,
690 .i386,
691 .x86_64,
692 => result.kind = .IPhoneOSSimulator,
694693 else => {},
695694 }
696695 }
src-self-hosted/llvm.zig+1-2
......@@ -1,4 +1,3 @@
1const builtin = @import("builtin");
21const c = @import("c.zig");
32const std = @import("std");
43const assert = std.debug.assert;
......@@ -269,7 +268,7 @@ pub const FnInline = extern enum {
269268};
270269
271270fn removeNullability(comptime T: type) type {
272 comptime assert(@typeInfo(T).Pointer.size == @import("builtin").TypeInfo.Pointer.Size.C);
271 comptime assert(@typeInfo(T).Pointer.size == .C);
273272 return *T.Child;
274273}
275274
src-self-hosted/main.zig+12-12
......@@ -266,16 +266,16 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co
266266 const build_mode = blk: {
267267 if (flags.single("mode")) |mode_flag| {
268268 if (mem.eql(u8, mode_flag, "debug")) {
269 break :blk builtin.Mode.Debug;
269 break :blk std.builtin.Mode.Debug;
270270 } else if (mem.eql(u8, mode_flag, "release-fast")) {
271 break :blk builtin.Mode.ReleaseFast;
271 break :blk std.builtin.Mode.ReleaseFast;
272272 } else if (mem.eql(u8, mode_flag, "release-safe")) {
273 break :blk builtin.Mode.ReleaseSafe;
273 break :blk std.builtin.Mode.ReleaseSafe;
274274 } else if (mem.eql(u8, mode_flag, "release-small")) {
275 break :blk builtin.Mode.ReleaseSmall;
275 break :blk std.builtin.Mode.ReleaseSmall;
276276 } else unreachable;
277277 } else {
278 break :blk builtin.Mode.Debug;
278 break :blk std.builtin.Mode.Debug;
279279 }
280280 };
281281
......@@ -475,13 +475,13 @@ async fn processBuildEvents(comp: *Compilation, color: errmsg.Color) void {
475475 count += 1;
476476
477477 switch (build_event) {
478 Compilation.Event.Ok => {
478 .Ok => {
479479 stderr.print("Build {} succeeded\n", count) catch process.exit(1);
480480 },
481 Compilation.Event.Error => |err| {
481 .Error => |err| {
482482 stderr.print("Build {} failed: {}\n", count, @errorName(err)) catch process.exit(1);
483483 },
484 Compilation.Event.Fail => |msgs| {
484 .Fail => |msgs| {
485485 stderr.print("Build {} compile errors:\n", count) catch process.exit(1);
486486 for (msgs) |msg| {
487487 defer msg.destroy();
......@@ -795,8 +795,8 @@ fn cmdTargets(allocator: *Allocator, args: []const []const u8) !void {
795795 try stdout.write("Operating Systems:\n");
796796 {
797797 comptime var i: usize = 0;
798 inline while (i < @memberCount(builtin.Os)) : (i += 1) {
799 comptime const os_tag = @memberName(builtin.Os, i);
798 inline while (i < @memberCount(Target.Os)) : (i += 1) {
799 comptime const os_tag = @memberName(Target.Os, i);
800800 // NOTE: Cannot use empty string, see #918.
801801 comptime const native_str = if (comptime mem.eql(u8, os_tag, @tagName(builtin.os))) " (native)\n" else "\n";
802802
......@@ -808,8 +808,8 @@ fn cmdTargets(allocator: *Allocator, args: []const []const u8) !void {
808808 try stdout.write("C ABIs:\n");
809809 {
810810 comptime var i: usize = 0;
811 inline while (i < @memberCount(builtin.Abi)) : (i += 1) {
812 comptime const abi_tag = @memberName(builtin.Abi, i);
811 inline while (i < @memberCount(Target.Abi)) : (i += 1) {
812 comptime const abi_tag = @memberName(Target.Abi, i);
813813 // NOTE: Cannot use empty string, see #918.
814814 comptime const native_str = if (comptime mem.eql(u8, abi_tag, @tagName(builtin.abi))) " (native)\n" else "\n";
815815
src-self-hosted/scope.zig+45-46
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const builtin = @import("builtin");
32const Allocator = mem.Allocator;
43const Decl = @import("decl.zig").Decl;
54const Compilation = @import("compilation.zig").Compilation;
......@@ -28,15 +27,15 @@ pub const Scope = struct {
2827 if (base.ref_count.decr() == 1) {
2928 if (base.parent) |parent| parent.deref(comp);
3029 switch (base.id) {
31 Id.Root => @fieldParentPtr(Root, "base", base).destroy(comp),
32 Id.Decls => @fieldParentPtr(Decls, "base", base).destroy(comp),
33 Id.Block => @fieldParentPtr(Block, "base", base).destroy(comp),
34 Id.FnDef => @fieldParentPtr(FnDef, "base", base).destroy(comp),
35 Id.CompTime => @fieldParentPtr(CompTime, "base", base).destroy(comp),
36 Id.Defer => @fieldParentPtr(Defer, "base", base).destroy(comp),
37 Id.DeferExpr => @fieldParentPtr(DeferExpr, "base", base).destroy(comp),
38 Id.Var => @fieldParentPtr(Var, "base", base).destroy(comp),
39 Id.AstTree => @fieldParentPtr(AstTree, "base", base).destroy(comp),
30 .Root => @fieldParentPtr(Root, "base", base).destroy(comp),
31 .Decls => @fieldParentPtr(Decls, "base", base).destroy(comp),
32 .Block => @fieldParentPtr(Block, "base", base).destroy(comp),
33 .FnDef => @fieldParentPtr(FnDef, "base", base).destroy(comp),
34 .CompTime => @fieldParentPtr(CompTime, "base", base).destroy(comp),
35 .Defer => @fieldParentPtr(Defer, "base", base).destroy(comp),
36 .DeferExpr => @fieldParentPtr(DeferExpr, "base", base).destroy(comp),
37 .Var => @fieldParentPtr(Var, "base", base).destroy(comp),
38 .AstTree => @fieldParentPtr(AstTree, "base", base).destroy(comp),
4039 }
4140 }
4241 }
......@@ -46,7 +45,7 @@ pub const Scope = struct {
4645 while (scope.parent) |parent| {
4746 scope = parent;
4847 }
49 assert(scope.id == Id.Root);
48 assert(scope.id == .Root);
5049 return @fieldParentPtr(Root, "base", scope);
5150 }
5251
......@@ -54,17 +53,17 @@ pub const Scope = struct {
5453 var scope = base;
5554 while (true) {
5655 switch (scope.id) {
57 Id.FnDef => return @fieldParentPtr(FnDef, "base", scope),
58 Id.Root, Id.Decls => return null,
59
60 Id.Block,
61 Id.Defer,
62 Id.DeferExpr,
63 Id.CompTime,
64 Id.Var,
56 .FnDef => return @fieldParentPtr(FnDef, "base", scope),
57 .Root, .Decls => return null,
58
59 .Block,
60 .Defer,
61 .DeferExpr,
62 .CompTime,
63 .Var,
6564 => scope = scope.parent.?,
6665
67 Id.AstTree => unreachable,
66 .AstTree => unreachable,
6867 }
6968 }
7069 }
......@@ -73,20 +72,20 @@ pub const Scope = struct {
7372 var scope = base;
7473 while (true) {
7574 switch (scope.id) {
76 Id.DeferExpr => return @fieldParentPtr(DeferExpr, "base", scope),
75 .DeferExpr => return @fieldParentPtr(DeferExpr, "base", scope),
7776
78 Id.FnDef,
79 Id.Decls,
77 .FnDef,
78 .Decls,
8079 => return null,
8180
82 Id.Block,
83 Id.Defer,
84 Id.CompTime,
85 Id.Root,
86 Id.Var,
81 .Block,
82 .Defer,
83 .CompTime,
84 .Root,
85 .Var,
8786 => scope = scope.parent orelse return null,
8887
89 Id.AstTree => unreachable,
88 .AstTree => unreachable,
9089 }
9190 }
9291 }
......@@ -123,7 +122,7 @@ pub const Scope = struct {
123122 const self = try comp.gpa().create(Root);
124123 self.* = Root{
125124 .base = Scope{
126 .id = Id.Root,
125 .id = .Root,
127126 .parent = null,
128127 .ref_count = std.atomic.Int(usize).init(1),
129128 },
......@@ -155,7 +154,7 @@ pub const Scope = struct {
155154 .base = undefined,
156155 .tree = tree,
157156 };
158 self.base.init(Id.AstTree, &root_scope.base);
157 self.base.init(.AstTree, &root_scope.base);
159158
160159 return self;
161160 }
......@@ -186,7 +185,7 @@ pub const Scope = struct {
186185 .base = undefined,
187186 .table = event.RwLocked(Decl.Table).init(Decl.Table.init(comp.gpa())),
188187 };
189 self.base.init(Id.Decls, parent);
188 self.base.init(.Decls, parent);
190189 return self;
191190 }
192191
......@@ -219,15 +218,15 @@ pub const Scope = struct {
219218
220219 fn get(self: Safety, comp: *Compilation) bool {
221220 return switch (self) {
222 Safety.Auto => switch (comp.build_mode) {
223 builtin.Mode.Debug,
224 builtin.Mode.ReleaseSafe,
221 .Auto => switch (comp.build_mode) {
222 .Debug,
223 .ReleaseSafe,
225224 => true,
226 builtin.Mode.ReleaseFast,
227 builtin.Mode.ReleaseSmall,
225 .ReleaseFast,
226 .ReleaseSmall,
228227 => false,
229228 },
230 @TagType(Safety).Manual => |man| man.enabled,
229 .Manual => |man| man.enabled,
231230 };
232231 }
233232 };
......@@ -243,7 +242,7 @@ pub const Scope = struct {
243242 .is_comptime = undefined,
244243 .safety = Safety.Auto,
245244 };
246 self.base.init(Id.Block, parent);
245 self.base.init(.Block, parent);
247246 return self;
248247 }
249248
......@@ -266,7 +265,7 @@ pub const Scope = struct {
266265 .base = undefined,
267266 .fn_val = null,
268267 };
269 self.base.init(Id.FnDef, parent);
268 self.base.init(.FnDef, parent);
270269 return self;
271270 }
272271
......@@ -282,7 +281,7 @@ pub const Scope = struct {
282281 pub fn create(comp: *Compilation, parent: *Scope) !*CompTime {
283282 const self = try comp.gpa().create(CompTime);
284283 self.* = CompTime{ .base = undefined };
285 self.base.init(Id.CompTime, parent);
284 self.base.init(.CompTime, parent);
286285 return self;
287286 }
288287
......@@ -314,7 +313,7 @@ pub const Scope = struct {
314313 .defer_expr_scope = defer_expr_scope,
315314 .kind = kind,
316315 };
317 self.base.init(Id.Defer, parent);
316 self.base.init(.Defer, parent);
318317 defer_expr_scope.base.ref();
319318 return self;
320319 }
......@@ -338,7 +337,7 @@ pub const Scope = struct {
338337 .expr_node = expr_node,
339338 .reported_err = false,
340339 };
341 self.base.init(Id.DeferExpr, parent);
340 self.base.init(.DeferExpr, parent);
342341 return self;
343342 }
344343
......@@ -404,14 +403,14 @@ pub const Scope = struct {
404403 .src_node = src_node,
405404 .data = undefined,
406405 };
407 self.base.init(Id.Var, parent);
406 self.base.init(.Var, parent);
408407 return self;
409408 }
410409
411410 pub fn destroy(self: *Var, comp: *Compilation) void {
412411 switch (self.data) {
413 Data.Param => {},
414 Data.Const => |value| value.deref(comp),
412 .Param => {},
413 .Const => |value| value.deref(comp),
415414 }
416415 comp.gpa().destroy(self);
417416 }
src-self-hosted/stage1.zig+5-6
......@@ -1,7 +1,6 @@
11// This is Zig code that is used by both stage1 and stage2.
22// The prototypes in src/userland.h must match these definitions.
33
4const builtin = @import("builtin");
54const std = @import("std");
65const io = std.io;
76const mem = std.mem;
......@@ -358,9 +357,9 @@ fn printErrMsgToFile(
358357 color: errmsg.Color,
359358) !void {
360359 const color_on = switch (color) {
361 errmsg.Color.Auto => file.isTty(),
362 errmsg.Color.On => true,
363 errmsg.Color.Off => false,
360 .Auto => file.isTty(),
361 .On => true,
362 .Off => false,
364363 };
365364 const lok_token = parse_error.loc();
366365 const span = errmsg.Span{
......@@ -425,8 +424,8 @@ export fn stage2_DepTokenizer_next(self: *stage2_DepTokenizer) stage2_DepNextRes
425424 const textz = std.Buffer.init(&self.handle.arena.allocator, token.bytes) catch @panic("failed to create .d tokenizer token text");
426425 return stage2_DepNextResult{
427426 .type_id = switch (token.id) {
428 .target => stage2_DepNextResult.TypeId.target,
429 .prereq => stage2_DepNextResult.TypeId.prereq,
427 .target => .target,
428 .prereq => .prereq,
430429 },
431430 .textz = textz.toSlice().ptr,
432431 };
src-self-hosted/test.zig+9-10
......@@ -1,6 +1,5 @@
11const std = @import("std");
22const mem = std.mem;
3const builtin = @import("builtin");
43const Target = std.Target;
54const Compilation = @import("compilation.zig").Compilation;
65const introspect = @import("introspect.zig");
......@@ -45,7 +44,7 @@ pub const TestContext = struct {
4544 errdefer self.zig_compiler.deinit();
4645
4746 self.group = std.event.Group(anyerror!void).init(allocator);
48 errdefer self.group.deinit();
47 errdefer self.group.wait();
4948
5049 self.zig_lib_dir = try introspect.resolveZigLibDir(allocator);
5150 errdefer allocator.free(self.zig_lib_dir);
......@@ -95,7 +94,7 @@ pub const TestContext = struct {
9594 file1_path,
9695 Target.Native,
9796 Compilation.Kind.Obj,
98 builtin.Mode.Debug,
97 .Debug,
9998 true, // is_static
10099 self.zig_lib_dir,
101100 );
......@@ -129,7 +128,7 @@ pub const TestContext = struct {
129128 file1_path,
130129 Target.Native,
131130 Compilation.Kind.Exe,
132 builtin.Mode.Debug,
131 .Debug,
133132 false,
134133 self.zig_lib_dir,
135134 );
......@@ -154,7 +153,7 @@ pub const TestContext = struct {
154153 const build_event = comp.events.get();
155154
156155 switch (build_event) {
157 Compilation.Event.Ok => {
156 .Ok => {
158157 const argv = []const []const u8{exe_file_2};
159158 // TODO use event loop
160159 const child = try std.ChildProcess.exec(allocator, argv, null, null, 1024 * 1024);
......@@ -172,8 +171,8 @@ pub const TestContext = struct {
172171 return error.OutputMismatch;
173172 }
174173 },
175 Compilation.Event.Error => |err| return err,
176 Compilation.Event.Fail => |msgs| {
174 .Error => |err| return err,
175 .Fail => |msgs| {
177176 var stderr = try std.io.getStdErr();
178177 try stderr.write("build incorrectly failed:\n");
179178 for (msgs) |msg| {
......@@ -196,13 +195,13 @@ pub const TestContext = struct {
196195 const build_event = comp.events.get();
197196
198197 switch (build_event) {
199 Compilation.Event.Ok => {
198 .Ok => {
200199 @panic("build incorrectly succeeded");
201200 },
202 Compilation.Event.Error => |err| {
201 .Error => |err| {
203202 @panic("build incorrectly failed");
204203 },
205 Compilation.Event.Fail => |msgs| {
204 .Fail => |msgs| {
206205 testing.expect(msgs.len != 0);
207206 for (msgs) |msg| {
208207 if (mem.endsWith(u8, msg.realpath, path) and mem.eql(u8, msg.text, text)) {
src-self-hosted/translate_c.zig+1-2
......@@ -2,7 +2,6 @@
22// and stage2. Currently the only way it is used is with `zig translate-c-2`.
33
44const std = @import("std");
5const builtin = @import("builtin");
65const assert = std.debug.assert;
76const ast = std.zig.ast;
87const Token = std.zig.Token;
......@@ -14,7 +13,7 @@ pub const Mode = enum {
1413};
1514
1615// TODO merge with Type.Fn.CallingConvention
17const CallingConvention = builtin.TypeInfo.CallingConvention;
16const CallingConvention = std.builtin.TypeInfo.CallingConvention;
1817
1918pub const ClangErrMsg = Stage2ErrorMsg;
2019
src-self-hosted/type.zig+154-154
......@@ -1,5 +1,5 @@
11const std = @import("std");
2const builtin = @import("builtin");
2const builtin = std.builtin;
33const Scope = @import("scope.zig").Scope;
44const Compilation = @import("compilation.zig").Compilation;
55const Value = @import("value.zig").Value;
......@@ -20,32 +20,32 @@ pub const Type = struct {
2020
2121 pub fn destroy(base: *Type, comp: *Compilation) void {
2222 switch (base.id) {
23 Id.Struct => @fieldParentPtr(Struct, "base", base).destroy(comp),
24 Id.Fn => @fieldParentPtr(Fn, "base", base).destroy(comp),
25 Id.Type => @fieldParentPtr(MetaType, "base", base).destroy(comp),
26 Id.Void => @fieldParentPtr(Void, "base", base).destroy(comp),
27 Id.Bool => @fieldParentPtr(Bool, "base", base).destroy(comp),
28 Id.NoReturn => @fieldParentPtr(NoReturn, "base", base).destroy(comp),
29 Id.Int => @fieldParentPtr(Int, "base", base).destroy(comp),
30 Id.Float => @fieldParentPtr(Float, "base", base).destroy(comp),
31 Id.Pointer => @fieldParentPtr(Pointer, "base", base).destroy(comp),
32 Id.Array => @fieldParentPtr(Array, "base", base).destroy(comp),
33 Id.ComptimeFloat => @fieldParentPtr(ComptimeFloat, "base", base).destroy(comp),
34 Id.ComptimeInt => @fieldParentPtr(ComptimeInt, "base", base).destroy(comp),
35 Id.EnumLiteral => @fieldParentPtr(EnumLiteral, "base", base).destroy(comp),
36 Id.Undefined => @fieldParentPtr(Undefined, "base", base).destroy(comp),
37 Id.Null => @fieldParentPtr(Null, "base", base).destroy(comp),
38 Id.Optional => @fieldParentPtr(Optional, "base", base).destroy(comp),
39 Id.ErrorUnion => @fieldParentPtr(ErrorUnion, "base", base).destroy(comp),
40 Id.ErrorSet => @fieldParentPtr(ErrorSet, "base", base).destroy(comp),
41 Id.Enum => @fieldParentPtr(Enum, "base", base).destroy(comp),
42 Id.Union => @fieldParentPtr(Union, "base", base).destroy(comp),
43 Id.BoundFn => @fieldParentPtr(BoundFn, "base", base).destroy(comp),
44 Id.ArgTuple => @fieldParentPtr(ArgTuple, "base", base).destroy(comp),
45 Id.Opaque => @fieldParentPtr(Opaque, "base", base).destroy(comp),
46 Id.Frame => @fieldParentPtr(Frame, "base", base).destroy(comp),
47 Id.AnyFrame => @fieldParentPtr(AnyFrame, "base", base).destroy(comp),
48 Id.Vector => @fieldParentPtr(Vector, "base", base).destroy(comp),
23 .Struct => @fieldParentPtr(Struct, "base", base).destroy(comp),
24 .Fn => @fieldParentPtr(Fn, "base", base).destroy(comp),
25 .Type => @fieldParentPtr(MetaType, "base", base).destroy(comp),
26 .Void => @fieldParentPtr(Void, "base", base).destroy(comp),
27 .Bool => @fieldParentPtr(Bool, "base", base).destroy(comp),
28 .NoReturn => @fieldParentPtr(NoReturn, "base", base).destroy(comp),
29 .Int => @fieldParentPtr(Int, "base", base).destroy(comp),
30 .Float => @fieldParentPtr(Float, "base", base).destroy(comp),
31 .Pointer => @fieldParentPtr(Pointer, "base", base).destroy(comp),
32 .Array => @fieldParentPtr(Array, "base", base).destroy(comp),
33 .ComptimeFloat => @fieldParentPtr(ComptimeFloat, "base", base).destroy(comp),
34 .ComptimeInt => @fieldParentPtr(ComptimeInt, "base", base).destroy(comp),
35 .EnumLiteral => @fieldParentPtr(EnumLiteral, "base", base).destroy(comp),
36 .Undefined => @fieldParentPtr(Undefined, "base", base).destroy(comp),
37 .Null => @fieldParentPtr(Null, "base", base).destroy(comp),
38 .Optional => @fieldParentPtr(Optional, "base", base).destroy(comp),
39 .ErrorUnion => @fieldParentPtr(ErrorUnion, "base", base).destroy(comp),
40 .ErrorSet => @fieldParentPtr(ErrorSet, "base", base).destroy(comp),
41 .Enum => @fieldParentPtr(Enum, "base", base).destroy(comp),
42 .Union => @fieldParentPtr(Union, "base", base).destroy(comp),
43 .BoundFn => @fieldParentPtr(BoundFn, "base", base).destroy(comp),
44 .ArgTuple => @fieldParentPtr(ArgTuple, "base", base).destroy(comp),
45 .Opaque => @fieldParentPtr(Opaque, "base", base).destroy(comp),
46 .Frame => @fieldParentPtr(Frame, "base", base).destroy(comp),
47 .AnyFrame => @fieldParentPtr(AnyFrame, "base", base).destroy(comp),
48 .Vector => @fieldParentPtr(Vector, "base", base).destroy(comp),
4949 }
5050 }
5151
......@@ -55,108 +55,108 @@ pub const Type = struct {
5555 llvm_context: *llvm.Context,
5656 ) (error{OutOfMemory}!*llvm.Type) {
5757 switch (base.id) {
58 Id.Struct => return @fieldParentPtr(Struct, "base", base).getLlvmType(allocator, llvm_context),
59 Id.Fn => return @fieldParentPtr(Fn, "base", base).getLlvmType(allocator, llvm_context),
60 Id.Type => unreachable,
61 Id.Void => unreachable,
62 Id.Bool => return @fieldParentPtr(Bool, "base", base).getLlvmType(allocator, llvm_context),
63 Id.NoReturn => unreachable,
64 Id.Int => return @fieldParentPtr(Int, "base", base).getLlvmType(allocator, llvm_context),
65 Id.Float => return @fieldParentPtr(Float, "base", base).getLlvmType(allocator, llvm_context),
66 Id.Pointer => return @fieldParentPtr(Pointer, "base", base).getLlvmType(allocator, llvm_context),
67 Id.Array => return @fieldParentPtr(Array, "base", base).getLlvmType(allocator, llvm_context),
68 Id.ComptimeFloat => unreachable,
69 Id.ComptimeInt => unreachable,
70 Id.EnumLiteral => unreachable,
71 Id.Undefined => unreachable,
72 Id.Null => unreachable,
73 Id.Optional => return @fieldParentPtr(Optional, "base", base).getLlvmType(allocator, llvm_context),
74 Id.ErrorUnion => return @fieldParentPtr(ErrorUnion, "base", base).getLlvmType(allocator, llvm_context),
75 Id.ErrorSet => return @fieldParentPtr(ErrorSet, "base", base).getLlvmType(allocator, llvm_context),
76 Id.Enum => return @fieldParentPtr(Enum, "base", base).getLlvmType(allocator, llvm_context),
77 Id.Union => return @fieldParentPtr(Union, "base", base).getLlvmType(allocator, llvm_context),
78 Id.BoundFn => return @fieldParentPtr(BoundFn, "base", base).getLlvmType(allocator, llvm_context),
79 Id.ArgTuple => unreachable,
80 Id.Opaque => return @fieldParentPtr(Opaque, "base", base).getLlvmType(allocator, llvm_context),
81 Id.Frame => return @fieldParentPtr(Frame, "base", base).getLlvmType(allocator, llvm_context),
82 Id.AnyFrame => return @fieldParentPtr(AnyFrame, "base", base).getLlvmType(allocator, llvm_context),
83 Id.Vector => return @fieldParentPtr(Vector, "base", base).getLlvmType(allocator, llvm_context),
58 .Struct => return @fieldParentPtr(Struct, "base", base).getLlvmType(allocator, llvm_context),
59 .Fn => return @fieldParentPtr(Fn, "base", base).getLlvmType(allocator, llvm_context),
60 .Type => unreachable,
61 .Void => unreachable,
62 .Bool => return @fieldParentPtr(Bool, "base", base).getLlvmType(allocator, llvm_context),
63 .NoReturn => unreachable,
64 .Int => return @fieldParentPtr(Int, "base", base).getLlvmType(allocator, llvm_context),
65 .Float => return @fieldParentPtr(Float, "base", base).getLlvmType(allocator, llvm_context),
66 .Pointer => return @fieldParentPtr(Pointer, "base", base).getLlvmType(allocator, llvm_context),
67 .Array => return @fieldParentPtr(Array, "base", base).getLlvmType(allocator, llvm_context),
68 .ComptimeFloat => unreachable,
69 .ComptimeInt => unreachable,
70 .EnumLiteral => unreachable,
71 .Undefined => unreachable,
72 .Null => unreachable,
73 .Optional => return @fieldParentPtr(Optional, "base", base).getLlvmType(allocator, llvm_context),
74 .ErrorUnion => return @fieldParentPtr(ErrorUnion, "base", base).getLlvmType(allocator, llvm_context),
75 .ErrorSet => return @fieldParentPtr(ErrorSet, "base", base).getLlvmType(allocator, llvm_context),
76 .Enum => return @fieldParentPtr(Enum, "base", base).getLlvmType(allocator, llvm_context),
77 .Union => return @fieldParentPtr(Union, "base", base).getLlvmType(allocator, llvm_context),
78 .BoundFn => return @fieldParentPtr(BoundFn, "base", base).getLlvmType(allocator, llvm_context),
79 .ArgTuple => unreachable,
80 .Opaque => return @fieldParentPtr(Opaque, "base", base).getLlvmType(allocator, llvm_context),
81 .Frame => return @fieldParentPtr(Frame, "base", base).getLlvmType(allocator, llvm_context),
82 .AnyFrame => return @fieldParentPtr(AnyFrame, "base", base).getLlvmType(allocator, llvm_context),
83 .Vector => return @fieldParentPtr(Vector, "base", base).getLlvmType(allocator, llvm_context),
8484 }
8585 }
8686
8787 pub fn handleIsPtr(base: *Type) bool {
8888 switch (base.id) {
89 Id.Type,
90 Id.ComptimeFloat,
91 Id.ComptimeInt,
92 Id.EnumLiteral,
93 Id.Undefined,
94 Id.Null,
95 Id.BoundFn,
96 Id.ArgTuple,
97 Id.Opaque,
89 .Type,
90 .ComptimeFloat,
91 .ComptimeInt,
92 .EnumLiteral,
93 .Undefined,
94 .Null,
95 .BoundFn,
96 .ArgTuple,
97 .Opaque,
9898 => unreachable,
9999
100 Id.NoReturn,
101 Id.Void,
102 Id.Bool,
103 Id.Int,
104 Id.Float,
105 Id.Pointer,
106 Id.ErrorSet,
107 Id.Enum,
108 Id.Fn,
109 Id.Frame,
110 Id.AnyFrame,
111 Id.Vector,
100 .NoReturn,
101 .Void,
102 .Bool,
103 .Int,
104 .Float,
105 .Pointer,
106 .ErrorSet,
107 .Enum,
108 .Fn,
109 .Frame,
110 .AnyFrame,
111 .Vector,
112112 => return false,
113113
114 Id.Struct => @panic("TODO"),
115 Id.Array => @panic("TODO"),
116 Id.Optional => @panic("TODO"),
117 Id.ErrorUnion => @panic("TODO"),
118 Id.Union => @panic("TODO"),
114 .Struct => @panic("TODO"),
115 .Array => @panic("TODO"),
116 .Optional => @panic("TODO"),
117 .ErrorUnion => @panic("TODO"),
118 .Union => @panic("TODO"),
119119 }
120120 }
121121
122122 pub fn hasBits(base: *Type) bool {
123123 switch (base.id) {
124 Id.Type,
125 Id.ComptimeFloat,
126 Id.ComptimeInt,
127 Id.EnumLiteral,
128 Id.Undefined,
129 Id.Null,
130 Id.BoundFn,
131 Id.ArgTuple,
132 Id.Opaque,
124 .Type,
125 .ComptimeFloat,
126 .ComptimeInt,
127 .EnumLiteral,
128 .Undefined,
129 .Null,
130 .BoundFn,
131 .ArgTuple,
132 .Opaque,
133133 => unreachable,
134134
135 Id.Void,
136 Id.NoReturn,
135 .Void,
136 .NoReturn,
137137 => return false,
138138
139 Id.Bool,
140 Id.Int,
141 Id.Float,
142 Id.Fn,
143 Id.Frame,
144 Id.AnyFrame,
145 Id.Vector,
139 .Bool,
140 .Int,
141 .Float,
142 .Fn,
143 .Frame,
144 .AnyFrame,
145 .Vector,
146146 => return true,
147147
148 Id.Pointer => {
148 .Pointer => {
149149 const ptr_type = @fieldParentPtr(Pointer, "base", base);
150150 return ptr_type.key.child_type.hasBits();
151151 },
152152
153 Id.ErrorSet => @panic("TODO"),
154 Id.Enum => @panic("TODO"),
155 Id.Struct => @panic("TODO"),
156 Id.Array => @panic("TODO"),
157 Id.Optional => @panic("TODO"),
158 Id.ErrorUnion => @panic("TODO"),
159 Id.Union => @panic("TODO"),
153 .ErrorSet => @panic("TODO"),
154 .Enum => @panic("TODO"),
155 .Struct => @panic("TODO"),
156 .Array => @panic("TODO"),
157 .Optional => @panic("TODO"),
158 .ErrorUnion => @panic("TODO"),
159 .Union => @panic("TODO"),
160160 }
161161 }
162162
......@@ -172,7 +172,7 @@ pub const Type = struct {
172172 fn init(base: *Type, comp: *Compilation, id: Id, name: []const u8) void {
173173 base.* = Type{
174174 .base = Value{
175 .id = Value.Id.Type,
175 .id = .Type,
176176 .typ = &MetaType.get(comp).base,
177177 .ref_count = std.atomic.Int(usize).init(1),
178178 },
......@@ -272,11 +272,11 @@ pub const Type = struct {
272272 var result: u32 = 0;
273273 result +%= hashAny(self.alignment, 0);
274274 switch (self.data) {
275 Kind.Generic => |generic| {
275 .Generic => |generic| {
276276 result +%= hashAny(generic.param_count, 1);
277277 result +%= hashAny(generic.cc, 3);
278278 },
279 Kind.Normal => |normal| {
279 .Normal => |normal| {
280280 result +%= hashAny(normal.return_type, 4);
281281 result +%= hashAny(normal.is_var_args, 5);
282282 result +%= hashAny(normal.cc, 6);
......@@ -294,14 +294,14 @@ pub const Type = struct {
294294 if (self.alignment) |self_align| {
295295 if (self_align != other.alignment.?) return false;
296296 }
297 if (@TagType(Data)(self.data) != @TagType(Data)(other.data)) return false;
297 if (self.data != other.data) return false;
298298 switch (self.data) {
299 Kind.Generic => |*self_generic| {
299 .Generic => |*self_generic| {
300300 const other_generic = &other.data.Generic;
301301 if (self_generic.param_count != other_generic.param_count) return false;
302302 if (self_generic.cc != other_generic.cc) return false;
303303 },
304 Kind.Normal => |*self_normal| {
304 .Normal => |*self_normal| {
305305 const other_normal = &other.data.Normal;
306306 if (self_normal.cc != other_normal.cc) return false;
307307 if (self_normal.is_var_args != other_normal.is_var_args) return false;
......@@ -318,8 +318,8 @@ pub const Type = struct {
318318
319319 pub fn deref(key: Key, comp: *Compilation) void {
320320 switch (key.data) {
321 Kind.Generic => {},
322 Kind.Normal => |normal| {
321 .Generic => {},
322 .Normal => |normal| {
323323 normal.return_type.base.deref(comp);
324324 for (normal.params) |param| {
325325 param.typ.base.deref(comp);
......@@ -330,8 +330,8 @@ pub const Type = struct {
330330
331331 pub fn ref(key: Key) void {
332332 switch (key.data) {
333 Kind.Generic => {},
334 Kind.Normal => |normal| {
333 .Generic => {},
334 .Normal => |normal| {
335335 normal.return_type.base.ref();
336336 for (normal.params) |param| {
337337 param.typ.base.ref();
......@@ -361,8 +361,8 @@ pub const Type = struct {
361361
362362 pub fn paramCount(self: *Fn) usize {
363363 return switch (self.key.data) {
364 Kind.Generic => |generic| generic.param_count,
365 Kind.Normal => |normal| normal.params.len,
364 .Generic => |generic| generic.param_count,
365 .Normal => |normal| normal.params.len,
366366 };
367367 }
368368
......@@ -396,7 +396,7 @@ pub const Type = struct {
396396 const name_stream = &std.io.BufferOutStream.init(&name_buf).stream;
397397
398398 switch (key.data) {
399 Kind.Generic => |generic| {
399 .Generic => |generic| {
400400 self.non_key = NonKey{ .Generic = {} };
401401 const cc_str = ccFnTypeStr(generic.cc);
402402 try name_stream.write(cc_str);
......@@ -412,7 +412,7 @@ pub const Type = struct {
412412 }
413413 try name_stream.write(" var");
414414 },
415 Kind.Normal => |normal| {
415 .Normal => |normal| {
416416 self.non_key = NonKey{
417417 .Normal = NonKey.Normal{ .variable_list = std.ArrayList(*Scope.Var).init(comp.gpa()) },
418418 };
......@@ -435,7 +435,7 @@ pub const Type = struct {
435435 },
436436 }
437437
438 self.base.init(comp, Id.Fn, name_buf.toOwnedSlice());
438 self.base.init(comp, .Fn, name_buf.toOwnedSlice());
439439
440440 {
441441 const held = comp.fn_type_table.acquire();
......@@ -449,8 +449,8 @@ pub const Type = struct {
449449 pub fn destroy(self: *Fn, comp: *Compilation) void {
450450 self.key.deref(comp);
451451 switch (self.key.data) {
452 Kind.Generic => {},
453 Kind.Normal => {
452 .Generic => {},
453 .Normal => {
454454 self.non_key.Normal.variable_list.deinit();
455455 },
456456 }
......@@ -460,7 +460,7 @@ pub const Type = struct {
460460 pub fn getLlvmType(self: *Fn, allocator: *Allocator, llvm_context: *llvm.Context) !*llvm.Type {
461461 const normal = &self.key.data.Normal;
462462 const llvm_return_type = switch (normal.return_type.id) {
463 Type.Id.Void => llvm.VoidTypeInContext(llvm_context) orelse return error.OutOfMemory,
463 .Void => llvm.VoidTypeInContext(llvm_context) orelse return error.OutOfMemory,
464464 else => try normal.return_type.getLlvmType(allocator, llvm_context),
465465 };
466466 const llvm_param_types = try allocator.alloc(*llvm.Type, normal.params.len);
......@@ -588,7 +588,7 @@ pub const Type = struct {
588588 const name = try std.fmt.allocPrint(comp.gpa(), "{c}{}", u_or_i, key.bit_count);
589589 errdefer comp.gpa().free(name);
590590
591 self.base.init(comp, Id.Int, name);
591 self.base.init(comp, .Int, name);
592592
593593 {
594594 const held = comp.int_type_table.acquire();
......@@ -650,8 +650,8 @@ pub const Type = struct {
650650 pub fn hash(self: *const Key) u32 {
651651 var result: u32 = 0;
652652 result +%= switch (self.alignment) {
653 Align.Abi => 0xf201c090,
654 Align.Override => |x| hashAny(x, 0),
653 .Abi => 0xf201c090,
654 .Override => |x| hashAny(x, 0),
655655 };
656656 result +%= hashAny(self.child_type, 1);
657657 result +%= hashAny(self.mut, 2);
......@@ -670,8 +670,8 @@ pub const Type = struct {
670670 return false;
671671 }
672672 switch (self.alignment) {
673 Align.Abi => return true,
674 Align.Override => |x| return x == other.alignment.Override,
673 .Abi => return true,
674 .Override => |x| return x == other.alignment.Override,
675675 }
676676 }
677677 };
......@@ -714,8 +714,8 @@ pub const Type = struct {
714714
715715 pub async fn getAlignAsInt(self: *Pointer, comp: *Compilation) u32 {
716716 switch (self.key.alignment) {
717 Align.Abi => return self.key.child_type.getAbiAlignment(comp),
718 Align.Override => |alignment| return alignment,
717 .Abi => return self.key.child_type.getAbiAlignment(comp),
718 .Override => |alignment| return alignment,
719719 }
720720 }
721721
......@@ -725,11 +725,11 @@ pub const Type = struct {
725725 ) !*Pointer {
726726 var normal_key = key;
727727 switch (key.alignment) {
728 Align.Abi => {},
729 Align.Override => |alignment| {
728 .Abi => {},
729 .Override => |alignment| {
730730 const abi_align = try key.child_type.getAbiAlignment(comp);
731731 if (abi_align == alignment) {
732 normal_key.alignment = Align.Abi;
732 normal_key.alignment = .Abi;
733733 }
734734 },
735735 }
......@@ -752,21 +752,21 @@ pub const Type = struct {
752752 errdefer comp.gpa().destroy(self);
753753
754754 const size_str = switch (self.key.size) {
755 Size.One => "*",
756 Size.Many => "[*]",
757 Size.Slice => "[]",
758 Size.C => "[*c]",
755 .One => "*",
756 .Many => "[*]",
757 .Slice => "[]",
758 .C => "[*c]",
759759 };
760760 const mut_str = switch (self.key.mut) {
761 Mut.Const => "const ",
762 Mut.Mut => "",
761 .Const => "const ",
762 .Mut => "",
763763 };
764764 const vol_str = switch (self.key.vol) {
765 Vol.Volatile => "volatile ",
766 Vol.Non => "",
765 .Volatile => "volatile ",
766 .Non => "",
767767 };
768768 const name = switch (self.key.alignment) {
769 Align.Abi => try std.fmt.allocPrint(
769 .Abi => try std.fmt.allocPrint(
770770 comp.gpa(),
771771 "{}{}{}{}",
772772 size_str,
......@@ -774,7 +774,7 @@ pub const Type = struct {
774774 vol_str,
775775 self.key.child_type.name,
776776 ),
777 Align.Override => |alignment| try std.fmt.allocPrint(
777 .Override => |alignment| try std.fmt.allocPrint(
778778 comp.gpa(),
779779 "{}align<{}> {}{}{}",
780780 size_str,
......@@ -786,7 +786,7 @@ pub const Type = struct {
786786 };
787787 errdefer comp.gpa().free(name);
788788
789 self.base.init(comp, Id.Pointer, name);
789 self.base.init(comp, .Pointer, name);
790790
791791 {
792792 const held = comp.ptr_type_table.acquire();
......@@ -854,7 +854,7 @@ pub const Type = struct {
854854 const name = try std.fmt.allocPrint(comp.gpa(), "[{}]{}", key.len, key.elem_type.name);
855855 errdefer comp.gpa().free(name);
856856
857 self.base.init(comp, Id.Array, name);
857 self.base.init(comp, .Array, name);
858858
859859 {
860860 const held = comp.array_type_table.acquire();
......@@ -1054,7 +1054,7 @@ pub const Type = struct {
10541054
10551055fn hashAny(x: var, comptime seed: u64) u32 {
10561056 switch (@typeInfo(@typeOf(x))) {
1057 builtin.TypeId.Int => |info| {
1057 .Int => |info| {
10581058 comptime var rng = comptime std.rand.DefaultPrng.init(seed);
10591059 const unsigned_x = @bitCast(@IntType(false, info.bits), x);
10601060 if (info.bits <= 32) {
......@@ -1063,21 +1063,21 @@ fn hashAny(x: var, comptime seed: u64) u32 {
10631063 return @truncate(u32, unsigned_x *% comptime rng.random.scalar(@typeOf(unsigned_x)));
10641064 }
10651065 },
1066 builtin.TypeId.Pointer => |info| {
1066 .Pointer => |info| {
10671067 switch (info.size) {
1068 builtin.TypeInfo.Pointer.Size.One => return hashAny(@ptrToInt(x), seed),
1069 builtin.TypeInfo.Pointer.Size.Many => @compileError("implement hash function"),
1070 builtin.TypeInfo.Pointer.Size.Slice => @compileError("implement hash function"),
1071 builtin.TypeInfo.Pointer.Size.C => unreachable,
1068 .One => return hashAny(@ptrToInt(x), seed),
1069 .Many => @compileError("implement hash function"),
1070 .Slice => @compileError("implement hash function"),
1071 .C => unreachable,
10721072 }
10731073 },
1074 builtin.TypeId.Enum => return hashAny(@enumToInt(x), seed),
1075 builtin.TypeId.Bool => {
1074 .Enum => return hashAny(@enumToInt(x), seed),
1075 .Bool => {
10761076 comptime var rng = comptime std.rand.DefaultPrng.init(seed);
10771077 const vals = comptime [2]u32{ rng.random.scalar(u32), rng.random.scalar(u32) };
10781078 return vals[@boolToInt(x)];
10791079 },
1080 builtin.TypeId.Optional => {
1080 .Optional => {
10811081 if (x) |non_opt| {
10821082 return hashAny(non_opt, seed);
10831083 } else {
src-self-hosted/value.zig+46-47
......@@ -1,5 +1,4 @@
11const std = @import("std");
2const builtin = @import("builtin");
32const Scope = @import("scope.zig").Scope;
43const Compilation = @import("compilation.zig").Compilation;
54const ObjectFile = @import("codegen.zig").ObjectFile;
......@@ -24,15 +23,15 @@ pub const Value = struct {
2423 if (base.ref_count.decr() == 1) {
2524 base.typ.base.deref(comp);
2625 switch (base.id) {
27 Id.Type => @fieldParentPtr(Type, "base", base).destroy(comp),
28 Id.Fn => @fieldParentPtr(Fn, "base", base).destroy(comp),
29 Id.FnProto => @fieldParentPtr(FnProto, "base", base).destroy(comp),
30 Id.Void => @fieldParentPtr(Void, "base", base).destroy(comp),
31 Id.Bool => @fieldParentPtr(Bool, "base", base).destroy(comp),
32 Id.NoReturn => @fieldParentPtr(NoReturn, "base", base).destroy(comp),
33 Id.Ptr => @fieldParentPtr(Ptr, "base", base).destroy(comp),
34 Id.Int => @fieldParentPtr(Int, "base", base).destroy(comp),
35 Id.Array => @fieldParentPtr(Array, "base", base).destroy(comp),
26 .Type => @fieldParentPtr(Type, "base", base).destroy(comp),
27 .Fn => @fieldParentPtr(Fn, "base", base).destroy(comp),
28 .FnProto => @fieldParentPtr(FnProto, "base", base).destroy(comp),
29 .Void => @fieldParentPtr(Void, "base", base).destroy(comp),
30 .Bool => @fieldParentPtr(Bool, "base", base).destroy(comp),
31 .NoReturn => @fieldParentPtr(NoReturn, "base", base).destroy(comp),
32 .Ptr => @fieldParentPtr(Ptr, "base", base).destroy(comp),
33 .Int => @fieldParentPtr(Int, "base", base).destroy(comp),
34 .Array => @fieldParentPtr(Array, "base", base).destroy(comp),
3635 }
3736 }
3837 }
......@@ -59,15 +58,15 @@ pub const Value = struct {
5958
6059 pub fn getLlvmConst(base: *Value, ofile: *ObjectFile) (error{OutOfMemory}!?*llvm.Value) {
6160 switch (base.id) {
62 Id.Type => unreachable,
63 Id.Fn => return @fieldParentPtr(Fn, "base", base).getLlvmConst(ofile),
64 Id.FnProto => return @fieldParentPtr(FnProto, "base", base).getLlvmConst(ofile),
65 Id.Void => return null,
66 Id.Bool => return @fieldParentPtr(Bool, "base", base).getLlvmConst(ofile),
67 Id.NoReturn => unreachable,
68 Id.Ptr => return @fieldParentPtr(Ptr, "base", base).getLlvmConst(ofile),
69 Id.Int => return @fieldParentPtr(Int, "base", base).getLlvmConst(ofile),
70 Id.Array => return @fieldParentPtr(Array, "base", base).getLlvmConst(ofile),
61 .Type => unreachable,
62 .Fn => return @fieldParentPtr(Fn, "base", base).getLlvmConst(ofile),
63 .FnProto => return @fieldParentPtr(FnProto, "base", base).getLlvmConst(ofile),
64 .Void => return null,
65 .Bool => return @fieldParentPtr(Bool, "base", base).getLlvmConst(ofile),
66 .NoReturn => unreachable,
67 .Ptr => return @fieldParentPtr(Ptr, "base", base).getLlvmConst(ofile),
68 .Int => return @fieldParentPtr(Int, "base", base).getLlvmConst(ofile),
69 .Array => return @fieldParentPtr(Array, "base", base).getLlvmConst(ofile),
7170 }
7271 }
7372
......@@ -83,15 +82,15 @@ pub const Value = struct {
8382
8483 pub fn copy(base: *Value, comp: *Compilation) (error{OutOfMemory}!*Value) {
8584 switch (base.id) {
86 Id.Type => unreachable,
87 Id.Fn => unreachable,
88 Id.FnProto => unreachable,
89 Id.Void => unreachable,
90 Id.Bool => unreachable,
91 Id.NoReturn => unreachable,
92 Id.Ptr => unreachable,
93 Id.Array => unreachable,
94 Id.Int => return &(try @fieldParentPtr(Int, "base", base).copy(comp)).base,
85 .Type => unreachable,
86 .Fn => unreachable,
87 .FnProto => unreachable,
88 .Void => unreachable,
89 .Bool => unreachable,
90 .NoReturn => unreachable,
91 .Ptr => unreachable,
92 .Array => unreachable,
93 .Int => return &(try @fieldParentPtr(Int, "base", base).copy(comp)).base,
9594 }
9695 }
9796
......@@ -138,7 +137,7 @@ pub const Value = struct {
138137 const self = try comp.gpa().create(FnProto);
139138 self.* = FnProto{
140139 .base = Value{
141 .id = Value.Id.FnProto,
140 .id = .FnProto,
142141 .typ = &fn_type.base,
143142 .ref_count = std.atomic.Int(usize).init(1),
144143 },
......@@ -202,7 +201,7 @@ pub const Value = struct {
202201 const self = try comp.gpa().create(Fn);
203202 self.* = Fn{
204203 .base = Value{
205 .id = Value.Id.Fn,
204 .id = .Fn,
206205 .typ = &fn_type.base,
207206 .ref_count = std.atomic.Int(usize).init(1),
208207 },
......@@ -359,7 +358,7 @@ pub const Value = struct {
359358 const self = try comp.gpa().create(Value.Ptr);
360359 self.* = Value.Ptr{
361360 .base = Value{
362 .id = Value.Id.Ptr,
361 .id = .Ptr,
363362 .typ = &ptr_type.base,
364363 .ref_count = std.atomic.Int(usize).init(1),
365364 },
......@@ -385,8 +384,8 @@ pub const Value = struct {
385384 const llvm_type = self.base.typ.getLlvmType(ofile.arena, ofile.context);
386385 // TODO carefully port the logic from codegen.cpp:gen_const_val_ptr
387386 switch (self.special) {
388 Special.Scalar => |scalar| @panic("TODO"),
389 Special.BaseArray => |base_array| {
387 .Scalar => |scalar| @panic("TODO"),
388 .BaseArray => |base_array| {
390389 // TODO put this in one .o file only, and after that, generate extern references to it
391390 const array_llvm_value = (try base_array.val.getLlvmConst(ofile)).?;
392391 const ptr_bit_count = ofile.comp.target_ptr_bits;
......@@ -401,9 +400,9 @@ pub const Value = struct {
401400 @intCast(c_uint, indices.len),
402401 ) orelse return error.OutOfMemory;
403402 },
404 Special.BaseStruct => |base_struct| @panic("TODO"),
405 Special.HardCodedAddr => |addr| @panic("TODO"),
406 Special.Discard => unreachable,
403 .BaseStruct => |base_struct| @panic("TODO"),
404 .HardCodedAddr => |addr| @panic("TODO"),
405 .Discard => unreachable,
407406 }
408407 }
409408 };
......@@ -437,7 +436,7 @@ pub const Value = struct {
437436 const self = try comp.gpa().create(Value.Array);
438437 self.* = Value.Array{
439438 .base = Value{
440 .id = Value.Id.Array,
439 .id = .Array,
441440 .typ = &array_type.base,
442441 .ref_count = std.atomic.Int(usize).init(1),
443442 },
......@@ -450,22 +449,22 @@ pub const Value = struct {
450449
451450 pub fn destroy(self: *Array, comp: *Compilation) void {
452451 switch (self.special) {
453 Special.Undefined => {},
454 Special.OwnedBuffer => |buf| {
452 .Undefined => {},
453 .OwnedBuffer => |buf| {
455454 comp.gpa().free(buf);
456455 },
457 Special.Explicit => {},
456 .Explicit => {},
458457 }
459458 comp.gpa().destroy(self);
460459 }
461460
462461 pub fn getLlvmConst(self: *Array, ofile: *ObjectFile) !?*llvm.Value {
463462 switch (self.special) {
464 Special.Undefined => {
463 .Undefined => {
465464 const llvm_type = try self.base.typ.getLlvmType(ofile.arena, ofile.context);
466465 return llvm.GetUndef(llvm_type);
467466 },
468 Special.OwnedBuffer => |buf| {
467 .OwnedBuffer => |buf| {
469468 const dont_null_terminate = 1;
470469 const llvm_str_init = llvm.ConstStringInContext(
471470 ofile.context,
......@@ -482,7 +481,7 @@ pub const Value = struct {
482481 llvm.SetAlignment(global, llvm.ABIAlignmentOfType(ofile.comp.target_data_ref, str_init_type));
483482 return global;
484483 },
485 Special.Explicit => @panic("TODO"),
484 .Explicit => @panic("TODO"),
486485 }
487486
488487 //{
......@@ -517,7 +516,7 @@ pub const Value = struct {
517516 const self = try comp.gpa().create(Value.Int);
518517 self.* = Value.Int{
519518 .base = Value{
520 .id = Value.Id.Int,
519 .id = .Int,
521520 .typ = typ,
522521 .ref_count = std.atomic.Int(usize).init(1),
523522 },
......@@ -536,7 +535,7 @@ pub const Value = struct {
536535
537536 pub fn getLlvmConst(self: *Int, ofile: *ObjectFile) !?*llvm.Value {
538537 switch (self.base.typ.id) {
539 Type.Id.Int => {
538 .Int => {
540539 const type_ref = try self.base.typ.getLlvmType(ofile.arena, ofile.context);
541540 if (self.big_int.len() == 0) {
542541 return llvm.ConstNull(type_ref);
......@@ -554,7 +553,7 @@ pub const Value = struct {
554553 };
555554 return if (self.big_int.isPositive()) unsigned_val else llvm.ConstNeg(unsigned_val);
556555 },
557 Type.Id.ComptimeInt => unreachable,
556 .ComptimeInt => unreachable,
558557 else => unreachable,
559558 }
560559 }
......@@ -566,7 +565,7 @@ pub const Value = struct {
566565 const new = try comp.gpa().create(Value.Int);
567566 new.* = Value.Int{
568567 .base = Value{
569 .id = Value.Id.Int,
568 .id = .Int,
570569 .typ = old.base.typ,
571570 .ref_count = std.atomic.Int(usize).init(1),
572571 },