authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-26 10:27:51+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-26 11:52:12+02:00
log36849d8a7b5b0ed62d966ea9c402f192ade0cadf
treeb03def98fe255f4572add7e7cae155e07964e93c
parent76f21852f6553fc22612bb82df19184fdb28719e
signaturelock-open Commit is signed but in an unrecognized format.

fixes and cleanup in self hosted


12 files changed, 244 insertions(+), 302 deletions(-)

src-self-hosted/codegen.zig+15-15
...@@ -25,10 +25,10 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)...@@ -25,10 +25,10 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
2525
26 const context = llvm_handle.node.data;26 const context = llvm_handle.node.data;
2727
28 const module = llvm.ModuleCreateWithNameInContext(comp.name.ptr(), context) orelse return error.OutOfMemory;28 const module = llvm.ModuleCreateWithNameInContext(comp.name.toSliceConst(), context) orelse return error.OutOfMemory;
29 defer llvm.DisposeModule(module);29 defer llvm.DisposeModule(module);
3030
31 llvm.SetTarget(module, comp.llvm_triple.ptr());31 llvm.SetTarget(module, comp.llvm_triple.toSliceConst());
32 llvm.SetDataLayout(module, comp.target_layout_str);32 llvm.SetDataLayout(module, comp.target_layout_str);
3333
34 if (util.getObjectFormat(comp.target) == .coff) {34 if (util.getObjectFormat(comp.target) == .coff) {
...@@ -48,23 +48,23 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)...@@ -48,23 +48,23 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
48 const producer = try std.Buffer.allocPrint(48 const producer = try std.Buffer.allocPrint(
49 &code.arena.allocator,49 &code.arena.allocator,
50 "zig {}.{}.{}",50 "zig {}.{}.{}",
51 u32(c.ZIG_VERSION_MAJOR),51 @as(u32, c.ZIG_VERSION_MAJOR),
52 u32(c.ZIG_VERSION_MINOR),52 @as(u32, c.ZIG_VERSION_MINOR),
53 u32(c.ZIG_VERSION_PATCH),53 @as(u32, c.ZIG_VERSION_PATCH),
54 );54 );
55 const flags = "";55 const flags = "";
56 const runtime_version = 0;56 const runtime_version = 0;
57 const compile_unit_file = llvm.CreateFile(57 const compile_unit_file = llvm.CreateFile(
58 dibuilder,58 dibuilder,
59 comp.name.ptr(),59 comp.name.toSliceConst(),
60 comp.root_package.root_src_dir.ptr(),60 comp.root_package.root_src_dir.toSliceConst(),
61 ) orelse return error.OutOfMemory;61 ) orelse return error.OutOfMemory;
62 const is_optimized = comp.build_mode != .Debug;62 const is_optimized = comp.build_mode != .Debug;
63 const compile_unit = llvm.CreateCompileUnit(63 const compile_unit = llvm.CreateCompileUnit(
64 dibuilder,64 dibuilder,
65 DW.LANG_C99,65 DW.LANG_C99,
66 compile_unit_file,66 compile_unit_file,
67 producer.ptr(),67 producer.toSliceConst(),
68 is_optimized,68 is_optimized,
69 flags,69 flags,
70 runtime_version,70 runtime_version,
...@@ -99,7 +99,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)...@@ -99,7 +99,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
9999
100 // verify the llvm module when safety is on100 // verify the llvm module when safety is on
101 if (std.debug.runtime_safety) {101 if (std.debug.runtime_safety) {
102 var error_ptr: ?[*]u8 = null;102 var error_ptr: ?[*:0]u8 = null;
103 _ = llvm.VerifyModule(ofile.module, llvm.AbortProcessAction, &error_ptr);103 _ = llvm.VerifyModule(ofile.module, llvm.AbortProcessAction, &error_ptr);
104 }104 }
105105
...@@ -108,12 +108,12 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)...@@ -108,12 +108,12 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
108 const is_small = comp.build_mode == .ReleaseSmall;108 const is_small = comp.build_mode == .ReleaseSmall;
109 const is_debug = comp.build_mode == .Debug;109 const is_debug = comp.build_mode == .Debug;
110110
111 var err_msg: [*]u8 = undefined;111 var err_msg: [*:0]u8 = undefined;
112 // TODO integrate this with evented I/O112 // TODO integrate this with evented I/O
113 if (llvm.TargetMachineEmitToFile(113 if (llvm.TargetMachineEmitToFile(
114 comp.target_machine,114 comp.target_machine,
115 module,115 module,
116 output_path.ptr(),116 output_path.toSliceConst(),
117 llvm.EmitBinary,117 llvm.EmitBinary,
118 &err_msg,118 &err_msg,
119 is_debug,119 is_debug,
...@@ -154,7 +154,7 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code)...@@ -154,7 +154,7 @@ pub fn renderToLlvmModule(ofile: *ObjectFile, fn_val: *Value.Fn, code: *ir.Code)
154 const llvm_fn_type = try fn_val.base.typ.getLlvmType(ofile.arena, ofile.context);154 const llvm_fn_type = try fn_val.base.typ.getLlvmType(ofile.arena, ofile.context);
155 const llvm_fn = llvm.AddFunction(155 const llvm_fn = llvm.AddFunction(
156 ofile.module,156 ofile.module,
157 fn_val.symbol_name.ptr(),157 fn_val.symbol_name.toSliceConst(),
158 llvm_fn_type,158 llvm_fn_type,
159 ) orelse return error.OutOfMemory;159 ) orelse return error.OutOfMemory;
160160
...@@ -379,7 +379,7 @@ fn renderLoadUntyped(...@@ -379,7 +379,7 @@ fn renderLoadUntyped(
379 ptr: *llvm.Value,379 ptr: *llvm.Value,
380 alignment: Type.Pointer.Align,380 alignment: Type.Pointer.Align,
381 vol: Type.Pointer.Vol,381 vol: Type.Pointer.Vol,
382 name: [*]const u8,382 name: [*:0]const u8,
383) !*llvm.Value {383) !*llvm.Value {
384 const result = llvm.BuildLoad(ofile.builder, ptr, name) orelse return error.OutOfMemory;384 const result = llvm.BuildLoad(ofile.builder, ptr, name) orelse return error.OutOfMemory;
385 switch (vol) {385 switch (vol) {
...@@ -390,7 +390,7 @@ fn renderLoadUntyped(...@@ -390,7 +390,7 @@ fn renderLoadUntyped(
390 return result;390 return result;
391}391}
392392
393fn renderLoad(ofile: *ObjectFile, ptr: *llvm.Value, ptr_type: *Type.Pointer, name: [*]const u8) !*llvm.Value {393fn renderLoad(ofile: *ObjectFile, ptr: *llvm.Value, ptr_type: *Type.Pointer, name: [*:0]const u8) !*llvm.Value {
394 return renderLoadUntyped(ofile, ptr, ptr_type.key.alignment, ptr_type.key.vol, name);394 return renderLoadUntyped(ofile, ptr, ptr_type.key.alignment, ptr_type.key.vol, name);
395}395}
396396
...@@ -438,7 +438,7 @@ pub fn renderAlloca(...@@ -438,7 +438,7 @@ pub fn renderAlloca(
438) !*llvm.Value {438) !*llvm.Value {
439 const llvm_var_type = try var_type.getLlvmType(ofile.arena, ofile.context);439 const llvm_var_type = try var_type.getLlvmType(ofile.arena, ofile.context);
440 const name_with_null = try std.cstr.addNullByte(ofile.arena, name);440 const name_with_null = try std.cstr.addNullByte(ofile.arena, name);
441 const result = llvm.BuildAlloca(ofile.builder, llvm_var_type, name_with_null.ptr) orelse return error.OutOfMemory;441 const result = llvm.BuildAlloca(ofile.builder, llvm_var_type, @ptrCast([*:0]const u8, name_with_null.ptr)) orelse return error.OutOfMemory;
442 llvm.SetAlignment(result, resolveAlign(ofile, alignment, llvm_var_type));442 llvm.SetAlignment(result, resolveAlign(ofile, alignment, llvm_var_type));
443 return result;443 return result;
444}444}
src-self-hosted/compilation.zig+93-128
...@@ -93,7 +93,7 @@ pub const ZigCompiler = struct {...@@ -93,7 +93,7 @@ pub const ZigCompiler = struct {
93 return LlvmHandle{ .node = node };93 return LlvmHandle{ .node = node };
94 }94 }
9595
96 pub async fn getNativeLibC(self: *ZigCompiler) !*LibCInstallation {96 pub fn getNativeLibC(self: *ZigCompiler) !*LibCInstallation {
97 if (self.native_libc.start()) |ptr| return ptr;97 if (self.native_libc.start()) |ptr| return ptr;
98 try self.native_libc.data.findNative(self.allocator);98 try self.native_libc.data.findNative(self.allocator);
99 self.native_libc.resolve();99 self.native_libc.resolve();
...@@ -135,26 +135,26 @@ pub const Compilation = struct {...@@ -135,26 +135,26 @@ pub const Compilation = struct {
135 /// lazily created when we need it135 /// lazily created when we need it
136 tmp_dir: event.Future(BuildError![]u8),136 tmp_dir: event.Future(BuildError![]u8),
137137
138 version_major: u32,138 version_major: u32 = 0,
139 version_minor: u32,139 version_minor: u32 = 0,
140 version_patch: u32,140 version_patch: u32 = 0,
141141
142 linker_script: ?[]const u8,142 linker_script: ?[]const u8 = null,
143 out_h_path: ?[]const u8,143 out_h_path: ?[]const u8 = null,
144144
145 is_test: bool,145 is_test: bool = false,
146 each_lib_rpath: bool,146 each_lib_rpath: bool = false,
147 strip: bool,147 strip: bool = false,
148 is_static: bool,148 is_static: bool,
149 linker_rdynamic: bool,149 linker_rdynamic: bool = false,
150150
151 clang_argv: []const []const u8,151 clang_argv: []const []const u8 = [_][]const u8{},
152 lib_dirs: []const []const u8,152 lib_dirs: []const []const u8 = [_][]const u8{},
153 rpath_list: []const []const u8,153 rpath_list: []const []const u8 = [_][]const u8{},
154 assembly_files: []const []const u8,154 assembly_files: []const []const u8 = [_][]const u8{},
155155
156 /// paths that are explicitly provided by the user to link against156 /// paths that are explicitly provided by the user to link against
157 link_objects: []const []const u8,157 link_objects: []const []const u8 = [_][]const u8{},
158158
159 /// functions that have their own objects that we need to link159 /// functions that have their own objects that we need to link
160 /// it uses an optional pointer so that tombstone removals are possible160 /// it uses an optional pointer so that tombstone removals are possible
...@@ -162,33 +162,33 @@ pub const Compilation = struct {...@@ -162,33 +162,33 @@ pub const Compilation = struct {
162162
163 pub const FnLinkSet = std.TailQueue(?*Value.Fn);163 pub const FnLinkSet = std.TailQueue(?*Value.Fn);
164164
165 windows_subsystem_windows: bool,165 windows_subsystem_windows: bool = false,
166 windows_subsystem_console: bool,166 windows_subsystem_console: bool = false,
167167
168 link_libs_list: ArrayList(*LinkLib),168 link_libs_list: ArrayList(*LinkLib),
169 libc_link_lib: ?*LinkLib,169 libc_link_lib: ?*LinkLib = null,
170170
171 err_color: errmsg.Color,171 err_color: errmsg.Color = .Auto,
172172
173 verbose_tokenize: bool,173 verbose_tokenize: bool = false,
174 verbose_ast_tree: bool,174 verbose_ast_tree: bool = false,
175 verbose_ast_fmt: bool,175 verbose_ast_fmt: bool = false,
176 verbose_cimport: bool,176 verbose_cimport: bool = false,
177 verbose_ir: bool,177 verbose_ir: bool = false,
178 verbose_llvm_ir: bool,178 verbose_llvm_ir: bool = false,
179 verbose_link: bool,179 verbose_link: bool = false,
180180
181 darwin_frameworks: []const []const u8,181 darwin_frameworks: []const []const u8 = [_][]const u8{},
182 darwin_version_min: DarwinVersionMin,182 darwin_version_min: DarwinVersionMin = .None,
183183
184 test_filters: []const []const u8,184 test_filters: []const []const u8 = [_][]const u8{},
185 test_name_prefix: ?[]const u8,185 test_name_prefix: ?[]const u8 = null,
186186
187 emit_file_type: Emit,187 emit_file_type: Emit = .Binary,
188188
189 kind: Kind,189 kind: Kind,
190190
191 link_out_file: ?[]const u8,191 link_out_file: ?[]const u8 = null,
192 events: *event.Channel(Event),192 events: *event.Channel(Event),
193193
194 exported_symbol_names: event.Locked(Decl.Table),194 exported_symbol_names: event.Locked(Decl.Table),
...@@ -213,7 +213,7 @@ pub const Compilation = struct {...@@ -213,7 +213,7 @@ pub const Compilation = struct {
213213
214 target_machine: *llvm.TargetMachine,214 target_machine: *llvm.TargetMachine,
215 target_data_ref: *llvm.TargetData,215 target_data_ref: *llvm.TargetData,
216 target_layout_str: [*]u8,216 target_layout_str: [*:0]u8,
217 target_ptr_bits: u32,217 target_ptr_bits: u32,
218218
219 /// for allocating things which have the same lifetime as this Compilation219 /// for allocating things which have the same lifetime as this Compilation
...@@ -222,7 +222,7 @@ pub const Compilation = struct {...@@ -222,7 +222,7 @@ pub const Compilation = struct {
222 root_package: *Package,222 root_package: *Package,
223 std_package: *Package,223 std_package: *Package,
224224
225 override_libc: ?*LibCInstallation,225 override_libc: ?*LibCInstallation = null,
226226
227 /// need to wait on this group before deinitializing227 /// need to wait on this group before deinitializing
228 deinit_group: event.Group(void),228 deinit_group: event.Group(void),
...@@ -231,7 +231,7 @@ pub const Compilation = struct {...@@ -231,7 +231,7 @@ pub const Compilation = struct {
231 // main_loop_frame: @Frame(Compilation.mainLoop),231 // main_loop_frame: @Frame(Compilation.mainLoop),
232 main_loop_future: event.Future(void),232 main_loop_future: event.Future(void),
233233
234 have_err_ret_tracing: bool,234 have_err_ret_tracing: bool = false,
235235
236 /// not locked because it is read-only236 /// not locked because it is read-only
237 primitive_type_table: TypeTable,237 primitive_type_table: TypeTable,
...@@ -243,7 +243,7 @@ pub const Compilation = struct {...@@ -243,7 +243,7 @@ pub const Compilation = struct {
243243
244 c_int_types: [CInt.list.len]*Type.Int,244 c_int_types: [CInt.list.len]*Type.Int,
245245
246 // fs_watch: *fs.Watch(*Scope.Root),246 fs_watch: *fs.Watch(*Scope.Root),
247247
248 const IntTypeTable = std.HashMap(*const Type.Int.Key, *Type.Int, Type.Int.Key.hash, Type.Int.Key.eql);248 const IntTypeTable = std.HashMap(*const Type.Int.Key, *Type.Int, Type.Int.Key.hash, Type.Int.Key.eql);
249 const ArrayTypeTable = std.HashMap(*const Type.Array.Key, *Type.Array, Type.Array.Key.hash, Type.Array.Key.eql);249 const ArrayTypeTable = std.HashMap(*const Type.Array.Key, *Type.Array, Type.Array.Key.hash, Type.Array.Key.eql);
...@@ -392,43 +392,10 @@ pub const Compilation = struct {...@@ -392,43 +392,10 @@ pub const Compilation = struct {
392392
393 .name = undefined,393 .name = undefined,
394 .llvm_triple = undefined,394 .llvm_triple = undefined,
395
396 .version_major = 0,
397 .version_minor = 0,
398 .version_patch = 0,
399
400 .verbose_tokenize = false,
401 .verbose_ast_tree = false,
402 .verbose_ast_fmt = false,
403 .verbose_cimport = false,
404 .verbose_ir = false,
405 .verbose_llvm_ir = false,
406 .verbose_link = false,
407
408 .linker_script = null,
409 .out_h_path = null,
410 .is_test = false,
411 .each_lib_rpath = false,
412 .strip = false,
413 .is_static = is_static,395 .is_static = is_static,
414 .linker_rdynamic = false,
415 .clang_argv = [_][]const u8{},
416 .lib_dirs = [_][]const u8{},
417 .rpath_list = [_][]const u8{},
418 .assembly_files = [_][]const u8{},
419 .link_objects = [_][]const u8{},
420 .fn_link_set = event.Locked(FnLinkSet).init(FnLinkSet.init()),396 .fn_link_set = event.Locked(FnLinkSet).init(FnLinkSet.init()),
421 .windows_subsystem_windows = false,
422 .windows_subsystem_console = false,
423 .link_libs_list = undefined,397 .link_libs_list = undefined,
424 .libc_link_lib = null,398
425 .err_color = errmsg.Color.Auto,
426 .darwin_frameworks = [_][]const u8{},
427 .darwin_version_min = DarwinVersionMin.None,
428 .test_filters = [_][]const u8{},
429 .test_name_prefix = null,
430 .emit_file_type = Emit.Binary,
431 .link_out_file = null,
432 .exported_symbol_names = event.Locked(Decl.Table).init(Decl.Table.init(allocator)),399 .exported_symbol_names = event.Locked(Decl.Table).init(Decl.Table.init(allocator)),
433 .prelink_group = event.Group(BuildError!void).init(allocator),400 .prelink_group = event.Group(BuildError!void).init(allocator),
434 .deinit_group = event.Group(void).init(allocator),401 .deinit_group = event.Group(void).init(allocator),
...@@ -458,11 +425,9 @@ pub const Compilation = struct {...@@ -458,11 +425,9 @@ pub const Compilation = struct {
458 .root_package = undefined,425 .root_package = undefined,
459 .std_package = undefined,426 .std_package = undefined,
460427
461 .override_libc = null,
462 .have_err_ret_tracing = false,
463 .primitive_type_table = undefined,428 .primitive_type_table = undefined,
464429
465 // .fs_watch = undefined,430 .fs_watch = undefined,
466 };431 };
467 comp.link_libs_list = ArrayList(*LinkLib).init(comp.arena());432 comp.link_libs_list = ArrayList(*LinkLib).init(comp.arena());
468 comp.primitive_type_table = TypeTable.init(comp.arena());433 comp.primitive_type_table = TypeTable.init(comp.arena());
...@@ -534,8 +499,8 @@ pub const Compilation = struct {...@@ -534,8 +499,8 @@ pub const Compilation = struct {
534 comp.root_package = try Package.create(comp.arena(), ".", "");499 comp.root_package = try Package.create(comp.arena(), ".", "");
535 }500 }
536501
537 // comp.fs_watch = try fs.Watch(*Scope.Root).create(16);502 comp.fs_watch = try fs.Watch(*Scope.Root).init(allocator, 16);
538 // defer comp.fs_watch.destroy();503 defer comp.fs_watch.deinit();
539504
540 try comp.initTypes();505 try comp.initTypes();
541 defer comp.primitive_type_table.deinit();506 defer comp.primitive_type_table.deinit();
...@@ -559,7 +524,7 @@ pub const Compilation = struct {...@@ -559,7 +524,7 @@ pub const Compilation = struct {
559 }524 }
560525
561 /// it does ref the result because it could be an arbitrary integer size526 /// it does ref the result because it could be an arbitrary integer size
562 pub async fn getPrimitiveType(comp: *Compilation, name: []const u8) !?*Type {527 pub fn getPrimitiveType(comp: *Compilation, name: []const u8) !?*Type {
563 if (name.len >= 2) {528 if (name.len >= 2) {
564 switch (name[0]) {529 switch (name[0]) {
565 'i', 'u' => blk: {530 'i', 'u' => blk: {
...@@ -795,47 +760,47 @@ pub const Compilation = struct {...@@ -795,47 +760,47 @@ pub const Compilation = struct {
795 self.events.put(Event{ .Error = err });760 self.events.put(Event{ .Error = err });
796 }761 }
797762
798 // // First, get an item from the watch channel, waiting on the channel.763 // First, get an item from the watch channel, waiting on the channel.
799 // var group = event.Group(BuildError!void).init(self.gpa());764 var group = event.Group(BuildError!void).init(self.gpa());
800 // {765 {
801 // const ev = (self.fs_watch.channel.get()) catch |err| {766 const ev = (self.fs_watch.channel.get()) catch |err| {
802 // build_result = err;767 build_result = err;
803 // continue;768 continue;
804 // };769 };
805 // const root_scope = ev.data;770 const root_scope = ev.data;
806 // group.call(rebuildFile, self, root_scope) catch |err| {771 group.call(rebuildFile, self, root_scope) catch |err| {
807 // build_result = err;772 build_result = err;
808 // continue;773 continue;
809 // };774 };
810 // }775 }
811 // // Next, get all the items from the channel that are buffered up.776 // Next, get all the items from the channel that are buffered up.
812 // while (self.fs_watch.channel.getOrNull()) |ev_or_err| {777 while (self.fs_watch.channel.getOrNull()) |ev_or_err| {
813 // if (ev_or_err) |ev| {778 if (ev_or_err) |ev| {
814 // const root_scope = ev.data;779 const root_scope = ev.data;
815 // group.call(rebuildFile, self, root_scope) catch |err| {780 group.call(rebuildFile, self, root_scope) catch |err| {
816 // build_result = err;781 build_result = err;
817 // continue;782 continue;
818 // };783 };
819 // } else |err| {784 } else |err| {
820 // build_result = err;785 build_result = err;
821 // continue;786 continue;
822 // }787 }
823 // }788 }
824 // build_result = group.wait();789 build_result = group.wait();
825 }790 }
826 }791 }
827792
828 async fn rebuildFile(self: *Compilation, root_scope: *Scope.Root) !void {793 async fn rebuildFile(self: *Compilation, root_scope: *Scope.Root) BuildError!void {
829 const tree_scope = blk: {794 const tree_scope = blk: {
830 const source_code = "";795 const source_code = fs.readFile(
831 // const source_code = fs.readFile(796 self.gpa(),
832 // root_scope.realpath,797 root_scope.realpath,
833 // max_src_size,798 max_src_size,
834 // ) catch |err| {799 ) catch |err| {
835 // try self.addCompileErrorCli(root_scope.realpath, "unable to open: {}", @errorName(err));800 try self.addCompileErrorCli(root_scope.realpath, "unable to open: {}", @errorName(err));
836 // return;801 return;
837 // };802 };
838 // errdefer self.gpa().free(source_code);803 errdefer self.gpa().free(source_code);
839804
840 const tree = try std.zig.parse(self.gpa(), source_code);805 const tree = try std.zig.parse(self.gpa(), source_code);
841 errdefer {806 errdefer {
...@@ -873,7 +838,7 @@ pub const Compilation = struct {...@@ -873,7 +838,7 @@ pub const Compilation = struct {
873 try decl_group.wait();838 try decl_group.wait();
874 }839 }
875840
876 async fn rebuildChangedDecls(841 fn rebuildChangedDecls(
877 self: *Compilation,842 self: *Compilation,
878 group: *event.Group(BuildError!void),843 group: *event.Group(BuildError!void),
879 locked_table: *Decl.Table,844 locked_table: *Decl.Table,
...@@ -962,7 +927,7 @@ pub const Compilation = struct {...@@ -962,7 +927,7 @@ pub const Compilation = struct {
962 }927 }
963 }928 }
964929
965 async fn initialCompile(self: *Compilation) !void {930 fn initialCompile(self: *Compilation) !void {
966 if (self.root_src_path) |root_src_path| {931 if (self.root_src_path) |root_src_path| {
967 const root_scope = blk: {932 const root_scope = blk: {
968 // TODO async/await std.fs.realpath933 // TODO async/await std.fs.realpath
...@@ -981,7 +946,7 @@ pub const Compilation = struct {...@@ -981,7 +946,7 @@ pub const Compilation = struct {
981 }946 }
982 }947 }
983948
984 async fn maybeLink(self: *Compilation) !void {949 fn maybeLink(self: *Compilation) !void {
985 (self.prelink_group.wait()) catch |err| switch (err) {950 (self.prelink_group.wait()) catch |err| switch (err) {
986 error.SemanticAnalysisFailed => {},951 error.SemanticAnalysisFailed => {},
987 else => return err,952 else => return err,
...@@ -1184,7 +1149,7 @@ pub const Compilation = struct {...@@ -1184,7 +1149,7 @@ pub const Compilation = struct {
11841149
1185 /// If the temporary directory for this compilation has not been created, it creates it.1150 /// If the temporary directory for this compilation has not been created, it creates it.
1186 /// Then it creates a random file name in that dir and returns it.1151 /// Then it creates a random file name in that dir and returns it.
1187 pub async fn createRandomOutputPath(self: *Compilation, suffix: []const u8) !Buffer {1152 pub fn createRandomOutputPath(self: *Compilation, suffix: []const u8) !Buffer {
1188 const tmp_dir = try self.getTmpDir();1153 const tmp_dir = try self.getTmpDir();
1189 const file_prefix = self.getRandomFileName();1154 const file_prefix = self.getRandomFileName();
11901155
...@@ -1200,14 +1165,14 @@ pub const Compilation = struct {...@@ -1200,14 +1165,14 @@ pub const Compilation = struct {
1200 /// If the temporary directory for this Compilation has not been created, creates it.1165 /// If the temporary directory for this Compilation has not been created, creates it.
1201 /// Then returns it. The directory is unique to this Compilation and cleaned up when1166 /// Then returns it. The directory is unique to this Compilation and cleaned up when
1202 /// the Compilation deinitializes.1167 /// the Compilation deinitializes.
1203 async fn getTmpDir(self: *Compilation) ![]const u8 {1168 fn getTmpDir(self: *Compilation) ![]const u8 {
1204 if (self.tmp_dir.start()) |ptr| return ptr.*;1169 if (self.tmp_dir.start()) |ptr| return ptr.*;
1205 self.tmp_dir.data = self.getTmpDirImpl();1170 self.tmp_dir.data = self.getTmpDirImpl();
1206 self.tmp_dir.resolve();1171 self.tmp_dir.resolve();
1207 return self.tmp_dir.data;1172 return self.tmp_dir.data;
1208 }1173 }
12091174
1210 async fn getTmpDirImpl(self: *Compilation) ![]u8 {1175 fn getTmpDirImpl(self: *Compilation) ![]u8 {
1211 const comp_dir_name = self.getRandomFileName();1176 const comp_dir_name = self.getRandomFileName();
1212 const zig_dir_path = try getZigDir(self.gpa());1177 const zig_dir_path = try getZigDir(self.gpa());
1213 defer self.gpa().free(zig_dir_path);1178 defer self.gpa().free(zig_dir_path);
...@@ -1217,7 +1182,7 @@ pub const Compilation = struct {...@@ -1217,7 +1182,7 @@ pub const Compilation = struct {
1217 return tmp_dir;1182 return tmp_dir;
1218 }1183 }
12191184
1220 async fn getRandomFileName(self: *Compilation) [12]u8 {1185 fn getRandomFileName(self: *Compilation) [12]u8 {
1221 // here we replace the standard +/ with -_ so that it can be used in a file name1186 // here we replace the standard +/ with -_ so that it can be used in a file name
1222 const b64_fs_encoder = std.base64.Base64Encoder.init(1187 const b64_fs_encoder = std.base64.Base64Encoder.init(
1223 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",1188 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
...@@ -1243,7 +1208,7 @@ pub const Compilation = struct {...@@ -1243,7 +1208,7 @@ pub const Compilation = struct {
1243 }1208 }
12441209
1245 /// Returns a value which has been ref()'d once1210 /// Returns a value which has been ref()'d once
1246 async fn analyzeConstValue(1211 fn analyzeConstValue(
1247 comp: *Compilation,1212 comp: *Compilation,
1248 tree_scope: *Scope.AstTree,1213 tree_scope: *Scope.AstTree,
1249 scope: *Scope,1214 scope: *Scope,
...@@ -1256,7 +1221,7 @@ pub const Compilation = struct {...@@ -1256,7 +1221,7 @@ pub const Compilation = struct {
1256 return analyzed_code.getCompTimeResult(comp);1221 return analyzed_code.getCompTimeResult(comp);
1257 }1222 }
12581223
1259 async fn analyzeTypeExpr(comp: *Compilation, tree_scope: *Scope.AstTree, scope: *Scope, node: *ast.Node) !*Type {1224 fn analyzeTypeExpr(comp: *Compilation, tree_scope: *Scope.AstTree, scope: *Scope, node: *ast.Node) !*Type {
1260 const meta_type = &Type.MetaType.get(comp).base;1225 const meta_type = &Type.MetaType.get(comp).base;
1261 defer meta_type.base.deref(comp);1226 defer meta_type.base.deref(comp);
12621227
...@@ -1287,7 +1252,7 @@ fn parseVisibToken(tree: *ast.Tree, optional_token_index: ?ast.TokenIndex) Visib...@@ -1287,7 +1252,7 @@ fn parseVisibToken(tree: *ast.Tree, optional_token_index: ?ast.TokenIndex) Visib
1287}1252}
12881253
1289/// The function that actually does the generation.1254/// The function that actually does the generation.
1290async fn generateDecl(comp: *Compilation, decl: *Decl) !void {1255fn generateDecl(comp: *Compilation, decl: *Decl) !void {
1291 switch (decl.id) {1256 switch (decl.id) {
1292 .Var => @panic("TODO"),1257 .Var => @panic("TODO"),
1293 .Fn => {1258 .Fn => {
...@@ -1298,7 +1263,7 @@ async fn generateDecl(comp: *Compilation, decl: *Decl) !void {...@@ -1298,7 +1263,7 @@ async fn generateDecl(comp: *Compilation, decl: *Decl) !void {
1298 }1263 }
1299}1264}
13001265
1301async fn generateDeclFn(comp: *Compilation, fn_decl: *Decl.Fn) !void {1266fn generateDeclFn(comp: *Compilation, fn_decl: *Decl.Fn) !void {
1302 const tree_scope = fn_decl.base.tree_scope;1267 const tree_scope = fn_decl.base.tree_scope;
13031268
1304 const body_node = fn_decl.fn_proto.body_node orelse return generateDeclFnProto(comp, fn_decl);1269 const body_node = fn_decl.fn_proto.body_node orelse return generateDeclFnProto(comp, fn_decl);
...@@ -1315,7 +1280,7 @@ async fn generateDeclFn(comp: *Compilation, fn_decl: *Decl.Fn) !void {...@@ -1315,7 +1280,7 @@ async fn generateDeclFn(comp: *Compilation, fn_decl: *Decl.Fn) !void {
13151280
1316 // The Decl.Fn owns the initial 1 reference count1281 // The Decl.Fn owns the initial 1 reference count
1317 const fn_val = try Value.Fn.create(comp, fn_type, fndef_scope, symbol_name);1282 const fn_val = try Value.Fn.create(comp, fn_type, fndef_scope, symbol_name);
1318 fn_decl.value = Decl.Fn.Val{ .Fn = fn_val };1283 fn_decl.value = .{ .Fn = fn_val };
1319 symbol_name_consumed = true;1284 symbol_name_consumed = true;
13201285
1321 // Define local parameter variables1286 // Define local parameter variables
...@@ -1382,7 +1347,7 @@ fn getZigDir(allocator: *mem.Allocator) ![]u8 {...@@ -1382,7 +1347,7 @@ fn getZigDir(allocator: *mem.Allocator) ![]u8 {
1382 return std.fs.getAppDataDir(allocator, "zig");1347 return std.fs.getAppDataDir(allocator, "zig");
1383}1348}
13841349
1385async fn analyzeFnType(1350fn analyzeFnType(
1386 comp: *Compilation,1351 comp: *Compilation,
1387 tree_scope: *Scope.AstTree,1352 tree_scope: *Scope.AstTree,
1388 scope: *Scope,1353 scope: *Scope,
...@@ -1444,7 +1409,7 @@ async fn analyzeFnType(...@@ -1444,7 +1409,7 @@ async fn analyzeFnType(
1444 return fn_type;1409 return fn_type;
1445}1410}
14461411
1447async fn generateDeclFnProto(comp: *Compilation, fn_decl: *Decl.Fn) !void {1412fn generateDeclFnProto(comp: *Compilation, fn_decl: *Decl.Fn) !void {
1448 const fn_type = try analyzeFnType(1413 const fn_type = try analyzeFnType(
1449 comp,1414 comp,
1450 fn_decl.base.tree_scope,1415 fn_decl.base.tree_scope,
...@@ -1459,6 +1424,6 @@ async fn generateDeclFnProto(comp: *Compilation, fn_decl: *Decl.Fn) !void {...@@ -1459,6 +1424,6 @@ async fn generateDeclFnProto(comp: *Compilation, fn_decl: *Decl.Fn) !void {
14591424
1460 // The Decl.Fn owns the initial 1 reference count1425 // The Decl.Fn owns the initial 1 reference count
1461 const fn_proto_val = try Value.FnProto.create(comp, fn_type, symbol_name);1426 const fn_proto_val = try Value.FnProto.create(comp, fn_type, symbol_name);
1462 fn_decl.value = Decl.Fn.Val{ .FnProto = fn_proto_val };1427 fn_decl.value = .{ .FnProto = fn_proto_val };
1463 symbol_name_consumed = true;1428 symbol_name_consumed = true;
1464}1429}
src-self-hosted/decl.zig+3-6
...@@ -69,15 +69,12 @@ pub const Decl = struct {...@@ -69,15 +69,12 @@ pub const Decl = struct {
6969
70 pub const Fn = struct {70 pub const Fn = struct {
71 base: Decl,71 base: Decl,
72 value: Val,72 value: union(enum) {
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,73 Unresolved,
78 Fn: *Value.Fn,74 Fn: *Value.Fn,
79 FnProto: *Value.FnProto,75 FnProto: *Value.FnProto,
80 };76 },
77 fn_proto: *ast.Node.FnProto,
8178
82 pub fn externLibName(self: Fn, tree: *ast.Tree) ?[]const u8 {79 pub fn externLibName(self: Fn, tree: *ast.Tree) ?[]const u8 {
83 return if (self.fn_proto.extern_export_inline_token) |tok_index| x: {80 return if (self.fn_proto.extern_export_inline_token) |tok_index| x: {
src-self-hosted/ir.zig+22-21
...@@ -110,7 +110,7 @@ pub const Inst = struct {...@@ -110,7 +110,7 @@ pub const Inst = struct {
110 unreachable;110 unreachable;
111 }111 }
112112
113 pub async fn analyze(base: *Inst, ira: *Analyze) Analyze.Error!*Inst {113 pub fn analyze(base: *Inst, ira: *Analyze) Analyze.Error!*Inst {
114 switch (base.id) {114 switch (base.id) {
115 .Return => return @fieldParentPtr(Return, "base", base).analyze(ira),115 .Return => return @fieldParentPtr(Return, "base", base).analyze(ira),
116 .Const => return @fieldParentPtr(Const, "base", base).analyze(ira),116 .Const => return @fieldParentPtr(Const, "base", base).analyze(ira),
...@@ -422,7 +422,7 @@ pub const Inst = struct {...@@ -422,7 +422,7 @@ pub const Inst = struct {
422 return false;422 return false;
423 }423 }
424424
425 pub async fn analyze(self: *const Ref, ira: *Analyze) !*Inst {425 pub fn analyze(self: *const Ref, ira: *Analyze) !*Inst {
426 const target = try self.params.target.getAsParam();426 const target = try self.params.target.getAsParam();
427427
428 if (ira.getCompTimeValOrNullUndefOk(target)) |val| {428 if (ira.getCompTimeValOrNullUndefOk(target)) |val| {
...@@ -472,7 +472,7 @@ pub const Inst = struct {...@@ -472,7 +472,7 @@ pub const Inst = struct {
472 return false;472 return false;
473 }473 }
474474
475 pub async fn analyze(self: *const DeclRef, ira: *Analyze) !*Inst {475 pub fn analyze(self: *const DeclRef, ira: *Analyze) !*Inst {
476 (ira.irb.comp.resolveDecl(self.params.decl)) catch |err| switch (err) {476 (ira.irb.comp.resolveDecl(self.params.decl)) catch |err| switch (err) {
477 error.OutOfMemory => return error.OutOfMemory,477 error.OutOfMemory => return error.OutOfMemory,
478 else => return error.SemanticAnalysisFailed,478 else => return error.SemanticAnalysisFailed,
...@@ -516,7 +516,7 @@ pub const Inst = struct {...@@ -516,7 +516,7 @@ pub const Inst = struct {
516 return false;516 return false;
517 }517 }
518518
519 pub async fn analyze(self: *const VarPtr, ira: *Analyze) !*Inst {519 pub fn analyze(self: *const VarPtr, ira: *Analyze) !*Inst {
520 switch (self.params.var_scope.data) {520 switch (self.params.var_scope.data) {
521 .Const => @panic("TODO"),521 .Const => @panic("TODO"),
522 .Param => |param| {522 .Param => |param| {
...@@ -563,7 +563,7 @@ pub const Inst = struct {...@@ -563,7 +563,7 @@ pub const Inst = struct {
563 return false;563 return false;
564 }564 }
565565
566 pub async fn analyze(self: *const LoadPtr, ira: *Analyze) !*Inst {566 pub fn analyze(self: *const LoadPtr, ira: *Analyze) !*Inst {
567 const target = try self.params.target.getAsParam();567 const target = try self.params.target.getAsParam();
568 const target_type = target.getKnownType();568 const target_type = target.getKnownType();
569 if (target_type.id != .Pointer) {569 if (target_type.id != .Pointer) {
...@@ -645,7 +645,7 @@ pub const Inst = struct {...@@ -645,7 +645,7 @@ pub const Inst = struct {
645 return false;645 return false;
646 }646 }
647647
648 pub async fn analyze(self: *const PtrType, ira: *Analyze) !*Inst {648 pub fn analyze(self: *const PtrType, ira: *Analyze) !*Inst {
649 const child_type = try self.params.child_type.getAsConstType(ira);649 const child_type = try self.params.child_type.getAsConstType(ira);
650 // if (child_type->id == TypeTableEntryIdUnreachable) {650 // if (child_type->id == TypeTableEntryIdUnreachable) {
651 // ir_add_error(ira, &instruction->base, buf_sprintf("pointer to noreturn not allowed"));651 // ir_add_error(ira, &instruction->base, buf_sprintf("pointer to noreturn not allowed"));
...@@ -927,7 +927,7 @@ pub const Variable = struct {...@@ -927,7 +927,7 @@ pub const Variable = struct {
927927
928pub const BasicBlock = struct {928pub const BasicBlock = struct {
929 ref_count: usize,929 ref_count: usize,
930 name_hint: [*]const u8, // must be a C string literal930 name_hint: [*:0]const u8,
931 debug_id: usize,931 debug_id: usize,
932 scope: *Scope,932 scope: *Scope,
933 instruction_list: std.ArrayList(*Inst),933 instruction_list: std.ArrayList(*Inst),
...@@ -1051,7 +1051,7 @@ pub const Builder = struct {...@@ -1051,7 +1051,7 @@ pub const Builder = struct {
1051 }1051 }
10521052
1053 /// No need to clean up resources thanks to the arena allocator.1053 /// No need to clean up resources thanks to the arena allocator.
1054 pub fn createBasicBlock(self: *Builder, scope: *Scope, name_hint: [*]const u8) !*BasicBlock {1054 pub fn createBasicBlock(self: *Builder, scope: *Scope, name_hint: [*:0]const u8) !*BasicBlock {
1055 const basic_block = try self.arena().create(BasicBlock);1055 const basic_block = try self.arena().create(BasicBlock);
1056 basic_block.* = BasicBlock{1056 basic_block.* = BasicBlock{
1057 .ref_count = 0,1057 .ref_count = 0,
...@@ -1186,6 +1186,7 @@ pub const Builder = struct {...@@ -1186,6 +1186,7 @@ pub const Builder = struct {
1186 }1186 }
1187 }1187 }
11881188
1189 fn genCall(irb: *Builder, suffix_op: *ast.Node.SuffixOp, call: *ast.Node.SuffixOp.Op.Call, scope: *Scope) !*Inst {
1189 async fn genCall(irb: *Builder, suffix_op: *ast.Node.SuffixOp, call: *ast.Node.SuffixOp.Op.Call, scope: *Scope) !*Inst {1190 async fn genCall(irb: *Builder, suffix_op: *ast.Node.SuffixOp, call: *ast.Node.SuffixOp.Op.Call, scope: *Scope) !*Inst {
1190 const fn_ref = try irb.genNode(suffix_op.lhs, scope, .None);1191 const fn_ref = try irb.genNode(suffix_op.lhs, scope, .None);
11911192
...@@ -1214,7 +1215,7 @@ pub const Builder = struct {...@@ -1214,7 +1215,7 @@ pub const Builder = struct {
1214 //return ir_lval_wrap(irb, scope, fn_call, lval);1215 //return ir_lval_wrap(irb, scope, fn_call, lval);
1215 }1216 }
12161217
1217 async fn genPtrType(1218 fn genPtrType(
1218 irb: *Builder,1219 irb: *Builder,
1219 prefix_op: *ast.Node.PrefixOp,1220 prefix_op: *ast.Node.PrefixOp,
1220 ptr_info: ast.Node.PrefixOp.PtrInfo,1221 ptr_info: ast.Node.PrefixOp.PtrInfo,
...@@ -1307,9 +1308,9 @@ pub const Builder = struct {...@@ -1307,9 +1308,9 @@ pub const Builder = struct {
1307 var rest: []const u8 = undefined;1308 var rest: []const u8 = undefined;
1308 if (int_token.len >= 3 and int_token[0] == '0') {1309 if (int_token.len >= 3 and int_token[0] == '0') {
1309 base = switch (int_token[1]) {1310 base = switch (int_token[1]) {
1310 'b' => u8(2),1311 'b' => 2,
1311 'o' => u8(8),1312 'o' => 8,
1312 'x' => u8(16),1313 'x' => 16,
1313 else => unreachable,1314 else => unreachable,
1314 };1315 };
1315 rest = int_token[2..];1316 rest = int_token[2..];
...@@ -1339,7 +1340,7 @@ pub const Builder = struct {...@@ -1339,7 +1340,7 @@ pub const Builder = struct {
1339 return inst;1340 return inst;
1340 }1341 }
13411342
1342 pub async fn genStrLit(irb: *Builder, str_lit: *ast.Node.StringLiteral, scope: *Scope) !*Inst {1343 pub fn genStrLit(irb: *Builder, str_lit: *ast.Node.StringLiteral, scope: *Scope) !*Inst {
1343 const str_token = irb.code.tree_scope.tree.tokenSlice(str_lit.token);1344 const str_token = irb.code.tree_scope.tree.tokenSlice(str_lit.token);
1344 const src_span = Span.token(str_lit.token);1345 const src_span = Span.token(str_lit.token);
13451346
...@@ -1389,7 +1390,7 @@ pub const Builder = struct {...@@ -1389,7 +1390,7 @@ pub const Builder = struct {
1389 }1390 }
1390 }1391 }
13911392
1392 pub async fn genBlock(irb: *Builder, block: *ast.Node.Block, parent_scope: *Scope) !*Inst {1393 pub fn genBlock(irb: *Builder, block: *ast.Node.Block, parent_scope: *Scope) !*Inst {
1393 const block_scope = try Scope.Block.create(irb.comp, parent_scope);1394 const block_scope = try Scope.Block.create(irb.comp, parent_scope);
13941395
1395 const outer_block_scope = &block_scope.base;1396 const outer_block_scope = &block_scope.base;
...@@ -1499,7 +1500,7 @@ pub const Builder = struct {...@@ -1499,7 +1500,7 @@ pub const Builder = struct {
1499 return irb.buildConstVoid(child_scope, Span.token(block.rbrace), true);1500 return irb.buildConstVoid(child_scope, Span.token(block.rbrace), true);
1500 }1501 }
15011502
1502 pub async fn genControlFlowExpr(1503 pub fn genControlFlowExpr(
1503 irb: *Builder,1504 irb: *Builder,
1504 control_flow_expr: *ast.Node.ControlFlowExpression,1505 control_flow_expr: *ast.Node.ControlFlowExpression,
1505 scope: *Scope,1506 scope: *Scope,
...@@ -1596,7 +1597,7 @@ pub const Builder = struct {...@@ -1596,7 +1597,7 @@ pub const Builder = struct {
1596 }1597 }
1597 }1598 }
15981599
1599 pub async fn genIdentifier(irb: *Builder, identifier: *ast.Node.Identifier, scope: *Scope, lval: LVal) !*Inst {1600 pub fn genIdentifier(irb: *Builder, identifier: *ast.Node.Identifier, scope: *Scope, lval: LVal) !*Inst {
1600 const src_span = Span.token(identifier.token);1601 const src_span = Span.token(identifier.token);
1601 const name = irb.code.tree_scope.tree.tokenSlice(identifier.token);1602 const name = irb.code.tree_scope.tree.tokenSlice(identifier.token);
16021603
...@@ -1694,7 +1695,7 @@ pub const Builder = struct {...@@ -1694,7 +1695,7 @@ pub const Builder = struct {
1694 return result;1695 return result;
1695 }1696 }
16961697
1697 async fn genDefersForBlock(1698 fn genDefersForBlock(
1698 irb: *Builder,1699 irb: *Builder,
1699 inner_scope: *Scope,1700 inner_scope: *Scope,
1700 outer_scope: *Scope,1701 outer_scope: *Scope,
...@@ -1797,7 +1798,7 @@ pub const Builder = struct {...@@ -1797,7 +1798,7 @@ pub const Builder = struct {
1797 // Look at the params and ref() other instructions1798 // Look at the params and ref() other instructions
1798 comptime var i = 0;1799 comptime var i = 0;
1799 inline while (i < @memberCount(I.Params)) : (i += 1) {1800 inline while (i < @memberCount(I.Params)) : (i += 1) {
1800 const FieldType = comptime @typeOf(@field(I.Params(undefined), @memberName(I.Params, i)));1801 const FieldType = comptime @typeOf(@field(@as(I.Params, undefined), @memberName(I.Params, i)));
1801 switch (FieldType) {1802 switch (FieldType) {
1802 *Inst => @field(inst.params, @memberName(I.Params, i)).ref(self),1803 *Inst => @field(inst.params, @memberName(I.Params, i)).ref(self),
1803 *BasicBlock => @field(inst.params, @memberName(I.Params, i)).ref(self),1804 *BasicBlock => @field(inst.params, @memberName(I.Params, i)).ref(self),
...@@ -1909,7 +1910,7 @@ pub const Builder = struct {...@@ -1909,7 +1910,7 @@ pub const Builder = struct {
1909 VarScope: *Scope.Var,1910 VarScope: *Scope.Var,
1910 };1911 };
19111912
1912 async fn findIdent(irb: *Builder, scope: *Scope, name: []const u8) Ident {1913 fn findIdent(irb: *Builder, scope: *Scope, name: []const u8) Ident {
1913 var s = scope;1914 var s = scope;
1914 while (true) {1915 while (true) {
1915 switch (s.id) {1916 switch (s.id) {
...@@ -2519,7 +2520,7 @@ const Analyze = struct {...@@ -2519,7 +2520,7 @@ const Analyze = struct {
2519 }2520 }
2520};2521};
25212522
2522pub async fn gen(2523pub fn gen(
2523 comp: *Compilation,2524 comp: *Compilation,
2524 body_node: *ast.Node,2525 body_node: *ast.Node,
2525 tree_scope: *Scope.AstTree,2526 tree_scope: *Scope.AstTree,
...@@ -2541,7 +2542,7 @@ pub async fn gen(...@@ -2541,7 +2542,7 @@ pub async fn gen(
2541 return irb.finish();2542 return irb.finish();
2542}2543}
25432544
2544pub async fn analyze(comp: *Compilation, old_code: *Code, expected_type: ?*Type) !*Code {2545pub fn analyze(comp: *Compilation, old_code: *Code, expected_type: ?*Type) !*Code {
2545 const old_entry_bb = old_code.basic_block_list.at(0);2546 const old_entry_bb = old_code.basic_block_list.at(0);
25462547
2547 var ira = try Analyze.init(comp, old_code.tree_scope, expected_type);2548 var ira = try Analyze.init(comp, old_code.tree_scope, expected_type);
src-self-hosted/libc_installation.zig+2-2
...@@ -143,7 +143,7 @@ pub const LibCInstallation = struct {...@@ -143,7 +143,7 @@ pub const LibCInstallation = struct {
143 }143 }
144144
145 /// Finds the default, native libc.145 /// Finds the default, native libc.
146 pub async fn findNative(self: *LibCInstallation, allocator: *Allocator) !void {146 pub fn findNative(self: *LibCInstallation, allocator: *Allocator) !void {
147 self.initEmpty();147 self.initEmpty();
148 var group = event.Group(FindError!void).init(allocator);148 var group = event.Group(FindError!void).init(allocator);
149 errdefer group.wait() catch {};149 errdefer group.wait() catch {};
...@@ -393,7 +393,7 @@ pub const LibCInstallation = struct {...@@ -393,7 +393,7 @@ pub const LibCInstallation = struct {
393};393};
394394
395/// caller owns returned memory395/// caller owns returned memory
396async fn ccPrintFileName(allocator: *Allocator, o_file: []const u8, want_dirname: bool) ![]u8 {396fn ccPrintFileName(allocator: *Allocator, o_file: []const u8, want_dirname: bool) ![]u8 {
397 const cc_exe = std.os.getenv("CC") orelse "cc";397 const cc_exe = std.os.getenv("CC") orelse "cc";
398 const arg1 = try std.fmt.allocPrint(allocator, "-print-file-name={}", o_file);398 const arg1 = try std.fmt.allocPrint(allocator, "-print-file-name={}", o_file);
399 defer allocator.free(arg1);399 defer allocator.free(arg1);
src-self-hosted/link.zig+26-29
...@@ -11,7 +11,7 @@ const util = @import("util.zig");...@@ -11,7 +11,7 @@ const util = @import("util.zig");
11const Context = struct {11const Context = struct {
12 comp: *Compilation,12 comp: *Compilation,
13 arena: std.heap.ArenaAllocator,13 arena: std.heap.ArenaAllocator,
14 args: std.ArrayList([*]const u8),14 args: std.ArrayList([*:0]const u8),
15 link_in_crt: bool,15 link_in_crt: bool,
1616
17 link_err: error{OutOfMemory}!void,17 link_err: error{OutOfMemory}!void,
...@@ -21,7 +21,7 @@ const Context = struct {...@@ -21,7 +21,7 @@ const Context = struct {
21 out_file_path: std.Buffer,21 out_file_path: std.Buffer,
22};22};
2323
24pub async fn link(comp: *Compilation) !void {24pub fn link(comp: *Compilation) !void {
25 var ctx = Context{25 var ctx = Context{
26 .comp = comp,26 .comp = comp,
27 .arena = std.heap.ArenaAllocator.init(comp.gpa()),27 .arena = std.heap.ArenaAllocator.init(comp.gpa()),
...@@ -33,7 +33,7 @@ pub async fn link(comp: *Compilation) !void {...@@ -33,7 +33,7 @@ pub async fn link(comp: *Compilation) !void {
33 .out_file_path = undefined,33 .out_file_path = undefined,
34 };34 };
35 defer ctx.arena.deinit();35 defer ctx.arena.deinit();
36 ctx.args = std.ArrayList([*]const u8).init(&ctx.arena.allocator);36 ctx.args = std.ArrayList([*:0]const u8).init(&ctx.arena.allocator);
37 ctx.link_msg = std.Buffer.initNull(&ctx.arena.allocator);37 ctx.link_msg = std.Buffer.initNull(&ctx.arena.allocator);
3838
39 if (comp.link_out_file) |out_file| {39 if (comp.link_out_file) |out_file| {
...@@ -171,7 +171,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {...@@ -171,7 +171,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {
171 //}171 //}
172172
173 try ctx.args.append("-o");173 try ctx.args.append("-o");
174 try ctx.args.append(ctx.out_file_path.ptr());174 try ctx.args.append(ctx.out_file_path.toSliceConst());
175175
176 if (ctx.link_in_crt) {176 if (ctx.link_in_crt) {
177 const crt1o = if (ctx.comp.is_static) "crt1.o" else "Scrt1.o";177 const crt1o = if (ctx.comp.is_static) "crt1.o" else "Scrt1.o";
...@@ -214,10 +214,11 @@ fn constructLinkerArgsElf(ctx: *Context) !void {...@@ -214,10 +214,11 @@ fn constructLinkerArgsElf(ctx: *Context) !void {
214214
215 if (ctx.comp.haveLibC()) {215 if (ctx.comp.haveLibC()) {
216 try ctx.args.append("-L");216 try ctx.args.append("-L");
217 try ctx.args.append((try std.cstr.addNullByte(&ctx.arena.allocator, ctx.libc.lib_dir.?)).ptr);217 // TODO addNullByte should probably return [:0]u8
218 try ctx.args.append(@ptrCast([*:0]const u8, (try std.cstr.addNullByte(&ctx.arena.allocator, ctx.libc.lib_dir.?)).ptr));
218219
219 try ctx.args.append("-L");220 try ctx.args.append("-L");
220 try ctx.args.append((try std.cstr.addNullByte(&ctx.arena.allocator, ctx.libc.static_lib_dir.?)).ptr);221 try ctx.args.append(@ptrCast([*:0]const u8, (try std.cstr.addNullByte(&ctx.arena.allocator, ctx.libc.static_lib_dir.?)).ptr));
221222
222 if (!ctx.comp.is_static) {223 if (!ctx.comp.is_static) {
223 const dl = blk: {224 const dl = blk: {
...@@ -226,7 +227,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {...@@ -226,7 +227,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {
226 return error.LibCMissingDynamicLinker;227 return error.LibCMissingDynamicLinker;
227 };228 };
228 try ctx.args.append("-dynamic-linker");229 try ctx.args.append("-dynamic-linker");
229 try ctx.args.append((try std.cstr.addNullByte(&ctx.arena.allocator, dl)).ptr);230 try ctx.args.append(@ptrCast([*:0]const u8, (try std.cstr.addNullByte(&ctx.arena.allocator, dl)).ptr));
230 }231 }
231 }232 }
232233
...@@ -238,7 +239,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {...@@ -238,7 +239,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {
238 // .o files239 // .o files
239 for (ctx.comp.link_objects) |link_object| {240 for (ctx.comp.link_objects) |link_object| {
240 const link_obj_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, link_object);241 const link_obj_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, link_object);
241 try ctx.args.append(link_obj_with_null.ptr);242 try ctx.args.append(@ptrCast([*:0]const u8, link_obj_with_null.ptr));
242 }243 }
243 try addFnObjects(ctx);244 try addFnObjects(ctx);
244245
...@@ -313,7 +314,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {...@@ -313,7 +314,7 @@ fn constructLinkerArgsElf(ctx: *Context) !void {
313fn addPathJoin(ctx: *Context, dirname: []const u8, basename: []const u8) !void {314fn addPathJoin(ctx: *Context, dirname: []const u8, basename: []const u8) !void {
314 const full_path = try std.fs.path.join(&ctx.arena.allocator, [_][]const u8{ dirname, basename });315 const full_path = try std.fs.path.join(&ctx.arena.allocator, [_][]const u8{ dirname, basename });
315 const full_path_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, full_path);316 const full_path_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, full_path);
316 try ctx.args.append(full_path_with_null.ptr);317 try ctx.args.append(@ptrCast([*:0]const u8, full_path_with_null.ptr));
317}318}
318319
319fn constructLinkerArgsCoff(ctx: *Context) !void {320fn constructLinkerArgsCoff(ctx: *Context) !void {
...@@ -339,12 +340,12 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {...@@ -339,12 +340,12 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
339 const is_library = ctx.comp.kind == .Lib;340 const is_library = ctx.comp.kind == .Lib;
340341
341 const out_arg = try std.fmt.allocPrint(&ctx.arena.allocator, "-OUT:{}\x00", ctx.out_file_path.toSliceConst());342 const out_arg = try std.fmt.allocPrint(&ctx.arena.allocator, "-OUT:{}\x00", ctx.out_file_path.toSliceConst());
342 try ctx.args.append(out_arg.ptr);343 try ctx.args.append(@ptrCast([*:0]const u8, out_arg.ptr));
343344
344 if (ctx.comp.haveLibC()) {345 if (ctx.comp.haveLibC()) {
345 try ctx.args.append((try std.fmt.allocPrint(&ctx.arena.allocator, "-LIBPATH:{}\x00", ctx.libc.msvc_lib_dir.?)).ptr);346 try ctx.args.append(@ptrCast([*:0]const u8, (try std.fmt.allocPrint(&ctx.arena.allocator, "-LIBPATH:{}\x00", ctx.libc.msvc_lib_dir.?)).ptr));
346 try ctx.args.append((try std.fmt.allocPrint(&ctx.arena.allocator, "-LIBPATH:{}\x00", ctx.libc.kernel32_lib_dir.?)).ptr);347 try ctx.args.append(@ptrCast([*:0]const u8, (try std.fmt.allocPrint(&ctx.arena.allocator, "-LIBPATH:{}\x00", ctx.libc.kernel32_lib_dir.?)).ptr));
347 try ctx.args.append((try std.fmt.allocPrint(&ctx.arena.allocator, "-LIBPATH:{}\x00", ctx.libc.lib_dir.?)).ptr);348 try ctx.args.append(@ptrCast([*:0]const u8, (try std.fmt.allocPrint(&ctx.arena.allocator, "-LIBPATH:{}\x00", ctx.libc.lib_dir.?)).ptr));
348 }349 }
349350
350 if (ctx.link_in_crt) {351 if (ctx.link_in_crt) {
...@@ -353,17 +354,17 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {...@@ -353,17 +354,17 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
353354
354 if (ctx.comp.is_static) {355 if (ctx.comp.is_static) {
355 const cmt_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "libcmt{}.lib\x00", d_str);356 const cmt_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "libcmt{}.lib\x00", d_str);
356 try ctx.args.append(cmt_lib_name.ptr);357 try ctx.args.append(@ptrCast([*:0]const u8, cmt_lib_name.ptr));
357 } else {358 } else {
358 const msvcrt_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "msvcrt{}.lib\x00", d_str);359 const msvcrt_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "msvcrt{}.lib\x00", d_str);
359 try ctx.args.append(msvcrt_lib_name.ptr);360 try ctx.args.append(@ptrCast([*:0]const u8, msvcrt_lib_name.ptr));
360 }361 }
361362
362 const vcruntime_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "{}vcruntime{}.lib\x00", lib_str, d_str);363 const vcruntime_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "{}vcruntime{}.lib\x00", lib_str, d_str);
363 try ctx.args.append(vcruntime_lib_name.ptr);364 try ctx.args.append(@ptrCast([*:0]const u8, vcruntime_lib_name.ptr));
364365
365 const crt_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "{}ucrt{}.lib\x00", lib_str, d_str);366 const crt_lib_name = try std.fmt.allocPrint(&ctx.arena.allocator, "{}ucrt{}.lib\x00", lib_str, d_str);
366 try ctx.args.append(crt_lib_name.ptr);367 try ctx.args.append(@ptrCast([*:0]const u8, crt_lib_name.ptr));
367368
368 // Visual C++ 2015 Conformance Changes369 // Visual C++ 2015 Conformance Changes
369 // https://msdn.microsoft.com/en-us/library/bb531344.aspx370 // https://msdn.microsoft.com/en-us/library/bb531344.aspx
...@@ -395,7 +396,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {...@@ -395,7 +396,7 @@ fn constructLinkerArgsCoff(ctx: *Context) !void {
395396
396 for (ctx.comp.link_objects) |link_object| {397 for (ctx.comp.link_objects) |link_object| {
397 const link_obj_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, link_object);398 const link_obj_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, link_object);
398 try ctx.args.append(link_obj_with_null.ptr);399 try ctx.args.append(@ptrCast([*:0]const u8, link_obj_with_null.ptr));
399 }400 }
400 try addFnObjects(ctx);401 try addFnObjects(ctx);
401402
...@@ -504,11 +505,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {...@@ -504,11 +505,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
504 //}505 //}
505506
506 try ctx.args.append("-arch");507 try ctx.args.append("-arch");
507 const darwin_arch_str = try std.cstr.addNullByte(508 try ctx.args.append(util.getDarwinArchString(ctx.comp.target));
508 &ctx.arena.allocator,
509 ctx.comp.target.getDarwinArchString(),
510 );
511 try ctx.args.append(darwin_arch_str.ptr);
512509
513 const platform = try DarwinPlatform.get(ctx.comp);510 const platform = try DarwinPlatform.get(ctx.comp);
514 switch (platform.kind) {511 switch (platform.kind) {
...@@ -517,7 +514,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {...@@ -517,7 +514,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
517 .IPhoneOSSimulator => try ctx.args.append("-ios_simulator_version_min"),514 .IPhoneOSSimulator => try ctx.args.append("-ios_simulator_version_min"),
518 }515 }
519 const ver_str = try std.fmt.allocPrint(&ctx.arena.allocator, "{}.{}.{}\x00", platform.major, platform.minor, platform.micro);516 const ver_str = try std.fmt.allocPrint(&ctx.arena.allocator, "{}.{}.{}\x00", platform.major, platform.minor, platform.micro);
520 try ctx.args.append(ver_str.ptr);517 try ctx.args.append(@ptrCast([*:0]const u8, ver_str.ptr));
521518
522 if (ctx.comp.kind == .Exe) {519 if (ctx.comp.kind == .Exe) {
523 if (ctx.comp.is_static) {520 if (ctx.comp.is_static) {
...@@ -528,7 +525,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {...@@ -528,7 +525,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
528 }525 }
529526
530 try ctx.args.append("-o");527 try ctx.args.append("-o");
531 try ctx.args.append(ctx.out_file_path.ptr());528 try ctx.args.append(ctx.out_file_path.toSliceConst());
532529
533 //for (size_t i = 0; i < g->rpath_list.length; i += 1) {530 //for (size_t i = 0; i < g->rpath_list.length; i += 1) {
534 // Buf *rpath = g->rpath_list.at(i);531 // Buf *rpath = g->rpath_list.at(i);
...@@ -572,7 +569,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {...@@ -572,7 +569,7 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
572569
573 for (ctx.comp.link_objects) |link_object| {570 for (ctx.comp.link_objects) |link_object| {
574 const link_obj_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, link_object);571 const link_obj_with_null = try std.cstr.addNullByte(&ctx.arena.allocator, link_object);
575 try ctx.args.append(link_obj_with_null.ptr);572 try ctx.args.append(@ptrCast([*:0]const u8, link_obj_with_null.ptr));
576 }573 }
577 try addFnObjects(ctx);574 try addFnObjects(ctx);
578575
...@@ -593,10 +590,10 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {...@@ -593,10 +590,10 @@ fn constructLinkerArgsMachO(ctx: *Context) !void {
593 } else {590 } else {
594 if (mem.indexOfScalar(u8, lib.name, '/') == null) {591 if (mem.indexOfScalar(u8, lib.name, '/') == null) {
595 const arg = try std.fmt.allocPrint(&ctx.arena.allocator, "-l{}\x00", lib.name);592 const arg = try std.fmt.allocPrint(&ctx.arena.allocator, "-l{}\x00", lib.name);
596 try ctx.args.append(arg.ptr);593 try ctx.args.append(@ptrCast([*:0]const u8, arg.ptr));
597 } else {594 } else {
598 const arg = try std.cstr.addNullByte(&ctx.arena.allocator, lib.name);595 const arg = try std.cstr.addNullByte(&ctx.arena.allocator, lib.name);
599 try ctx.args.append(arg.ptr);596 try ctx.args.append(@ptrCast([*:0]const u8, arg.ptr));
600 }597 }
601 }598 }
602 }599 }
...@@ -639,7 +636,7 @@ fn addFnObjects(ctx: *Context) !void {...@@ -639,7 +636,7 @@ fn addFnObjects(ctx: *Context) !void {
639 ctx.comp.gpa().destroy(node);636 ctx.comp.gpa().destroy(node);
640 continue;637 continue;
641 };638 };
642 try ctx.args.append(fn_val.containing_object.ptr());639 try ctx.args.append(fn_val.containing_object.toSliceConst());
643 it = node.next;640 it = node.next;
644 }641 }
645}642}
src-self-hosted/llvm.zig+1-1
...@@ -86,7 +86,7 @@ pub const AddGlobal = LLVMAddGlobal;...@@ -86,7 +86,7 @@ pub const AddGlobal = LLVMAddGlobal;
86extern fn LLVMAddGlobal(M: *Module, Ty: *Type, Name: [*:0]const u8) ?*Value;86extern fn LLVMAddGlobal(M: *Module, Ty: *Type, Name: [*:0]const u8) ?*Value;
8787
88pub const ConstStringInContext = LLVMConstStringInContext;88pub const ConstStringInContext = LLVMConstStringInContext;
89extern fn LLVMConstStringInContext(C: *Context, Str: [*:0]const u8, Length: c_uint, DontNullTerminate: Bool) ?*Value;89extern fn LLVMConstStringInContext(C: *Context, Str: [*]const u8, Length: c_uint, DontNullTerminate: Bool) ?*Value;
9090
91pub const ConstInt = LLVMConstInt;91pub const ConstInt = LLVMConstInt;
92extern fn LLVMConstInt(IntTy: *Type, N: c_ulonglong, SignExtend: Bool) ?*Value;92extern fn LLVMConstInt(IntTy: *Type, N: c_ulonglong, SignExtend: Bool) ?*Value;
src-self-hosted/main.zig+49-65
...@@ -126,7 +126,8 @@ pub fn main() !void {...@@ -126,7 +126,8 @@ pub fn main() !void {
126126
127 try stderr.print("unknown command: {}\n\n", args[1]);127 try stderr.print("unknown command: {}\n\n", args[1]);
128 try stderr.write(usage);128 try stderr.write(usage);
129 process.exit(1);129 process.argsFree(allocator, args);
130 defer process.exit(1);
130}131}
131132
132const usage_build_generic =133const usage_build_generic =
...@@ -461,13 +462,12 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co...@@ -461,13 +462,12 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co
461 comp.link_objects = link_objects;462 comp.link_objects = link_objects;
462463
463 comp.start();464 comp.start();
464 const frame = async processBuildEvents(comp, color);465 processBuildEvents(comp, color);
465}466}
466467
467async fn processBuildEvents(comp: *Compilation, color: errmsg.Color) void {468fn processBuildEvents(comp: *Compilation, color: errmsg.Color) void {
468 var count: usize = 0;469 var count: usize = 0;
469 while (true) {470 while (true) { // TODO(Vexu)
470 // TODO directly awaiting async should guarantee memory allocation elision
471 const build_event = comp.events.get();471 const build_event = comp.events.get();
472 count += 1;472 count += 1;
473473
...@@ -567,10 +567,6 @@ fn cmdLibC(allocator: *Allocator, args: []const []const u8) !void {...@@ -567,10 +567,6 @@ fn cmdLibC(allocator: *Allocator, args: []const []const u8) !void {
567 var zig_compiler = try ZigCompiler.init(allocator);567 var zig_compiler = try ZigCompiler.init(allocator);
568 defer zig_compiler.deinit();568 defer zig_compiler.deinit();
569569
570 const frame = async findLibCAsync(&zig_compiler);
571}
572
573async fn findLibCAsync(zig_compiler: *ZigCompiler) void {
574 const libc = zig_compiler.getNativeLibC() catch |err| {570 const libc = zig_compiler.getNativeLibC() catch |err| {
575 stderr.print("unable to find libc: {}\n", @errorName(err)) catch process.exit(1);571 stderr.print("unable to find libc: {}\n", @errorName(err)) catch process.exit(1);
576 process.exit(1);572 process.exit(1);
...@@ -644,11 +640,23 @@ fn cmdFmt(allocator: *Allocator, args: []const []const u8) !void {...@@ -644,11 +640,23 @@ fn cmdFmt(allocator: *Allocator, args: []const []const u8) !void {
644 process.exit(1);640 process.exit(1);
645 }641 }
646642
647 return asyncFmtMain(643 var fmt = Fmt{
648 allocator,644 .allocator = allocator,
649 &flags,645 .seen = event.Locked(Fmt.SeenMap).init(Fmt.SeenMap.init(allocator)),
650 color,646 .any_error = false,
651 );647 .color = color,
648 };
649
650 const check_mode = flags.present("check");
651
652 var group = event.Group(FmtError!void).init(allocator);
653 for (flags.positionals.toSliceConst()) |file_path| {
654 try group.call(fmtPath, &fmt, file_path, check_mode);
655 }
656 try group.wait();
657 if (fmt.any_error) {
658 process.exit(1);
659 }
652}660}
653661
654const FmtError = error{662const FmtError = error{
...@@ -673,30 +681,6 @@ const FmtError = error{...@@ -673,30 +681,6 @@ const FmtError = error{
673 CurrentWorkingDirectoryUnlinked,681 CurrentWorkingDirectoryUnlinked,
674} || fs.File.OpenError;682} || fs.File.OpenError;
675683
676async fn asyncFmtMain(
677 allocator: *Allocator,
678 flags: *const Args,
679 color: errmsg.Color,
680) FmtError!void {
681 var fmt = Fmt{
682 .allocator = allocator,
683 .seen = event.Locked(Fmt.SeenMap).init(Fmt.SeenMap.init(allocator)),
684 .any_error = false,
685 .color = color,
686 };
687
688 const check_mode = flags.present("check");
689
690 var group = event.Group(FmtError!void).init(allocator);
691 for (flags.positionals.toSliceConst()) |file_path| {
692 try group.call(fmtPath, &fmt, file_path, check_mode);
693 }
694 try group.wait();
695 if (fmt.any_error) {
696 process.exit(1);
697 }
698}
699
700async fn fmtPath(fmt: *Fmt, file_path_ref: []const u8, check_mode: bool) FmtError!void {684async fn fmtPath(fmt: *Fmt, file_path_ref: []const u8, check_mode: bool) FmtError!void {
701 const file_path = try std.mem.dupe(fmt.allocator, u8, file_path_ref);685 const file_path = try std.mem.dupe(fmt.allocator, u8, file_path_ref);
702 defer fmt.allocator.free(file_path);686 defer fmt.allocator.free(file_path);
...@@ -708,33 +692,33 @@ async fn fmtPath(fmt: *Fmt, file_path_ref: []const u8, check_mode: bool) FmtErro...@@ -708,33 +692,33 @@ async fn fmtPath(fmt: *Fmt, file_path_ref: []const u8, check_mode: bool) FmtErro
708 if (try held.value.put(file_path, {})) |_| return;692 if (try held.value.put(file_path, {})) |_| return;
709 }693 }
710694
711 const source_code = "";695 const source_code = event.fs.readFile(
712 // const source_code = event.fs.readFile(696 fmt.allocator,
713 // file_path,697 file_path,
714 // max_src_size,698 max_src_size,
715 // ) catch |err| switch (err) {699 ) catch |err| switch (err) {
716 // error.IsDir, error.AccessDenied => {700 error.IsDir, error.AccessDenied => {
717 // // TODO make event based (and dir.next())701 var dir = try fs.Dir.cwd().openDirList(file_path);
718 // var dir = try fs.Dir.cwd().openDirList(file_path);702 defer dir.close();
719 // defer dir.close();703
720704 var group = event.Group(FmtError!void).init(fmt.allocator);
721 // var group = event.Group(FmtError!void).init(fmt.allocator);705 var it = dir.iterate();
722 // while (try dir.next()) |entry| {706 while (try it.next()) |entry| {
723 // if (entry.kind == fs.Dir.Entry.Kind.Directory or mem.endsWith(u8, entry.name, ".zig")) {707 if (entry.kind == .Directory or mem.endsWith(u8, entry.name, ".zig")) {
724 // const full_path = try fs.path.join(fmt.allocator, [_][]const u8{ file_path, entry.name });708 const full_path = try fs.path.join(fmt.allocator, [_][]const u8{ file_path, entry.name });
725 // try group.call(fmtPath, fmt, full_path, check_mode);709 try group.call(fmtPath, fmt, full_path, check_mode);
726 // }710 }
727 // }711 }
728 // return group.wait();712 return group.wait();
729 // },713 },
730 // else => {714 else => {
731 // // TODO lock stderr printing715 // TODO lock stderr printing
732 // try stderr.print("unable to open '{}': {}\n", file_path, err);716 try stderr.print("unable to open '{}': {}\n", file_path, err);
733 // fmt.any_error = true;717 fmt.any_error = true;
734 // return;718 return;
735 // },719 },
736 // };720 };
737 // defer fmt.allocator.free(source_code);721 defer fmt.allocator.free(source_code);
738722
739 const tree = std.zig.parse(fmt.allocator, source_code) catch |err| {723 const tree = std.zig.parse(fmt.allocator, source_code) catch |err| {
740 try stderr.print("error parsing file '{}': {}\n", file_path, err);724 try stderr.print("error parsing file '{}': {}\n", file_path, err);
src-self-hosted/test.zig+4-7
...@@ -116,7 +116,7 @@ pub const TestContext = struct {...@@ -116,7 +116,7 @@ pub const TestContext = struct {
116 const file_index = try std.fmt.bufPrint(file_index_buf[0..], "{}", self.file_index.incr());116 const file_index = try std.fmt.bufPrint(file_index_buf[0..], "{}", self.file_index.incr());
117 const file1_path = try std.fs.path.join(allocator, [_][]const u8{ tmp_dir_name, file_index, file1 });117 const file1_path = try std.fs.path.join(allocator, [_][]const u8{ tmp_dir_name, file_index, file1 });
118118
119 const output_file = try std.fmt.allocPrint(allocator, "{}-out{}", file1_path, (Target{.Native = {}}).exeFileExt());119 const output_file = try std.fmt.allocPrint(allocator, "{}-out{}", file1_path, (Target{ .Native = {} }).exeFileExt());
120 if (std.fs.path.dirname(file1_path)) |dirname| {120 if (std.fs.path.dirname(file1_path)) |dirname| {
121 try std.fs.makePath(allocator, dirname);121 try std.fs.makePath(allocator, dirname);
122 }122 }
...@@ -148,15 +148,12 @@ pub const TestContext = struct {...@@ -148,15 +148,12 @@ pub const TestContext = struct {
148 exe_file: []const u8,148 exe_file: []const u8,
149 expected_output: []const u8,149 expected_output: []const u8,
150 ) anyerror!void {150 ) anyerror!void {
151 // TODO this should not be necessary
152 const exe_file_2 = try std.mem.dupe(allocator, u8, exe_file);
153
154 defer comp.destroy();151 defer comp.destroy();
155 const build_event = comp.events.get();152 const build_event = comp.events.get();
156153
157 switch (build_event) {154 switch (build_event) {
158 .Ok => {155 .Ok => {
159 const argv = [_][]const u8{exe_file_2};156 const argv = [_][]const u8{exe_file};
160 // TODO use event loop157 // TODO use event loop
161 const child = try std.ChildProcess.exec(allocator, argv, null, null, 1024 * 1024);158 const child = try std.ChildProcess.exec(allocator, argv, null, null, 1024 * 1024);
162 switch (child.term) {159 switch (child.term) {
...@@ -173,8 +170,8 @@ pub const TestContext = struct {...@@ -173,8 +170,8 @@ pub const TestContext = struct {
173 return error.OutputMismatch;170 return error.OutputMismatch;
174 }171 }
175 },172 },
176 Compilation.Event.Error => |err| return err,173 .Error => |err| return err,
177 Compilation.Event.Fail => |msgs| {174 .Fail => |msgs| {
178 const stderr = std.io.getStdErr();175 const stderr = std.io.getStdErr();
179 try stderr.write("build incorrectly failed:\n");176 try stderr.write("build incorrectly failed:\n");
180 for (msgs) |msg| {177 for (msgs) |msg| {
src-self-hosted/type.zig+11-11
...@@ -53,7 +53,7 @@ pub const Type = struct {...@@ -53,7 +53,7 @@ pub const Type = struct {
53 base: *Type,53 base: *Type,
54 allocator: *Allocator,54 allocator: *Allocator,
55 llvm_context: *llvm.Context,55 llvm_context: *llvm.Context,
56 ) (error{OutOfMemory}!*llvm.Type) {56 ) error{OutOfMemory}!*llvm.Type {
57 switch (base.id) {57 switch (base.id) {
58 .Struct => return @fieldParentPtr(Struct, "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),59 .Fn => return @fieldParentPtr(Fn, "base", base).getLlvmType(allocator, llvm_context),
...@@ -184,7 +184,7 @@ pub const Type = struct {...@@ -184,7 +184,7 @@ pub const Type = struct {
184184
185 /// If you happen to have an llvm context handy, use getAbiAlignmentInContext instead.185 /// If you happen to have an llvm context handy, use getAbiAlignmentInContext instead.
186 /// Otherwise, this one will grab one from the pool and then release it.186 /// Otherwise, this one will grab one from the pool and then release it.
187 pub async fn getAbiAlignment(base: *Type, comp: *Compilation) !u32 {187 pub fn getAbiAlignment(base: *Type, comp: *Compilation) !u32 {
188 if (base.abi_alignment.start()) |ptr| return ptr.*;188 if (base.abi_alignment.start()) |ptr| return ptr.*;
189189
190 {190 {
...@@ -200,7 +200,7 @@ pub const Type = struct {...@@ -200,7 +200,7 @@ pub const Type = struct {
200 }200 }
201201
202 /// If you have an llvm conext handy, you can use it here.202 /// If you have an llvm conext handy, you can use it here.
203 pub async fn getAbiAlignmentInContext(base: *Type, comp: *Compilation, llvm_context: *llvm.Context) !u32 {203 pub fn getAbiAlignmentInContext(base: *Type, comp: *Compilation, llvm_context: *llvm.Context) !u32 {
204 if (base.abi_alignment.start()) |ptr| return ptr.*;204 if (base.abi_alignment.start()) |ptr| return ptr.*;
205205
206 base.abi_alignment.data = base.resolveAbiAlignment(comp, llvm_context);206 base.abi_alignment.data = base.resolveAbiAlignment(comp, llvm_context);
...@@ -209,7 +209,7 @@ pub const Type = struct {...@@ -209,7 +209,7 @@ pub const Type = struct {
209 }209 }
210210
211 /// Lower level function that does the work. See getAbiAlignment.211 /// Lower level function that does the work. See getAbiAlignment.
212 async fn resolveAbiAlignment(base: *Type, comp: *Compilation, llvm_context: *llvm.Context) !u32 {212 fn resolveAbiAlignment(base: *Type, comp: *Compilation, llvm_context: *llvm.Context) !u32 {
213 const llvm_type = try base.getLlvmType(comp.gpa(), llvm_context);213 const llvm_type = try base.getLlvmType(comp.gpa(), llvm_context);
214 return @intCast(u32, llvm.ABIAlignmentOfType(comp.target_data_ref, llvm_type));214 return @intCast(u32, llvm.ABIAlignmentOfType(comp.target_data_ref, llvm_type));
215 }215 }
...@@ -367,7 +367,7 @@ pub const Type = struct {...@@ -367,7 +367,7 @@ pub const Type = struct {
367 }367 }
368368
369 /// takes ownership of key.Normal.params on success369 /// takes ownership of key.Normal.params on success
370 pub async fn get(comp: *Compilation, key: Key) !*Fn {370 pub fn get(comp: *Compilation, key: Key) !*Fn {
371 {371 {
372 const held = comp.fn_type_table.acquire();372 const held = comp.fn_type_table.acquire();
373 defer held.release();373 defer held.release();
...@@ -564,7 +564,7 @@ pub const Type = struct {...@@ -564,7 +564,7 @@ pub const Type = struct {
564 return comp.u8_type;564 return comp.u8_type;
565 }565 }
566566
567 pub async fn get(comp: *Compilation, key: Key) !*Int {567 pub fn get(comp: *Compilation, key: Key) !*Int {
568 {568 {
569 const held = comp.int_type_table.acquire();569 const held = comp.int_type_table.acquire();
570 defer held.release();570 defer held.release();
...@@ -606,7 +606,7 @@ pub const Type = struct {...@@ -606,7 +606,7 @@ pub const Type = struct {
606 comp.registerGarbage(Int, &self.garbage_node);606 comp.registerGarbage(Int, &self.garbage_node);
607 }607 }
608608
609 pub async fn gcDestroy(self: *Int, comp: *Compilation) void {609 pub fn gcDestroy(self: *Int, comp: *Compilation) void {
610 {610 {
611 const held = comp.int_type_table.acquire();611 const held = comp.int_type_table.acquire();
612 defer held.release();612 defer held.release();
...@@ -700,7 +700,7 @@ pub const Type = struct {...@@ -700,7 +700,7 @@ pub const Type = struct {
700 comp.registerGarbage(Pointer, &self.garbage_node);700 comp.registerGarbage(Pointer, &self.garbage_node);
701 }701 }
702702
703 pub async fn gcDestroy(self: *Pointer, comp: *Compilation) void {703 pub fn gcDestroy(self: *Pointer, comp: *Compilation) void {
704 {704 {
705 const held = comp.ptr_type_table.acquire();705 const held = comp.ptr_type_table.acquire();
706 defer held.release();706 defer held.release();
...@@ -711,14 +711,14 @@ pub const Type = struct {...@@ -711,14 +711,14 @@ pub const Type = struct {
711 comp.gpa().destroy(self);711 comp.gpa().destroy(self);
712 }712 }
713713
714 pub async fn getAlignAsInt(self: *Pointer, comp: *Compilation) u32 {714 pub fn getAlignAsInt(self: *Pointer, comp: *Compilation) u32 {
715 switch (self.key.alignment) {715 switch (self.key.alignment) {
716 .Abi => return self.key.child_type.getAbiAlignment(comp),716 .Abi => return self.key.child_type.getAbiAlignment(comp),
717 .Override => |alignment| return alignment,717 .Override => |alignment| return alignment,
718 }718 }
719 }719 }
720720
721 pub async fn get(721 pub fn get(
722 comp: *Compilation,722 comp: *Compilation,
723 key: Key,723 key: Key,
724 ) !*Pointer {724 ) !*Pointer {
...@@ -828,7 +828,7 @@ pub const Type = struct {...@@ -828,7 +828,7 @@ pub const Type = struct {
828 comp.gpa().destroy(self);828 comp.gpa().destroy(self);
829 }829 }
830830
831 pub async fn get(comp: *Compilation, key: Key) !*Array {831 pub fn get(comp: *Compilation, key: Key) !*Array {
832 key.elem_type.base.ref();832 key.elem_type.base.ref();
833 errdefer key.elem_type.base.deref(comp);833 errdefer key.elem_type.base.deref(comp);
834834
src-self-hosted/util.zig+12-11
...@@ -32,21 +32,21 @@ pub fn getFloatAbi(self: Target) FloatAbi {...@@ -32,21 +32,21 @@ pub fn getFloatAbi(self: Target) FloatAbi {
32 };32 };
33}33}
3434
35pub fn getObjectFormat(self: Target) Target.ObjectFormat {35pub fn getObjectFormat(target: Target) Target.ObjectFormat {
36 return switch (self) {36 switch (target) {
37 .Native => @import("builtin").object_format,37 .Native => return @import("builtin").object_format,
38 .Cross => {38 .Cross => blk: {
39 if (target.isWindows() or target.isUefi()) {39 if (target.isWindows() or target.isUefi()) {
40 break .coff;40 return .coff;
41 } else if (target.isDarwin()) {41 } else if (target.isDarwin()) {
42 break .macho;42 return .macho;
43 }43 }
44 if (target.isWasm()) {44 if (target.isWasm()) {
45 break .wasm;45 return .wasm;
46 }46 }
47 break .elf;47 return .elf;
48 },48 },
49 };49 }
50}50}
5151
52pub fn getDynamicLinkerPath(self: Target) ?[]const u8 {52pub fn getDynamicLinkerPath(self: Target) ?[]const u8 {
...@@ -156,7 +156,7 @@ pub fn getDynamicLinkerPath(self: Target) ?[]const u8 {...@@ -156,7 +156,7 @@ pub fn getDynamicLinkerPath(self: Target) ?[]const u8 {
156 }156 }
157}157}
158158
159pub fn getDarwinArchString(self: Target) []const u8 {159pub fn getDarwinArchString(self: Target) [:0]const u8 {
160 const arch = self.getArch();160 const arch = self.getArch();
161 switch (arch) {161 switch (arch) {
162 .aarch64 => return "arm64",162 .aarch64 => return "arm64",
...@@ -166,7 +166,8 @@ pub fn getDarwinArchString(self: Target) []const u8 {...@@ -166,7 +166,8 @@ pub fn getDarwinArchString(self: Target) []const u8 {
166 .powerpc => return "ppc",166 .powerpc => return "ppc",
167 .powerpc64 => return "ppc64",167 .powerpc64 => return "ppc64",
168 .powerpc64le => return "ppc64le",168 .powerpc64le => return "ppc64le",
169 else => return @tagName(arch),169 // @tagName should be able to return sentinel terminated slice
170 else => @panic("TODO"), //return @tagName(arch),
170 }171 }
171}172}
172173
src-self-hosted/value.zig+6-6
...@@ -156,7 +156,7 @@ pub const Value = struct {...@@ -156,7 +156,7 @@ pub const Value = struct {
156 const llvm_fn_type = try self.base.typ.getLlvmType(ofile.arena, ofile.context);156 const llvm_fn_type = try self.base.typ.getLlvmType(ofile.arena, ofile.context);
157 const llvm_fn = llvm.AddFunction(157 const llvm_fn = llvm.AddFunction(
158 ofile.module,158 ofile.module,
159 self.symbol_name.ptr(),159 self.symbol_name.toSliceConst(),
160 llvm_fn_type,160 llvm_fn_type,
161 ) orelse return error.OutOfMemory;161 ) orelse return error.OutOfMemory;
162162
...@@ -241,7 +241,7 @@ pub const Value = struct {...@@ -241,7 +241,7 @@ pub const Value = struct {
241 const llvm_fn_type = try self.base.typ.getLlvmType(ofile.arena, ofile.context);241 const llvm_fn_type = try self.base.typ.getLlvmType(ofile.arena, ofile.context);
242 const llvm_fn = llvm.AddFunction(242 const llvm_fn = llvm.AddFunction(
243 ofile.module,243 ofile.module,
244 self.symbol_name.ptr(),244 self.symbol_name.toSliceConst(),
245 llvm_fn_type,245 llvm_fn_type,
246 ) orelse return error.OutOfMemory;246 ) orelse return error.OutOfMemory;
247247
...@@ -334,7 +334,7 @@ pub const Value = struct {...@@ -334,7 +334,7 @@ pub const Value = struct {
334 field_index: usize,334 field_index: usize,
335 };335 };
336336
337 pub async fn createArrayElemPtr(337 pub fn createArrayElemPtr(
338 comp: *Compilation,338 comp: *Compilation,
339 array_val: *Array,339 array_val: *Array,
340 mut: Type.Pointer.Mut,340 mut: Type.Pointer.Mut,
...@@ -390,13 +390,13 @@ pub const Value = struct {...@@ -390,13 +390,13 @@ pub const Value = struct {
390 const array_llvm_value = (try base_array.val.getLlvmConst(ofile)).?;390 const array_llvm_value = (try base_array.val.getLlvmConst(ofile)).?;
391 const ptr_bit_count = ofile.comp.target_ptr_bits;391 const ptr_bit_count = ofile.comp.target_ptr_bits;
392 const usize_llvm_type = llvm.IntTypeInContext(ofile.context, ptr_bit_count) orelse return error.OutOfMemory;392 const usize_llvm_type = llvm.IntTypeInContext(ofile.context, ptr_bit_count) orelse return error.OutOfMemory;
393 const indices = [_]*llvm.Value{393 var indices = [_]*llvm.Value{
394 llvm.ConstNull(usize_llvm_type) orelse return error.OutOfMemory,394 llvm.ConstNull(usize_llvm_type) orelse return error.OutOfMemory,
395 llvm.ConstInt(usize_llvm_type, base_array.elem_index, 0) orelse return error.OutOfMemory,395 llvm.ConstInt(usize_llvm_type, base_array.elem_index, 0) orelse return error.OutOfMemory,
396 };396 };
397 return llvm.ConstInBoundsGEP(397 return llvm.ConstInBoundsGEP(
398 array_llvm_value,398 array_llvm_value,
399 &indices,399 @ptrCast([*]*llvm.Value, &indices),
400 @intCast(c_uint, indices.len),400 @intCast(c_uint, indices.len),
401 ) orelse return error.OutOfMemory;401 ) orelse return error.OutOfMemory;
402 },402 },
...@@ -423,7 +423,7 @@ pub const Value = struct {...@@ -423,7 +423,7 @@ pub const Value = struct {
423 };423 };
424424
425 /// Takes ownership of buffer425 /// Takes ownership of buffer
426 pub async fn createOwnedBuffer(comp: *Compilation, buffer: []u8) !*Array {426 pub fn createOwnedBuffer(comp: *Compilation, buffer: []u8) !*Array {
427 const u8_type = Type.Int.get_u8(comp);427 const u8_type = Type.Int.get_u8(comp);
428 defer u8_type.base.base.deref(comp);428 defer u8_type.base.base.deref(comp);
429429