| 1 | module c |
| 2 | |
| 3 | import os |
| 4 | import v.ast |
| 5 | import v.checker |
| 6 | import v.parser |
| 7 | import v.pref |
| 8 | |
| 9 | fn generate_bare_output(main_src string) string { |
| 10 | mut table := ast.new_table() |
| 11 | mut pref_ := pref.new_preferences() |
| 12 | pref_.is_bare = true |
| 13 | builtin_src := 'module builtin\n\nasm amd64 {\n\t.globl _start\n\t_start:\n\tret\n}\n' |
| 14 | mut builtin_file := parser.parse_text(builtin_src, os.join_path('/virtual', 'vlib', 'builtin', |
| 15 | 'linux_bare', 'linux_syscalls.v'), mut table, .skip_comments, pref_) |
| 16 | mut main_file := parser.parse_text(main_src, os.join_path('/virtual', 'main.v'), mut table, |
| 17 | .skip_comments, pref_) |
| 18 | mut chk := checker.new_checker(table, pref_) |
| 19 | chk.check(mut builtin_file) |
| 20 | chk.check(mut main_file) |
| 21 | result := gen([builtin_file, main_file], mut table, pref_) |
| 22 | return result.res_builder.bytestr() |
| 23 | } |
| 24 | |
| 25 | fn test_linux_bare_startup_stub_is_suppressed_for_exported_start() { |
| 26 | generated := |
| 27 | generate_bare_output("module main\n\n@[export: '_start']\nfn start() {}\n\nfn main() {}\n") |
| 28 | assert !generated.contains('.globl _start') |
| 29 | assert generated.contains('// export alias: _start -> main__start') |
| 30 | assert generated.contains('void _start(void) {') |
| 31 | } |
| 32 | |
| 33 | fn test_linux_bare_startup_stub_stays_for_default_main() { |
| 34 | generated := generate_bare_output('module main\n\nfn main() {}\n') |
| 35 | assert generated.contains('.globl _start') |
| 36 | assert !generated.contains('// export alias: _start -> main__start') |
| 37 | } |
| 38 | |
| 39 | fn test_bare_prelude_uses_stddef_size_t() { |
| 40 | generated := generate_bare_output('module main\n\nfn main() {}\n') |
| 41 | assert generated.contains('#include <stddef.h>') |
| 42 | assert generated.contains('typedef size_t usize;') |
| 43 | assert !generated.contains('typedef long unsigned int size_t;') |
| 44 | } |
| 45 | |