Skip to content

Commit 5fccfbb

Browse files
authored
Merge pull request #372 from Janno/janno/fix-extend-signature
Update symbols and index when extending with a signature
2 parents 0768bac + b16e1e5 commit 5fccfbb

File tree

7 files changed

+123
-24
lines changed

7 files changed

+123
-24
lines changed

CHANGES.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
# v3.4.1 (September 2025)
2+
3+
Requires Menhir 20211230 and OCaml 4.13 or above.
4+
5+
- Compiler:
6+
- Fix extend_signature, was not updating the symbol table
7+
18
# v3.4.0 (September 2025)
29

310
- Parser:

src/compiler/compiler.ml

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2021,6 +2021,25 @@ let extend1_signature base_signature (signature : checked_compilation_unit_signa
20212021

20222022
{ Assembled.kinds; types; type_abbrevs; toplevel_macros }
20232023

2024+
let new_symbols_of_types ~(base_sig:checked_compilation_unit_signature) new_types =
2025+
let symbs = TypingEnv.all_symbols new_types in
2026+
symbs |> List.filter_map (fun (symb,m) -> if TypingEnv.mem_symbol base_sig.types symb then None else Some symb),
2027+
symbs |> List.filter_map (fun (symb, { TypingEnv.indexing } ) -> match indexing with Index m -> Some (symb, m) | _ -> None)
2028+
2029+
let allocate_new_symbols state ~symbols ~new_defined_symbols =
2030+
(* THE MISTERY: allocating symbols following their declaration order makes the grundlagen job 30% faster (600M less memory):
2031+
time typchk wall mem
2032+
with: 14.75 0.53 16.69 2348.4M
2033+
wout: 19.61 0.56 21.72 2789.1M
2034+
*)
2035+
let new_defined_symbols =
2036+
if List.length new_defined_symbols > 2000 then
2037+
new_defined_symbols |> List.sort (fun s1 s2 -> compare (Symbol.get_loc s1).line (Symbol.get_loc s2).line)
2038+
else
2039+
new_defined_symbols in
2040+
List.fold_left (fun symbols s -> SymbolMap.allocate_global_symbol state symbols s |> fst)
2041+
symbols new_defined_symbols
2042+
20242043
let extend1 flags (state, base) unit =
20252044

20262045
let signature =
@@ -2033,25 +2052,9 @@ let extend1 flags (state, base) unit =
20332052

20342053
(* Format.eprintf "extend %a\n%!" (F.Map.pp (fun _ _ -> ())) types_indexing; *)
20352054

2036-
let new_defined_symbols, new_indexable =
2037-
let symbs = TypingEnv.all_symbols new_types in
2038-
symbs |> List.filter_map (fun (symb,m) -> if TypingEnv.mem_symbol bsig.types symb then None else Some symb),
2039-
symbs |> List.filter_map (fun (symb, { TypingEnv.indexing } ) -> match indexing with Index m -> Some (symb, m) | _ -> None) in
2040-
2041-
let symbols =
2042-
(* THE MISTERY: allocating symbols following their declaration order makes the grundlagen job 30% faster (600M less memory):
2043-
time typchk wall mem
2044-
with: 14.75 0.53 16.69 2348.4M
2045-
wout: 19.61 0.56 21.72 2789.1M
2046-
*)
2047-
let new_defined_symbols =
2048-
if List.length new_defined_symbols > 2000 then
2049-
new_defined_symbols |> List.sort (fun s1 s2 -> compare (Symbol.get_loc s1).line (Symbol.get_loc s2).line)
2050-
else
2051-
new_defined_symbols in
2052-
List.fold_left (fun symbols s -> SymbolMap.allocate_global_symbol state symbols s |> fst)
2053-
symbols new_defined_symbols in
2055+
let new_defined_symbols, new_indexable = new_symbols_of_types ~base_sig:bsig new_types in
20542056

2057+
let symbols = allocate_new_symbols state ~symbols ~new_defined_symbols in
20552058

20562059
let prolog_program, indexing = update_indexing state symbols prolog_program new_indexable indexing in
20572060
(* Format.eprintf "extended\n%!"; *)
@@ -2081,11 +2084,15 @@ let extend1 flags (state, base) unit =
20812084
let hash = hash_base base in
20822085
state, { base with hash }
20832086

2084-
let extend flags state assembled u = extend1 flags (state, assembled) u
2085-
let extend_signature state assembled u =
2086-
let signature = extend1_signature assembled.Assembled.signature u in
2087-
let base = { assembled with signature } in
2088-
state, { base with hash = hash_base base }
2087+
let extend flags state assembled u = extend1 flags (state, assembled) u
2088+
let extend_signature state assembled u =
2089+
let signature = extend1_signature assembled.Assembled.signature u in
2090+
let base_sig = assembled.Assembled.signature in
2091+
let new_defined_symbols, new_indexable = new_symbols_of_types ~base_sig signature.types in
2092+
let symbols = allocate_new_symbols state ~symbols:assembled.symbols ~new_defined_symbols in
2093+
let prolog_program, indexing = update_indexing state symbols assembled.prolog_program new_indexable assembled.indexing in
2094+
let base = { assembled with symbols; prolog_program; indexing; signature } in
2095+
state, { base with hash = hash_base base }
20892096

20902097
let compile_query state { Assembled.symbols; builtins; signature = { types; type_abbrevs } } (needs_spilling,t) =
20912098
let (symbols, amap), t = spill_todbl ~builtins ~needs_spilling ~types ~type_abbrevs state symbols t in

tests/sources/dune

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,6 @@
1515
(executable (name sepcomp_perf5) (modules sepcomp_perf5) (libraries sepcomp))
1616
(executable (name sepcomp_tyid) (modules sepcomp_tyid) (libraries sepcomp))
1717
(executable (name sepcomp_tyid2) (modules sepcomp_tyid2) (libraries sepcomp))
18-
(executable (name sepcomp_hover) (modules sepcomp_hover) (libraries sepcomp))
18+
(executable (name sepcomp_hover) (modules sepcomp_hover) (libraries sepcomp))
19+
(executable (name sepcomp_extend_sig) (modules sepcomp_extend_sig) (libraries sepcomp))
20+
(executable (name sepcomp_extend_sig2) (modules sepcomp_extend_sig2) (libraries sepcomp))
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
let u = {|
2+
3+
pred p i:int.
4+
p 2 :- !, fail.
5+
6+
|}
7+
;;
8+
9+
let v = {|
10+
11+
p _.
12+
13+
main :- p 2.
14+
15+
|}
16+
;;
17+
18+
let () =
19+
let open Sepcomp.Sepcomp_template in
20+
let elpi = init () in
21+
let flags = Elpi.API.Compile.default_flags in
22+
let base = Elpi.API.Compile.empty_base ~elpi in
23+
let _, u = cc ~elpi ~flags ~base 0 u in
24+
let su = signature_of u in
25+
let p = extend_signature ~flags ~base su in
26+
let p, _ = cc ~elpi ~flags ~base:p 0 v in
27+
let q = query ~elpi p in
28+
exec q
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
let u = {|
2+
3+
pred p i:int.
4+
p 2 :- !, fail.
5+
6+
|}
7+
;;
8+
9+
let v = {|
10+
11+
p _.
12+
main :- p 2.
13+
14+
|}
15+
;;
16+
17+
let () =
18+
let open Sepcomp.Sepcomp_template in
19+
let elpi = init () in
20+
let flags = Elpi.API.Compile.default_flags in
21+
let base = Elpi.API.Compile.empty_base ~elpi in
22+
let _, u = cc ~elpi ~flags ~base 0 u in
23+
let su = signature_of u in
24+
let base = extend_signature ~flags ~base su in
25+
let base = extend ~flags ~base u in
26+
let base, _ = cc ~elpi ~flags ~base 0 v in
27+
let q = query ~elpi base in
28+
assert(try_exec q = false);
29+
let base, _ = cc ~elpi ~flags ~base 0 "fail." in
30+
let q = query ~elpi base in
31+
exec q
32+

tests/sources/sepcomp_template.ml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ let cc ~elpi ~flags ~base i u =
1111
(Lexing.from_string u))) in
1212
Compile.extend ~flags ~base u, u
1313

