vxx2 / vlib / v3 / tests / gettid_libc_compat_codegen_test.v
53 lines · 48 sloc · 2.02 KB · 0e30f8d2f2cf6ed81ee9cebe949190dc76b548c9
Raw
1import os
2
3const gettid_compat_vexe = @VEXE
4const gettid_compat_tests_dir = os.dir(@FILE)
5const gettid_compat_v3_dir = os.dir(gettid_compat_tests_dir)
6const gettid_compat_vlib_dir = os.dir(gettid_compat_v3_dir)
7const gettid_compat_v3_src = os.join_path(gettid_compat_v3_dir, 'v3.v')
8
9fn gettid_compat_build_v3() string {
10 v3_bin := os.join_path(os.temp_dir(), 'v3_gettid_compat_test_${os.getpid()}')
11 os.rm(v3_bin) or {}
12 build :=
13 os.execute('${gettid_compat_vexe} -gc none -path "${gettid_compat_vlib_dir}|@vlib|@vmodules" -o ${v3_bin} ${gettid_compat_v3_src}')
14 assert build.exit_code == 0, build.output
15 return v3_bin
16}
17
18fn test_v_gettid_uses_declared_libc_compat_helper() {
19 $if !linux {
20 return
21 }
22 v3_bin := gettid_compat_build_v3()
23 src := os.join_path(os.temp_dir(), 'v3_gettid_compat_${os.getpid()}.v')
24 bin := os.join_path(os.temp_dir(), 'v3_gettid_compat_${os.getpid()}')
25 os.write_file(src, 'module main
26
27#flag -Werror=implicit-function-declaration
28
29fn main() {
30 println(v_gettid().str())
31}
32') or {
33 panic(err)
34 }
35 os.rm(bin) or {}
36 os.rm(bin + '.c') or {}
37 compile := os.execute('${v3_bin} ${src} -b c -o ${bin}')
38 assert compile.exit_code == 0, compile.output
39 assert !compile.output.contains('implicit declaration'), compile.output
40 generated := os.read_file(bin + '.c') or { panic(err) }
41 assert generated.contains('static inline u32 v3_gettid(void)'), generated
42 assert generated.contains('#elif defined(__arm__)'), generated
43 assert generated.contains('#elif defined(__riscv) && __riscv_xlen == 64'), generated
44 assert generated.contains('#elif defined(__loongarch_lp64)'), generated
45 assert generated.contains('#error unsupported Linux gettid syscall number for this architecture'), generated
46 assert generated.contains('syscall(SYS_gettid)'), generated
47 assert !generated.contains('#include <sys/syscall.h>'), generated
48 assert !generated.contains('__NR_gettid'), generated
49 assert !generated.contains(' gettid('), generated
50 run := os.execute(bin)
51 assert run.exit_code == 0, run.output
52 assert run.output.trim_space().len > 0, run.output
53}
54