From 66ca916805efee6b35b8dd6104fb1da50dd1dc8b Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 15 Dec 2015 00:07:51 -0700 Subject: [PATCH] std: expose exit syscall --- example/expressions/expressions.zig | 14 +++++--------- std/std.zig | 19 +++++++++++++++++++ 2 files changed, 24 insertions(+), 9 deletions(-) diff --git a/example/expressions/expressions.zig b/example/expressions/expressions.zig index cab306c46676ec3e65dc28cc053f6b2dd8894c9d..4a1090939a0e64d49daec813eb8e0a03222948bb 100644 --- a/example/expressions/expressions.zig +++ b/example/expressions/expressions.zig @@ -1,10 +1,6 @@ export executable "expressions"; -#link("c") -extern { - fn puts(s: &const u8) -> i32; - fn exit(code: i32) -> unreachable; -} +use "std.zig"; fn other_exit() -> unreachable { if (true) { exit(0); } @@ -12,21 +8,21 @@ fn other_exit() -> unreachable { unreachable; } -export fn _start() -> unreachable { +export fn main(argc: isize, argv: &&u8, env: &&u8) -> unreachable { const a : i32 = 1; const b = 2 as i32; // const c : i32; // not yet support for const variables // const d; // parse error if (a + b == 3) { const no_conflict : i32 = 5; - if (no_conflict == 5) { puts(c"OK 1"); } + if (no_conflict == 5) { print_str("OK 1\n" as string); } } const c = { const no_conflict : i32 = 10; no_conflict }; - if (c == 10) { puts(c"OK 2"); } + if (c == 10) { print_str("OK 2\n" as string); } void_fun(1, void, 2); @@ -49,7 +45,7 @@ loop_start: if i == 3 { goto done; } - puts(c"loop"); + print_str("loop\n" as string); i = i + 1; goto loop_start; done: diff --git a/std/std.zig b/std/std.zig index 8b1962844186cd9ce6fa02894cce9f610ce2e6af..ea3b0d20f67e8854c9b149b26e5ea0105d8dddc4 100644 --- a/std/std.zig +++ b/std/std.zig @@ -1,6 +1,20 @@ const SYS_write : isize = 1; +const SYS_exit : isize = 60; const stdout_fileno : isize = 1; +fn syscall1(number: isize, arg1: isize) -> isize { + var result : isize; + asm volatile (" + mov %[number], %%rax + mov %[arg1], %%rdi + syscall + mov %%rax, %[ret]" + : [ret] "=m" (result) + : [number] "r" (number), [arg1] "r" (arg1) + : "rcx", "r11", "rax", "rdi"); + return result; +} + fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize { var result : isize; asm volatile (" @@ -20,6 +34,11 @@ pub fn write(fd: isize, buf: &const u8, count: usize) -> isize { return syscall3(SYS_write, fd, buf as isize, count as isize); } +pub fn exit(status: i32) -> unreachable { + syscall1(SYS_exit, status as isize); + unreachable; +} + // TODO error handling // TODO handle buffering and flushing pub fn print_str(str : string) -> isize { -- 2.54.0