| author | |
| committer | |
| log | 1abb4e59be4ceed603ec377d89b4b8ce831dbebe |
| tree | 0423da0469c75d8308c58325312200a5d7284740 |
| parent | fb1e3a5be976c76f821abf387bdd69446f2ab07b |
5 files changed, 25 insertions(+), 17 deletions(-)
example/guess_number/main.zig+3-1| ... | ... | @@ -10,7 +10,9 @@ pub fn main(argc: isize, argv: &&u8, env: &&u8) -> i32 { |
| 10 | 10 | print_str("Welcome to the Guess Number Game in Zig.\n"); |
| 11 | 11 | |
| 12 | 12 | var seed : u32; |
| 13 | if (os_get_random_bytes(&seed as &u8, 4) != 0) { | |
| 13 | var err : isize; | |
| 14 | // TODO #sizeof(u32) instead of 4 | |
| 15 | if ({err = os_get_random_bytes(&seed as &u8, 4); err != 4}) { | |
| 14 | 16 | // TODO full error message |
| 15 | 17 | fprint_str(stderr_fileno, "unable to get random bytes"); |
| 16 | 18 | return 1; |
src/analyze.cpp+1| ... | ... | @@ -196,6 +196,7 @@ static TypeTableEntry *get_array_type(CodeGen *g, TypeTableEntry *child_type, ui |
| 196 | 196 | |
| 197 | 197 | entry->size_in_bits = child_type->size_in_bits * array_size; |
| 198 | 198 | entry->align_in_bits = child_type->align_in_bits; |
| 199 | ||
| 199 | 200 | entry->di_type = LLVMZigCreateDebugArrayType(g->dbuilder, entry->size_in_bits, |
| 200 | 201 | entry->align_in_bits, child_type->di_type, array_size); |
| 201 | 202 | entry->data.array.child_type = child_type; |
src/codegen.cpp+1| ... | ... | @@ -1570,6 +1570,7 @@ static void do_code_gen(CodeGen *g) { |
| 1570 | 1570 | |
| 1571 | 1571 | add_debug_source_node(g, var->decl_node); |
| 1572 | 1572 | var->value_ref = LLVMBuildAlloca(g->builder, var->type->type_ref, buf_ptr(&var->name)); |
| 1573 | LLVMSetAlignment(var->value_ref, var->type->align_in_bits / 8); | |
| 1573 | 1574 | } |
| 1574 | 1575 | |
| 1575 | 1576 | var->di_loc_var = LLVMZigCreateLocalVariable(g->dbuilder, tag, |
src/parser.cpp+1-1| ... | ... | @@ -628,7 +628,7 @@ static uint8_t parse_char_literal(ParseContext *pc, Token *token) { |
| 628 | 628 | } else if (return_count > 1) { |
| 629 | 629 | ast_error(pc, token, "character literal too long"); |
| 630 | 630 | } |
| 631 | return return_count; | |
| 631 | return return_value; | |
| 632 | 632 | } |
| 633 | 633 | |
| 634 | 634 | static void parse_string_literal(ParseContext *pc, Token *token, Buf *buf, bool *out_c_str, |
std/std.zig+19-15| ... | ... | @@ -1,9 +1,6 @@ |
| 1 | 1 | const SYS_write : usize = 1; |
| 2 | 2 | const SYS_exit : usize = 60; |
| 3 | const SYS_getrandom : usize = 278; | |
| 4 | ||
| 5 | const stdout_fileno : isize = 1; | |
| 6 | const stderr_fileno : isize = 2; | |
| 3 | const SYS_getrandom : usize = 318; | |
| 7 | 4 | |
| 8 | 5 | fn syscall1(number: usize, arg1: usize) -> usize { |
| 9 | 6 | asm volatile ("syscall" |
| ... | ... | @@ -19,32 +16,37 @@ fn syscall3(number: usize, arg1: usize, arg2: usize, arg3: usize) -> usize { |
| 19 | 16 | : "rcx", "r11") |
| 20 | 17 | } |
| 21 | 18 | |
| 22 | pub fn getrandom(buf: &u8, count: usize, flags: u32) -> i32 { | |
| 23 | return syscall3(SYS_getrandom, buf as usize, count, flags as usize) as i32; | |
| 24 | } | |
| 25 | ||
| 26 | 19 | pub fn write(fd: isize, buf: &const u8, count: usize) -> isize { |
| 27 | return syscall3(SYS_write, fd as usize, buf as usize, count) as isize; | |
| 20 | syscall3(SYS_write, fd as usize, buf as usize, count) as isize | |
| 28 | 21 | } |
| 29 | 22 | |
| 30 | 23 | pub fn exit(status: i32) -> unreachable { |
| 31 | 24 | syscall1(SYS_exit, status as usize); |
| 32 | unreachable; | |
| 25 | unreachable | |
| 26 | } | |
| 27 | ||
| 28 | pub fn getrandom(buf: &u8, count: usize, flags: u32) -> isize { | |
| 29 | syscall3(SYS_getrandom, buf as usize, count, flags as usize) as isize | |
| 33 | 30 | } |
| 34 | 31 | |
| 32 | const stdout_fileno : isize = 1; | |
| 33 | const stderr_fileno : isize = 2; | |
| 34 | ||
| 35 | 35 | // TODO error handling |
| 36 | pub fn os_get_random_bytes(buf: &u8, count: usize) -> i32 { | |
| 37 | return getrandom(buf, count, 0); | |
| 36 | pub fn os_get_random_bytes(buf: &u8, count: usize) -> isize { | |
| 37 | getrandom(buf, count, 0) | |
| 38 | 38 | } |
| 39 | 39 | |
| 40 | 40 | // TODO error handling |
| 41 | 41 | // TODO handle buffering and flushing (mutex protected) |
| 42 | pub fn print_str(str: string) -> isize { fprint_str(stdout_fileno, str) } | |
| 42 | pub fn print_str(str: string) -> isize { | |
| 43 | fprint_str(stdout_fileno, str) | |
| 44 | } | |
| 43 | 45 | |
| 44 | 46 | // TODO error handling |
| 45 | 47 | // TODO handle buffering and flushing (mutex protected) |
| 46 | 48 | pub fn fprint_str(fd: isize, str: string) -> isize { |
| 47 | return write(fd, str.ptr, str.len); | |
| 49 | write(fd, str.ptr, str.len) | |
| 48 | 50 | } |
| 49 | 51 | |
| 50 | 52 | // TODO handle buffering and flushing (mutex protected) |
| ... | ... | @@ -56,7 +58,9 @@ pub fn print_u64(x: u64) -> isize { |
| 56 | 58 | return write(stdout_fileno, buf.ptr, len); |
| 57 | 59 | } |
| 58 | 60 | |
| 59 | fn digit_to_char(digit: u64) -> u8 { '0' + (digit as u8) } | |
| 61 | fn digit_to_char(digit: u64) -> u8 { | |
| 62 | '0' + (digit as u8) | |
| 63 | } | |
| 60 | 64 | |
| 61 | 65 | const max_u64_base10_digits: usize = 20; |
| 62 | 66 |