Commit e06ba9e86e

Noam Preil <noam@pixelhero.dev>
2020-09-08 20:41:51
CBE: properly resolve Insts
1 parent 9ef6c0a
Changed files (1)
src
codegen
src/codegen/c.zig
@@ -109,6 +109,18 @@ const Context = struct {
     argdex: usize = 0,
     unnamed_index: usize = 0,
 
+    fn resolveInst(self: *Context, inst: *Inst) ![]u8 {
+        if (inst.cast(Inst.Constant)) |const_inst| {
+            var out = std.ArrayList(u8).init(&self.arena.allocator);
+            try renderValue(self, out.writer(), inst.ty, const_inst.val);
+            return out.toOwnedSlice();
+        }
+        if (self.inst_map.get(inst)) |val| {
+            return val;
+        }
+        return self.file.fail(inst.src, "Internal error: failed to resolve inst!", .{});
+    }
+
     fn name(self: *Context) ![]u8 {
         const val = try std.fmt.allocPrint(&self.arena.allocator, "__temp_{}", .{self.unnamed_index});
         self.unnamed_index += 1;
@@ -186,8 +198,7 @@ fn genIntCast(ctx: *Context, inst: *Inst.UnOp) !?[]u8 {
     const op = inst.operand;
     const writer = ctx.file.main.writer();
     const name = try ctx.name();
-    const from = ctx.inst_map.get(op) orelse
-        return ctx.file.fail(ctx.decl.src(), "Internal error in C backend: intCast argument not found in inst_map", .{});
+    const from = try ctx.resolveInst(inst.operand);
     try writer.writeAll(indentation ++ "const ");
     try renderType(ctx, writer, inst.base.ty);
     try writer.print(" {} = (", .{name});
@@ -223,7 +234,8 @@ fn genCall(ctx: *Context, inst: *Inst.Call) !?[]u8 {
                     if (arg.cast(Inst.Constant)) |con| {
                         try renderValue(ctx, writer, arg.ty, con.val);
                     } else {
-                        return ctx.file.fail(ctx.decl.src(), "TODO call pass arg {}", .{arg});
+                        const val = try ctx.resolveInst(arg);
+                        try writer.print("{}", .{val});
                     }
                 }
             }