Commit 8a7a07f30d

Andrew Kelley <andrew@ziglang.org>
2021-05-17 23:39:56
stage2: test cases take advantage of `pub fn main` support
1 parent 8367707
Changed files (3)
test/stage2/arm.zig
@@ -9,7 +9,7 @@ const linux_arm = std.zig.CrossTarget{
 pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("linux_arm hello world", linux_arm);
-        // Regular old hello world
+        // Hello world using _start and inline asm.
         case.addCompareOutput(
             \\pub export fn _start() noreturn {
             \\    print();
@@ -50,9 +50,8 @@ pub fn addCases(ctx: *TestContext) !void {
         // be in a specific order because otherwise the write to r0
         // would overwrite the len parameter which resides in r0
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    print(id(14));
-            \\    exit();
             \\}
             \\
             \\fn id(x: u32) u32 {
@@ -70,16 +69,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    );
             \\    return;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "Hello, World!\n",
         );
@@ -89,9 +78,8 @@ pub fn addCases(ctx: *TestContext) !void {
         var case = ctx.exe("non-leaf functions", linux_arm);
         // Testing non-leaf functions
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    foo();
-            \\    exit();
             \\}
             \\
             \\fn foo() void {
@@ -99,16 +87,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\}
             \\
             \\fn bar() void {}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -119,10 +97,9 @@ pub fn addCases(ctx: *TestContext) !void {
 
         // Add two numbers
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    print(2, 4);
             \\    print(1, 7);
-            \\    exit();
             \\}
             \\
             \\fn print(a: u32, b: u32) void {
@@ -136,26 +113,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    );
             \\    return;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "12345612345678",
         );
 
         // Subtract two numbers
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    print(10, 5);
             \\    print(4, 3);
-            \\    exit();
             \\}
             \\
             \\fn print(a: u32, b: u32) void {
@@ -169,26 +135,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    );
             \\    return;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "123451",
         );
 
         // Bitwise And
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    print(8, 9);
             \\    print(3, 7);
-            \\    exit();
             \\}
             \\
             \\fn print(a: u32, b: u32) void {
@@ -202,26 +157,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    );
             \\    return;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "12345678123",
         );
 
         // Bitwise Or
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    print(4, 2);
             \\    print(3, 7);
-            \\    exit();
             \\}
             \\
             \\fn print(a: u32, b: u32) void {
@@ -235,26 +179,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    );
             \\    return;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "1234561234567",
         );
 
         // Bitwise Xor
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    print(42, 42);
             \\    print(3, 5);
-            \\    exit();
             \\}
             \\
             \\fn print(a: u32, b: u32) void {
@@ -268,16 +201,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    );
             \\    return;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "123456",
         );
