Skip to content

Commit 164b303

Browse files
authored
v2: fix arm64 self-hosting (#27396)
1 parent d48d789 commit 164b303

23 files changed

Lines changed: 2445 additions & 394 deletions

vlib/v2/ast/flat.v

Lines changed: 233 additions & 182 deletions
Large diffs are not rendered by default.

vlib/v2/ast/flat_append_flat_test.v

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,3 +165,46 @@ fn test_append_flat_empty_source_is_noop() {
165165
assert dst.flat.edges.len == pre_edges
166166
assert dst.flat.files.len == pre_files
167167
}
168+
169+
fn test_copy_subtree_from_preserves_stmt_shape_and_strings() {
170+
mut src := new_flat_builder()
171+
imp_id := src.emit_stmt(Stmt(ImportStmt{
172+
name: 'os'
173+
alias: 'myos'
174+
is_aliased: true
175+
}))
176+
dir_id := src.emit_stmt(Stmt(Directive{
177+
name: 'flag'
178+
value: '-lm'
179+
}))
180+
for_id := src.emit_stmt(make_for_with_idents(['alpha', 'beta']))
181+
182+
mut dst := seeded_dst()
183+
copied_imp := dst.copy_subtree_from(&src.flat, imp_id)
184+
copied_dir := dst.copy_subtree_from(&src.flat, dir_id)
185+
copied_for := dst.copy_subtree_from(&src.flat, for_id)
186+
187+
assert dst.flat.subtree_signature(copied_for) == src.flat.subtree_signature(for_id)
188+
189+
merged_imp := Cursor{
190+
flat: &dst.flat
191+
id: copied_imp
192+
}.stmt() as ImportStmt
193+
assert merged_imp.name == 'os'
194+
assert merged_imp.alias == 'myos'
195+
assert merged_imp.is_aliased
196+
197+
merged_dir := Cursor{
198+
flat: &dst.flat
199+
id: copied_dir
200+
}.stmt() as Directive
201+
assert merged_dir.name == 'flag'
202+
assert merged_dir.value == '-lm'
203+
}
204+
205+
fn test_copy_subtree_from_invalid_root_returns_invalid() {
206+
mut src := new_flat_builder()
207+
mut dst := new_flat_builder()
208+
assert dst.copy_subtree_from(&src.flat, -1) == invalid_flat_node_id
209+
assert dst.copy_subtree_from(&src.flat, 100) == invalid_flat_node_id
210+
}

vlib/v2/builder/builder.v

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -285,14 +285,9 @@ pub fn (mut b Builder) build(files []string) {
285285
}
286286
} else {
287287
// Parallel transform fans the per-file work across worker threads via
288-
// the driver, then flattens. The sequential transform_flat_to_flat_direct
289-
// is ~3x slower here because it cannot parallelize the per-file loop, and
290-
// the flat AST has no thread-safe merge primitive to let workers append
291-
// to one builder concurrently. For flat-codegen backends we still drop
292-
// b.files immediately so codegen stays flat-only (the legacy files are
293-
// live only transiently during the parallel transform). The memory-
294-
// critical arm64 self-host runs --no-parallel, so it takes the sequential
295-
// branch above and keeps the allocation-minimal flat-direct path.
288+
// the driver. Flat-codegen backends use worker-local FlatBuilders merged
289+
// by append_flat and keep b.files empty; legacy consumers request the
290+
// compatibility []ast.File result.
296291
new_flat, files_out := b.transform_files_parallel_to_flat_via_driver(mut trans,
297292
!transform_flat_only)
298293
b.flat = new_flat

vlib/v2/gen/arm64/linker.v

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -882,8 +882,8 @@ fn (l Linker) generate_code_signature(ident string) []u8 {
882882
// Slot -2: Hash of requirements blob
883883
mut hash_buf := [32]u8{}
884884
sha256_hash(req_blob.data, req_blob.len, &hash_buf[0])
885-
for b in hash_buf {
886-
sig << b
885+
for i in 0 .. cs_hash_size {
886+
sig << hash_buf[i]
887887
}
888888

889889
// Slot -1: Info.plist (zeros = no Info.plist)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import v2.ast
2+
3+
fn main() {
4+
file := ast.File{
5+
name: @FILE
6+
mod: 'main'
7+
imports: [
8+
ast.ImportStmt{
9+
name: 'v2.pref'
10+
alias: 'pref'
11+
},
12+
]
13+
stmts: [
14+
ast.Stmt(ast.ImportStmt{
15+
name: 'v2.pref'
16+
alias: 'pref'
17+
}),
18+
]
19+
}
20+
flat := ast.flatten_files([file])
21+
file_node := flat.nodes[flat.files[0].file_id]
22+
imports := flat.read_file_imports(flat.files[0])
23+
println(file_node.edge_count)
24+
println(imports.len)
25+
if imports.len > 0 {
26+
println(imports[0].name)
27+
println(imports[0].alias)
28+
}
29+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
fn push_name(mut names []string, name string) {
2+
names << name
3+
println(names.len)
4+
}
5+
6+
fn wrap(mut names []string, name string) {
7+
push_name(mut names, name)
8+
println(names.len)
9+
}
10+
11+
fn main() {
12+
mut names := []string{}
13+
wrap(mut names, 'abc')
14+
println(names.len)
15+
if names.len > 0 {
16+
println(names[0])
17+
}
18+
}

0 commit comments

Comments
 (0)