Skip to content

Commit

Permalink
flambda-backend: Introduce Import_info (ocaml#1036)
Browse files Browse the repository at this point in the history
  • Loading branch information
mshinwell committed Dec 27, 2022
1 parent bc5b135 commit b11eea1
Show file tree
Hide file tree
Showing 36 changed files with 393 additions and 168 deletions.
42 changes: 40 additions & 2 deletions .depend
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,16 @@ utils/identifiable.cmx : \
utils/misc.cmx \
utils/identifiable.cmi
utils/identifiable.cmi :
utils/import_info.cmo : \
utils/misc.cmi \
utils/compilation_unit.cmi \
utils/import_info.cmi
utils/import_info.cmx : \
utils/misc.cmx \
utils/compilation_unit.cmx \
utils/import_info.cmi
utils/import_info.cmi : \
utils/compilation_unit.cmi
utils/int_replace_polymorphic_compare.cmo : \
utils/int_replace_polymorphic_compare.cmi
utils/int_replace_polymorphic_compare.cmx : \
Expand Down Expand Up @@ -720,6 +730,7 @@ typing/env.cmi : \
parsing/longident.cmi \
parsing/location.cmi \
utils/load_path.cmi \
utils/import_info.cmi \
typing/ident.cmi \
utils/compilation_unit.cmi \
file_formats/cmi_format.cmi \
Expand Down Expand Up @@ -1071,6 +1082,7 @@ typing/persistent_env.cmo : \
parsing/location.cmi \
utils/load_path.cmi \
utils/lazy_backtrack.cmi \
utils/import_info.cmi \
utils/consistbl.cmi \
utils/config.cmi \
utils/compilation_unit.cmi \
Expand All @@ -1083,6 +1095,7 @@ typing/persistent_env.cmx : \
parsing/location.cmx \
utils/load_path.cmx \
utils/lazy_backtrack.cmx \
utils/import_info.cmx \
utils/consistbl.cmx \
utils/config.cmx \
utils/compilation_unit.cmx \
Expand All @@ -1094,6 +1107,7 @@ typing/persistent_env.cmi : \
utils/misc.cmi \
parsing/location.cmi \
utils/lazy_backtrack.cmi \
utils/import_info.cmi \
utils/consistbl.cmi \
utils/compilation_unit.cmi \
file_formats/cmi_format.cmi
Expand Down Expand Up @@ -1786,6 +1800,7 @@ typing/typemod.cmo : \
utils/load_path.cmi \
typing/includemod_errorprinter.cmi \
typing/includemod.cmi \
utils/import_info.cmi \
typing/ident.cmi \
typing/envaux.cmi \
typing/env.cmi \
Expand Down Expand Up @@ -1823,6 +1838,7 @@ typing/typemod.cmx : \
utils/load_path.cmx \
typing/includemod_errorprinter.cmx \
typing/includemod.cmx \
utils/import_info.cmx \
typing/ident.cmx \
typing/envaux.cmx \
typing/env.cmx \
Expand Down Expand Up @@ -2080,6 +2096,7 @@ bytecomp/bytelink.cmo : \
parsing/location.cmi \
utils/load_path.cmi \
bytecomp/instruct.cmi \
utils/import_info.cmi \
typing/ident.cmi \
bytecomp/emitcode.cmi \
bytecomp/dll.cmi \
Expand All @@ -2099,6 +2116,7 @@ bytecomp/bytelink.cmx : \
parsing/location.cmx \
utils/load_path.cmx \
bytecomp/instruct.cmx \
utils/import_info.cmx \
typing/ident.cmx \
bytecomp/emitcode.cmx \
bytecomp/dll.cmx \
Expand All @@ -2113,6 +2131,7 @@ bytecomp/bytelink.cmx : \
bytecomp/bytelink.cmi : \
bytecomp/symtable.cmi \
utils/misc.cmi \
utils/import_info.cmi \
utils/compilation_unit.cmi \
file_formats/cmo_format.cmi
bytecomp/bytepackager.cmo : \
Expand All @@ -2126,6 +2145,7 @@ bytecomp/bytepackager.cmo : \
parsing/location.cmi \
utils/load_path.cmi \
bytecomp/instruct.cmi \
utils/import_info.cmi \
typing/ident.cmi \
typing/env.cmi \
bytecomp/emitcode.cmi \
Expand All @@ -2147,6 +2167,7 @@ bytecomp/bytepackager.cmx : \
parsing/location.cmx \
utils/load_path.cmx \
bytecomp/instruct.cmx \
utils/import_info.cmx \
typing/ident.cmx \
typing/env.cmx \
bytecomp/emitcode.cmx \
Expand Down Expand Up @@ -2286,6 +2307,7 @@ bytecomp/symtable.cmo : \
bytecomp/meta.cmi \
parsing/location.cmi \
lambda/lambda.cmi \
utils/import_info.cmi \
typing/ident.cmi \
bytecomp/dll.cmi \
utils/config.cmi \
Expand All @@ -2301,6 +2323,7 @@ bytecomp/symtable.cmx : \
bytecomp/meta.cmx \
parsing/location.cmx \
lambda/lambda.cmx \
utils/import_info.cmx \
typing/ident.cmx \
bytecomp/dll.cmx \
utils/config.cmx \
Expand All @@ -2312,6 +2335,7 @@ bytecomp/symtable.cmx : \
bytecomp/symtable.cmi : \
utils/misc.cmi \
lambda/lambda.cmi \
utils/import_info.cmi \
typing/ident.cmi \
file_formats/cmo_format.cmi
asmcomp/CSE.cmo : \
Expand Down Expand Up @@ -2487,6 +2511,7 @@ asmcomp/asmlink.cmo : \
utils/misc.cmi \
parsing/location.cmi \
utils/load_path.cmi \
utils/import_info.cmi \
asmcomp/emitaux.cmi \
asmcomp/emit.cmi \
utils/consistbl.cmi \
Expand All @@ -2507,6 +2532,7 @@ asmcomp/asmlink.cmx : \
utils/misc.cmx \
parsing/location.cmx \
utils/load_path.cmx \
utils/import_info.cmx \
asmcomp/emitaux.cmx \
asmcomp/emit.cmx \
utils/consistbl.cmx \
Expand All @@ -2522,6 +2548,7 @@ asmcomp/asmlink.cmx : \
asmcomp/asmlink.cmi
asmcomp/asmlink.cmi : \
utils/misc.cmi \
utils/import_info.cmi \
utils/compilation_unit.cmi \
file_formats/cmx_format.cmi
asmcomp/asmpackager.cmo : \
Expand All @@ -2535,6 +2562,7 @@ asmcomp/asmpackager.cmo : \
utils/load_path.cmi \
utils/linkage_name.cmi \
lambda/lambda.cmi \
utils/import_info.cmi \
middle_end/flambda/flambda_middle_end.cmi \
middle_end/flambda/export_info.cmi \
typing/env.cmi \
Expand All @@ -2559,6 +2587,7 @@ asmcomp/asmpackager.cmx : \
utils/load_path.cmx \
utils/linkage_name.cmx \
lambda/lambda.cmx \
utils/import_info.cmx \
middle_end/flambda/flambda_middle_end.cmx \
middle_end/flambda/export_info.cmx \
typing/env.cmx \
Expand Down Expand Up @@ -3421,6 +3450,7 @@ middle_end/compilenv.cmo : \
parsing/location.cmi \
utils/load_path.cmi \
utils/linkage_name.cmi \
utils/import_info.cmi \
typing/ident.cmi \
middle_end/flambda/export_info.cmi \
typing/env.cmi \
Expand All @@ -3440,6 +3470,7 @@ middle_end/compilenv.cmx : \
parsing/location.cmx \
utils/load_path.cmx \
utils/linkage_name.cmx \
utils/import_info.cmx \
typing/ident.cmx \
middle_end/flambda/export_info.cmx \
typing/env.cmx \
Expand Down Expand Up @@ -4050,22 +4081,26 @@ file_formats/cmi_format.cmo : \
typing/types.cmi \
utils/misc.cmi \
parsing/location.cmi \
utils/import_info.cmi \
utils/config.cmi \
utils/compilation_unit.cmi \
file_formats/cmi_format.cmi
file_formats/cmi_format.cmx : \
typing/types.cmx \
utils/misc.cmx \
parsing/location.cmx \
utils/import_info.cmx \
utils/config.cmx \
utils/compilation_unit.cmx \
file_formats/cmi_format.cmi
file_formats/cmi_format.cmi : \
typing/types.cmi \
utils/misc.cmi \
utils/import_info.cmi \
utils/compilation_unit.cmi
file_formats/cmo_format.cmi : \
lambda/lambda.cmi \
utils/import_info.cmi \
typing/ident.cmi \
utils/compilation_unit.cmi
file_formats/cmt_format.cmo : \
Expand All @@ -4077,6 +4112,7 @@ file_formats/cmt_format.cmo : \
parsing/location.cmi \
utils/load_path.cmi \
parsing/lexer.cmi \
utils/import_info.cmi \
typing/env.cmi \
utils/config.cmi \
utils/compilation_unit.cmi \
Expand All @@ -4092,6 +4128,7 @@ file_formats/cmt_format.cmx : \
parsing/location.cmx \
utils/load_path.cmx \
parsing/lexer.cmx \
utils/import_info.cmx \
typing/env.cmx \
utils/config.cmx \
utils/compilation_unit.cmx \
Expand All @@ -4108,6 +4145,7 @@ file_formats/cmt_format.cmi : \
file_formats/cmi_format.cmi
file_formats/cmx_format.cmi : \
lambda/lambda.cmi \
utils/import_info.cmi \
middle_end/flambda/export_info.cmi \
utils/compilation_unit.cmi \
middle_end/clambda.cmi
Expand Down Expand Up @@ -6427,17 +6465,17 @@ toplevel/expunge.cmo : \
bytecomp/symtable.cmi \
lambda/runtimedef.cmi \
utils/misc.cmi \
utils/import_info.cmi \
typing/ident.cmi \
utils/compilation_unit.cmi \
file_formats/cmo_format.cmi \
bytecomp/bytesections.cmi
toplevel/expunge.cmx : \
bytecomp/symtable.cmx \
lambda/runtimedef.cmx \
utils/misc.cmx \
utils/import_info.cmx \
typing/ident.cmx \
utils/compilation_unit.cmx \
file_formats/cmo_format.cmi \
bytecomp/bytesections.cmx
toplevel/genprintval.cmo : \
typing/types.cmi \
Expand Down
29 changes: 21 additions & 8 deletions asmcomp/asmlink.ml
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,10 @@ let cmx_required = ref ([] : CU.t list)

let check_consistency file_name unit crc =
begin try
List.iter
(fun (name, crco) ->
Array.iter
(fun import ->
let name = Import_info.name import in
let crco = Import_info.crc_with_unit import in
interfaces := name :: !interfaces;
match crco with
None -> ()
Expand All @@ -68,8 +70,10 @@ let check_consistency file_name unit crc =
raise(Error(Inconsistent_interface(name, user, auth)))
end;
begin try
List.iter
(fun (name, crco) ->
Array.iter
(fun import ->
let name = Import_info.cu import in
let crco = Import_info.crc import in
implementations := name :: !implementations;
match crco with
None ->
Expand Down Expand Up @@ -100,9 +104,15 @@ let check_consistency file_name unit crc =

let extract_crc_interfaces () =
Cmi_consistbl.extract !interfaces crc_interfaces
|> List.map (fun (name, crc_with_unit) ->
Import_info.create name ~crc_with_unit)

let extract_crc_implementations () =
Cmx_consistbl.extract !implementations crc_implementations
|> List.map (fun (name, crco) -> name, Option.map snd crco)
|> List.map (fun (cu, crc) ->
let crc = Option.map (fun ((), crc) -> crc) crc in
Import_info.create_normal cu ~crc)


(* Add C objects and options and "custom" info from a library descriptor.
See bytecomp/bytelink.ml for comments on the order of C objects. *)
Expand Down Expand Up @@ -137,7 +147,8 @@ let is_required name =
try ignore (Hashtbl.find missing_globals name); true
with Not_found -> false

let add_required by (name, _crc) =
let add_required by import =
let name = Import_info.cu import in
try
let rq = Hashtbl.find missing_globals name in
rq := by :: !rq
Expand Down Expand Up @@ -199,7 +210,7 @@ let scan_file file tolink =
| Unit (file_name,info,crc) ->
(* This is a .cmx file. It must be linked in any case. *)
remove_required info.ui_unit;
List.iter (add_required file_name) info.ui_imports_cmx;
Array.iter (add_required file_name) info.ui_imports_cmx;
(info, file_name, crc) :: tolink
| Library (file_name,infos) ->
(* This is an archive file. Each unit contained in it will be linked
Expand All @@ -216,7 +227,7 @@ let scan_file file tolink =
let req_by =
Printf.sprintf "%s(%s)" file_name (ui_name |> CU.Name.to_string)
in
List.iter (add_required req_by) info.ui_imports_cmx;
Array.iter (add_required req_by) info.ui_imports_cmx;
(info, file_name, crc) :: reqd
end else
reqd)
Expand All @@ -231,6 +242,8 @@ let force_linking_of_startup ~ppf_dump =
let make_globals_map units_list ~crc_interfaces =
let crc_interfaces =
crc_interfaces
|> List.map (fun import ->
Import_info.name import, Import_info.crc_with_unit import)
|> CU.Name.Tbl.of_list
in
let defined =
Expand Down
4 changes: 2 additions & 2 deletions asmcomp/asmlink.mli
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ val call_linker_shared: string list -> string -> unit

val reset : unit -> unit
val check_consistency: filepath -> Cmx_format.unit_infos -> Digest.t -> unit
val extract_crc_interfaces: unit -> Cmx_format.import_info_cmi list
val extract_crc_implementations: unit -> Cmx_format.import_info_cmx list
val extract_crc_interfaces: unit -> Import_info.t list
val extract_crc_implementations: unit -> Import_info.t list

type error =
| File_not_found of filepath
Expand Down
20 changes: 12 additions & 8 deletions asmcomp/asmpackager.ml
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,9 @@ let check_units members =
begin match mb.pm_kind with
| PM_intf -> ()
| PM_impl infos ->
List.iter
(fun (unit, _) ->
Array.iter
(fun import ->
let unit = Import_info.cu import in
let name = CU.name unit in
if List.mem name forbidden
then raise(Error(Forward_reference(mb.pm_file, name))))
Expand Down Expand Up @@ -174,9 +175,9 @@ let get_approx ui =
let build_package_cmx members cmxfile =
let unit_names =
List.map (fun m -> m.pm_name) members in
let filter ~get_name lst =
List.filter (fun (name, _crc) ->
not (List.mem (get_name name) unit_names)) lst in
let filter lst =
List.filter (fun import ->
not (List.mem (Import_info.name import) unit_names)) lst in
let union lst =
List.fold_left
(List.fold_left
Expand Down Expand Up @@ -207,10 +208,13 @@ let build_package_cmx members cmxfile =
List.flatten (List.map (fun info -> info.ui_defines) units) @
[ui.ui_unit];
ui_imports_cmi =
(modname, Some (ui.ui_unit, Env.crc_of_unit modname)) ::
filter(Asmlink.extract_crc_interfaces()) ~get_name:(fun name -> name);
(Import_info.create modname
~crc_with_unit:(Some (ui.ui_unit, Env.crc_of_unit modname))) ::
filter (Asmlink.extract_crc_interfaces ())
|> Array.of_list;
ui_imports_cmx =
filter(Asmlink.extract_crc_implementations()) ~get_name:CU.name;
(filter(Asmlink.extract_crc_implementations()))
|> Array.of_list;
ui_curry_fun =
union(List.map (fun info -> info.ui_curry_fun) units);
ui_apply_fun =
Expand Down
Binary file modified boot/ocamlc
Binary file not shown.
Binary file modified boot/ocamllex
Binary file not shown.
Loading

0 comments on commit b11eea1

Please sign in to comment.