authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-12-15 00:07:51-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2015-12-15 00:07:51-07:00
log66ca916805efee6b35b8dd6104fb1da50dd1dc8b
tree7adacd400232e2df30b63a191c56f905bb217941
parent4dc2b8250638efda3a9990182f46ad57c403b28b

std: expose exit syscall


2 files changed, 24 insertions(+), 9 deletions(-)

example/expressions/expressions.zig+5-9
...@@ -1,10 +1,6 @@...@@ -1,10 +1,6 @@
1export executable "expressions";1export executable "expressions";
22
3#link("c")3use "std.zig";
4extern {
5 fn puts(s: &const u8) -> i32;
6 fn exit(code: i32) -> unreachable;
7}
84
9fn other_exit() -> unreachable {5fn other_exit() -> unreachable {
10 if (true) { exit(0); }6 if (true) { exit(0); }
...@@ -12,21 +8,21 @@ fn other_exit() -> unreachable {...@@ -12,21 +8,21 @@ fn other_exit() -> unreachable {
12 unreachable;8 unreachable;
13}9}
1410
15export fn _start() -> unreachable {11export fn main(argc: isize, argv: &&u8, env: &&u8) -> unreachable {
16 const a : i32 = 1;12 const a : i32 = 1;
17 const b = 2 as i32;13 const b = 2 as i32;
18 // const c : i32; // not yet support for const variables14 // const c : i32; // not yet support for const variables
19 // const d; // parse error15 // const d; // parse error
20 if (a + b == 3) {16 if (a + b == 3) {
21 const no_conflict : i32 = 5;17 const no_conflict : i32 = 5;
22 if (no_conflict == 5) { puts(c"OK 1"); }18 if (no_conflict == 5) { print_str("OK 1\n" as string); }
23 }19 }
2420
25 const c = {21 const c = {
26 const no_conflict : i32 = 10;22 const no_conflict : i32 = 10;
27 no_conflict23 no_conflict
28 };24 };
29 if (c == 10) { puts(c"OK 2"); }25 if (c == 10) { print_str("OK 2\n" as string); }
3026
31 void_fun(1, void, 2);27 void_fun(1, void, 2);
3228
...@@ -49,7 +45,7 @@ loop_start:...@@ -49,7 +45,7 @@ loop_start:
49 if i == 3 {45 if i == 3 {
50 goto done;46 goto done;
51 }47 }
52 puts(c"loop");48 print_str("loop\n" as string);
53 i = i + 1;49 i = i + 1;
54 goto loop_start;50 goto loop_start;
55done:51done:
std/std.zig+19
...@@ -1,6 +1,20 @@...@@ -1,6 +1,20 @@
1const SYS_write : isize = 1;1const SYS_write : isize = 1;
2const SYS_exit : isize = 60;
2const stdout_fileno : isize = 1;3const stdout_fileno : isize = 1;
34
5fn syscall1(number: isize, arg1: isize) -> isize {
6 var result : isize;
7 asm volatile ("
8 mov %[number], %%rax
9 mov %[arg1], %%rdi
10 syscall
11 mov %%rax, %[ret]"
12 : [ret] "=m" (result)
13 : [number] "r" (number), [arg1] "r" (arg1)
14 : "rcx", "r11", "rax", "rdi");
15 return result;
16}
17
4fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize {18fn syscall3(number: isize, arg1: isize, arg2: isize, arg3: isize) -> isize {
5 var result : isize;19 var result : isize;
6 asm volatile ("20 asm volatile ("
...@@ -20,6 +34,11 @@ pub fn write(fd: isize, buf: &const u8, count: usize) -> isize {...@@ -20,6 +34,11 @@ pub fn write(fd: isize, buf: &const u8, count: usize) -> isize {
20 return syscall3(SYS_write, fd, buf as isize, count as isize);34 return syscall3(SYS_write, fd, buf as isize, count as isize);
21}35}
2236
37pub fn exit(status: i32) -> unreachable {
38 syscall1(SYS_exit, status as isize);
39 unreachable;
40}
41
23// TODO error handling42// TODO error handling
24// TODO handle buffering and flushing43// TODO handle buffering and flushing
25pub fn print_str(str : string) -> isize {44pub fn print_str(str : string) -> isize {