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 {
1515 return name;
1616}
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 {
1919 if (T.tag() == .usize) {
2020 file.need_stddef = true;
2121 try writer.writeAll("size_t");
......@@ -26,20 +26,20 @@ fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type) !void {
2626 try writer.writeAll("noreturn void");
2727 },
2828 .Void => try writer.writeAll("void"),
29 else => return error.Unimplemented,
29 else => |e| return file.fail(src, "TODO implement type {}", .{e}),
3030 }
3131 }
3232}
3333
3434fn renderFunctionSignature(file: *C, writer: std.ArrayList(u8).Writer, decl: *Decl) !void {
3535 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());
3737 const name = try map(mem.spanZ(decl.name));
3838 try writer.print(" {}(", .{name});
3939 if (tv.ty.fnParamLen() == 0) {
4040 try writer.writeAll("void)");
4141 } else {
42 return error.Unimplemented;
42 return file.fail(decl.src(), "TODO implement parameters", .{});
4343 }
4444}
4545
......@@ -68,21 +68,21 @@ pub fn generate(file: *C, decl: *Decl) !void {
6868 if (arg.cast(ir.Inst.Constant)) |c| {
6969 if (c.val.tag() == .int_u64) {
7070 try writer.writeAll("register ");
71 try renderType(file, writer, arg.ty);
71 try renderType(file, writer, arg.ty, decl.src());
7272 try writer.print(" {}_constant __asm__(\"{}\") = {};\n\t", .{ reg, reg, c.val.toUnsignedInt() });
7373 } else {
74 return error.Unimplemented;
74 return file.fail(decl.src(), "TODO inline asm {} args", .{c.val.tag()});
7575 }
7676 } else {
77 return error.Unimplemented;
77 return file.fail(decl.src(), "TODO non-constant inline asm args", .{});
7878 }
7979 } else {
80 return error.Unimplemented;
80 return file.fail(decl.src(), "TODO non-explicit inline asm regs", .{});
8181 }
8282 }
8383 try writer.print("__asm {} (\"{}\"", .{ if (as.is_volatile) @as([]const u8, "volatile") else "", as.asm_source });
8484 if (as.output) |o| {
85 return error.Unimplemented;
85 return file.fail(decl.src(), "TODO inline asm output", .{});
8686 }
8787 if (as.inputs.len > 0) {
8888 if (as.output == null) {
......@@ -99,10 +99,12 @@ pub fn generate(file: *C, decl: *Decl) !void {
9999 if (arg.cast(ir.Inst.Constant)) |c| {
100100 try writer.print("\"\"({}_constant)", .{reg});
101101 } else {
102 return error.Unimplemented;
102 // This is blocked by the earlier test
103 unreachable;
103104 }
104105 } else {
105 return error.Unimplemented;
106 // This is blocked by the earlier test
107 unreachable;
106108 }
107109 }
108110 }
......@@ -121,20 +123,17 @@ pub fn generate(file: *C, decl: *Decl) !void {
121123 }
122124 try writer.print("{}();", .{tname});
123125 } else {
124 std.debug.warn("non-function call target?\n", .{});
125 return error.Unimplemented;
126 return file.fail(decl.src(), "TODO non-function call target?", .{});
126127 }
127128 if (call.args.len != 0) {
128 std.debug.warn("parameters\n", .{});
129 return error.Unimplemented;
129 return file.fail(decl.src(), "TODO function arguments", .{});
130130 }
131131 } else {
132 std.debug.warn("non-constant call inst?\n", .{});
133 return error.Unimplemented;
132 return file.fail(decl.src(), "TODO non-constant call inst?", .{});
134133 }
135134 },
136 else => {
137 std.debug.warn("\nTranslating {}\n", .{inst.*});
135 else => |e| {
136 return file.fail(decl.src(), "TODO {}", .{e});
138137 },
139138 }
140139 }
......@@ -151,13 +150,12 @@ pub fn generate(file: *C, decl: *Decl) !void {
151150 std.debug.warn("\n\nARRAYTRANS\n", .{});
152151 if (tv.ty.arraySentinel()) |sentinel| {}
153152 } else {
154 return error.Unimplemented;
153 return file.fail(decl.src(), "TODO non-byte arrays", .{});
155154 }
156155 }
157156 },
158157 else => |e| {
159 std.debug.warn("\nTODO implement {}\n", .{e});
160 return error.Unimplemented;
158 return file.fail(decl.src(), "TODO {}", .{e});
161159 },
162160 }
163161}
src-self-hosted/link.zig+13-2
......@@ -227,6 +227,12 @@ pub const File = struct {
227227 need_stddef: bool = false,
228228 need_stdint: bool = false,
229229 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
231237 pub fn deinit(self: *File.C) void {
232238 self.main.deinit();
......@@ -237,7 +243,12 @@ pub const File = struct {
237243 }
238244
239245 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 };
241252 }
242253
243254 pub fn flush(self: *File.C) !void {
......@@ -1185,7 +1196,7 @@ pub const File = struct {
11851196 .appended => code_buffer.items,
11861197 .fail => |em| {
11871198 decl.analysis = .codegen_failure;
1188 _ = try module.failed_decls.put(decl, em);
1199 try module.failed_decls.put(decl, em);
11891200 return;
11901201 },
11911202 };