14+
let signature_of u = Compile.signature u
15+
16+
let extend ~flags ~base u = Compile.extend ~flags ~base u
17+
let extend_signature ~flags ~base u = Compile.extend_signature ~flags ~base u
1418

1519
let check q =
1620
()
@@ -28,6 +32,13 @@ let exec q =
2832
| Execute.Success _ -> exit 0
2933
| Execute.NoMoreSteps -> assert false
3034

35+
let try_exec q =
36+
let exe = Compile.optimize q in
37+
match Execute.once exe with
38+
| Execute.Failure -> false
39+
| Execute.Success _ -> true
40+
| Execute.NoMoreSteps -> assert false
41+
3142
let main us =
3243
let elpi = init () in
3344
let flags = Compile.default_flags in

tests/suite/elpi_api.ml

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,15 @@ let () = declare "sepcomp_hover"
6666
~expectation:Test.Success
6767
()
6868

69+
let () = declare "sepcomp_extend_sig"
70+
~source_dune:"sepcomp_extend_sig.exe"
71+
~description:"extend unit with signature"
72+
~expectation:Test.Success
73+
()
74+
75+
let () = declare "sepcomp_extend_sig2"
76+
~source_dune:"sepcomp_extend_sig2.exe"
77+
~description:"extend unit with signature then code"
78+
~expectation:Test.Success
79+
()
80+

0 commit comments

Comments
 (0)