From d8bb9390728ace0ccc91f050e07bd99de0133418 Mon Sep 17 00:00:00 2001 From: pancake Date: Tue, 27 Apr 2021 00:09:37 +0200 Subject: [PATCH] native: fix tests, address comments and a little cleaner macho --- vlib/v/checker/checker.v | 3 +- vlib/v/gen/native/amd64.v | 4 ++- vlib/v/gen/native/arm64.v | 1 - vlib/v/gen/native/gen.v | 2 +- vlib/v/gen/native/macho.v | 23 +++++++++--- vlib/v/gen/native/tests/expressions.vv | 41 ++++++++++++++++------ vlib/v/gen/native/tests/general.vv | 32 +++++++++-------- vlib/v/gen/native/tests/general.vv.out | 3 -- vlib/v/gen/native/tests/simple_fn_calls.vv | 2 +- 9 files changed, 72 insertions(+), 39 deletions(-) diff --git a/vlib/v/checker/checker.v b/vlib/v/checker/checker.v index c4a6f37b87..74ae9798d7 100644 --- a/vlib/v/checker/checker.v +++ b/vlib/v/checker/checker.v @@ -2072,9 +2072,8 @@ pub fn (mut c Checker) fn_call(mut call_expr ast.CallExpr) ast.Type { } if !found && c.pref.backend == .native { if fn_name in native.builtins { - found = true c.table.fns[fn_name].usages++ - return ast.string_type + return ast.void_type } } if !found && c.pref.is_script && !found { diff --git a/vlib/v/gen/native/amd64.v b/vlib/v/gen/native/amd64.v index fd44bed67c..459b10ccc7 100644 --- a/vlib/v/gen/native/amd64.v +++ b/vlib/v/gen/native/amd64.v @@ -529,7 +529,9 @@ fn (mut g Gen) assign_stmt(node ast.AssignStmt) { g.allocate_var(name, 4, 0) // `mov DWORD PTR [rbp-0x8],eax` offset := g.get_var_offset(name) - println('infix assignment $name offset=$offset.hex2()') + if g.pref.is_verbose { + println('infix assignment $name offset=$offset.hex2()') + } g.mov_reg_to_rbp(offset, .eax) } ast.StructInit { diff --git a/vlib/v/gen/native/arm64.v b/vlib/v/gen/native/arm64.v index f6f6f496a6..b49bb3890c 100644 --- a/vlib/v/gen/native/arm64.v +++ b/vlib/v/gen/native/arm64.v @@ -69,7 +69,6 @@ pub fn (mut g Gen) fn_decl_arm64(node ast.FnDecl) { } fn (mut g Gen) gen_arm64_helloworld() { - // ADD THE CODE HERE THIS GOES INTO THE STMTS THING // g.write32(0x77777777) // assembly g.mov_arm(.x0, 1) diff --git a/vlib/v/gen/native/gen.v b/vlib/v/gen/native/gen.v index ea1dce15da..c6467c26b0 100644 --- a/vlib/v/gen/native/gen.v +++ b/vlib/v/gen/native/gen.v @@ -106,7 +106,7 @@ pub fn (mut g Gen) create_executable() { unsafe { f.write_ptr(g.buf.data, g.buf.len) } f.close() if g.pref.is_verbose { - println('\narm64 mach-o binary has been successfully generated') + println('\n$g.out_name: native binary has been successfully generated') } } diff --git a/vlib/v/gen/native/macho.v b/vlib/v/gen/native/macho.v index 122441f665..111557c24b 100644 --- a/vlib/v/gen/native/macho.v +++ b/vlib/v/gen/native/macho.v @@ -13,6 +13,7 @@ const ( macho_d_size = 0x50 lc_symtab = 0x2 lc_dymsymtab = 0xB + mh_object = 1 ) struct Symbol { @@ -44,9 +45,10 @@ pub fn (mut g Gen) generate_macho_header() { g.write32(0x01000007) // CPU_TYPE_X64 g.write32(0x00000003) // CPU_SUBTYPE_X64 } - g.write32(0x00000001) // MH_OBJECT - g.write32(0x00000004) // # of load commands - g.write32(0x118) // size of load commands + g.write32(native.mh_object) // MH_OBJECT + text_offset := 0x138 + g.write32(4) // # of load commands + g.write32(text_offset - 0x20) // size of load commands // 0x138-0x20 // g.write32(0x00002000) // MH_SUBSECTIONS_VIA_SYMBOLS g.write32(0) // MH_SUBSECTIONS_VIA_SYMBOLS g.write32(0) // reserved @@ -56,7 +58,7 @@ pub fn (mut g Gen) generate_macho_header() { g.zeroes(16) // segment name g.write64(0) // VM address g.write64(0x25) // VM size - g.write64(0x138) // file offset + g.write64(text_offset) // file offset g.write64(0x25) // file size g.write32(0x7) // max vm protection g.write32(0x7) // initial vm protection @@ -67,7 +69,7 @@ pub fn (mut g Gen) generate_macho_header() { g.write_string_with_padding('__TEXT', 16) // segment name g.write64(0) // address g.write64(0x25) // size - g.write32(0x138) // offset + g.write32(text_offset) // offset g.write32(0x4) // alignment g.write32(0x160) // relocation offset g.write32(0x1) // # of relocations @@ -97,9 +99,17 @@ pub fn (mut g Gen) generate_macho_header() { for _ in 0 .. 12 { g.write32(0) } + if g.pref.is_verbose { + println('commands size = $g.buf.len') + if g.buf.len != 0x138 { + println('macho: invalid header size') + } + } if g.pref.arch == .arm64 { g.gen_arm64_helloworld() + } else { + // do nothing } } @@ -168,6 +178,9 @@ pub fn (mut g Gen) zeroes(n int) { } fn (mut g Gen) write_relocs() { + if g.pref.is_verbose { + println('relocs at $g.buf.len should be 0x160') + } g.write32(0x8) g.write32(0x2d000003) } diff --git a/vlib/v/gen/native/tests/expressions.vv b/vlib/v/gen/native/tests/expressions.vv index a26a1e581a..3a6a9ad9a0 100644 --- a/vlib/v/gen/native/tests/expressions.vv +++ b/vlib/v/gen/native/tests/expressions.vv @@ -1,14 +1,34 @@ fn print_number(n int) { - if n == 0 { println('0') } - if n == 1 { println('1') } - if n == 2 { println('2') } - if n == 3 { println('3') } - if n == 4 { println('4') } - if n == 5 { println('5') } - if n == 6 { println('6') } - if n == 7 { println('7') } - if n == 8 { println('8') } - if n == 9 { println('9') } + if n == 0 { + println('0') + } + if n == 1 { + println('1') + } + if n == 2 { + println('2') + } + if n == 3 { + println('3') + } + if n == 4 { + println('4') + } + if n == 5 { + println('5') + } + if n == 6 { + println('6') + } + if n == 7 { + println('7') + } + if n == 8 { + println('8') + } + if n == 9 { + println('9') + } } struct User { @@ -16,7 +36,6 @@ struct User { } fn print_user(u User) { - } fn test_add() { diff --git a/vlib/v/gen/native/tests/general.vv b/vlib/v/gen/native/tests/general.vv index d5e3282649..155a039509 100644 --- a/vlib/v/gen/native/tests/general.vv +++ b/vlib/v/gen/native/tests/general.vv @@ -6,8 +6,8 @@ fn if_test() { if b == 2 { println('b == 2') } - //if b != 2 { - //println('b != 2') + // if b != 2 { + // println('b != 2') //} } if a == 2 { @@ -35,22 +35,27 @@ fn foo(a int) { if a == 7 { println('a == 7') } - a++ - if a == 2 { - println('a == 2') + /* + // native gen doesnt support more than one variable + mut b := a + 1 + if b == 2 { + println('b == 2') } - if a == 3 { - println('a == 3') + if b == 3 { + println('b == 3') } - + if b == 8 { + println('b == 8') + } + */ } fn args() { x := 7 println('===args===') - foo(1) - foo(x) - foo(2) + foo(1) // prints 1 2 + foo(x) // prints 7 8 + foo(2) // prints 3 } /* @@ -69,9 +74,8 @@ fn expr() { } */ - struct User { - age int + age int nr_orders int } @@ -79,5 +83,5 @@ fn main() { if_test() loop() args() - //expr() + // expr() } diff --git a/vlib/v/gen/native/tests/general.vv.out b/vlib/v/gen/native/tests/general.vv.out index 4ae114d341..3c73504cce 100644 --- a/vlib/v/gen/native/tests/general.vv.out +++ b/vlib/v/gen/native/tests/general.vv.out @@ -9,9 +9,6 @@ hello ===args=== foo: a == 1 -a == 2 foo: a == 7 foo: -a == 3 - diff --git a/vlib/v/gen/native/tests/simple_fn_calls.vv b/vlib/v/gen/native/tests/simple_fn_calls.vv index 3cdd217a63..0b39c98728 100644 --- a/vlib/v/gen/native/tests/simple_fn_calls.vv +++ b/vlib/v/gen/native/tests/simple_fn_calls.vv @@ -1,4 +1,4 @@ -fn print_greeting(){ +fn print_greeting() { println('hello from native V') }