authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-23 20:15:59+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2019-11-23 21:57:24+02:00
logd40f204ec05d5913046c17ae46bba3b14cdaf384
tree15df55915afb4a7dad4ee55ab39fa911ba4e658e
parent133579d7c05a92e33bd8a4cfaf5c460f48150de7
signaturelock-open Commit is signed but in an unrecognized format.

self hosted compiler: small miscellaneous fixes


10 files changed, 62 insertions(+), 53 deletions(-)

src-self-hosted/codegen.zig+5-4
...@@ -6,6 +6,7 @@ const ir = @import("ir.zig");...@@ -6,6 +6,7 @@ const ir = @import("ir.zig");
6const Value = @import("value.zig").Value;6const Value = @import("value.zig").Value;
7const Type = @import("type.zig").Type;7const Type = @import("type.zig").Type;
8const Scope = @import("scope.zig").Scope;8const Scope = @import("scope.zig").Scope;
9const util = @import("util.zig");
9const event = std.event;10const event = std.event;
10const assert = std.debug.assert;11const assert = std.debug.assert;
11const DW = std.dwarf;12const DW = std.dwarf;
...@@ -30,11 +31,11 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)...@@ -30,11 +31,11 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code)
30 llvm.SetTarget(module, comp.llvm_triple.ptr());31 llvm.SetTarget(module, comp.llvm_triple.ptr());
31 llvm.SetDataLayout(module, comp.target_layout_str);32 llvm.SetDataLayout(module, comp.target_layout_str);
3233
33 // if (comp.target.getObjectFormat() == .coff) {34 if (util.getObjectFormat(comp.target) == .coff) {
34 // llvm.AddModuleCodeViewFlag(module);35 llvm.AddModuleCodeViewFlag(module);
35 // } else {36 } else {
36 llvm.AddModuleDebugInfoFlag(module);37 llvm.AddModuleDebugInfoFlag(module);
37 // }38 }
3839
39 const builder = llvm.CreateBuilderInContext(context) orelse return error.OutOfMemory;40 const builder = llvm.CreateBuilderInContext(context) orelse return error.OutOfMemory;
40 defer llvm.DisposeBuilder(builder);41 defer llvm.DisposeBuilder(builder);
src-self-hosted/compilation.zig-1
...@@ -858,7 +858,6 @@ pub const Compilation = struct {...@@ -858,7 +858,6 @@ pub const Compilation = struct {
858 defer locked_table.release();858 defer locked_table.release();
859859
860 var decl_group = event.Group(BuildError!void).init(self.gpa());860 var decl_group = event.Group(BuildError!void).init(self.gpa());
861 defer decl_group.wait() catch {};
862861
863 try self.rebuildChangedDecls(862 try self.rebuildChangedDecls(
864 &decl_group,863 &decl_group,
src-self-hosted/libc_installation.zig+1-1
...@@ -146,7 +146,7 @@ pub const LibCInstallation = struct {...@@ -146,7 +146,7 @@ pub const LibCInstallation = struct {
146 pub async fn findNative(self: *LibCInstallation, allocator: *Allocator) !void {146 pub async 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.deinit();149 errdefer group.wait() catch {};
150 var windows_sdk: ?*c.ZigWindowsSDK = null;150 var windows_sdk: ?*c.ZigWindowsSDK = null;
151 errdefer if (windows_sdk) |sdk| c.zig_free_windows_sdk(@ptrCast(?[*]c.ZigWindowsSDK, sdk));151 errdefer if (windows_sdk) |sdk| c.zig_free_windows_sdk(@ptrCast(?[*]c.ZigWindowsSDK, sdk));
152152
src-self-hosted/link.zig+8-9
...@@ -78,7 +78,7 @@ pub async fn link(comp: *Compilation) !void {...@@ -78,7 +78,7 @@ pub async fn link(comp: *Compilation) !void {
78 std.debug.warn("\n");78 std.debug.warn("\n");
79 }79 }
8080
81 const extern_ofmt = toExternObjectFormatType(.elf); //comp.target.getObjectFormat());81 const extern_ofmt = toExternObjectFormatType(util.getObjectFormat(comp.target));
82 const args_slice = ctx.args.toSlice();82 const args_slice = ctx.args.toSlice();
8383
84 {84 {
...@@ -130,14 +130,13 @@ fn toExternObjectFormatType(ofmt: ObjectFormat) c.ZigLLVM_ObjectFormatType {...@@ -130,14 +130,13 @@ fn toExternObjectFormatType(ofmt: ObjectFormat) c.ZigLLVM_ObjectFormatType {
130}130}
131131
132fn constructLinkerArgs(ctx: *Context) !void {132fn constructLinkerArgs(ctx: *Context) !void {
133 return constructLinkerArgsElf(ctx);133 switch (util.getObjectFormat(ctx.comp.target)) {
134 // switch (ctx.comp.target.getObjectFormat()) {134 .unknown => unreachable,
135 // .unknown => unreachable,135 .coff => return constructLinkerArgsCoff(ctx),
136 // .coff => return constructLinkerArgsCoff(ctx),136 .elf => return constructLinkerArgsElf(ctx),
137 // .elf => return constructLinkerArgsElf(ctx),137 .macho => return constructLinkerArgsMachO(ctx),
138 // .macho => return constructLinkerArgsMachO(ctx),138 .wasm => return constructLinkerArgsWasm(ctx),
139 // .wasm => return constructLinkerArgsWasm(ctx),139 }
140 // }
141}140}
142141
143fn constructLinkerArgsElf(ctx: *Context) !void {142fn constructLinkerArgsElf(ctx: *Context) !void {
src-self-hosted/llvm.zig+1-2
...@@ -1,6 +1,5 @@...@@ -1,6 +1,5 @@
1const c = @import("c.zig");1const c = @import("c.zig");
2const std = @import("std");2const assert = @import("std").debug.assert;
3const assert = std.debug.assert;
43
5// we wrap the c module for 3 reasons:4// we wrap the c module for 3 reasons:
6// 1. to avoid accidentally calling the non-thread-safe functions5// 1. to avoid accidentally calling the non-thread-safe functions
src-self-hosted/main.zig+21-21
...@@ -260,47 +260,47 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co...@@ -260,47 +260,47 @@ fn buildOutputType(allocator: *Allocator, args: []const []const u8, out_type: Co
260 process.exit(0);260 process.exit(0);
261 }261 }
262262
263 const build_mode = blk: {263 const build_mode: std.builtin.Mode = blk: {
264 if (flags.single("mode")) |mode_flag| {264 if (flags.single("mode")) |mode_flag| {
265 if (mem.eql(u8, mode_flag, "debug")) {265 if (mem.eql(u8, mode_flag, "debug")) {
266 break :blk std.builtin.Mode.Debug;266 break :blk .Debug;
267 } else if (mem.eql(u8, mode_flag, "release-fast")) {267 } else if (mem.eql(u8, mode_flag, "release-fast")) {
268 break :blk std.builtin.Mode.ReleaseFast;268 break :blk .ReleaseFast;
269 } else if (mem.eql(u8, mode_flag, "release-safe")) {269 } else if (mem.eql(u8, mode_flag, "release-safe")) {
270 break :blk std.builtin.Mode.ReleaseSafe;270 break :blk .ReleaseSafe;
271 } else if (mem.eql(u8, mode_flag, "release-small")) {271 } else if (mem.eql(u8, mode_flag, "release-small")) {
272 break :blk std.builtin.Mode.ReleaseSmall;272 break :blk .ReleaseSmall;
273 } else unreachable;273 } else unreachable;
274 } else {274 } else {
275 break :blk std.builtin.Mode.Debug;275 break :blk .Debug;
276 }276 }
277 };277 };
278278
279 const color = blk: {279 const color: errmsg.Color = blk: {
280 if (flags.single("color")) |color_flag| {280 if (flags.single("color")) |color_flag| {
281 if (mem.eql(u8, color_flag, "auto")) {281 if (mem.eql(u8, color_flag, "auto")) {
282 break :blk errmsg.Color.Auto;282 break :blk .Auto;
283 } else if (mem.eql(u8, color_flag, "on")) {283 } else if (mem.eql(u8, color_flag, "on")) {
284 break :blk errmsg.Color.On;284 break :blk .On;
285 } else if (mem.eql(u8, color_flag, "off")) {285 } else if (mem.eql(u8, color_flag, "off")) {
286 break :blk errmsg.Color.Off;286 break :blk .Off;
287 } else unreachable;287 } else unreachable;
288 } else {288 } else {
289 break :blk errmsg.Color.Auto;289 break :blk .Auto;
290 }290 }
291 };291 };
292292
293 const emit_type = blk: {293 const emit_type: Compilation.Emit = blk: {
294 if (flags.single("emit")) |emit_flag| {294 if (flags.single("emit")) |emit_flag| {
295 if (mem.eql(u8, emit_flag, "asm")) {295 if (mem.eql(u8, emit_flag, "asm")) {
296 break :blk Compilation.Emit.Assembly;296 break :blk .Assembly;
297 } else if (mem.eql(u8, emit_flag, "bin")) {297 } else if (mem.eql(u8, emit_flag, "bin")) {
298 break :blk Compilation.Emit.Binary;298 break :blk .Binary;
299 } else if (mem.eql(u8, emit_flag, "llvm-ir")) {299 } else if (mem.eql(u8, emit_flag, "llvm-ir")) {
300 break :blk Compilation.Emit.LlvmIr;300 break :blk .LlvmIr;
301 } else unreachable;301 } else unreachable;
302 } else {302 } else {
303 break :blk Compilation.Emit.Binary;303 break :blk .Binary;
304 }304 }
305 };305 };
306306
...@@ -587,17 +587,17 @@ fn cmdFmt(allocator: *Allocator, args: []const []const u8) !void {...@@ -587,17 +587,17 @@ fn cmdFmt(allocator: *Allocator, args: []const []const u8) !void {
587 process.exit(0);587 process.exit(0);
588 }588 }
589589
590 const color = blk: {590 const color: errmsg.Color = blk: {
591 if (flags.single("color")) |color_flag| {591 if (flags.single("color")) |color_flag| {
592 if (mem.eql(u8, color_flag, "auto")) {592 if (mem.eql(u8, color_flag, "auto")) {
593 break :blk errmsg.Color.Auto;593 break :blk .Auto;
594 } else if (mem.eql(u8, color_flag, "on")) {594 } else if (mem.eql(u8, color_flag, "on")) {
595 break :blk errmsg.Color.On;595 break :blk .On;
596 } else if (mem.eql(u8, color_flag, "off")) {596 } else if (mem.eql(u8, color_flag, "off")) {
597 break :blk errmsg.Color.Off;597 break :blk .Off;
598 } else unreachable;598 } else unreachable;
599 } else {599 } else {
600 break :blk errmsg.Color.Auto;600 break :blk .Auto;
601 }601 }
602 };602 };
603603
src-self-hosted/test.zig+6-10
...@@ -16,7 +16,7 @@ test "stage2" {...@@ -16,7 +16,7 @@ test "stage2" {
16 try @import("../test/stage2/compile_errors.zig").addCases(&ctx);16 try @import("../test/stage2/compile_errors.zig").addCases(&ctx);
17 try @import("../test/stage2/compare_output.zig").addCases(&ctx);17 try @import("../test/stage2/compare_output.zig").addCases(&ctx);
1818
19 try ctx.run();19 async ctx.run();
20}20}
2121
22const file1 = "1.zig";22const file1 = "1.zig";
...@@ -44,7 +44,7 @@ pub const TestContext = struct {...@@ -44,7 +44,7 @@ pub const TestContext = struct {
44 errdefer self.zig_compiler.deinit();44 errdefer self.zig_compiler.deinit();
4545
46 self.group = std.event.Group(anyerror!void).init(allocator);46 self.group = std.event.Group(anyerror!void).init(allocator);
47 errdefer self.group.wait();47 errdefer self.group.wait() catch {};
4848
49 self.zig_lib_dir = try introspect.resolveZigLibDir(allocator);49 self.zig_lib_dir = try introspect.resolveZigLibDir(allocator);
50 errdefer allocator.free(self.zig_lib_dir);50 errdefer allocator.free(self.zig_lib_dir);
...@@ -59,14 +59,10 @@ pub const TestContext = struct {...@@ -59,14 +59,10 @@ pub const TestContext = struct {
59 self.zig_compiler.deinit();59 self.zig_compiler.deinit();
60 }60 }
6161
62 fn run(self: *TestContext) !void {62 fn run(self: *TestContext) void {
63 const handle = try std.event.Loop.instance.?.call(waitForGroup, self);63 std.event.Loop.instance.?.startCpuBoundOperation();
64 await handle;
65 return self.any_err;
66 }
67
68 async fn waitForGroup(self: *TestContext) void {
69 self.any_err = self.group.wait();64 self.any_err = self.group.wait();
65 return self.any_err;
70 }66 }
7167
72 fn testCompileError(68 fn testCompileError(
...@@ -173,7 +169,7 @@ pub const TestContext = struct {...@@ -173,7 +169,7 @@ pub const TestContext = struct {
173 },169 },
174 Compilation.Event.Error => |err| return err,170 Compilation.Event.Error => |err| return err,
175 Compilation.Event.Fail => |msgs| {171 Compilation.Event.Fail => |msgs| {
176 var stderr = try std.io.getStdErr();172 const stderr = std.io.getStdErr();
177 try stderr.write("build incorrectly failed:\n");173 try stderr.write("build incorrectly failed:\n");
178 for (msgs) |msg| {174 for (msgs) |msg| {
179 defer msg.destroy();175 defer msg.destroy();
src-self-hosted/translate_c.zig-1
...@@ -12,7 +12,6 @@ pub const Mode = enum {...@@ -12,7 +12,6 @@ pub const Mode = enum {
12 translate,12 translate,
13};13};
1414
15// TODO merge with Type.Fn.CallingConvention
16const CallingConvention = std.builtin.TypeInfo.CallingConvention;15const CallingConvention = std.builtin.TypeInfo.CallingConvention;
1716
18pub const ClangErrMsg = Stage2ErrorMsg;17pub const ClangErrMsg = Stage2ErrorMsg;
src-self-hosted/type.zig+3-4
...@@ -399,8 +399,7 @@ pub const Type = struct {...@@ -399,8 +399,7 @@ pub const Type = struct {
399 .Generic => |generic| {399 .Generic => |generic| {
400 self.non_key = NonKey{ .Generic = {} };400 self.non_key = NonKey{ .Generic = {} };
401 const cc_str = ccFnTypeStr(generic.cc);401 const cc_str = ccFnTypeStr(generic.cc);
402 try name_stream.write(cc_str);402 try name_stream.print("{}fn(", cc_str);
403 try name_stream.write("fn(");
404 var param_i: usize = 0;403 var param_i: usize = 0;
405 while (param_i < generic.param_count) : (param_i += 1) {404 while (param_i < generic.param_count) : (param_i += 1) {
406 const arg = if (param_i == 0) "var" else ", var";405 const arg = if (param_i == 0) "var" else ", var";
...@@ -408,7 +407,7 @@ pub const Type = struct {...@@ -408,7 +407,7 @@ pub const Type = struct {
408 }407 }
409 try name_stream.write(")");408 try name_stream.write(")");
410 if (key.alignment) |alignment| {409 if (key.alignment) |alignment| {
411 try name_stream.print(" align<{}>", alignment);410 try name_stream.print(" align({})", alignment);
412 }411 }
413 try name_stream.write(" var");412 try name_stream.write(" var");
414 },413 },
...@@ -429,7 +428,7 @@ pub const Type = struct {...@@ -429,7 +428,7 @@ pub const Type = struct {
429 }428 }
430 try name_stream.write(")");429 try name_stream.write(")");
431 if (key.alignment) |alignment| {430 if (key.alignment) |alignment| {
432 try name_stream.print(" align<{}>", alignment);431 try name_stream.print(" align({})", alignment);
433 }432 }
434 try name_stream.print(" {}", normal.return_type.name);433 try name_stream.print(" {}", normal.return_type.name);
435 },434 },
src-self-hosted/util.zig+17
...@@ -32,6 +32,23 @@ pub fn getFloatAbi(self: Target) FloatAbi {...@@ -32,6 +32,23 @@ pub fn getFloatAbi(self: Target) FloatAbi {
32 };32 };
33}33}
3434
35pub fn getObjectFormat(self: Target) Target.ObjectFormat {
36 return switch (self) {
37 .Native => @import("builtin").object_format,
38 .Cross => {
39 if (target.isWindows() or target.isUefi()) {
40 break .coff;
41 } else if (target.isDarwin()) {
42 break .macho;
43 }
44 if (target.isWasm()) {
45 break .wasm;
46 }
47 break .elf;
48 },
49 };
50}
51
35pub fn getDynamicLinkerPath(self: Target) ?[]const u8 {52pub fn getDynamicLinkerPath(self: Target) ?[]const u8 {
36 const env = self.getAbi();53 const env = self.getAbi();
37 const arch = self.getArch();54 const arch = self.getArch();