v / vlib / v2 / builder / ssa_build_parallel_test.v
153 lines · 136 sloc · 3.28 KB · ddb021b9866c3b4523b746fa2f4c16a594f8bd89
Raw
1// vtest build: !windows
2module builder
3
4import os
5import runtime
6import v2.parser
7import v2.pref
8import v2.ssa
9import v2.token
10import v2.transformer
11import v2.types
12
13fn parallel_ssa_alias_tmp_dir(label string) string {
14 return os.join_path(os.temp_dir(), 'v2_parallel_ssa_alias_${label}_${os.getpid()}')
15}
16
17struct ParallelSSAAliasTestSource {
18 rel_path string
19 code string
20}
21
22fn parallel_ssa_module_for_test_sources(label string, sources []ParallelSSAAliasTestSource) &ssa.Module {
23 tmp_dir := parallel_ssa_alias_tmp_dir(label)
24 os.rmdir_all(tmp_dir) or {}
25 os.mkdir_all(tmp_dir) or { panic('cannot create ${tmp_dir}') }
26 defer {
27 os.rmdir_all(tmp_dir) or {}
28 }
29 mut paths := []string{}
30 for source in sources {
31 path := os.join_path(tmp_dir, source.rel_path)
32 os.mkdir_all(os.dir(path)) or { panic('cannot create ${os.dir(path)}') }
33 os.write_file(path, source.code) or { panic('cannot write ${path}') }
34 paths << path
35 }
36 prefs := &pref.Preferences{
37 backend: .x64
38 arch: .x64
39 }
40 mut file_set := token.FileSet.new()
41 mut par := parser.Parser.new(prefs)
42 files := par.parse_files(paths, mut file_set)
43 env := types.Environment.new()
44 mut checker := types.Checker.new(prefs, file_set, env)
45 checker.check_files(files)
46 mut trans := transformer.Transformer.new_with_pref(env, prefs)
47 trans.set_file_set(file_set)
48 transformed_files := trans.transform_files(files)
49 mut mod := ssa.Module.new('parallel_alias_test')
50 mut ssa_builder := ssa.Builder.new_with_env(mod, env)
51 ssa_builder.skip_fn_bodies = true
52 ssa_builder.build_all(transformed_files)
53 ssa_builder.skip_fn_bodies = false
54
55 old_vjobs := os.getenv_opt('VJOBS')
56 os.setenv('VJOBS', '2', true)
57 defer {
58 if old := old_vjobs {
59 os.setenv('VJOBS', old, true)
60 } else {
61 os.unsetenv('VJOBS')
62 }
63 }
64 assert runtime.nr_jobs() == 2
65 mut outer_builder := new_builder(prefs)
66 outer_builder.ssa_build_parallel(mut ssa_builder, transformed_files)
67 return mod
68}
69
70fn parallel_ssa_func_names(m &ssa.Module) []string {
71 mut names := []string{}
72 for func in m.funcs {
73 names << func.name
74 }
75 return names
76}
77
78fn test_parallel_ssa_worker_restores_module_import_aliases() {
79 m := parallel_ssa_module_for_test_sources('module_alias', [
80 ParallelSSAAliasTestSource{
81 rel_path: 'left/left.v'
82 code: 'module left
83
84pub struct Box {
85pub:
86 value int
87}
88'
89 },
90 ParallelSSAAliasTestSource{
91 rel_path: 'right/right.v'
92 code: 'module right
93
94pub struct Box {
95pub:
96 value int
97}
98'
99 },
100 ParallelSSAAliasTestSource{
101 rel_path: 'a.v'
102 code: 'module main
103
104import left as dep
105
106fn bump_left() int {
107 box := dep.Box{
108 value: 1
109 }
110 return keep[dep.Box](box).value
111}
112'
113 },
114 ParallelSSAAliasTestSource{
115 rel_path: 'b.v'
116 code: 'module main
117
118import right as dep
119
120fn bump_right() int {
121 box := dep.Box{
122 value: 2
123 }
124 return keep[dep.Box](box).value
125}
126'
127 },
128 ParallelSSAAliasTestSource{
129 rel_path: 'main.v'
130 code: 'module main
131
132fn keep[T](value T) T {
133 return value
134}
135
136fn filler0() int { return 0 }
137fn filler1() int { return 1 }
138fn filler2() int { return 2 }
139fn filler3() int { return 3 }
140
141fn main() {
142 _ = bump_left()
143 _ = bump_right()
144}
145'
146 },
147 ])
148
149 func_names := parallel_ssa_func_names(m)
150 assert 'keep_T_left_Box' in func_names, func_names.str()
151 assert 'keep_T_right_Box' in func_names, func_names.str()
152 assert 'keep_T_dep_Box' !in func_names, func_names.str()
153}
154