Commit 9aaffe00d3

Noam Preil <pleasantatk@gmail.com>
2020-07-08 05:59:55
CBE: Cleanup unimplementeds
1 parent 089c056
Changed files (2)
src-self-hosted
src-self-hosted/cgen.zig
@@ -15,7 +15,7 @@ fn map(name: []const u8) ![]const u8 {
     return name;
 }
 
-fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type) !void {
+fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type, src: usize) !void {
     if (T.tag() == .usize) {
         file.need_stddef = true;
         try writer.writeAll("size_t");
@@ -26,20 +26,20 @@ fn renderType(file: *C, writer: std.ArrayList(u8).Writer, T: Type) !void {
                 try writer.writeAll("noreturn void");
             },
             .Void => try writer.writeAll("void"),
-            else => return error.Unimplemented,
+            else => |e| return file.fail(src, "TODO implement type {}", .{e}),
         }
     }
 }
 
 fn renderFunctionSignature(file: *C, writer: std.ArrayList(u8).Writer, decl: *Decl) !void {
     const tv = decl.typed_value.most_recent.typed_value;
-    try renderType(file, writer, tv.ty.fnReturnType());
+    try renderType(file, writer, tv.ty.fnReturnType(), decl.src());
     const name = try map(mem.spanZ(decl.name));
     try writer.print(" {}(", .{name});
     if (tv.ty.fnParamLen() == 0) {
         try writer.writeAll("void)");
     } else {
-        return error.Unimplemented;
+        return file.fail(decl.src(), "TODO implement parameters", .{});
     }
 }
 
@@ -68,21 +68,21 @@ pub fn generate(file: *C, decl: *Decl) !void {
                                     if (arg.cast(ir.Inst.Constant)) |c| {
                                         if (c.val.tag() == .int_u64) {
                                             try writer.writeAll("register ");
-                                            try renderType(file, writer, arg.ty);
+                                            try renderType(file, writer, arg.ty, decl.src());
                                             try writer.print(" {}_constant __asm__(\"{}\") = {};\n\t", .{ reg, reg, c.val.toUnsignedInt() });
                                         } else {
-                                            return error.Unimplemented;
+                                            return file.fail(decl.src(), "TODO inline asm {} args", .{c.val.tag()});
                                         }
                                     } else {
-                                        return error.Unimplemented;
+                                        return file.fail(decl.src(), "TODO non-constant inline asm args", .{});
                                     }
                                 } else {
-                                    return error.Unimplemented;
+                                    return file.fail(decl.src(), "TODO non-explicit inline asm regs", .{});
                                 }
                             }
                             try writer.print("__asm {} (\"{}\"", .{ if (as.is_volatile) @as([]const u8, "volatile") else "", as.asm_source });
                             if (as.output) |o| {
-                                return error.Unimplemented;
+                                return file.fail(decl.src(), "TODO inline asm output", .{});
                             }
                             if (as.inputs.len > 0) {
                                 if (as.output == null) {
@@ -99,10 +99,12 @@ pub fn generate(file: *C, decl: *Decl) !void {
                                         if (arg.cast(ir.Inst.Constant)) |c| {
                                             try writer.print("\"\"({}_constant)", .{reg});
                                         } else {
-                                            return error.Unimplemented;
+                                            // This is blocked by the earlier test
+                                            unreachable;
                                         }
                                     } else {
-                                        return error.Unimplemented;
+                                        // This is blocked by the earlier test
+                                        unreachable;
                                     }
                                 }
                             }
@@ -121,20 +123,17 @@ pub fn generate(file: *C, decl: *Decl) !void {
                                     }
                                     try writer.print("{}();", .{tname});
                                 } else {
-                                    std.debug.warn("non-function call target?\n", .{});
-                                    return error.Unimplemented;
+                                    return file.fail(decl.src(), "TODO non-function call target?", .{});
                                 }
                                 if (call.args.len != 0) {
-                                    std.debug.warn("parameters\n", .{});
-                                    return error.Unimplemented;
+                                    return file.fail(decl.src(), "TODO function arguments", .{});
                                 }
                             } else {
-                                std.debug.warn("non-constant call inst?\n", .{});
-                                return error.Unimplemented;
+                                return file.fail(decl.src(), "TODO non-constant call inst?", .{});
                             }
                         },
-                        else => {
-                            std.debug.warn("\nTranslating {}\n", .{inst.*});
+                        else => |e| {
+                            return file.fail(decl.src(), "TODO {}", .{e});
                         },
                     }
                 }
@@ -151,13 +150,12 @@ pub fn generate(file: *C, decl: *Decl) !void {
                     std.debug.warn("\n\nARRAYTRANS\n", .{});
                     if (tv.ty.arraySentinel()) |sentinel| {}
                 } else {
-                    return error.Unimplemented;
+                    return file.fail(decl.src(), "TODO non-byte arrays", .{});
                 }
             }
         },
         else => |e| {
-            std.debug.warn("\nTODO implement {}\n", .{e});
-            return error.Unimplemented;
+            return file.fail(decl.src(), "TODO {}", .{e});
         },
     }
 }
src-self-hosted/link.zig
@@ -227,6 +227,12 @@ pub const File = struct {
         need_stddef: bool = false,
         need_stdint: bool = false,
         need_noreturn: bool = false,
+        error_msg: *Module.ErrorMsg = undefined,
+
+        pub fn fail(self: *C, src: usize, comptime format: []const u8, args: var) !void {
+            self.error_msg = try Module.ErrorMsg.create(self.allocator, src, format, args);
+            return error.CGenFailure;
+        }
 
         pub fn deinit(self: *File.C) void {
             self.main.deinit();
@@ -237,7 +243,12 @@ pub const File = struct {
         }
 
         pub fn updateDecl(self: *File.C, module: *Module, decl: *Module.Decl) !void {
-            try cgen.generate(self, decl);
+            cgen.generate(self, decl) catch |err| {
+                if (err == error.CGenFailure) {
+                    try module.failed_decls.put(decl, self.error_msg);
+                }
+                return err;
+            };
         }
 
         pub fn flush(self: *File.C) !void {
@@ -1185,7 +1196,7 @@ pub const File = struct {
                 .appended => code_buffer.items,
                 .fail => |em| {
                     decl.analysis = .codegen_failure;
-                    _ = try module.failed_decls.put(decl, em);
+                    try module.failed_decls.put(decl, em);
                     return;
                 },
             };