Skip to content

Commit 66e5929

Browse files
authored
fix(compiler): Fix 'inconsistent assumptions over interface' bug (#2253)
1 parent 30f5cc3 commit 66e5929

File tree

10 files changed

+73
-130
lines changed

10 files changed

+73
-130
lines changed

compiler/src/codegen/transl_anf.re

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1112,6 +1112,12 @@ let transl_anf_program =
11121112
~imports=anf_prog.imports,
11131113
anf_prog.signature,
11141114
);
1115+
1116+
Env.add_cmi_to_persistent_structures(
1117+
anf_prog.prog_loc.loc_start.pos_fname,
1118+
signature,
1119+
);
1120+
11151121
let globals = get_globals();
11161122
let function_table_elements = get_function_table_idents();
11171123
let global_function_table_offset = function_table_global^;

compiler/src/typed/env.re

Lines changed: 27 additions & 92 deletions
Original file line numberDiff line numberDiff line change
@@ -793,14 +793,12 @@ module Persistent_signature = {
793793
};
794794

795795
let load =
796-
ref((~loc=Location.dummy_loc, unit_name) => {
797-
switch (Module_resolution.locate_object_file(~loc, unit_name)) {
798-
| filename =>
799-
let ret = {filename, cmi: Module_resolution.read_file_cmi(filename)};
800-
Some(ret);
801-
| exception Not_found => None
796+
ref(obj_filename =>
797+
{
798+
filename: obj_filename,
799+
cmi: Module_resolution.read_file_cmi(obj_filename),
802800
}
803-
});
801+
);
804802
};
805803

