native: fix tests, address comments and a little cleaner macho
parent
5be41ebc80
commit
d8bb939072
|
@ -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 !found && c.pref.backend == .native {
|
||||||
if fn_name in native.builtins {
|
if fn_name in native.builtins {
|
||||||
found = true
|
|
||||||
c.table.fns[fn_name].usages++
|
c.table.fns[fn_name].usages++
|
||||||
return ast.string_type
|
return ast.void_type
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !found && c.pref.is_script && !found {
|
if !found && c.pref.is_script && !found {
|
||||||
|
|
|
@ -529,7 +529,9 @@ fn (mut g Gen) assign_stmt(node ast.AssignStmt) {
|
||||||
g.allocate_var(name, 4, 0)
|
g.allocate_var(name, 4, 0)
|
||||||
// `mov DWORD PTR [rbp-0x8],eax`
|
// `mov DWORD PTR [rbp-0x8],eax`
|
||||||
offset := g.get_var_offset(name)
|
offset := g.get_var_offset(name)
|
||||||
|
if g.pref.is_verbose {
|
||||||
println('infix assignment $name offset=$offset.hex2()')
|
println('infix assignment $name offset=$offset.hex2()')
|
||||||
|
}
|
||||||
g.mov_reg_to_rbp(offset, .eax)
|
g.mov_reg_to_rbp(offset, .eax)
|
||||||
}
|
}
|
||||||
ast.StructInit {
|
ast.StructInit {
|
||||||
|
|
|
@ -69,7 +69,6 @@ pub fn (mut g Gen) fn_decl_arm64(node ast.FnDecl) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (mut g Gen) gen_arm64_helloworld() {
|
fn (mut g Gen) gen_arm64_helloworld() {
|
||||||
// ADD THE CODE HERE THIS GOES INTO THE STMTS THING
|
|
||||||
// g.write32(0x77777777)
|
// g.write32(0x77777777)
|
||||||
// assembly
|
// assembly
|
||||||
g.mov_arm(.x0, 1)
|
g.mov_arm(.x0, 1)
|
||||||
|
|
|
@ -106,7 +106,7 @@ pub fn (mut g Gen) create_executable() {
|
||||||
unsafe { f.write_ptr(g.buf.data, g.buf.len) }
|
unsafe { f.write_ptr(g.buf.data, g.buf.len) }
|
||||||
f.close()
|
f.close()
|
||||||
if g.pref.is_verbose {
|
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')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ const (
|
||||||
macho_d_size = 0x50
|
macho_d_size = 0x50
|
||||||
lc_symtab = 0x2
|
lc_symtab = 0x2
|
||||||
lc_dymsymtab = 0xB
|
lc_dymsymtab = 0xB
|
||||||
|
mh_object = 1
|
||||||
)
|
)
|
||||||
|
|
||||||
struct Symbol {
|
struct Symbol {
|
||||||
|
@ -44,9 +45,10 @@ pub fn (mut g Gen) generate_macho_header() {
|
||||||
g.write32(0x01000007) // CPU_TYPE_X64
|
g.write32(0x01000007) // CPU_TYPE_X64
|
||||||
g.write32(0x00000003) // CPU_SUBTYPE_X64
|
g.write32(0x00000003) // CPU_SUBTYPE_X64
|
||||||
}
|
}
|
||||||
g.write32(0x00000001) // MH_OBJECT
|
g.write32(native.mh_object) // MH_OBJECT
|
||||||
g.write32(0x00000004) // # of load commands
|
text_offset := 0x138
|
||||||
g.write32(0x118) // size of load commands
|
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(0x00002000) // MH_SUBSECTIONS_VIA_SYMBOLS
|
||||||
g.write32(0) // MH_SUBSECTIONS_VIA_SYMBOLS
|
g.write32(0) // MH_SUBSECTIONS_VIA_SYMBOLS
|
||||||
g.write32(0) // reserved
|
g.write32(0) // reserved
|
||||||
|
@ -56,7 +58,7 @@ pub fn (mut g Gen) generate_macho_header() {
|
||||||
g.zeroes(16) // segment name
|
g.zeroes(16) // segment name
|
||||||
g.write64(0) // VM address
|
g.write64(0) // VM address
|
||||||
g.write64(0x25) // VM size
|
g.write64(0x25) // VM size
|
||||||
g.write64(0x138) // file offset
|
g.write64(text_offset) // file offset
|
||||||
g.write64(0x25) // file size
|
g.write64(0x25) // file size
|
||||||
g.write32(0x7) // max vm protection
|
g.write32(0x7) // max vm protection
|
||||||
g.write32(0x7) // initial 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.write_string_with_padding('__TEXT', 16) // segment name
|
||||||
g.write64(0) // address
|
g.write64(0) // address
|
||||||
g.write64(0x25) // size
|
g.write64(0x25) // size
|
||||||
g.write32(0x138) // offset
|
g.write32(text_offset) // offset
|
||||||
g.write32(0x4) // alignment
|
g.write32(0x4) // alignment
|
||||||
g.write32(0x160) // relocation offset
|
g.write32(0x160) // relocation offset
|
||||||
g.write32(0x1) // # of relocations
|
g.write32(0x1) // # of relocations
|
||||||
|
@ -97,9 +99,17 @@ pub fn (mut g Gen) generate_macho_header() {
|
||||||
for _ in 0 .. 12 {
|
for _ in 0 .. 12 {
|
||||||
g.write32(0)
|
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 {
|
if g.pref.arch == .arm64 {
|
||||||
g.gen_arm64_helloworld()
|
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() {
|
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(0x8)
|
||||||
g.write32(0x2d000003)
|
g.write32(0x2d000003)
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,34 @@
|
||||||
fn print_number(n int) {
|
fn print_number(n int) {
|
||||||
if n == 0 { println('0') }
|
if n == 0 {
|
||||||
if n == 1 { println('1') }
|
println('0')
|
||||||
if n == 2 { println('2') }
|
}
|
||||||
if n == 3 { println('3') }
|
if n == 1 {
|
||||||
if n == 4 { println('4') }
|
println('1')
|
||||||
if n == 5 { println('5') }
|
}
|
||||||
if n == 6 { println('6') }
|
if n == 2 {
|
||||||
if n == 7 { println('7') }
|
println('2')
|
||||||
if n == 8 { println('8') }
|
}
|
||||||
if n == 9 { println('9') }
|
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 {
|
struct User {
|
||||||
|
@ -16,7 +36,6 @@ struct User {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_user(u User) {
|
fn print_user(u User) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn test_add() {
|
fn test_add() {
|
||||||
|
|
|
@ -35,22 +35,27 @@ fn foo(a int) {
|
||||||
if a == 7 {
|
if a == 7 {
|
||||||
println('a == 7')
|
println('a == 7')
|
||||||
}
|
}
|
||||||
a++
|
/*
|
||||||
if a == 2 {
|
// native gen doesnt support more than one variable
|
||||||
println('a == 2')
|
mut b := a + 1
|
||||||
|
if b == 2 {
|
||||||
|
println('b == 2')
|
||||||
}
|
}
|
||||||
if a == 3 {
|
if b == 3 {
|
||||||
println('a == 3')
|
println('b == 3')
|
||||||
}
|
}
|
||||||
|
if b == 8 {
|
||||||
|
println('b == 8')
|
||||||
|
}
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
fn args() {
|
fn args() {
|
||||||
x := 7
|
x := 7
|
||||||
println('===args===')
|
println('===args===')
|
||||||
foo(1)
|
foo(1) // prints 1 2
|
||||||
foo(x)
|
foo(x) // prints 7 8
|
||||||
foo(2)
|
foo(2) // prints 3
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -69,7 +74,6 @@ fn expr() {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
struct User {
|
struct User {
|
||||||
age int
|
age int
|
||||||
nr_orders int
|
nr_orders int
|
||||||
|
|
|
@ -9,9 +9,6 @@ hello
|
||||||
===args===
|
===args===
|
||||||
foo:
|
foo:
|
||||||
a == 1
|
a == 1
|
||||||
a == 2
|
|
||||||
foo:
|
foo:
|
||||||
a == 7
|
a == 7
|
||||||
foo:
|
foo:
|
||||||
a == 3
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue