From 86d9563d1539cd7581dc120023bb830fae77ba0f Mon Sep 17 00:00:00 2001 From: Vexu <15308111+Vexu@users.noreply.github.com> Date: Fri, 8 Nov 2019 00:18:14 +0200 Subject: [PATCH] self hosted compiler: various small fixes --- src-self-hosted/codegen.zig | 14 +++++++------- src-self-hosted/compilation.zig | 14 +++++++------- src-self-hosted/decl.zig | 9 ++++++--- src-self-hosted/ir.zig | 10 +++++----- src-self-hosted/link.zig | 22 ++++++++++++---------- src-self-hosted/type.zig | 2 +- src-self-hosted/util.zig | 15 --------------- 7 files changed, 38 insertions(+), 48 deletions(-) diff --git a/src-self-hosted/codegen.zig b/src-self-hosted/codegen.zig index c5b3717b27..1c945d8f4a 100644 --- a/src-self-hosted/codegen.zig +++ b/src-self-hosted/codegen.zig @@ -11,12 +11,12 @@ const assert = std.debug.assert; const DW = std.dwarf; const maxInt = std.math.maxInt; -pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) !void { +pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) Compilation.BuildError!void { fn_val.base.ref(); defer fn_val.base.deref(comp); defer code.destroy(comp.gpa()); - var output_path = try comp.createRandomOutputPath(comp.target.objFileExt()); + var output_path = try comp.createRandomOutputPath(comp.target.oFileExt()); errdefer output_path.deinit(); const llvm_handle = try comp.zig_compiler.getAnyLlvmContext(); @@ -30,11 +30,11 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) llvm.SetTarget(module, comp.llvm_triple.ptr()); llvm.SetDataLayout(module, comp.target_layout_str); - if (comp.target.getObjectFormat() == .coff) { - llvm.AddModuleCodeViewFlag(module); - } else { + // if (comp.target.getObjectFormat() == .coff) { + // llvm.AddModuleCodeViewFlag(module); + // } else { llvm.AddModuleDebugInfoFlag(module); - } + // } const builder = llvm.CreateBuilderInContext(context) orelse return error.OutOfMemory; defer llvm.DisposeBuilder(builder); @@ -113,7 +113,7 @@ pub async fn renderToLlvm(comp: *Compilation, fn_val: *Value.Fn, code: *ir.Code) comp.target_machine, module, output_path.ptr(), - .EmitBinary, + llvm.EmitBinary, &err_msg, is_debug, is_small, diff --git a/src-self-hosted/compilation.zig b/src-self-hosted/compilation.zig index ad8fbed144..52d02ff4bb 100644 --- a/src-self-hosted/compilation.zig +++ b/src-self-hosted/compilation.zig @@ -857,7 +857,7 @@ pub const Compilation = struct { defer locked_table.release(); var decl_group = event.Group(BuildError!void).init(self.gpa()); - defer decl_group.deinit(); + defer decl_group.wait() catch {}; try self.rebuildChangedDecls( &decl_group, @@ -937,7 +937,7 @@ pub const Compilation = struct { .parent_scope = &decl_scope.base, .tree_scope = tree_scope, }, - .value = Decl.Fn.Val{ .Unresolved = {} }, + .value = .Unresolved, .fn_proto = fn_proto, }; tree_scope.base.ref(); @@ -1100,7 +1100,7 @@ pub const Compilation = struct { async fn addCompileErrorAsync( self: *Compilation, msg: *Msg, - ) !void { + ) BuildError!void { errdefer msg.destroy(); const compile_errors = self.compile_errors.acquire(); @@ -1109,7 +1109,7 @@ pub const Compilation = struct { try compile_errors.value.append(msg); } - async fn verifyUniqueSymbol(self: *Compilation, decl: *Decl) !void { + async fn verifyUniqueSymbol(self: *Compilation, decl: *Decl) BuildError!void { const exported_symbol_names = self.exported_symbol_names.acquire(); defer exported_symbol_names.release(); @@ -1264,7 +1264,7 @@ pub const Compilation = struct { } /// This declaration has been blessed as going into the final code generation. - pub async fn resolveDecl(comp: *Compilation, decl: *Decl) !void { + pub async fn resolveDecl(comp: *Compilation, decl: *Decl) BuildError!void { if (decl.resolution.start()) |ptr| return ptr.*; decl.resolution.data = try generateDecl(comp, decl); @@ -1363,7 +1363,7 @@ async fn generateDeclFn(comp: *Compilation, fn_decl: *Decl.Fn) !void { try comp.prelink_group.call(addFnToLinkSet, comp, fn_val); } -async fn addFnToLinkSet(comp: *Compilation, fn_val: *Value.Fn) void { +async fn addFnToLinkSet(comp: *Compilation, fn_val: *Value.Fn) Compilation.BuildError!void { fn_val.base.ref(); defer fn_val.base.deref(comp); @@ -1421,7 +1421,7 @@ async fn analyzeFnType( .return_type = return_type, .params = params.toOwnedSlice(), .is_var_args = false, // TODO - .cc = Type.Fn.CallingConvention.Auto, // TODO + .cc = .Unspecified, // TODO }, }, }; diff --git a/src-self-hosted/decl.zig b/src-self-hosted/decl.zig index e68a1458d6..21a99729f5 100644 --- a/src-self-hosted/decl.zig +++ b/src-self-hosted/decl.zig @@ -69,12 +69,15 @@ pub const Decl = struct { pub const Fn = struct { base: Decl, - value: union(enum) { + value: Val, + fn_proto: *ast.Node.FnProto, + + // TODO https://github.com/ziglang/zig/issues/683 and then make this anonymous + pub const Val = union(enum) { Unresolved, Fn: *Value.Fn, FnProto: *Value.FnProto, - }, - fn_proto: *ast.Node.FnProto, + }; pub fn externLibName(self: Fn, tree: *ast.Tree) ?[]const u8 { return if (self.fn_proto.extern_export_inline_token) |tok_index| x: { diff --git a/src-self-hosted/ir.zig b/src-self-hosted/ir.zig index 3e25277223..0017edd96c 100644 --- a/src-self-hosted/ir.zig +++ b/src-self-hosted/ir.zig @@ -521,7 +521,7 @@ pub const Inst = struct { .Const => @panic("TODO"), .Param => |param| { const new_inst = try ira.irb.build( - .VarPtr, + Inst.VarPtr, self.base.scope, self.base.span, Inst.VarPtr.Params{ .var_scope = self.params.var_scope }, @@ -1134,7 +1134,7 @@ pub const Builder = struct { .VarType => return error.Unimplemented, .ErrorType => return error.Unimplemented, .FnProto => return error.Unimplemented, - .PromiseType => return error.Unimplemented, + .AnyFrameType => return error.Unimplemented, .IntegerLiteral => { const int_lit = @fieldParentPtr(ast.Node.IntegerLiteral, "base", node); return irb.lvalWrap(scope, try irb.genIntLit(int_lit, scope), lval); @@ -1812,9 +1812,9 @@ pub const Builder = struct { for (@field(inst.params, @memberName(I.Params, i))) |other| other.ref(self); }, - .Mut, - .Vol, - .Size, + Type.Pointer.Mut, + Type.Pointer.Vol, + Type.Pointer.Size, LVal, *Decl, *Scope.Var, diff --git a/src-self-hosted/link.zig b/src-self-hosted/link.zig index 4e573215bb..16c31b928e 100644 --- a/src-self-hosted/link.zig +++ b/src-self-hosted/link.zig @@ -6,6 +6,7 @@ const Target = std.Target; const ObjectFormat = Target.ObjectFormat; const LibCInstallation = @import("libc_installation.zig").LibCInstallation; const assert = std.debug.assert; +const util = @import("util.zig"); const Context = struct { comp: *Compilation, @@ -44,10 +45,10 @@ pub async fn link(comp: *Compilation) !void { try ctx.out_file_path.append(comp.target.exeFileExt()); }, .Lib => { - try ctx.out_file_path.append(comp.target.libFileExt(comp.is_static)); + try ctx.out_file_path.append(if (comp.is_static) comp.target.staticLibSuffix() else comp.target.dynamicLibSuffix()); }, .Obj => { - try ctx.out_file_path.append(comp.target.objFileExt()); + try ctx.out_file_path.append(comp.target.oFileExt()); }, } } @@ -77,7 +78,7 @@ pub async fn link(comp: *Compilation) !void { std.debug.warn("\n"); } - const extern_ofmt = toExternObjectFormatType(comp.target.getObjectFormat()); + const extern_ofmt = toExternObjectFormatType(.elf); //comp.target.getObjectFormat()); const args_slice = ctx.args.toSlice(); { @@ -129,13 +130,14 @@ fn toExternObjectFormatType(ofmt: ObjectFormat) c.ZigLLVM_ObjectFormatType { } fn constructLinkerArgs(ctx: *Context) !void { - switch (ctx.comp.target.getObjectFormat()) { - .unknown => unreachable, - .coff => return constructLinkerArgsCoff(ctx), - .elf => return constructLinkerArgsElf(ctx), - .macho => return constructLinkerArgsMachO(ctx), - .wasm => return constructLinkerArgsWasm(ctx), - } + return constructLinkerArgsElf(ctx); + // switch (ctx.comp.target.getObjectFormat()) { + // .unknown => unreachable, + // .coff => return constructLinkerArgsCoff(ctx), + // .elf => return constructLinkerArgsElf(ctx), + // .macho => return constructLinkerArgsMachO(ctx), + // .wasm => return constructLinkerArgsWasm(ctx), + // } } fn constructLinkerArgsElf(ctx: *Context) !void { diff --git a/src-self-hosted/type.zig b/src-self-hosted/type.zig index f62c9caa99..cea461d608 100644 --- a/src-self-hosted/type.zig +++ b/src-self-hosted/type.zig @@ -350,7 +350,7 @@ pub const Type = struct { fn ccFnTypeStr(cc: CallingConvention) []const u8 { return switch (cc) { - .Auto => "", + .Unspecified => "", .C => "extern ", .Cold => "coldcc ", .Naked => "nakedcc ", diff --git a/src-self-hosted/util.zig b/src-self-hosted/util.zig index 40644c30c8..9b3475739d 100644 --- a/src-self-hosted/util.zig +++ b/src-self-hosted/util.zig @@ -1,7 +1,6 @@ const std = @import("std"); const Target = std.Target; const llvm = @import("llvm.zig"); -// const builtin = @import("builtin"); pub const FloatAbi = enum { Hard, @@ -9,20 +8,6 @@ pub const FloatAbi = enum { SoftFp, }; -// pub const Cross = struct { -// arch: Target.Arch, -// os: Target.Os, -// abi: Target.Abi, -// object_format: builtin.ObjectFormat, -// }; - -// pub fn getObjectFormat(self: Target) builtin.ObjectFormat { -// return switch (self) { -// .Native => builtin.object_format, -// .Cross => |t| t.object_format, -// }; -// } - /// TODO expose the arch and subarch separately pub fn isArmOrThumb(self: Target) bool { return switch (self.getArch()) {