authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-28 20:27:58-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-12-28 20:32:13-07:00
log813d3308ccd13bdc96a40b583ffd8722651b7b83
tree287b4417d847bcfc27d068ef75e45c6a2fce1991
parentbbe66572e1c1e2abff0a433c36291f3429482e8f

stage2: update C backend test cases for new output


2 files changed, 31 insertions(+), 34 deletions(-)

src/codegen/c.zig+15-5
...@@ -198,6 +198,13 @@ fn renderFunctionSignature(...@@ -198,6 +198,13 @@ fn renderFunctionSignature(
198 try writer.writeByte(')');198 try writer.writeByte(')');
199}199}
200200
201fn indent(file: *C) !void {
202 const indent_size = 4;
203 const indent_level = 1;
204 const indent_amt = indent_size * indent_level;
205 try file.main.writer().writeByteNTimes(' ', indent_amt);
206}
207
201pub fn generate(file: *C, decl: *Decl) !void {208pub fn generate(file: *C, decl: *Decl) !void {
202 const tv = decl.typed_value.most_recent.typed_value;209 const tv = decl.typed_value.most_recent.typed_value;
203210
...@@ -228,11 +235,6 @@ pub fn generate(file: *C, decl: *Decl) !void {...@@ -228,11 +235,6 @@ pub fn generate(file: *C, decl: *Decl) !void {
228 if (instructions.len > 0) {235 if (instructions.len > 0) {
229 try writer.writeAll("\n");236 try writer.writeAll("\n");
230 for (instructions) |inst| {237 for (instructions) |inst| {
231 if (inst.tag != .dbg_stmt) {
232 const indent_size = 4;
233 const indent_level = 1;
234 try writer.writeByteNTimes(' ', indent_size * indent_level);
235 }
236 if (switch (inst.tag) {238 if (switch (inst.tag) {
237 .assembly => try genAsm(&ctx, file, inst.castTag(.assembly).?),239 .assembly => try genAsm(&ctx, file, inst.castTag(.assembly).?),
238 .call => try genCall(&ctx, file, inst.castTag(.call).?),240 .call => try genCall(&ctx, file, inst.castTag(.call).?),
...@@ -361,11 +363,13 @@ fn genArg(ctx: *Context) !?[]u8 {...@@ -361,11 +363,13 @@ fn genArg(ctx: *Context) !?[]u8 {
361}363}
362364
363fn genRetVoid(file: *C) !?[]u8 {365fn genRetVoid(file: *C) !?[]u8 {
366 try indent(file);
364 try file.main.writer().print("return;\n", .{});367 try file.main.writer().print("return;\n", .{});
365 return null;368 return null;
366}369}
367370
368fn genRet(ctx: *Context, file: *C, inst: *Inst.UnOp) !?[]u8 {371fn genRet(ctx: *Context, file: *C, inst: *Inst.UnOp) !?[]u8 {
372 try indent(file);
369 const writer = file.main.writer();373 const writer = file.main.writer();
370 try writer.writeAll("return ");374 try writer.writeAll("return ");
371 try genValue(ctx, writer, inst.operand);375 try genValue(ctx, writer, inst.operand);
...@@ -384,6 +388,7 @@ fn genValue(ctx: *Context, writer: Writer, inst: *Inst) !void {...@@ -384,6 +388,7 @@ fn genValue(ctx: *Context, writer: Writer, inst: *Inst) !void {
384fn genIntCast(ctx: *Context, file: *C, inst: *Inst.UnOp) !?[]u8 {388fn genIntCast(ctx: *Context, file: *C, inst: *Inst.UnOp) !?[]u8 {
385 if (inst.base.isUnused())389 if (inst.base.isUnused())
386 return null;390 return null;
391 try indent(file);
387 const op = inst.operand;392 const op = inst.operand;
388 const writer = file.main.writer();393 const writer = file.main.writer();
389 const name = try ctx.name();394 const name = try ctx.name();
...@@ -399,6 +404,7 @@ fn genIntCast(ctx: *Context, file: *C, inst: *Inst.UnOp) !?[]u8 {...@@ -399,6 +404,7 @@ fn genIntCast(ctx: *Context, file: *C, inst: *Inst.UnOp) !?[]u8 {
399fn genBinOp(ctx: *Context, file: *C, inst: *Inst.BinOp, comptime operator: []const u8) !?[]u8 {404fn genBinOp(ctx: *Context, file: *C, inst: *Inst.BinOp, comptime operator: []const u8) !?[]u8 {
400 if (inst.base.isUnused())405 if (inst.base.isUnused())
401 return null;406 return null;
407 try indent(file);
402 const lhs = ctx.resolveInst(inst.lhs);408 const lhs = ctx.resolveInst(inst.lhs);
403 const rhs = ctx.resolveInst(inst.rhs);409 const rhs = ctx.resolveInst(inst.rhs);
404 const writer = file.main.writer();410 const writer = file.main.writer();
...@@ -410,6 +416,7 @@ fn genBinOp(ctx: *Context, file: *C, inst: *Inst.BinOp, comptime operator: []con...@@ -410,6 +416,7 @@ fn genBinOp(ctx: *Context, file: *C, inst: *Inst.BinOp, comptime operator: []con
410}416}
411417
412fn genCall(ctx: *Context, file: *C, inst: *Inst.Call) !?[]u8 {418fn genCall(ctx: *Context, file: *C, inst: *Inst.Call) !?[]u8 {
419 try indent(file);
413 const writer = file.main.writer();420 const writer = file.main.writer();
414 const header = file.header.buf.writer();421 const header = file.header.buf.writer();
415 if (inst.func.castTag(.constant)) |func_inst| {422 if (inst.func.castTag(.constant)) |func_inst| {
...@@ -458,16 +465,19 @@ fn genDbgStmt(ctx: *Context, inst: *Inst.NoOp) !?[]u8 {...@@ -458,16 +465,19 @@ fn genDbgStmt(ctx: *Context, inst: *Inst.NoOp) !?[]u8 {
458}465}
459466
460fn genBreakpoint(file: *C, inst: *Inst.NoOp) !?[]u8 {467fn genBreakpoint(file: *C, inst: *Inst.NoOp) !?[]u8 {
468 try indent(file);
461 try file.main.writer().writeAll("zig_breakpoint();\n");469 try file.main.writer().writeAll("zig_breakpoint();\n");
462 return null;470 return null;
463}471}
464472
465fn genUnreach(file: *C, inst: *Inst.NoOp) !?[]u8 {473fn genUnreach(file: *C, inst: *Inst.NoOp) !?[]u8 {
474 try indent(file);
466 try file.main.writer().writeAll("zig_unreachable();\n");475 try file.main.writer().writeAll("zig_unreachable();\n");
467 return null;476 return null;
468}477}
469478
470fn genAsm(ctx: *Context, file: *C, as: *Inst.Assembly) !?[]u8 {479fn genAsm(ctx: *Context, file: *C, as: *Inst.Assembly) !?[]u8 {
480 try indent(file);
471 const writer = file.main.writer();481 const writer = file.main.writer();
472 for (as.inputs) |i, index| {482 for (as.inputs) |i, index| {
473 if (i[0] == '{' and i[i.len - 1] == '}') {483 if (i[0] == '{' and i[i.len - 1] == '}') {
test/stage2/cbe.zig+16-29
...@@ -23,6 +23,7 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -23,6 +23,7 @@ pub fn addCases(ctx: *TestContext) !void {
2323
24 // Now change the message only24 // Now change the message only
25 // TODO fix C backend not supporting updates25 // TODO fix C backend not supporting updates
26 // https://github.com/ziglang/zig/issues/7589
26 //case.addCompareOutput(27 //case.addCompareOutput(
27 // \\extern fn puts(s: [*:0]const u8) c_int;28 // \\extern fn puts(s: [*:0]const u8) c_int;
28 // \\export fn main() c_int {29 // \\export fn main() c_int {
...@@ -88,9 +89,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -88,9 +89,9 @@ pub fn addCases(ctx: *TestContext) !void {
88 ,89 ,
89 \\zig_noreturn void exitGood(void);90 \\zig_noreturn void exitGood(void);
90 \\91 \\
91 \\const char *const exitGood__anon_0 = "{rax}";92 \\static uint8_t exitGood__anon_0[6] = "{rax}";
92 \\const char *const exitGood__anon_1 = "{rdi}";93 \\static uint8_t exitGood__anon_1[6] = "{rdi}";
93 \\const char *const exitGood__anon_2 = "syscall";94 \\static uint8_t exitGood__anon_2[8] = "syscall";
94 \\95 \\
95 \\zig_noreturn void _start(void) {96 \\zig_noreturn void _start(void) {
96 \\ exitGood();97 \\ exitGood();
...@@ -122,9 +123,9 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -122,9 +123,9 @@ pub fn addCases(ctx: *TestContext) !void {
122 ,123 ,
123 \\zig_noreturn void exit(uintptr_t arg0);124 \\zig_noreturn void exit(uintptr_t arg0);
124 \\125 \\
125 \\const char *const exit__anon_0 = "{rax}";126 \\static uint8_t exit__anon_0[6] = "{rax}";
126 \\const char *const exit__anon_1 = "{rdi}";127 \\static uint8_t exit__anon_1[6] = "{rdi}";
127 \\const char *const exit__anon_2 = "syscall";128 \\static uint8_t exit__anon_2[8] = "syscall";
128 \\129 \\
129 \\zig_noreturn void _start(void) {130 \\zig_noreturn void _start(void) {
130 \\ exit(0);131 \\ exit(0);
...@@ -154,13 +155,11 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -154,13 +155,11 @@ pub fn addCases(ctx: *TestContext) !void {
154 \\}155 \\}
155 \\156 \\
156 ,157 ,
157 \\#include <stdint.h>
158 \\
159 \\zig_noreturn void exit(uint8_t arg0);158 \\zig_noreturn void exit(uint8_t arg0);
160 \\159 \\
161 \\const char *const exit__anon_0 = "{rax}";160 \\static uint8_t exit__anon_0[6] = "{rax}";
162 \\const char *const exit__anon_1 = "{rdi}";161 \\static uint8_t exit__anon_1[6] = "{rdi}";
163 \\const char *const exit__anon_2 = "syscall";162 \\static uint8_t exit__anon_2[8] = "syscall";
164 \\163 \\
165 \\zig_noreturn void _start(void) {164 \\zig_noreturn void _start(void) {
166 \\ exit(0);165 \\ exit(0);
...@@ -195,14 +194,12 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -195,14 +194,12 @@ pub fn addCases(ctx: *TestContext) !void {
195 \\}194 \\}
196 \\195 \\
197 ,196 ,
198 \\#include <stdint.h>
199 \\
200 \\zig_noreturn void exitMath(uint8_t arg0);197 \\zig_noreturn void exitMath(uint8_t arg0);
201 \\zig_noreturn void exit(uint8_t arg0);198 \\zig_noreturn void exit(uint8_t arg0);
202 \\199 \\
203 \\const char *const exit__anon_0 = "{rax}";200 \\static uint8_t exit__anon_0[6] = "{rax}";
204 \\const char *const exit__anon_1 = "{rdi}";201 \\static uint8_t exit__anon_1[6] = "{rdi}";
205 \\const char *const exit__anon_2 = "syscall";202 \\static uint8_t exit__anon_2[8] = "syscall";
206 \\203 \\
207 \\zig_noreturn void _start(void) {204 \\zig_noreturn void _start(void) {
208 \\ exitMath(1);205 \\ exitMath(1);
...@@ -243,14 +240,12 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -243,14 +240,12 @@ pub fn addCases(ctx: *TestContext) !void {
243 \\}240 \\}
244 \\241 \\
245 ,242 ,
246 \\#include <stdint.h>
247 \\
248 \\zig_noreturn void exitMath(uint8_t arg0);243 \\zig_noreturn void exitMath(uint8_t arg0);
249 \\zig_noreturn void exit(uint8_t arg0);244 \\zig_noreturn void exit(uint8_t arg0);
250 \\245 \\
251 \\const char *const exit__anon_0 = "{rax}";246 \\static uint8_t exit__anon_0[6] = "{rax}";
252 \\const char *const exit__anon_1 = "{rdi}";247 \\static uint8_t exit__anon_1[6] = "{rdi}";
253 \\const char *const exit__anon_2 = "syscall";248 \\static uint8_t exit__anon_2[8] = "syscall";
254 \\249 \\
255 \\zig_noreturn void _start(void) {250 \\zig_noreturn void _start(void) {
256 \\ exitMath(1);251 \\ exitMath(1);
...@@ -275,24 +270,18 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -275,24 +270,18 @@ pub fn addCases(ctx: *TestContext) !void {
275 ctx.h("header with single param function", linux_x64,270 ctx.h("header with single param function", linux_x64,
276 \\export fn start(a: u8) void{}271 \\export fn start(a: u8) void{}
277 ,272 ,
278 \\#include <stdint.h>
279 \\
280 \\void start(uint8_t arg0);273 \\void start(uint8_t arg0);
281 \\274 \\
282 );275 );
283 ctx.h("header with multiple param function", linux_x64,276 ctx.h("header with multiple param function", linux_x64,
284 \\export fn start(a: u8, b: u8, c: u8) void{}277 \\export fn start(a: u8, b: u8, c: u8) void{}
285 ,278 ,
286 \\#include <stdint.h>
287 \\
288 \\void start(uint8_t arg0, uint8_t arg1, uint8_t arg2);279 \\void start(uint8_t arg0, uint8_t arg1, uint8_t arg2);
289 \\280 \\
290 );281 );
291 ctx.h("header with u32 param function", linux_x64,282 ctx.h("header with u32 param function", linux_x64,
292 \\export fn start(a: u32) void{}283 \\export fn start(a: u32) void{}
293 ,284 ,
294 \\#include <stdint.h>
295 \\
296 \\void start(uint32_t arg0);285 \\void start(uint32_t arg0);
297 \\286 \\
298 );287 );
...@@ -329,8 +318,6 @@ pub fn addCases(ctx: *TestContext) !void {...@@ -329,8 +318,6 @@ pub fn addCases(ctx: *TestContext) !void {
329 ctx.h("header with multiple includes", linux_x64,318 ctx.h("header with multiple includes", linux_x64,
330 \\export fn start(a: u32, b: usize) void{}319 \\export fn start(a: u32, b: usize) void{}
331 ,320 ,
332 \\#include <stdint.h>
333 \\
334 \\void start(uint32_t arg0, uintptr_t arg1);321 \\void start(uint32_t arg0, uintptr_t arg1);
335 \\322 \\
336 );323 );