v2 / vlib / v / gen / c / custom_start_freestanding_test.v
44 lines · 39 sloc · 1.62 KB · f32377e2367312b621f8c6e4ad8df58876ee5ac7
Raw
1module c
2
3import os
4import v.ast
5import v.checker
6import v.parser
7import v.pref
8
9fn 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
25fn 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
33fn 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
39fn 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