authorgravatar for noam@pixelhero.devNoam Preil <noam@pixelhero.dev> 2020-07-07 23:59:55-04:00
committergravatar for noam@pixelhero.devNoam Preil <noam@pixelhero.dev> 2020-07-07 23:59:55-04:00
log9aaffe00d3450d2fabd5fbb6a099b3cdc56d04d2
tree9ceeef23b4791e7f32a7552dc021575a9a29e724
parent089c056dbe1fdbb1da9b1a5bab970ca688d3aa01
signaturelock-open Commit is signed but in an unrecognized format.

CBE: Cleanup unimplementeds


2 files changed, 33 insertions(+), 24 deletions(-)

src-self-hosted/cgen.zig+20-22
...@@ -15,7 +15,7 @@ fn map(name: []const u8) ![]const u8 {...@@ -15,7 +15,7 @@ fn map(name: []const u8) ![]const u8 {
15 return name;15 return name;
16}16}
1717
18fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type) !void {18fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type, src: usize) !void {
19 if (T.tag() == .usize) {19 if (T.tag() == .usize) {
20 file.need_stddef = true;20 file.need_stddef = true;
21 try writer.writeAll("size_t");21 try writer.writeAll("size_t");
...@@ -26,20 +26,20 @@ fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type) !void {...@@ -26,20 +26,20 @@ fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type) !void {
26 try writer.writeAll("noreturn void");26 try writer.writeAll("noreturn void");
27 },27 },
28 .Void => try writer.writeAll("void"),28 .Void => try writer.writeAll("void"),
29 else => return error.Unimplemented,29 else => |e| return file.fail(src, "TODO implement type {}", .{e}),
30 }30 }
31 }31 }
32}32}
3333
34fn renderFunctionSignature(file: *C, writer: std.ArrayList(u8).Writer, decl: *Decl) !void {34fn renderFunctionSignature(file: *C, writer: std.ArrayList(u8).Writer, decl: *Decl) !void {
35 const tv = decl.typed_value.most_recent.typed_value;35 const tv = decl.typed_value.most_recent.typed_value;
36 try renderType(file, writer, tv.ty.fnReturnType());36 try renderType(file, writer, tv.ty.fnReturnType(), decl.src());
37 const name = try map(mem.spanZ(decl.name));37 const name = try map(mem.spanZ(decl.name));
38 try writer.print(" {}(", .{name});38 try writer.print(" {}(", .{name});
39 if (tv.ty.fnParamLen() == 0) {39 if (tv.ty.fnParamLen() == 0) {
40 try writer.writeAll("void)");40 try writer.writeAll("void)");
41 } else {41 } else {
42 return error.Unimplemented;42 return file.fail(decl.src(), "TODO implement parameters", .{});
43 }43 }
44}44}
4545
...@@ -68,21 +68,21 @@ pub fn generate(file: *C, decl: *Decl) !void {...@@ -68,21 +68,21 @@ pub fn generate(file: *C, decl: *Decl) !void {
68 if (arg.cast(ir.Inst.Constant)) |c| {68 if (arg.cast(ir.Inst.Constant)) |c| {
69 if (c.val.tag() == .int_u64) {69 if (c.val.tag() == .int_u64) {
70 try writer.writeAll("register ");70 try writer.writeAll("register ");
71 try renderType(file, writer, arg.ty);71 try renderType(file, writer, arg.ty, decl.src());
72 try writer.print(" {}_constant __asm__(\"{}\") = {};\n\t", .{ reg, reg, c.val.toUnsignedInt() });72 try writer.print(" {}_constant __asm__(\"{}\") = {};\n\t", .{ reg, reg, c.val.toUnsignedInt() });
73 } else {73 } else {
74 return error.Unimplemented;74 return file.fail(decl.src(), "TODO inline asm {} args", .{c.val.tag()});
75 }75 }
76 } else {76 } else {
77 return error.Unimplemented;77 return file.fail(decl.src(), "TODO non-constant inline asm args", .{});
78 }78 }
79 } else {79 } else {
80 return error.Unimplemented;80 return file.fail(decl.src(), "TODO non-explicit inline asm regs", .{});
81 }81 }
82 }82 }
83 try writer.print("__asm {} (\"{}\"", .{ if (as.is_volatile) @as([]const u8, "volatile") else "", as.asm_source });83 try writer.print("__asm {} (\"{}\"", .{ if (as.is_volatile) @as([]const u8, "volatile") else "", as.asm_source });
84 if (as.output) |o| {84 if (as.output) |o| {
85 return error.Unimplemented;85 return file.fail(decl.src(), "TODO inline asm output", .{});
86 }86 }
87 if (as.inputs.len > 0) {87 if (as.inputs.len > 0) {
88 if (as.output == null) {88 if (as.output == null) {
...@@ -99,10 +99,12 @@ pub fn generate(file: *C, decl: *Decl) !void {...@@ -99,10 +99,12 @@ pub fn generate(file: *C, decl: *Decl) !void {
99 if (arg.cast(ir.Inst.Constant)) |c| {99 if (arg.cast(ir.Inst.Constant)) |c| {
100 try writer.print("\"\"({}_constant)", .{reg});100 try writer.print("\"\"({}_constant)", .{reg});
101 } else {101 } else {
102 return error.Unimplemented;102 // This is blocked by the earlier test
103 unreachable;
103 }104 }
104 } else {105 } else {
105 return error.Unimplemented;106 // This is blocked by the earlier test
107 unreachable;
106 }108 }
107 }109 }
108 }110 }
...@@ -121,20 +123,17 @@ pub fn generate(file: *C, decl: *Decl) !void {...@@ -121,20 +123,17 @@ pub fn generate(file: *C, decl: *Decl) !void {
121 }123 }
122 try writer.print("{}();", .{tname});124 try writer.print("{}();", .{tname});
123 } else {125 } else {
124 std.debug.warn("non-function call target?\n", .{});126 return file.fail(decl.src(), "TODO non-function call target?", .{});
125 return error.Unimplemented;
126 }127 }
127 if (call.args.len != 0) {128 if (call.args.len != 0) {
128 std.debug.warn("parameters\n", .{});129 return file.fail(decl.src(), "TODO function arguments", .{});
129 return error.Unimplemented;
130 }130 }
131 } else {131 } else {
132 std.debug.warn("non-constant call inst?\n", .{});132 return file.fail(decl.src(), "TODO non-constant call inst?", .{});
133 return error.Unimplemented;
134 }133 }
135 },134 },
136 else => {135 else => |e| {
137 std.debug.warn("\nTranslating {}\n", .{inst.*});136 return file.fail(decl.src(), "TODO {}", .{e});
138 },137 },
139 }138 }
140 }139 }
...@@ -151,13 +150,12 @@ pub fn generate(file: *C, decl: *Decl) !void {...@@ -151,13 +150,12 @@ pub fn generate(file: *C, decl: *Decl) !void {
151 std.debug.warn("\n\nARRAYTRANS\n", .{});150 std.debug.warn("\n\nARRAYTRANS\n", .{});
152 if (tv.ty.arraySentinel()) |sentinel| {}151 if (tv.ty.arraySentinel()) |sentinel| {}
153 } else {152 } else {
154 return error.Unimplemented;153 return file.fail(decl.src(), "TODO non-byte arrays", .{});
155 }154 }
156 }155 }
157 },156 },
158 else => |e| {157 else => |e| {
159 std.debug.warn("\nTODO implement {}\n", .{e});158 return file.fail(decl.src(), "TODO {}", .{e});
160 return error.Unimplemented;
161 },159 },
162 }160 }
163}161}
src-self-hosted/link.zig+13-2
...@@ -227,6 +227,12 @@ pub const File = struct {...@@ -227,6 +227,12 @@ pub const File = struct {
227 need_stddef: bool = false,227 need_stddef: bool = false,
228 need_stdint: bool = false,228 need_stdint: bool = false,
229 need_noreturn: bool = false,229 need_noreturn: bool = false,
230 error_msg: *Module.ErrorMsg = undefined,
231
232 pub fn fail(self: *C, src: usize, comptime format: []const u8, args: var) !void {
233 self.error_msg = try Module.ErrorMsg.create(self.allocator, src, format, args);
234 return error.CGenFailure;
235 }
230236
231 pub fn deinit(self: *File.C) void {237 pub fn deinit(self: *File.C) void {
232 self.main.deinit();238 self.main.deinit();
...@@ -237,7 +243,12 @@ pub const File = struct {...@@ -237,7 +243,12 @@ pub const File = struct {
237 }243 }
238244
239 pub fn updateDecl(self: *File.C, module: *Module, decl: *Module.Decl) !void {245 pub fn updateDecl(self: *File.C, module: *Module, decl: *Module.Decl) !void {
240 try cgen.generate(self, decl);246 cgen.generate(self, decl) catch |err| {
247 if (err == error.CGenFailure) {
248 try module.failed_decls.put(decl, self.error_msg);
249 }
250 return err;
251 };
241 }252 }
242253
243 pub fn flush(self: *File.C) !void {254 pub fn flush(self: *File.C) !void {
...@@ -1185,7 +1196,7 @@ pub const File = struct {...@@ -1185,7 +1196,7 @@ pub const File = struct {
1185 .appended => code_buffer.items,1196 .appended => code_buffer.items,
1186 .fail => |em| {1197 .fail => |em| {
1187 decl.analysis = .codegen_failure;1198 decl.analysis = .codegen_failure;
1188 _ = try module.failed_decls.put(decl, em);1199 try module.failed_decls.put(decl, em);
1189 return;1200 return;
1190 },1201 },
1191 };1202 };