authorgravatar for noam@pixelhero.devNoam Preil <noam@pixelhero.dev> 2020-06-15 17:59:38-04:00
committergravatar for noam@pixelhero.devNoam Preil <noam@pixelhero.dev> 2020-06-15 20:33:39-04:00
log7ee0462f5f8b4ec5ff824b38821d8f1b79e5ba63
treef14ccce94569e7f427ec13878a20aba1ddf9976e
parent1e5945d0a926b74517b1bed3cdab00f244aa592c
signature Commit is signed but in an unrecognized format.

Stage2/Testing: Fix transformation tests


2 files changed, 114 insertions(+), 64 deletions(-)

src-self-hosted/test.zig+32-10
......@@ -38,7 +38,6 @@ pub const TestContext = struct {
3838 };
3939
4040 // TODO: remove
41
4241 pub const ZIRErrorCase = struct {
4342 name: []const u8,
4443 src: [:0]const u8,
......@@ -71,7 +70,7 @@ pub const TestContext = struct {
7170 src: [:0]const u8,
7271 case: union(ZIRUpdateType) {
7372 /// The expected output ZIR
74 Transformation: []const u8,
73 Transformation: [:0]const u8,
7574 /// A slice containing the expected errors *in sequential order*.
7675 Error: []const ErrorMsg,
7776
......@@ -106,21 +105,30 @@ pub const TestContext = struct {
106105 /// such as QEMU is required for tests to complete.
107106 ///
108107 target: std.zig.CrossTarget,
109 updates: []const ZIRUpdate,
108 updates: std.ArrayList(ZIRUpdate),
109
110 pub fn addTransform(self: *ZIRCase, src: [:0]const u8, result: [:0]const u8) void {
111 self.updates.append(.{
112 .src = src,
113 .case = .{ .Transformation = result },
114 }) catch unreachable;
115 }
116
117 pub fn addError(self: *ZIRCase, src: [:0]const u8, errors: []const []const u8) void {}
110118 };
111119
112 pub fn addZIRCase(
120 pub fn addZIRMulti(
113121 ctx: *TestContext,
114122 name: []const u8,
115123 target: std.zig.CrossTarget,
116 updates: []const ZIRUpdate,
117 ) void {
124 ) *ZIRCase {
118125 const case = ZIRCase{
119126 .name = name,
120127 .target = target,
121 .updates = updates,
128 .updates = std.ArrayList(ZIRUpdate).init(ctx.zir_cases.allocator),
122129 };
123 ctx.zir_cases.append(case) catch |err| std.debug.panic("Error: {}", .{err});
130 ctx.zir_cases.append(case) catch unreachable;
131 return &ctx.zir_cases.items[ctx.zir_cases.items.len - 1];
124132 }
125133
126134 pub fn addZIRCompareOutput(
......@@ -136,6 +144,17 @@ pub const TestContext = struct {
136144 }) catch unreachable;
137145 }
138146
147 pub fn addZIRTransform(
148 ctx: *TestContext,
149 name: []const u8,
150 target: std.zig.CrossTarget,
151 src: [:0]const u8,
152 result: [:0]const u8,
153 ) void {
154 var c = ctx.addZIRMulti(name, target);
155 c.addTransform(src, result);
156 }
157
139158 pub fn addZIRError(
140159 ctx: *TestContext,
141160 name: []const u8,
......@@ -194,6 +213,9 @@ pub const TestContext = struct {
194213 self.zir_error_cases.allocator.free(e.expected_errors);
195214 }
196215 self.zir_error_cases.deinit();
216 for (self.zir_cases.items) |c| {
217 c.updates.deinit();
218 }
197219 self.zir_cases.deinit();
198220 self.* = undefined;
199221 }
......@@ -234,7 +256,7 @@ pub const TestContext = struct {
234256 const root_pkg = try Package.create(allocator, tmp.dir, ".", tmp_src_path);
235257 defer root_pkg.destroy();
236258
237 var prg_node = root_node.start(case.name, case.updates.len);
259 var prg_node = root_node.start(case.name, case.updates.items.len);
238260 prg_node.activate();
239261 defer prg_node.end();
240262
......@@ -255,7 +277,7 @@ pub const TestContext = struct {
255277 });
256278 defer module.deinit();
257279
258 for (case.updates) |s| {
280 for (case.updates.items) |s| {
259281 // TODO: remove before committing. This is for ZLS ;)
260282 const update: ZIRUpdate = s;
261283
test/stage2/zir.zig+82-54
......@@ -1,6 +1,5 @@
11const std = @import("std");
22const TestContext = @import("../../src-self-hosted/test.zig").TestContext;
3const ZIRUpdate = TestContext.ZIRUpdate;
43// self-hosted does not yet support PE executable files / COFF object files
54// or mach-o files. So we do the ZIR transform test cases cross compiling for
65// x86_64-linux.
......@@ -10,61 +9,90 @@ const linux_x64 = std.zig.CrossTarget{
109};
1110
1211pub fn addCases(ctx: *TestContext) void {
13 ctx.addZIRCase("elemptr, add, cmp, condbr, return, breakpoint", linux_x64, &[_]ZIRUpdate{ZIRUpdate{
14 .src =
15 \\@void = primitive(void)
16 \\@usize = primitive(usize)
17 \\@fnty = fntype([], @void, cc=C)
18 \\@0 = int(0)
19 \\@1 = int(1)
20 \\@2 = int(2)
21 \\@3 = int(3)
22 \\
23 \\@entry = fn(@fnty, {
24 \\ %a = str("\x32\x08\x01\x0a")
25 \\ %aref = ref(%a)
26 \\ %eptr0 = elemptr(%aref, @0)
27 \\ %eptr1 = elemptr(%aref, @1)
28 \\ %eptr2 = elemptr(%aref, @2)
29 \\ %eptr3 = elemptr(%aref, @3)
30 \\ %v0 = deref(%eptr0)
31 \\ %v1 = deref(%eptr1)
32 \\ %v2 = deref(%eptr2)
33 \\ %v3 = deref(%eptr3)
34 \\ %x0 = add(%v0, %v1)
35 \\ %x1 = add(%v2, %v3)
36 \\ %result = add(%x0, %x1)
37 \\
38 \\ %expected = int(69)
39 \\ %ok = cmp(%result, eq, %expected)
40 \\ %10 = condbr(%ok, {
41 \\ %11 = return()
42 \\ }, {
43 \\ %12 = breakpoint()
44 \\ })
45 \\})
46 \\
47 \\@9 = str("entry")
48 \\@10 = ref(@9)
49 \\@11 = export(@10, @entry)
50 ,
51 .case = .{
52 .Transformation =
53 \\@0 = primitive(void)
54 \\@1 = fntype([], @0, cc=C)
55 \\@2 = fn(@1, {
56 \\ %0 = return()
57 \\})
58 \\@3 = str("entry")
59 \\@4 = ref(@3)
60 \\@5 = export(@4, @2)
61 \\
62 },
63 }});
12 ctx.addZIRTransform("referencing decls which appear later in the file", linux_x64,
13 \\@void = primitive(void)
14 \\@fnty = fntype([], @void, cc=C)
15 \\
16 \\@9 = str("entry")
17 \\@10 = ref(@9)
18 \\@11 = export(@10, @entry)
19 \\
20 \\@entry = fn(@fnty, {
21 \\ %11 = return()
22 \\})
23 ,
24 \\@void = primitive(void)
25 \\@fnty = fntype([], @void, cc=C)
26 \\@9 = str("entry")
27 \\@10 = ref(@9)
28 \\@unnamed$6 = str("entry")
29 \\@unnamed$7 = ref(@unnamed$6)
30 \\@unnamed$8 = export(@unnamed$7, @entry)
31 \\@unnamed$10 = fntype([], @void, cc=C)
32 \\@entry = fn(@unnamed$10, {
33 \\ %0 = return()
34 \\})
35 \\
36 );
37 ctx.addZIRTransform("elemptr, add, cmp, condbr, return, breakpoint", linux_x64,
38 \\@void = primitive(void)
39 \\@usize = primitive(usize)
40 \\@fnty = fntype([], @void, cc=C)
41 \\@0 = int(0)
42 \\@1 = int(1)
43 \\@2 = int(2)
44 \\@3 = int(3)
45 \\
46 \\@entry = fn(@fnty, {
47 \\ %a = str("\x32\x08\x01\x0a")
48 \\ %aref = ref(%a)
49 \\ %eptr0 = elemptr(%aref, @0)
50 \\ %eptr1 = elemptr(%aref, @1)
51 \\ %eptr2 = elemptr(%aref, @2)
52 \\ %eptr3 = elemptr(%aref, @3)
53 \\ %v0 = deref(%eptr0)
54 \\ %v1 = deref(%eptr1)
55 \\ %v2 = deref(%eptr2)
56 \\ %v3 = deref(%eptr3)
57 \\ %x0 = add(%v0, %v1)
58 \\ %x1 = add(%v2, %v3)
59 \\ %result = add(%x0, %x1)
60 \\
61 \\ %expected = int(69)
62 \\ %ok = cmp(%result, eq, %expected)
63 \\ %10 = condbr(%ok, {
64 \\ %11 = return()
65 \\ }, {
66 \\ %12 = breakpoint()
67 \\ })
68 \\})
69 \\
70 \\@9 = str("entry")
71 \\@10 = ref(@9)
72 \\@11 = export(@10, @entry)
73 ,
74 \\@void = primitive(void)
75 \\@fnty = fntype([], @void, cc=C)
76 \\@0 = int(0)
77 \\@1 = int(1)
78 \\@2 = int(2)
79 \\@3 = int(3)
80 \\@unnamed$7 = fntype([], @void, cc=C)
81 \\@entry = fn(@unnamed$7, {
82 \\ %0 = return()
83 \\})
84 \\@a = str("2\x08\x01\n")
85 \\@9 = str("entry")
86 \\@10 = ref(@9)
87 \\@unnamed$14 = str("entry")
88 \\@unnamed$15 = ref(@unnamed$14)
89 \\@unnamed$16 = export(@unnamed$15, @entry)
90 \\
91 );
6492
6593 {
6694 var case = ctx.addZIRMulti("reference cycle with compile error in the cycle", linux_x64);
67 case.addZIR(
95 case.addTransform(
6896 \\@void = primitive(void)
6997 \\@fnty = fntype([], @void, cc=C)
7098 \\
......@@ -143,7 +171,7 @@ pub fn addCases(ctx: *TestContext) void {
143171 // Now we remove the call to `a`. `a` and `b` form a cycle, but no entry points are
144172 // referencing either of them. This tests that the cycle is detected, and the error
145173 // goes away.
146 case.addZIR(
174 case.addTransform(
147175 \\@void = primitive(void)
148176 \\@fnty = fntype([], @void, cc=C)
149177 \\