@@ -287,26 +210,15 @@ pub fn addCases(ctx: *TestContext) !void {
         var case = ctx.exe("if statements", linux_arm);
         // Simple if statement in assert
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var x: u32 = 123;
             \\    var y: u32 = 42;
             \\    assert(x > y);
-            \\    exit();
             \\}
             \\
             \\fn assert(ok: bool) void {
             \\    if (!ok) unreachable;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -316,7 +228,7 @@ pub fn addCases(ctx: *TestContext) !void {
         var case = ctx.exe("while loops", linux_arm);
         // Simple while loop with assert
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var x: u32 = 2020;
             \\    var i: u32 = 0;
             \\    while (x > 0) {
@@ -324,22 +236,11 @@ pub fn addCases(ctx: *TestContext) !void {
             \\        i += 1;
             \\    }
             \\    assert(i == 1010);
-            \\    exit();
             \\}
             \\
             \\fn assert(ok: bool) void {
             \\    if (!ok) unreachable;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -349,12 +250,11 @@ pub fn addCases(ctx: *TestContext) !void {
         var case = ctx.exe("integer multiplication", linux_arm);
         // Simple u32 integer multiplication
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(mul(1, 1) == 1);
             \\    assert(mul(42, 1) == 42);
             \\    assert(mul(1, 42) == 42);
             \\    assert(mul(123, 42) == 5166);
-            \\    exit();
             \\}
             \\
             \\fn mul(x: u32, y: u32) u32 {
@@ -364,16 +264,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\fn assert(ok: bool) void {
             \\    if (!ok) unreachable;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -385,9 +275,8 @@ pub fn addCases(ctx: *TestContext) !void {
         // callee preserved register, otherwise it will be overwritten
         // by the first parameter to baz.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(foo() == 43);
-            \\    exit();
             \\}
             \\
             \\fn foo() u32 {
@@ -405,16 +294,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\fn assert(ok: bool) void {
             \\    if (!ok) unreachable;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -423,14 +302,13 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("recursive fibonacci", linux_arm);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(fib(0) == 0);
             \\    assert(fib(1) == 1);
             \\    assert(fib(2) == 1);
             \\    assert(fib(3) == 2);
             \\    assert(fib(10) == 55);
             \\    assert(fib(20) == 6765);
-            \\    exit();
             \\}
             \\
             \\fn fib(n: u32) u32 {
@@ -444,16 +322,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\fn assert(ok: bool) void {
             \\    if (!ok) unreachable;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -462,9 +330,8 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("spilling registers", linux_arm);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(add(3, 4) == 791);
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) u32 {
@@ -497,16 +364,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\fn assert(ok: bool) void {
             \\    if (!ok) unreachable;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("svc #0"
-            \\        :
-            \\        : [number] "{r7}" (1),
-            \\          [arg1] "{r0}" (0)
-            \\        : "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
test/stage2/test.zig
@@ -65,6 +65,7 @@ pub fn addCases(ctx: *TestContext) !void {
         ,
             "Hello, World!\n",
         );
+
         // Now change the message only
         case.addCompareOutput(
             \\pub export fn _start() noreturn {
@@ -237,25 +238,13 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("subtracting numbers at runtime", linux_x64);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    sub(7, 4);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn sub(a: u32, b: u32) void {
             \\    if (a - b != 3) unreachable;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -263,58 +252,33 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("@TypeOf", linux_x64);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var x: usize = 0;
             \\    const z = @TypeOf(x, @as(u128, 5));
             \\    assert(z == u128);
-            \\
-            \\    exit();
             \\}
             \\
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const z = @TypeOf(true);
             \\    assert(z == bool);
-            \\
-            \\    exit();
             \\}
             \\
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
         case.addError(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const z = @TypeOf(true, 1);
-            \\    unreachable;
             \\}
         , &[_][]const u8{":2:15: error: incompatible types: 'bool' and 'comptime_int'"});
     }
@@ -346,7 +310,7 @@ pub fn addCases(ctx: *TestContext) !void {
         );
         // comptime function call
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn _start() noreturn {
             \\    exit();
             \\}
             \\
@@ -397,10 +361,8 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("assert function", linux_x64);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    add(3, 4);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) void {
@@ -427,10 +389,8 @@ pub fn addCases(ctx: *TestContext) !void {
         // Tests copying a register. For the `c = a + b`, it has to
         // preserve both a and b, because they are both used later.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    add(3, 4);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) void {
@@ -443,26 +403,14 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // More stress on the liveness detection.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    add(3, 4);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) void {
@@ -479,26 +427,14 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Requires a second move. The register allocator should figure out to re-use rax.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    add(3, 4);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) void {
@@ -516,27 +452,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Now we test integer return values.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(add(3, 4) == 7);
             \\    assert(add(20, 10) == 30);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) u32 {
@@ -546,27 +470,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Local mutable variables.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(add(3, 4) == 7);
             \\    assert(add(20, 10) == 30);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) u32 {
@@ -580,39 +492,17 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Optionals
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const a: u32 = 2;
             \\    const b: ?u32 = a;
             \\    const c = b.?;
             \\    if (c != 2) unreachable;
-            \\
-            \\    exit();
-            \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
             \\}
         ,
             "",
@@ -620,12 +510,10 @@ pub fn addCases(ctx: *TestContext) !void {
 
         // While loops
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var i: u32 = 0;
             \\    while (i < 4) : (i += 1) print();
             \\    assert(i == 4);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn print() void {
@@ -643,28 +531,16 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "hello\nhello\nhello\nhello\n",
         );
 
         // inline while requires the condition to be comptime known.
         case.addError(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var i: u32 = 0;
             \\    inline while (i < 4) : (i += 1) print();
             \\    assert(i == 4);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn print() void {
@@ -682,24 +558,12 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         , &[_][]const u8{":3:21: error: unable to resolve comptime value"});
 
         // Labeled blocks (no conditional branch)
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(add(3, 4) == 20);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) u32 {
@@ -717,26 +581,14 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // This catches a possible bug in the logic for re-using dying operands.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(add(3, 4) == 116);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) u32 {
@@ -759,27 +611,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Spilling registers to the stack.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(add(3, 4) == 1221);
             \\    assert(mul(3, 4) == 21609);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) u32 {
@@ -840,27 +680,15 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Reusing the registers of dead operands playing nicely with conditional branching.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(add(3, 4) == 791);
             \\    assert(add(4, 3) == 79);
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) u32 {
@@ -902,30 +730,18 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Character literals and multiline strings.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const ignore =
             \\        \\ cool thx
             \\        \\
             \\    ;
             \\    add('ぁ', '\x03');
-            \\
-            \\    exit();
             \\}
             \\
             \\fn add(a: u32, b: u32) void {
@@ -935,26 +751,14 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Global const.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    add(aa, bb);
-            \\
-            \\    exit();
             \\}
             \\
             \\const aa = 'ぁ';
@@ -967,41 +771,19 @@ pub fn addCases(ctx: *TestContext) !void {
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Array access.
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert("hello"[0] == 'h');
-            \\
-            \\    exit();
             \\}
             \\
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -1009,61 +791,35 @@ pub fn addCases(ctx: *TestContext) !void {
         // Array access to a global array.
         case.addCompareOutput(
             \\const hello = "hello".*;
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    assert(hello[1] == 'e');
-            \\
-            \\    exit();
             \\}
             \\
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // 64bit set stack
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var i: u64 = 0xFFEEDDCCBBAA9988;
             \\    assert(i == 0xFFEEDDCCBBAA9988);
-            \\
-            \\    exit();
             \\}
             \\
             \\pub fn assert(ok: bool) void {
             \\    if (!ok) unreachable; // assertion failure
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         // Basic for loop
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    for ("hello") |_| print();
-            \\
-            \\    exit();
             \\}
             \\
             \\fn print() void {
@@ -1077,16 +833,6 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    );
             \\    return;
             \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "hello\nhello\nhello\nhello\nhello\n",
         );
@@ -1095,19 +841,8 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("basic import", linux_x64);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    @import("print.zig").print();
-            \\    exit();
-            \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (@as(usize, 0))
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
             \\}
         ,
             "Hello, World!\n",
@@ -1132,14 +867,14 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("redundant comptime", linux_x64);
         case.addError(
-            \\pub export fn _start() void {
+            \\pub fn main() void {
             \\    var a: comptime u32 = 0;
             \\}
         ,
             &.{":2:12: error: redundant comptime keyword in already comptime scope"},
         );
         case.addError(
-            \\pub export fn _start() void {
+            \\pub fn main() void {
             \\    comptime {
             \\        var a: u32 = comptime 0;
             \\    }
@@ -1151,19 +886,8 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("import private", linux_x64);
         case.addError(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    @import("print.zig").print();
-            \\    exit();
-            \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (@as(usize, 0))
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
             \\}
         ,
             &.{
@@ -1215,19 +939,17 @@ pub fn addCases(ctx: *TestContext) !void {
     });
 
     ctx.compileError("compileError", linux_x64,
-        \\pub export fn _start() noreturn {
+        \\export fn foo() void {
         \\  @compileError("this is an error");
-        \\  unreachable;
         \\}
     , &[_][]const u8{":2:3: error: this is an error"});
 
     {
         var case = ctx.obj("variable shadowing", linux_x64);
         case.addError(
-            \\export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var i: u32 = 10;
             \\    var i: u32 = 10;
-            \\    unreachable;
             \\}
         , &[_][]const u8{
             ":3:9: error: redeclaration of 'i'",
@@ -1235,9 +957,8 @@ pub fn addCases(ctx: *TestContext) !void {
         });
         case.addError(
             \\var testing: i64 = 10;
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    var testing: i64 = 20;
-            \\    unreachable;
             \\}
         , &[_][]const u8{
             ":3:9: error: local shadows declaration of 'testing'",
@@ -1268,7 +989,7 @@ pub fn addCases(ctx: *TestContext) !void {
 
         // Now only compile log statements remain. One per Decl.
         case.addError(
-            \\pub export fn _start() noreturn {
+            \\export fn _start() noreturn {
             \\    const b = true;
             \\    var f: u32 = 1;
             \\    @compileLog(b, 20, f, x);
@@ -1306,43 +1027,19 @@ pub fn addCases(ctx: *TestContext) !void {
 
         // Break out of loop
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    while (true) {
             \\        break;
             \\    }
-            \\
-            \\    exit();
-            \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
             \\}
         ,
             "",
         );
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    foo: while (true) {
             \\        break :foo;
             \\    }
-            \\
-            \\    exit();
-            \\}
-            \\
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
             \\}
         ,
             "",
@@ -1534,46 +1231,26 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("orelse at comptime", linux_x64);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const i: ?u64 = 0;
-            \\    const orelsed = i orelse 5;
-            \\    assert(orelsed == 0);
-            \\    exit();
+            \\    const result = i orelse 5;
+            \\    assert(result == 0);
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable;
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const i: ?u64 = null;
-            \\    const orelsed = i orelse 5;
-            \\    assert(orelsed == 5);
-            \\    exit();
+            \\    const result = i orelse 5;
+            \\    assert(result == 5);
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable;
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -1611,20 +1288,10 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("passing u0 to function", linux_x64);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    doNothing(0);
-            \\    exit();
             \\}
             \\fn doNothing(arg: u0) void {}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
@@ -1632,119 +1299,67 @@ pub fn addCases(ctx: *TestContext) !void {
     {
         var case = ctx.exe("catch at comptime", linux_x64);
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const i: anyerror!u64 = 0;
             \\    const caught = i catch 5;
             \\    assert(caught == 0);
-            \\    exit();
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable;
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const i: anyerror!u64 = error.B;
             \\    const caught = i catch 5;
             \\    assert(caught == 5);
-            \\    exit();
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable;
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
 
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const a: anyerror!comptime_int = 42;
             \\    const b: *const comptime_int = &(a catch unreachable);
             \\    assert(b.* == 42);
-            \\
-            \\    exit();
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable; // assertion failure
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         , "");
 
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const a: anyerror!u32 = error.B;
             \\    _ = &(a catch |err| assert(err == error.B));
-            \\    exit();
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable;
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         , "");
 
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const a: anyerror!u32 = error.Bar;
             \\    a catch |err| assert(err == error.Bar);
-            \\
-            \\    exit();
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable;
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         , "");
     }
     {
         var case = ctx.exe("merge error sets", linux_x64);
 
         case.addCompareOutput(
-            \\pub export fn _start() noreturn {
+            \\pub fn main() void {
             \\    const E = error{ A, B, D } || error { A, B, C };
             \\    const a = E.A;
             \\    const b = E.B;
@@ -1755,20 +1370,10 @@ pub fn addCases(ctx: *TestContext) !void {
             \\    const y = E2.Y;
             \\    const z = E2.Z;
             \\    assert(anyerror || error { Z } == anyerror);
-            \\    exit();
             \\}
             \\fn assert(b: bool) void {
             \\    if (!b) unreachable;
             \\}
-            \\fn exit() noreturn {
-            \\    asm volatile ("syscall"
-            \\        :
-            \\        : [number] "{rax}" (231),
-            \\          [arg1] "{rdi}" (0)
-            \\        : "rcx", "r11", "memory"
-            \\    );
-            \\    unreachable;
-            \\}
         ,
             "",
         );
BRANCH_TODO
@@ -1,5 +1,3 @@
- * modify stage2 tests so that only 1 uses _start and the rest use
-   pub fn main
  * modify stage2 CBE tests so that only 1 uses pub export main and the
    rest use pub fn main