806804
let acknowledge_pers_struct = (check, {Persistent_signature.filename, cmi}) => {
@@ -846,24 +844,21 @@ let acknowledge_pers_struct = (check, {Persistent_signature.filename, cmi}) => {
846844
ps;
847845
};
848846

849-
let find_pers_struct = (~loc, check, filepath) => {
850-
switch (Hashtbl.find(persistent_structures, filepath)) {
851-
| Some(ps) => ps
847+
let find_pers_struct = (~loc, check, src_filepath) => {
848+
let obj_filepath = Module_resolution.locate_object_file(~loc, src_filepath);
849+
850+
switch (Hashtbl.find(persistent_structures, obj_filepath)) {
851+
| Some(ps) =>
852+
add_import(src_filepath);
853+
ps;
852854
| None => raise(Not_found)
853855
| exception Not_found =>
854856
switch (can_load_modules^) {
855857
| Cannot_load_modules(_) => raise(Not_found)
856858
| Can_load_modules =>
857-
let ps = {
858-
switch (Persistent_signature.load^(~loc, filepath)) {
859-
| Some(ps) => ps
860-
| None =>
861-
Hashtbl.add(persistent_structures, filepath, None);
862-
raise(Not_found);
863-
};
864-
};
859+
let ps = Persistent_signature.load^(obj_filepath);
865860

866-
add_import(filepath);
861+
add_import(src_filepath);
867862
acknowledge_pers_struct(check, ps);
868863
}
869864
};
@@ -873,62 +868,8 @@ let load_pers_struct = (~loc, filepath) => {
873868
find_pers_struct(~loc, false, filepath).ps_name;
874869
};
875870

876-
/* Emits a warning if there is no valid cmi for name */
877-
let check_pers_struct = (~loc, name, filename) =>
878-
try(ignore(find_pers_struct(~loc, false, filename))) {
879-
| Not_found =>
880-
let err = No_module_file(name, None);
881-
error(err);
882-
| Cmi_format.Error(err) =>
883-
let msg = Format.asprintf("%a", Cmi_format.report_error, err);
884-
let err = No_module_file(name, Some(msg));
885-
error(err);
886-
| Error(err) =>
887-
let msg =
888-
switch (err) {
889-
| Illegal_renaming(name, ps_name, filename) =>
890-
Format.asprintf(
891-
" %a@ contains the compiled interface for @ %s when %s was expected",
892-
Location.print_filename,
893-
filename,
894-
ps_name,
895-
name,
896-
)
897-
| Inconsistent_import(_) => assert(false)
898-
| Depend_on_unsafe_string_unit(name, _) =>
899-
Printf.sprintf("%s uses -unsafe-string", name)
900-
| Unbound_label(_) => assert(false)
901-
| Unbound_label_with_alt(_) => assert(false)
902-
| Unbound_module(_) => assert(false)
903-
| Missing_module(_) => assert(false)
904-
| No_module_file(_) => assert(false)
905-
| Value_not_found_in_module(_) => assert(false)
906-
| Module_not_found_in_module(_) => assert(false)
907-
| Type_not_found_in_module(_) => assert(false)
908-
| Exception_not_found_in_module(_) => assert(false)
909-
| Illegal_value_name(_) => assert(false)
910-
| Cyclic_dependencies(_) => assert(false)
911-
};
912-
913-
let err = No_module_file(name, Some(msg));
914-
error(err);
915-
};
916-
917871
let find_pers_struct = filename => find_pers_struct(true, filename);
918872

919-
let check_pers_struct = (~loc, name, filename) =>
920-
if (!Hashtbl.mem(persistent_structures, filename)) {
921-
/* PR#6843: record the weak dependency ([add_import]) regardless of
922-
whether the check succeeds, to help make builds more
923-
deterministic. */
924-
add_import(filename);
925-
if (Warnings.is_active(Warnings.NoCmiFile("", None))) {
926-
add_delayed_check_forward^(() =>
927-
check_pers_struct(~loc, name, filename)
928-
);
929-
};
930-
};
931-
932873
let rec find_module_descr = (path, filename, env) => {
933874
switch (path) {
934875
| PIdent(id) =>
@@ -2245,16 +2186,7 @@ let crc_of_unit = filename => {
22452186

22462187
let imports = () => {
22472188
let imported_units = StringSet.elements(imported_units^);
2248-
let resolved_units =
2249-
List.map(
2250-
unit => Module_resolution.locate_unit_object_file(unit),
2251-
imported_units,
2252-
);
2253-
List.map2(
2254-
(unit, resolved_unit) => (unit, crc_of_unit(resolved_unit)),
2255-
imported_units,
2256-
resolved_units,
2257-
);
2189+
List.map(unit => (unit, crc_of_unit(unit)), imported_units);
22582190
};
22592191

22602192
/* Build a module signature */
@@ -2269,7 +2201,7 @@ let build_signature_with_imports =
22692201
let flags = [];
22702202
let crc = Cmi_format.build_crc(~name=modname, sg);
22712203

2272-
let cmi = {
2204+
{
22732205
cmi_name: modname,
22742206
cmi_sign: sg,
22752207
cmi_crcs: imports,
@@ -2278,30 +2210,33 @@ let build_signature_with_imports =
22782210
cmi_type_metadata: type_metadata,
22792211
cmi_config_sum: Cmi_format.config_sum(),
22802212
};
2213+
};
22812214

2215+
let add_cmi_to_persistent_structures = (filename, cmi) => {
22822216
let comps =
22832217
components_of_module(
2284-
~deprecated,
2218+
~deprecated=None,
22852219
~loc=Location.dummy_loc,
22862220
empty,
22872221
Subst.identity,
2288-
PIdent(Ident.create_persistent(modname)),
2289-
TModSignature(sg),
2222+
PIdent(Ident.create_persistent(cmi.cmi_name)),
2223+
TModSignature(cmi.cmi_sign),
22902224
);
22912225

22922226
let ps = {
2293-
ps_name: modname,
2294-
ps_sig: lazy(Subst.signature(Subst.identity, sg)),
2227+
ps_name: cmi.cmi_name,
2228+
ps_sig: lazy(Subst.signature(Subst.identity, cmi.cmi_sign)),
22952229
ps_comps: comps,
22962230
ps_crcs: cmi.cmi_crcs,
22972231
ps_crc: cmi.cmi_crc,
2298-
ps_filename: Module_resolution.get_object_name(filename),
2232+
ps_filename:
2233+
Module_resolution.get_object_name(
2234+
Filepath.to_string(Filepath.String.derelativize(filename)),
2235+
),
22992236
ps_flags: cmi.cmi_flags,
23002237
};
23012238

23022239
save_pers_struct(ps);
2303-
2304-
cmi;
23052240
};
23062241

23072242
let build_signature = (~deprecated=?, sg, modname, filename, type_metadata) =>

compiler/src/typed/env.rei

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -303,9 +303,11 @@ module Persistent_signature: {
303303
the .cmi file in the load path. This function can be overridden to load
304304
it from memory, for instance to build a self-contained toplevel. */
305305

306-
let load: ref((~loc: Location.t=?, string) => option(t));
306+
let load: ref(string => t);
307307
};
308308

309+
let add_cmi_to_persistent_structures: (string, Cmi_format.cmi_infos) => unit;
310+
309311
/* Summaries -- compact representation of an environment, to be
310312
exported in debugging information. */
311313

compiler/test/__snapshots__/basic_functionality.1bf5759c.0.snapshot

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -55,51 +55,51 @@ basic functionality › unsafe_wasm_globals
5555
(((instr_desc
5656
(MDrop
5757
((instr_desc
58-
(MCallKnown (func printI32_1152)
58+
(MCallKnown (func printI32_1076)
5959
(closure
6060
((immediate_desc
61-
(MImmBinding (MGlobalBind printI32_1152 Managed)))
61+
(MImmBinding (MGlobalBind printI32_1076 Managed)))
6262
(immediate_analyses ((last_usage Unknown)))))
6363
(func_type (((Unmanaged WasmI32)) ((Unmanaged WasmI32))))
6464
(args
6565
(((immediate_desc
66-
(MImmBinding (MGlobalBind _I32_VAL_1153 (Unmanaged WasmI32))))
66+
(MImmBinding (MGlobalBind _I32_VAL_1077 (Unmanaged WasmI32))))
6767
(immediate_analyses ((last_usage Unknown))))))))))))
6868
((instr_desc
6969
(MDrop
7070
((instr_desc
71-
(MCallKnown (func printI64_1154)
71+
(MCallKnown (func printI64_1078)
7272
(closure
7373
((immediate_desc
74-
(MImmBinding (MGlobalBind printI64_1154 Managed)))
74+
(MImmBinding (MGlobalBind printI64_1078 Managed)))
7575
(immediate_analyses ((last_usage Unknown)))))
7676
(func_type (((Unmanaged WasmI64)) ((Unmanaged WasmI32))))
7777
(args
7878
(((immediate_desc
79-
(MImmBinding (MGlobalBind _I64_VAL_1155 (Unmanaged WasmI64))))
79+
(MImmBinding (MGlobalBind _I64_VAL_1079 (Unmanaged WasmI64))))
8080
(immediate_analyses ((last_usage Unknown))))))))))))
8181
((instr_desc
8282
(MDrop
8383
((instr_desc
84-
(MCallKnown (func printF32_1156)
84+
(MCallKnown (func printF32_1080)
8585
(closure
8686
((immediate_desc
87-
(MImmBinding (MGlobalBind printF32_1156 Managed)))
87+
(MImmBinding (MGlobalBind printF32_1080 Managed)))
8888
(immediate_analyses ((last_usage Unknown)))))
8989
(func_type (((Unmanaged WasmF32)) ((Unmanaged WasmI32))))
9090
(args
9191
(((immediate_desc
92-
(MImmBinding (MGlobalBind _F32_VAL_1157 (Unmanaged WasmF32))))
92+
(MImmBinding (MGlobalBind _F32_VAL_1081 (Unmanaged WasmF32))))
9393
(immediate_analyses ((last_usage Unknown))))))))))))
9494
((instr_desc
95-
(MReturnCallKnown (func printF64_1158)
95+
(MReturnCallKnown (func printF64_1082)
9696
(closure
97-
((immediate_desc (MImmBinding (MGlobalBind printF64_1158 Managed)))
97+
((immediate_desc (MImmBinding (MGlobalBind printF64_1082 Managed)))
9898
(immediate_analyses ((last_usage Unknown)))))
9999
(func_type (((Unmanaged WasmF64)) ((Unmanaged WasmI32))))
100100
(args
101101
(((immediate_desc
102-
(MImmBinding (MGlobalBind _F64_VAL_1159 (Unmanaged WasmF64))))
102+
(MImmBinding (MGlobalBind _F64_VAL_1083 (Unmanaged WasmF64))))
103103
(immediate_analyses ((last_usage Unknown)))))))))))
104104
(main_body_stack_size
105105
((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0)

compiler/test/__snapshots__/includes.a3212bd0.0.snapshot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ includes › include_relative_path3
99
(main_body
1010
(((instr_desc
1111
(MImmediate
12-
((immediate_desc (MImmBinding (MGlobalBind j_1116 Managed)))
12+
((immediate_desc (MImmBinding (MGlobalBind j_1040 Managed)))
1313
(immediate_analyses ((last_usage Last)))))))))
1414
(main_body_stack_size
1515
((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0)

compiler/test/__snapshots__/includes.c0c0d5ca.0.snapshot

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,24 +36,24 @@ includes › include_relative_path4
3636
(MStore
3737
(((MLocalBind 1 Managed)
3838
((instr_desc
39-
(MCallKnown (func bar_1119)
39+
(MCallKnown (func bar_1043)
4040
(closure
4141
((immediate_desc
4242
(MIncRef
4343
((immediate_desc
44-
(MImmBinding (MGlobalBind bar_1119 Managed)))
44+
(MImmBinding (MGlobalBind bar_1043 Managed)))
4545
(immediate_analyses ((last_usage Last))))))
4646
(immediate_analyses ((last_usage Unknown)))))
4747
(func_type ((Managed) (Managed)))
4848
(args
4949
(((immediate_desc (MImmConst (MConstI32 2)))
5050
(immediate_analyses ((last_usage Unknown))))))))))))))
5151
((instr_desc
52-
(MReturnCallKnown (func print_1116)
52+
(MReturnCallKnown (func print_1040)
5353
(closure
5454
((immediate_desc
5555
(MIncRef
56-
((immediate_desc (MImmBinding (MGlobalBind print_1116 Managed)))
56+
((immediate_desc (MImmBinding (MGlobalBind print_1040 Managed)))
5757
(immediate_analyses ((last_usage Last))))))
5858
(immediate_analyses ((last_usage Unknown)))))
5959
(func_type ((Managed Managed) ((Unmanaged WasmI32))))

compiler/test/__snapshots__/includes.f2bf866b.0.snapshot

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ includes › include_all_constructor
1010
(MADT
1111
((immediate_desc (MImmConst (MConstI32 609193316)))
1212
(immediate_analyses ((last_usage Unknown))))
13-
((immediate_desc (MImmConst (MConstI32 1121)))
13+
((immediate_desc (MImmConst (MConstI32 1045)))
1414
(immediate_analyses ((last_usage Unknown))))
1515
((immediate_desc (MImmConst (MConstI32 0)))
1616
(immediate_analyses ((last_usage Unknown))))
@@ -20,7 +20,7 @@ includes › include_all_constructor
2020
(MADT
2121
((immediate_desc (MImmConst (MConstI32 609193316)))
2222
(immediate_analyses ((last_usage Unknown))))
23-
((immediate_desc (MImmConst (MConstI32 1121)))
23+
((immediate_desc (MImmConst (MConstI32 1045)))
2424
(immediate_analyses ((last_usage Unknown))))
2525
((immediate_desc (MImmConst (MConstI32 1)))
2626
(immediate_analyses ((last_usage Unknown))))

compiler/test/__snapshots__/provides.0ef7e7b3.0.snapshot

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ provides › provide7
22
((mash_code
33
((functions ())
44
(imports
5-
(((mimp_id ((stamp 1122) (name x))) (mimp_mod provideAll.gr)
5+
(((mimp_id ((stamp 1046) (name x))) (mimp_mod provideAll.gr)
66
(mimp_name x) (mimp_type (MGlobalImport Managed true))
77
(mimp_kind MImportGrain) (mimp_setup MCallGetter) (mimp_used true))))
88
(exports ())
99
(main_body
1010
(((instr_desc
1111
(MImmediate
12-
((immediate_desc (MImmBinding (MGlobalBind x_1122 Managed)))
12+
((immediate_desc (MImmBinding (MGlobalBind x_1046 Managed)))
1313
(immediate_analyses ((last_usage Last)))))))))
1414
(main_body_stack_size
1515
((stack_size_ptr 0) (stack_size_i32 0) (stack_size_i64 0)
1616
(stack_size_f32 0) (stack_size_f64 0)))
1717
(globals ()) (function_table_elements ())
18-
(global_function_table_offset ((stamp 1123) (name function_table_global)))
18+
(global_function_table_offset ((stamp 1047) (name function_table_global)))
1919
(compilation_mode Normal) (type_metadata <opaque>)))
2020
(signature <opaque>))

0 commit comments

Comments
 (0)