From d52c4ab5e88aadcead3f0f28c6161670867728f3 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Thu, 3 Sep 2020 14:51:38 +0200 Subject: [PATCH] New upstream version 4.09.0 --- .depend | 5699 +++++++++-------- .gitattributes | 28 +- .gitignore | 21 +- .mailmap | 2 + .travis.yml | 7 +- CONTRIBUTING.md | 59 +- Changes | 282 +- HACKING.adoc | 19 +- INSTALL.adoc | 13 +- Makefile | 397 +- Makefile.common.in | 10 + Makefile.config.in | 50 +- README.adoc | 55 +- README.win32.adoc | 6 +- VERSION | 2 +- aclocal.m4 | 1 - asmcomp/CSEgen.ml | 3 - asmcomp/afl_instrument.ml | 54 +- asmcomp/afl_instrument.mli | 23 +- asmcomp/amd64/emit.mlp | 55 +- asmcomp/amd64/proc.ml | 6 + asmcomp/amd64/selection.ml | 36 +- asmcomp/arm/emit.mlp | 67 +- asmcomp/arm/proc.ml | 9 + asmcomp/arm/selection.ml | 27 +- asmcomp/arm64/emit.mlp | 34 +- asmcomp/arm64/proc.ml | 8 + asmcomp/arm64/selection.ml | 33 +- asmcomp/asmgen.ml | 14 +- asmcomp/asmgen.mli | 1 + asmcomp/asmlink.ml | 56 +- asmcomp/asmlink.mli | 23 +- asmcomp/asmpackager.ml | 8 +- asmcomp/cmm.ml | 26 +- asmcomp/cmm.mli | 30 +- asmcomp/cmmgen.ml | 1835 +++--- asmcomp/cmmgen.mli | 2 + asmcomp/cmmgen_state.ml | 66 + asmcomp/cmmgen_state.mli | 42 + asmcomp/comballoc.ml | 4 - asmcomp/deadcode.ml | 4 - asmcomp/debug/available_regs.ml | 16 - asmcomp/debug/compute_ranges.ml | 514 ++ asmcomp/debug/compute_ranges.mli | 28 + asmcomp/debug/compute_ranges_intf.ml | 274 + asmcomp/i386/NOTES.md | 7 +- asmcomp/i386/arch.ml | 3 +- asmcomp/i386/emit.mlp | 95 +- asmcomp/i386/proc.ml | 11 + asmcomp/i386/selection.ml | 51 +- asmcomp/interf.ml | 6 - asmcomp/interval.ml | 4 - asmcomp/linearize.ml | 104 +- asmcomp/linearize.mli | 5 +- asmcomp/liveness.ml | 14 - asmcomp/mach.ml | 5 +- asmcomp/mach.mli | 1 - asmcomp/power/emit.mlp | 81 +- asmcomp/power/proc.ml | 20 + asmcomp/power/selection.ml | 10 +- asmcomp/printcmm.ml | 22 +- asmcomp/printlinear.ml | 8 +- asmcomp/printmach.ml | 2 - asmcomp/proc.mli | 4 + asmcomp/reloadgen.ml | 2 - asmcomp/s390x/emit.mlp | 13 +- asmcomp/s390x/proc.ml | 8 + asmcomp/s390x/selection.ml | 18 +- asmcomp/schedgen.ml | 6 +- asmcomp/selectgen.ml | 325 +- asmcomp/selectgen.mli | 24 +- asmcomp/spacetime_profiling.ml | 98 +- asmcomp/spill.ml | 42 - asmcomp/split.ml | 5 - asmcomp/strmatch.ml | 12 +- asmcomp/x86_proc.ml | 7 - asmcomp/x86_proc.mli | 5 - autogen | 29 +- boot/ocamlc | Bin 2623091 -> 2623597 bytes boot/ocamllex | Bin 323034 -> 322927 bytes bytecomp/bytegen.ml | 25 +- bytecomp/bytelink.ml | 53 +- bytecomp/bytelink.mli | 25 +- bytecomp/bytepackager.ml | 2 +- bytecomp/dune | 8 - config/Makefile.mingw | 201 - config/Makefile.mingw64 | 201 - config/Makefile.msvc | 207 - config/Makefile.msvc64 | 208 - config/auto-aux/align.c | 103 - config/auto-aux/ansi.c | 27 - config/auto-aux/async_io.c | 60 - config/auto-aux/cckind.c | 32 - config/auto-aux/cfi.S | 6 - config/auto-aux/dblalign.c | 54 - config/auto-aux/elf.c | 26 - config/auto-aux/endian.c | 42 - config/auto-aux/getgroups.c | 32 - config/auto-aux/gethostbyaddr.c | 55 - config/auto-aux/gethostbyname.c | 45 - config/auto-aux/hasgot | 47 - config/auto-aux/hasgot2 | 46 - config/auto-aux/hashbang | 2 - config/auto-aux/hashbang2 | 2 - config/auto-aux/hashbang3 | 2 - config/auto-aux/ia32sse2.c | 24 - config/auto-aux/initgroups.c | 26 - config/auto-aux/int64align.c | 65 - config/auto-aux/mmap-huge.c | 51 - config/auto-aux/nanosecond_stat.c | 30 - config/auto-aux/runtest | 26 - config/auto-aux/searchpath | 34 - config/auto-aux/setgroups.c | 28 - config/auto-aux/signals.c | 68 - config/auto-aux/simple.S | 3 - config/auto-aux/sizes.c | 27 - config/auto-aux/solaris-ld | 23 - config/auto-aux/tryassemble | 33 - config/auto-aux/trycompile | 25 - config/gnu/config.guess | 1558 ----- config/gnu/config.sub | 1788 ------ config/m-nt.h | 58 - config/s-nt.h | 44 - configure | 496 +- configure.ac | 162 +- debugger/.depend | 16 +- debugger/Makefile | 28 +- debugger/dune | 22 +- debugger/loadprinter.ml | 52 +- debugger/loadprinter.mli | 2 +- debugger/main.ml | 16 +- driver/compenv.ml | 8 +- driver/compenv.mli | 3 - driver/compify_dynlink.sh | 3 - driver/compile.ml | 2 +- driver/compile_common.ml | 4 +- driver/compmisc.ml | 6 +- driver/compmisc.mli | 2 +- driver/compplugin.ml | 50 - driver/dune | 55 - driver/main.ml | 28 +- driver/main_args.ml | 88 +- driver/main_args.mli | 18 +- driver/makedepend.ml | 128 +- driver/optcompile.ml | 12 +- driver/optcompile.mli | 1 + driver/optmain.ml | 24 +- driver/pparse.ml | 9 - driver/pparse.mli | 5 +- dune | 147 +- {typing => file_formats}/cmi_format.ml | 14 +- {typing => file_formats}/cmi_format.mli | 14 +- {bytecomp => file_formats}/cmo_format.mli | 13 +- {typing => file_formats}/cmt_format.ml | 0 {typing => file_formats}/cmt_format.mli | 6 +- {asmcomp => file_formats}/cmx_format.mli | 34 +- file_formats/cmxs_format.mli | 35 + {middle_end => lambda}/debuginfo.ml | 0 {middle_end => lambda}/debuginfo.mli | 0 lambda/dune | 21 + {bytecomp => lambda}/generate_runtimedef.sh | 0 {bytecomp => lambda}/lambda.ml | 0 {bytecomp => lambda}/lambda.mli | 0 {bytecomp => lambda}/matching.ml | 0 {bytecomp => lambda}/matching.mli | 0 {bytecomp => lambda}/printlambda.ml | 0 {bytecomp => lambda}/printlambda.mli | 8 +- {bytecomp => lambda}/runtimedef.mli | 0 {bytecomp => lambda}/simplif.ml | 19 +- {bytecomp => lambda}/simplif.mli | 6 +- {bytecomp => lambda}/switch.ml | 0 {bytecomp => lambda}/switch.mli | 0 {bytecomp => lambda}/translattribute.ml | 0 {bytecomp => lambda}/translattribute.mli | 0 {bytecomp => lambda}/translclass.ml | 0 {bytecomp => lambda}/translclass.mli | 0 {bytecomp => lambda}/translcore.ml | 2 +- {bytecomp => lambda}/translcore.mli | 0 {bytecomp => lambda}/translmod.ml | 5 +- {bytecomp => lambda}/translmod.mli | 0 {bytecomp => lambda}/translobj.ml | 0 {bytecomp => lambda}/translobj.mli | 0 {bytecomp => lambda}/translprim.ml | 6 + {bytecomp => lambda}/translprim.mli | 0 lex/Makefile | 7 +- man/ocamlc.m | 21 +- man/ocamldep.m | 17 - man/ocamlopt.m | 47 +- manual/README.md | 2 +- manual/manual/allfiles.etex | 1 - manual/manual/cmds/Makefile | 2 +- manual/manual/cmds/comp.etex | 13 +- manual/manual/cmds/intf-c.etex | 18 +- manual/manual/cmds/native.etex | 14 +- manual/manual/cmds/ocamldep.etex | 8 - manual/manual/cmds/plugins.etex | 87 - manual/manual/cmds/profil.etex | 37 +- manual/manual/cmds/unified-options.etex | 52 +- manual/manual/library/Makefile | 1 - manual/manual/library/compilerlibs.etex | 19 +- manual/manual/library/libdynlink.etex | 8 +- manual/manual/library/libgraph.etex | 103 +- manual/manual/library/libgraph.fig | 29 - manual/manual/library/libgraph.png | Bin 1046 -> 0 bytes manual/manual/library/libthreads.etex | 8 - manual/manual/macros.hva | 4 +- manual/manual/refman/typedecl.etex | 4 +- manual/manual/tutorials/objectexamples.etex | 33 - manual/tests/Makefile | 2 +- middle_end/backend_intf.mli | 0 {asmcomp => middle_end}/backend_var.ml | 0 {asmcomp => middle_end}/backend_var.mli | 0 {asmcomp => middle_end}/clambda.ml | 2 +- {asmcomp => middle_end}/clambda.mli | 2 +- middle_end/clambda_primitives.ml | 155 + middle_end/clambda_primitives.mli | 158 + {asmcomp => middle_end/closure}/closure.ml | 387 +- {asmcomp => middle_end/closure}/closure.mli | 7 +- .../{base_types => }/compilation_unit.ml | 0 .../{base_types => }/compilation_unit.mli | 0 {asmcomp => middle_end}/compilenv.ml | 0 {asmcomp => middle_end}/compilenv.mli | 0 middle_end/convert_primitives.ml | 153 + middle_end/convert_primitives.mli | 17 + middle_end/{ => flambda}/alias_analysis.ml | 0 middle_end/{ => flambda}/alias_analysis.mli | 0 middle_end/{ => flambda}/allocated_const.ml | 0 middle_end/{ => flambda}/allocated_const.mli | 0 .../{ => flambda}/augment_specialised_args.ml | 0 .../augment_specialised_args.mli | 0 .../base_types/closure_element.ml | 0 .../base_types/closure_element.mli | 0 .../{ => flambda}/base_types/closure_id.ml | 0 .../{ => flambda}/base_types/closure_id.mli | 0 .../base_types/closure_origin.ml | 0 .../base_types/closure_origin.mli | 0 .../{ => flambda}/base_types/export_id.ml | 0 .../{ => flambda}/base_types/export_id.mli | 0 .../{ => flambda}/base_types/id_types.ml | 0 .../{ => flambda}/base_types/id_types.mli | 0 .../base_types/mutable_variable.ml | 0 .../base_types/mutable_variable.mli | 0 .../base_types/set_of_closures_id.ml | 0 .../base_types/set_of_closures_id.mli | 0 .../base_types/set_of_closures_origin.ml | 0 .../base_types/set_of_closures_origin.mli | 0 .../base_types/static_exception.ml | 0 .../base_types/static_exception.mli | 0 middle_end/{ => flambda}/base_types/tag.ml | 0 middle_end/{ => flambda}/base_types/tag.mli | 0 .../base_types/var_within_closure.ml | 0 .../base_types/var_within_closure.mli | 0 .../flambda}/build_export_info.ml | 38 +- .../flambda}/build_export_info.mli | 0 .../{ => flambda}/closure_conversion.ml | 51 +- .../{ => flambda}/closure_conversion.mli | 0 .../{ => flambda}/closure_conversion_aux.ml | 0 .../{ => flambda}/closure_conversion_aux.mli | 0 .../flambda}/closure_offsets.ml | 0 .../flambda}/closure_offsets.mli | 0 middle_end/{ => flambda}/effect_analysis.ml | 2 +- middle_end/{ => flambda}/effect_analysis.mli | 0 .../flambda}/export_info.ml | 0 .../flambda}/export_info.mli | 0 .../flambda}/export_info_for_pack.ml | 0 .../flambda}/export_info_for_pack.mli | 0 .../{ => flambda}/extract_projections.ml | 0 .../{ => flambda}/extract_projections.mli | 0 .../{ => flambda}/find_recursive_functions.ml | 0 .../find_recursive_functions.mli | 0 middle_end/{ => flambda}/flambda.ml | 10 +- middle_end/{ => flambda}/flambda.mli | 2 +- .../{ => flambda}/flambda_invariants.ml | 40 +- .../{ => flambda}/flambda_invariants.mli | 1 - middle_end/{ => flambda}/flambda_iterators.ml | 0 .../{ => flambda}/flambda_iterators.mli | 0 .../flambda_middle_end.ml} | 0 .../flambda_middle_end.mli} | 0 .../flambda}/flambda_to_clambda.ml | 2 +- .../flambda}/flambda_to_clambda.mli | 0 middle_end/{ => flambda}/flambda_utils.ml | 8 +- middle_end/{ => flambda}/flambda_utils.mli | 0 middle_end/{ => flambda}/freshening.ml | 0 middle_end/{ => flambda}/freshening.mli | 0 .../flambda}/import_approx.ml | 0 .../flambda}/import_approx.mli | 0 middle_end/{ => flambda}/inconstant_idents.ml | 6 +- .../{ => flambda}/inconstant_idents.mli | 0 .../initialize_symbol_to_let_symbol.ml | 0 .../initialize_symbol_to_let_symbol.mli | 0 .../{ => flambda}/inline_and_simplify.ml | 6 +- .../{ => flambda}/inline_and_simplify.mli | 0 .../{ => flambda}/inline_and_simplify_aux.ml | 0 .../{ => flambda}/inline_and_simplify_aux.mli | 0 middle_end/{ => flambda}/inlining_cost.ml | 7 +- middle_end/{ => flambda}/inlining_cost.mli | 0 middle_end/{ => flambda}/inlining_decision.ml | 0 .../{ => flambda}/inlining_decision.mli | 0 .../{ => flambda}/inlining_decision_intf.mli | 0 middle_end/{ => flambda}/inlining_stats.ml | 0 middle_end/{ => flambda}/inlining_stats.mli | 0 .../{ => flambda}/inlining_stats_types.ml | 0 .../{ => flambda}/inlining_stats_types.mli | 0 .../{ => flambda}/inlining_transforms.ml | 0 .../{ => flambda}/inlining_transforms.mli | 0 middle_end/{ => flambda}/invariant_params.ml | 0 middle_end/{ => flambda}/invariant_params.mli | 0 middle_end/{ => flambda}/lift_code.ml | 0 middle_end/{ => flambda}/lift_code.mli | 0 middle_end/{ => flambda}/lift_constants.ml | 0 middle_end/{ => flambda}/lift_constants.mli | 0 .../lift_let_to_initialize_symbol.ml | 0 .../lift_let_to_initialize_symbol.mli | 0 middle_end/{ => flambda}/parameter.ml | 0 middle_end/{ => flambda}/parameter.mli | 0 middle_end/{ => flambda}/pass_wrapper.ml | 0 middle_end/{ => flambda}/pass_wrapper.mli | 0 middle_end/{ => flambda}/projection.ml | 0 middle_end/{ => flambda}/projection.mli | 0 middle_end/{ => flambda}/ref_to_variables.ml | 0 middle_end/{ => flambda}/ref_to_variables.mli | 0 .../remove_free_vars_equal_to_args.ml | 0 .../remove_free_vars_equal_to_args.mli | 0 .../{ => flambda}/remove_unused_arguments.ml | 0 .../{ => flambda}/remove_unused_arguments.mli | 0 .../remove_unused_closure_vars.ml | 0 .../remove_unused_closure_vars.mli | 0 .../remove_unused_program_constructs.ml | 0 .../remove_unused_program_constructs.mli | 0 middle_end/{ => flambda}/share_constants.ml | 0 middle_end/{ => flambda}/share_constants.mli | 0 .../{ => flambda}/simple_value_approx.ml | 0 .../{ => flambda}/simple_value_approx.mli | 0 .../simplify_boxed_integer_ops.ml | 12 +- .../simplify_boxed_integer_ops.mli | 0 .../simplify_boxed_integer_ops_intf.mli | 6 +- middle_end/{ => flambda}/simplify_common.ml | 0 middle_end/{ => flambda}/simplify_common.mli | 0 .../{ => flambda}/simplify_primitives.ml | 40 +- .../{ => flambda}/simplify_primitives.mli | 3 +- .../flambda}/traverse_for_exported_symbols.ml | 0 .../traverse_for_exported_symbols.mli | 0 {asmcomp => middle_end/flambda}/un_anf.ml | 4 +- {asmcomp => middle_end/flambda}/un_anf.mli | 0 middle_end/{ => flambda}/unbox_closures.ml | 0 middle_end/{ => flambda}/unbox_closures.mli | 0 .../unbox_free_vars_of_closures.ml | 0 .../unbox_free_vars_of_closures.mli | 0 .../{ => flambda}/unbox_specialised_args.ml | 0 .../{ => flambda}/unbox_specialised_args.mli | 0 middle_end/internal_variable_names.ml | 6 +- middle_end/internal_variable_names.mli | 2 + middle_end/{base_types => }/linkage_name.ml | 0 middle_end/{base_types => }/linkage_name.mli | 0 {asmcomp => middle_end}/printclambda.ml | 3 +- {asmcomp => middle_end}/printclambda.mli | 0 middle_end/printclambda_primitives.ml | 202 + .../printclambda_primitives.mli | 6 +- .../semantics_of_primitives.ml | 49 +- .../semantics_of_primitives.mli | 4 +- middle_end/{base_types => }/symbol.ml | 0 middle_end/{base_types => }/symbol.mli | 0 middle_end/{base_types => }/variable.ml | 0 middle_end/{base_types => }/variable.mli | 0 ocaml-variants.opam | 6 +- ocamldoc/Makefile | 8 +- ocamldoc/Makefile.docfiles | 12 +- ocamldoc/odoc_analyse.ml | 4 +- ocamldoc/odoc_args.ml | 2 +- ocamltest/Makefile | 4 +- ocamltest/builtin_actions.ml | 7 + ocamltest/builtin_actions.mli | 3 + ocamltest/ocaml_actions.ml | 39 +- ocamltest/ocaml_flags.ml | 1 + ocamltest/ocaml_modifiers.ml | 4 + ocamltest/ocaml_variables.ml | 6 +- ocamltest/ocaml_variables.mli | 2 + ocamltest/run_unix.c | 20 +- otherlibs/dynlink/.depend | 40 + otherlibs/dynlink/Makefile | 314 +- otherlibs/dynlink/{ => byte}/dynlink.ml | 8 +- otherlibs/dynlink/dune | 30 +- otherlibs/dynlink/dynlink.mli | 22 + otherlibs/dynlink/dynlink_common.ml | 13 +- otherlibs/dynlink/dynlink_common.mli | 1 + .../Makefile.copy-sources} | 30 +- otherlibs/dynlink/dynlink_platform_intf.ml | 2 + otherlibs/dynlink/extract_crc.ml | 2 + .../{natdynlink.ml => native/dynlink.ml} | 19 +- otherlibs/dynlink/nodynlink.ml | 79 - otherlibs/graph/.depend | 69 - otherlibs/graph/color.c | 233 - otherlibs/graph/draw.c | 127 - otherlibs/graph/dump_img.c | 58 - otherlibs/graph/events.c | 279 - otherlibs/graph/fill.c | 90 - otherlibs/graph/graphics.ml | 266 - otherlibs/graph/graphics.mli | 391 -- otherlibs/graph/graphicsX11.ml | 42 - otherlibs/graph/graphicsX11.mli | 30 - otherlibs/graph/image.c | 109 - otherlibs/graph/image.h | 29 - otherlibs/graph/libgraph.h | 89 - otherlibs/graph/make_img.c | 99 - otherlibs/graph/open.c | 401 -- otherlibs/graph/point_col.c | 31 - otherlibs/graph/sound.c | 34 - otherlibs/graph/subwindow.c | 45 - otherlibs/graph/text.c | 86 - otherlibs/systhreads/st_posix.h | 55 +- otherlibs/systhreads/st_stubs.c | 18 +- otherlibs/systhreads/st_win32.h | 16 +- otherlibs/threads/.depend | 78 - otherlibs/threads/Makefile | 159 - otherlibs/threads/condition.ml | 35 - otherlibs/threads/condition.mli | 53 - otherlibs/threads/event.ml | 274 - otherlibs/threads/event.mli | 81 - otherlibs/threads/marshal.ml | 60 - otherlibs/threads/mutex.ml | 38 - otherlibs/threads/mutex.mli | 49 - otherlibs/threads/scheduler.c | 878 --- otherlibs/threads/stdlib.ml | 707 -- otherlibs/threads/thread.ml | 147 - otherlibs/threads/thread.mli | 140 - otherlibs/threads/threadUnix.ml | 68 - otherlibs/threads/threadUnix.mli | 104 - otherlibs/threads/unix.ml | 1210 ---- otherlibs/unix/mmap.c | 54 +- otherlibs/unix/mmap_ba.c | 21 +- otherlibs/unix/open.c | 2 +- otherlibs/unix/sleep.c | 13 +- otherlibs/unix/socketaddr.c | 48 +- otherlibs/unix/unixsupport.c | 2 +- otherlibs/unix/wait.c | 3 + otherlibs/win32graph/Makefile | 39 - otherlibs/win32graph/draw.c | 649 -- otherlibs/win32graph/events.c | 210 - otherlibs/win32graph/libgraph.h | 78 - otherlibs/win32graph/open.c | 372 -- otherlibs/win32unix/mmap.c | 55 +- otherlibs/win32unix/nonblock.c | 0 otherlibs/win32unix/unixsupport.c | 2 +- parsing/ast_iterator.ml | 0 parsing/ast_iterator.mli | 0 parsing/ast_mapper.ml | 5 +- parsing/builtin_attributes.ml | 0 parsing/builtin_attributes.mli | 7 +- parsing/depend.mli | 2 +- parsing/location.ml | 30 +- parsing/pprintast.ml | 8 +- runtime/.depend | 286 - runtime/Makefile | 24 - runtime/alloc.c | 38 +- runtime/amd64.S | 33 +- runtime/arm.S | 25 - runtime/arm64.S | 17 - runtime/backtrace_byt.c | 2 +- runtime/callback.c | 8 +- runtime/caml/callback.h | 4 +- runtime/caml/config.h | 5 - runtime/caml/custom.h | 2 +- runtime/caml/exec.h | 2 +- runtime/caml/int64_emul.h | 293 - runtime/caml/int64_format.h | 111 - runtime/caml/int64_native.h | 67 - runtime/caml/misc.h | 8 +- runtime/caml/s.h.in | 19 - runtime/compare.c | 28 - runtime/debugger.c | 2 +- runtime/dynlink.c | 12 +- runtime/extern.c | 6 +- runtime/fail_nat.c | 2 +- runtime/floats.c | 80 +- runtime/globroots.c | 104 +- runtime/i386.S | 106 +- runtime/intern.c | 2 +- runtime/ints.c | 14 +- runtime/obj.c | 25 +- runtime/printexc.c | 4 +- runtime/signals_osdep.h | 20 + runtime/spacetime_nat.c | 10 +- runtime/startup_aux.c | 60 +- runtime/startup_byt.c | 24 +- runtime/startup_nat.c | 2 +- runtime/sys.c | 31 +- runtime/win32.c | 22 +- stdlib/.depend | 576 +- stdlib/Compflags | 14 +- stdlib/Makefile | 167 +- stdlib/buffer.ml | 119 +- stdlib/bytes.mli | 3 + stdlib/bytesLabels.mli | 3 + stdlib/camlinternalFormat.ml | 113 +- stdlib/camlinternalFormatBasics.ml | 25 +- stdlib/camlinternalFormatBasics.mli | 13 +- stdlib/camlinternalLazy.ml | 10 +- stdlib/camlinternalMod.ml | 17 +- stdlib/obj.ml | 1 + stdlib/obj.mli | 4 + stdlib/printexc.ml | 50 +- stdlib/printexc.mli | 12 + stdlib/printf.mli | 7 +- stdlib/scanf.ml | 10 +- stdlib/sys.mli | 2 +- stdlib/sys.mlp | 5 +- stdlib/weak.ml | 6 +- testsuite/interactive/lib-graph-2/Makefile | 23 - .../interactive/lib-graph-2/graph_test.ml | 290 - testsuite/interactive/lib-graph-3/Makefile | 23 - testsuite/interactive/lib-graph-3/sorts.ml | 243 - testsuite/interactive/lib-graph/Makefile | 23 - .../interactive/lib-graph/graph_example.ml | 146 - testsuite/tests/arch-power/exn_raise.ml | 19 + .../arch-power/exn_raise.reference} | 0 testsuite/tests/arch-power/ocamltests | 1 + testsuite/tests/asmgen/catch-multiple.cmm | 20 + testsuite/tests/asmgen/ocamltests | 1 + .../tests/backtrace/backtrace2.byte.reference | 4 +- .../tests/backtrace/backtrace2.opt.reference | 4 +- testsuite/tests/basic-float/float_literals.ml | 285 + testsuite/tests/basic-float/ocamltests | 1 + testsuite/tests/basic-float/tfloat_hex.ml | 34 + .../tests/basic-float/tfloat_hex.reference | 14 + testsuite/tests/basic-modules/main.ml | 3 +- testsuite/tests/basic-modules/pr4008.ml | 6 + .../recursive_module_evaluation_errors.ml | 4 +- .../basic-more/morematch.compilers.reference | 2 +- testsuite/tests/basic-more/morematch.ml | 2 +- .../robustmatch.compilers.reference | 54 +- testsuite/tests/basic/localexn.ml | 0 testsuite/tests/basic/localfunction.ml | 0 testsuite/tests/basic/localfunction.reference | 0 testsuite/tests/basic/opt_variants.ml | 0 testsuite/tests/basic/patmatch_incoherence.ml | 14 +- testsuite/tests/basic/pr7657.ml | 0 testsuite/tests/basic/switch_opts.ml | 334 +- testsuite/tests/basic/switch_opts.reference | 2 +- testsuite/tests/embedded/cmstub.c | 4 +- .../float_subst_boxed_number.ml | 2 + testsuite/tests/gc-roots/globroots.ml | 4 + testsuite/tests/gc-roots/globrootsprim.c | 30 + .../tests/generalized-open/clambda_optim.ml | 15 + testsuite/tests/generalized-open/gpr1506.ml | 4 +- testsuite/tests/generalized-open/ocamltests | 1 + testsuite/tests/let-syntax/let_syntax.ml | 7 +- testsuite/tests/letrec-check/basic.ml | 16 +- .../letrec-check/extension_constructor.ml | 2 +- testsuite/tests/letrec-check/modules.ml | 2 +- .../tests/letrec-check/pr7706.ocaml.reference | 2 +- testsuite/tests/letrec-check/unboxed.ml | 4 +- testsuite/tests/letrec-compilation/ocamltests | 1 + testsuite/tests/letrec-compilation/pr8681.ml | 63 + .../tests/letrec-compilation/pr8681.reference | 5 + testsuite/tests/lib-arg/testerror.ml | 2 + testsuite/tests/lib-bigarray-file/mapfile.ml | 1 + testsuite/tests/lib-bytes/binary.ml | 0 testsuite/tests/lib-filename/extension.ml | 0 testsuite/tests/lib-filename/suffix.ml | 0 testsuite/tests/lib-int/test.ml | 1 + testsuite/tests/lib-obj/ocamltests | 1 + testsuite/tests/lib-obj/reachable_words.ml | 0 testsuite/tests/lib-obj/with_tag.ml | 31 + testsuite/tests/lib-obj/with_tag.reference | 1 + testsuite/tests/lib-printf/tprintf.ml | 44 +- testsuite/tests/lib-printf/tprintf.reference | 66 +- testsuite/tests/lib-stream/mpr7769.ml | 0 testsuite/tests/lib-stream/mpr7769.reference | 0 testsuite/tests/lib-systhreads/ocamltests | 1 + testsuite/tests/lib-systhreads/testyield.ml | 51 + testsuite/tests/lib-threads/delayintr.ml | 61 + .../tests/lib-threads/delayintr.reference | 1 + testsuite/tests/lib-threads/delayintr.run | 5 + testsuite/tests/lib-threads/ocamltests | 1 + testsuite/tests/lib-threads/pr4466.ml | 4 +- .../tests/lib-unix/common/wait_nohang.ml | 57 +- .../lib-unix/common/wait_nohang.reference | 2 +- .../tests/lib-unix/unix-socket/is-linux.sh | 21 + .../tests/lib-unix/unix-socket/ocamltests | 2 + .../tests/lib-unix/unix-socket/recvfrom.ml | 33 + .../lib-unix/unix-socket/recvfrom_linux.ml | 21 + .../unix-socket/recvfrom_linux.reference | 1 + .../lib-unix/unix-socket/recvfrom_unix.ml | 23 + .../unix-socket/recvfrom_unix.reference | 2 + .../exhaustiveness_warnings.ml | 8 +- testsuite/tests/misc/sorts.ml | 26 +- testsuite/tests/parsetree/source.ml | 8 + testsuite/tests/ppx-contexts/myppx.ml | 2 - .../ppx-contexts/test.compilers.reference | 7 - testsuite/tests/ppx-contexts/test.ml | 3 +- .../tests/printing-types/disambiguation.ml | 42 + testsuite/tests/printing-types/ocamltests | 1 + .../tests/self-contained-toplevel/main.ml | 7 +- .../tests/tool-debugger/printer/debuggee.ml | 22 + .../tool-debugger/printer/debuggee.reference | 5 + .../tests/tool-debugger/printer/input_script | 7 + .../tests/tool-debugger/printer/ocamltests | 1 + .../tests/tool-debugger/printer/printer.ml | 8 + testsuite/tests/tool-ocamldep-shadowing/a.ml | 13 + .../tests/tool-ocamldep-shadowing/a.reference | 6 + .../tool-ocamldep-shadowing/dir1/b.ml} | 0 .../tool-ocamldep-shadowing/dir2/b.mli} | 0 .../tests/tool-ocamldep-shadowing/dir2/c.mli | 0 .../tests/tool-ocamldep-shadowing/ocamltests | 1 + .../tool-toplevel-invocation/print_args.ml | 1 + .../print_args.reference | 3 + .../tests/tool-toplevel-invocation/test.ml | 6 + .../error_highlighting.compilers.reference | 5 +- testsuite/tests/tool-toplevel/ocamltests | 1 + .../tool-toplevel/uncaught_exceptions.ml | 45 + .../tests/typing-core-bugs/const_int_hint.ml | 152 + testsuite/tests/typing-core-bugs/ocamltests | 1 + .../typing-core-bugs/repeated_did_you_mean.ml | 0 testsuite/tests/typing-deprecated/alerts.ml | 0 .../tests/typing-extensions/extensions.ml | 416 +- .../extensions.ocaml.reference | 138 - .../tests/typing-extensions/open_types.ml | 240 +- .../open_types.ocaml.reference | 123 - testsuite/tests/typing-gadts/ambiguity.ml | 75 + testsuite/tests/typing-gadts/didier.ml | 16 +- testsuite/tests/typing-gadts/or_patterns.ml | 8 +- testsuite/tests/typing-gadts/pr5785.ml | 2 +- testsuite/tests/typing-gadts/pr5906.ml | 2 +- testsuite/tests/typing-gadts/pr5981.ml | 4 +- testsuite/tests/typing-gadts/pr5985.ml | 2 +- testsuite/tests/typing-gadts/pr5989.ml | 4 +- testsuite/tests/typing-gadts/pr6241.ml | 2 +- testsuite/tests/typing-gadts/pr6690.ml | 3 +- testsuite/tests/typing-gadts/pr7160.ml | 2 +- testsuite/tests/typing-gadts/pr7260.ml | 2 +- testsuite/tests/typing-gadts/pr7378.ml | 2 +- testsuite/tests/typing-gadts/test.ml | 18 +- testsuite/tests/typing-gadts/yallop_bugs.ml | 4 +- testsuite/tests/typing-immediate/immediate.ml | 2 +- .../implicit_unpack.ocaml.reference | 10 +- .../typing-misc/disambiguate_principality.ml | 4 +- testsuite/tests/typing-misc/gpr2277.ml | 54 + testsuite/tests/typing-misc/is_expansive.ml | 12 + testsuite/tests/typing-misc/ocamltests | 3 + testsuite/tests/typing-misc/polyvars.ml | 10 + testsuite/tests/typing-misc/pr6416.ml | 14 +- testsuite/tests/typing-misc/pr6634.ml | 2 +- testsuite/tests/typing-misc/pr7668_bad.ml | 4 +- testsuite/tests/typing-misc/pr7937.ml | 84 + testsuite/tests/typing-misc/records.ml | 83 + .../unique_names_in_unification.ml | 6 +- testsuite/tests/typing-misc/variant.ml | 77 +- .../tests/typing-missing-cmi-3/middle.ml | 1 + .../tests/typing-missing-cmi-3/ocamltest | 1 + .../tests/typing-missing-cmi-3/original.ml | 1 + testsuite/tests/typing-missing-cmi-3/user.ml | 18 + testsuite/tests/typing-modules/Test.ml | 2 +- .../typing-modules/illegal_permutation.ml | 656 ++ .../typing-modules/nondep_private_abbrev.ml | 2 +- .../tests/typing-modules/normalize_path.ml | 0 testsuite/tests/typing-modules/ocamltests | 2 + testsuite/tests/typing-modules/pr6394.ml | 2 +- testsuite/tests/typing-modules/pr7818.ml | 2 +- testsuite/tests/typing-modules/pr8810.ml | 7 + .../pr3968_bad.compilers.reference | 2 +- testsuite/tests/typing-objects/Exemples.ml | 2 +- testsuite/tests/typing-objects/Tests.ml | 12 +- testsuite/tests/typing-objects/dummy.ml | 4 +- testsuite/tests/typing-objects/pr5619_bad.ml | 2 +- .../pervasives_leitmotiv.compilers.reference | 2 +- .../pr7402.compilers.reference | 4 +- testsuite/tests/typing-poly/error_messages.ml | 2 +- testsuite/tests/typing-poly/poly.ml | 39 +- .../tests/typing-polyvariants-bugs/pr7824.ml | 2 +- .../typing-recmod/t12bad.compilers.reference | 2 +- .../b_bad.compilers.reference | 2 +- .../typing-sigsubst/sig_local_aliases.ml | 17 - testsuite/tests/typing-sigsubst/sigsubst.ml | 10 +- .../typing-typeparam/newtype.ocaml.reference | 4 +- testsuite/tests/typing-unboxed-types/test.ml | 14 +- testsuite/tests/typing-unboxed/test.ml | 16 +- .../ambiguous_guarded_disjunction.ml | 10 +- .../tests/typing-warnings/exhaustiveness.ml | 6 +- .../tests/typing-warnings/open_warnings.ml | 0 testsuite/tests/typing-warnings/pr6587.ml | 2 +- testsuite/tests/warnings/deprecated_module.ml | 0 .../tests/warnings/deprecated_module.mli | 0 .../warnings/deprecated_module_assigment.ml | 0 .../tests/warnings/deprecated_module_use.ml | 0 .../tests/warnings/w04.compilers.reference | 2 +- .../warnings/w04_failure.compilers.reference | 6 +- .../tests/warnings/w32.compilers.reference | 2 +- testsuite/tests/warnings/w45.ml | 0 testsuite/tests/warnings/w50.ml | 0 testsuite/tests/warnings/w60.ml | 0 testsuite/tests/warnings/w60.mli | 0 .../win-unicode/mltest.compilers.reference | 0 testsuite/tools/Makefile | 1 + testsuite/tools/expect_test.ml | 2 +- testsuite/tools/parsecmm.mly | 52 +- tools/.depend | 60 +- tools/Makefile | 20 +- tools/caml_tex.ml | 21 +- tools/check-typo | 41 + tools/ci/inria/bootstrap | 2 +- tools/ci/inria/remove-sinh-primitive.patch | 13 - tools/ci/travis/travis-ci.sh | 18 +- tools/mantis2gh_stripped.csv | 1512 +++++ tools/objinfo.ml | 1 + tools/ocamlcp.ml | 223 +- tools/ocamlmklib.ml | 6 +- tools/ocamloptp.ml | 312 +- tools/pre-commit-githook | 6 +- tools/read_cmt.ml | 2 +- tools/release-checklist | 68 +- tools/scrapelabels.ml | 2 +- toplevel/opttopdirs.ml | 6 +- toplevel/opttoploop.ml | 41 +- toplevel/opttopmain.ml | 4 +- toplevel/topdirs.ml | 12 +- toplevel/toploop.ml | 31 +- toplevel/topmain.ml | 2 +- typing/TODO.md | 0 typing/ctype.ml | 62 +- typing/ctype.mli | 8 + typing/env.ml | 627 +- typing/env.mli | 44 +- typing/includecore.ml | 30 +- typing/includemod.ml | 209 +- typing/includemod.mli | 2 +- typing/oprint.ml | 4 +- typing/parmatch.ml | 52 +- typing/persistent_env.ml | 369 ++ typing/persistent_env.mli | 101 + typing/printtyp.ml | 30 +- typing/subst.ml | 1 + typing/tast_iterator.ml | 506 ++ typing/tast_iterator.mli | 69 + typing/typecore.ml | 587 +- typing/typecore.mli | 8 +- typing/typedtreeIter.ml | 709 -- typing/typedtreeIter.mli | 99 - typing/typemod.ml | 30 +- typing/typemod.mli | 10 +- typing/typetexp.ml | 7 +- typing/typetexp.mli | 2 + utils/HACKING.adoc | 5 - utils/Makefile | 2 - utils/ccomp.ml | 3 +- utils/clflags.ml | 17 +- utils/clflags.mli | 11 +- utils/config.mli | 6 - utils/config.mlp | 29 +- utils/consistbl.ml | 101 +- utils/consistbl.mli | 104 +- .../int_replace_polymorphic_compare.ml | 0 .../int_replace_polymorphic_compare.mli | 0 utils/misc.ml | 229 +- utils/misc.mli | 121 +- 754 files changed, 16975 insertions(+), 26018 deletions(-) create mode 100644 asmcomp/cmmgen_state.ml create mode 100644 asmcomp/cmmgen_state.mli create mode 100644 asmcomp/debug/compute_ranges.ml create mode 100644 asmcomp/debug/compute_ranges.mli create mode 100644 asmcomp/debug/compute_ranges_intf.ml delete mode 100644 config/Makefile.mingw delete mode 100644 config/Makefile.mingw64 delete mode 100644 config/Makefile.msvc delete mode 100644 config/Makefile.msvc64 delete mode 100644 config/auto-aux/align.c delete mode 100644 config/auto-aux/ansi.c delete mode 100644 config/auto-aux/async_io.c delete mode 100644 config/auto-aux/cckind.c delete mode 100644 config/auto-aux/cfi.S delete mode 100644 config/auto-aux/dblalign.c delete mode 100644 config/auto-aux/elf.c delete mode 100644 config/auto-aux/endian.c delete mode 100644 config/auto-aux/getgroups.c delete mode 100644 config/auto-aux/gethostbyaddr.c delete mode 100644 config/auto-aux/gethostbyname.c delete mode 100755 config/auto-aux/hasgot delete mode 100644 config/auto-aux/hasgot2 delete mode 100755 config/auto-aux/hashbang delete mode 100755 config/auto-aux/hashbang2 delete mode 100755 config/auto-aux/hashbang3 delete mode 100644 config/auto-aux/ia32sse2.c delete mode 100644 config/auto-aux/initgroups.c delete mode 100644 config/auto-aux/int64align.c delete mode 100644 config/auto-aux/mmap-huge.c delete mode 100644 config/auto-aux/nanosecond_stat.c delete mode 100755 config/auto-aux/runtest delete mode 100755 config/auto-aux/searchpath delete mode 100644 config/auto-aux/setgroups.c delete mode 100644 config/auto-aux/signals.c delete mode 100644 config/auto-aux/simple.S delete mode 100644 config/auto-aux/sizes.c delete mode 100644 config/auto-aux/solaris-ld delete mode 100644 config/auto-aux/tryassemble delete mode 100755 config/auto-aux/trycompile delete mode 100755 config/gnu/config.guess delete mode 100755 config/gnu/config.sub delete mode 100644 config/m-nt.h delete mode 100644 config/s-nt.h delete mode 100755 driver/compify_dynlink.sh delete mode 100644 driver/compplugin.ml delete mode 100644 driver/dune rename {typing => file_formats}/cmi_format.ml (93%) rename {typing => file_formats}/cmi_format.mli (87%) rename {bytecomp => file_formats}/cmo_format.mli (88%) rename {typing => file_formats}/cmt_format.ml (100%) rename {typing => file_formats}/cmt_format.mli (98%) rename {asmcomp => file_formats}/cmx_format.mli (72%) create mode 100644 file_formats/cmxs_format.mli rename {middle_end => lambda}/debuginfo.ml (100%) rename {middle_end => lambda}/debuginfo.mli (100%) create mode 100644 lambda/dune rename {bytecomp => lambda}/generate_runtimedef.sh (100%) rename {bytecomp => lambda}/lambda.ml (100%) rename {bytecomp => lambda}/lambda.mli (100%) rename {bytecomp => lambda}/matching.ml (100%) rename {bytecomp => lambda}/matching.mli (100%) rename {bytecomp => lambda}/printlambda.ml (100%) rename {bytecomp => lambda}/printlambda.mli (79%) rename {bytecomp => lambda}/runtimedef.mli (100%) rename {bytecomp => lambda}/simplif.ml (98%) rename {bytecomp => lambda}/simplif.mli (92%) rename {bytecomp => lambda}/switch.ml (100%) rename {bytecomp => lambda}/switch.mli (100%) rename {bytecomp => lambda}/translattribute.ml (100%) rename {bytecomp => lambda}/translattribute.mli (100%) rename {bytecomp => lambda}/translclass.ml (100%) rename {bytecomp => lambda}/translclass.mli (100%) rename {bytecomp => lambda}/translcore.ml (99%) rename {bytecomp => lambda}/translcore.mli (100%) rename {bytecomp => lambda}/translmod.ml (99%) rename {bytecomp => lambda}/translmod.mli (100%) rename {bytecomp => lambda}/translobj.ml (100%) rename {bytecomp => lambda}/translobj.mli (100%) rename {bytecomp => lambda}/translprim.ml (99%) rename {bytecomp => lambda}/translprim.mli (100%) delete mode 100644 manual/manual/cmds/plugins.etex delete mode 100644 manual/manual/library/libgraph.fig delete mode 100644 manual/manual/library/libgraph.png mode change 100755 => 100644 middle_end/backend_intf.mli rename {asmcomp => middle_end}/backend_var.ml (100%) rename {asmcomp => middle_end}/backend_var.mli (100%) rename {asmcomp => middle_end}/clambda.ml (99%) rename {asmcomp => middle_end}/clambda.mli (98%) create mode 100644 middle_end/clambda_primitives.ml create mode 100644 middle_end/clambda_primitives.mli rename {asmcomp => middle_end/closure}/closure.ml (83%) rename {asmcomp => middle_end/closure}/closure.mli (92%) rename middle_end/{base_types => }/compilation_unit.ml (100%) rename middle_end/{base_types => }/compilation_unit.mli (100%) rename {asmcomp => middle_end}/compilenv.ml (100%) rename {asmcomp => middle_end}/compilenv.mli (100%) create mode 100644 middle_end/convert_primitives.ml create mode 100644 middle_end/convert_primitives.mli rename middle_end/{ => flambda}/alias_analysis.ml (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/alias_analysis.mli (100%) rename middle_end/{ => flambda}/allocated_const.ml (100%) rename middle_end/{ => flambda}/allocated_const.mli (100%) rename middle_end/{ => flambda}/augment_specialised_args.ml (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/augment_specialised_args.mli (100%) rename middle_end/{ => flambda}/base_types/closure_element.ml (100%) rename middle_end/{ => flambda}/base_types/closure_element.mli (100%) rename middle_end/{ => flambda}/base_types/closure_id.ml (100%) rename middle_end/{ => flambda}/base_types/closure_id.mli (100%) rename middle_end/{ => flambda}/base_types/closure_origin.ml (100%) rename middle_end/{ => flambda}/base_types/closure_origin.mli (100%) rename middle_end/{ => flambda}/base_types/export_id.ml (100%) rename middle_end/{ => flambda}/base_types/export_id.mli (100%) rename middle_end/{ => flambda}/base_types/id_types.ml (100%) rename middle_end/{ => flambda}/base_types/id_types.mli (100%) rename middle_end/{ => flambda}/base_types/mutable_variable.ml (100%) rename middle_end/{ => flambda}/base_types/mutable_variable.mli (100%) rename middle_end/{ => flambda}/base_types/set_of_closures_id.ml (100%) rename middle_end/{ => flambda}/base_types/set_of_closures_id.mli (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/base_types/set_of_closures_origin.ml (100%) rename middle_end/{ => flambda}/base_types/set_of_closures_origin.mli (100%) rename middle_end/{ => flambda}/base_types/static_exception.ml (100%) rename middle_end/{ => flambda}/base_types/static_exception.mli (100%) rename middle_end/{ => flambda}/base_types/tag.ml (100%) rename middle_end/{ => flambda}/base_types/tag.mli (100%) rename middle_end/{ => flambda}/base_types/var_within_closure.ml (100%) rename middle_end/{ => flambda}/base_types/var_within_closure.mli (100%) rename {asmcomp => middle_end/flambda}/build_export_info.ml (95%) rename {asmcomp => middle_end/flambda}/build_export_info.mli (100%) rename middle_end/{ => flambda}/closure_conversion.ml (94%) mode change 100755 => 100644 rename middle_end/{ => flambda}/closure_conversion.mli (100%) rename middle_end/{ => flambda}/closure_conversion_aux.ml (100%) rename middle_end/{ => flambda}/closure_conversion_aux.mli (100%) mode change 100755 => 100644 rename {asmcomp => middle_end/flambda}/closure_offsets.ml (100%) rename {asmcomp => middle_end/flambda}/closure_offsets.mli (100%) rename middle_end/{ => flambda}/effect_analysis.ml (97%) rename middle_end/{ => flambda}/effect_analysis.mli (100%) rename {asmcomp => middle_end/flambda}/export_info.ml (100%) rename {asmcomp => middle_end/flambda}/export_info.mli (100%) rename {asmcomp => middle_end/flambda}/export_info_for_pack.ml (100%) rename {asmcomp => middle_end/flambda}/export_info_for_pack.mli (100%) rename middle_end/{ => flambda}/extract_projections.ml (100%) rename middle_end/{ => flambda}/extract_projections.mli (100%) rename middle_end/{ => flambda}/find_recursive_functions.ml (100%) rename middle_end/{ => flambda}/find_recursive_functions.mli (100%) rename middle_end/{ => flambda}/flambda.ml (99%) rename middle_end/{ => flambda}/flambda.mli (99%) mode change 100755 => 100644 rename middle_end/{ => flambda}/flambda_invariants.ml (95%) mode change 100755 => 100644 rename middle_end/{ => flambda}/flambda_invariants.mli (98%) rename middle_end/{ => flambda}/flambda_iterators.ml (100%) rename middle_end/{ => flambda}/flambda_iterators.mli (100%) rename middle_end/{middle_end.ml => flambda/flambda_middle_end.ml} (100%) rename middle_end/{middle_end.mli => flambda/flambda_middle_end.mli} (100%) rename {asmcomp => middle_end/flambda}/flambda_to_clambda.ml (99%) rename {asmcomp => middle_end/flambda}/flambda_to_clambda.mli (100%) rename middle_end/{ => flambda}/flambda_utils.ml (99%) rename middle_end/{ => flambda}/flambda_utils.mli (100%) rename middle_end/{ => flambda}/freshening.ml (100%) rename middle_end/{ => flambda}/freshening.mli (100%) rename {asmcomp => middle_end/flambda}/import_approx.ml (100%) rename {asmcomp => middle_end/flambda}/import_approx.mli (100%) rename middle_end/{ => flambda}/inconstant_idents.ml (98%) mode change 100755 => 100644 rename middle_end/{ => flambda}/inconstant_idents.mli (100%) rename middle_end/{ => flambda}/initialize_symbol_to_let_symbol.ml (100%) rename middle_end/{ => flambda}/initialize_symbol_to_let_symbol.mli (100%) rename middle_end/{ => flambda}/inline_and_simplify.ml (99%) mode change 100755 => 100644 rename middle_end/{ => flambda}/inline_and_simplify.mli (100%) rename middle_end/{ => flambda}/inline_and_simplify_aux.ml (100%) rename middle_end/{ => flambda}/inline_and_simplify_aux.mli (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/inlining_cost.ml (99%) rename middle_end/{ => flambda}/inlining_cost.mli (100%) rename middle_end/{ => flambda}/inlining_decision.ml (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/inlining_decision.mli (100%) rename middle_end/{ => flambda}/inlining_decision_intf.mli (100%) rename middle_end/{ => flambda}/inlining_stats.ml (100%) rename middle_end/{ => flambda}/inlining_stats.mli (100%) rename middle_end/{ => flambda}/inlining_stats_types.ml (100%) rename middle_end/{ => flambda}/inlining_stats_types.mli (100%) rename middle_end/{ => flambda}/inlining_transforms.ml (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/inlining_transforms.mli (100%) rename middle_end/{ => flambda}/invariant_params.ml (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/invariant_params.mli (100%) rename middle_end/{ => flambda}/lift_code.ml (100%) rename middle_end/{ => flambda}/lift_code.mli (100%) rename middle_end/{ => flambda}/lift_constants.ml (100%) rename middle_end/{ => flambda}/lift_constants.mli (100%) rename middle_end/{ => flambda}/lift_let_to_initialize_symbol.ml (100%) rename middle_end/{ => flambda}/lift_let_to_initialize_symbol.mli (100%) rename middle_end/{ => flambda}/parameter.ml (100%) rename middle_end/{ => flambda}/parameter.mli (100%) rename middle_end/{ => flambda}/pass_wrapper.ml (100%) rename middle_end/{ => flambda}/pass_wrapper.mli (100%) rename middle_end/{ => flambda}/projection.ml (100%) rename middle_end/{ => flambda}/projection.mli (100%) rename middle_end/{ => flambda}/ref_to_variables.ml (100%) rename middle_end/{ => flambda}/ref_to_variables.mli (100%) rename middle_end/{ => flambda}/remove_free_vars_equal_to_args.ml (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/remove_free_vars_equal_to_args.mli (100%) rename middle_end/{ => flambda}/remove_unused_arguments.ml (100%) rename middle_end/{ => flambda}/remove_unused_arguments.mli (100%) rename middle_end/{ => flambda}/remove_unused_closure_vars.ml (100%) rename middle_end/{ => flambda}/remove_unused_closure_vars.mli (100%) rename middle_end/{ => flambda}/remove_unused_program_constructs.ml (100%) rename middle_end/{ => flambda}/remove_unused_program_constructs.mli (100%) rename middle_end/{ => flambda}/share_constants.ml (100%) rename middle_end/{ => flambda}/share_constants.mli (100%) rename middle_end/{ => flambda}/simple_value_approx.ml (100%) rename middle_end/{ => flambda}/simple_value_approx.mli (100%) rename middle_end/{ => flambda}/simplify_boxed_integer_ops.ml (92%) rename middle_end/{ => flambda}/simplify_boxed_integer_ops.mli (100%) rename middle_end/{ => flambda}/simplify_boxed_integer_ops_intf.mli (94%) rename middle_end/{ => flambda}/simplify_common.ml (100%) rename middle_end/{ => flambda}/simplify_common.mli (100%) rename middle_end/{ => flambda}/simplify_primitives.ml (90%) rename middle_end/{ => flambda}/simplify_primitives.mli (97%) rename {asmcomp => middle_end/flambda}/traverse_for_exported_symbols.ml (100%) rename {asmcomp => middle_end/flambda}/traverse_for_exported_symbols.mli (100%) rename {asmcomp => middle_end/flambda}/un_anf.ml (99%) rename {asmcomp => middle_end/flambda}/un_anf.mli (100%) rename middle_end/{ => flambda}/unbox_closures.ml (100%) rename middle_end/{ => flambda}/unbox_closures.mli (100%) rename middle_end/{ => flambda}/unbox_free_vars_of_closures.ml (100%) rename middle_end/{ => flambda}/unbox_free_vars_of_closures.mli (100%) rename middle_end/{ => flambda}/unbox_specialised_args.ml (100%) mode change 100755 => 100644 rename middle_end/{ => flambda}/unbox_specialised_args.mli (100%) rename middle_end/{base_types => }/linkage_name.ml (100%) rename middle_end/{base_types => }/linkage_name.mli (100%) rename {asmcomp => middle_end}/printclambda.ml (99%) rename {asmcomp => middle_end}/printclambda.mli (100%) create mode 100644 middle_end/printclambda_primitives.ml rename driver/compplugin.mli => middle_end/printclambda_primitives.mli (86%) rename {bytecomp => middle_end}/semantics_of_primitives.ml (79%) rename {bytecomp => middle_end}/semantics_of_primitives.mli (96%) rename middle_end/{base_types => }/symbol.ml (100%) rename middle_end/{base_types => }/symbol.mli (100%) rename middle_end/{base_types => }/variable.ml (100%) rename middle_end/{base_types => }/variable.mli (100%) create mode 100644 otherlibs/dynlink/.depend rename otherlibs/dynlink/{ => byte}/dynlink.ml (96%) rename otherlibs/{graph/Makefile => dynlink/dynlink_compilerlibs/Makefile.copy-sources} (63%) rename otherlibs/dynlink/{natdynlink.ml => native/dynlink.ml} (89%) delete mode 100644 otherlibs/dynlink/nodynlink.ml delete mode 100644 otherlibs/graph/.depend delete mode 100644 otherlibs/graph/color.c delete mode 100644 otherlibs/graph/draw.c delete mode 100644 otherlibs/graph/dump_img.c delete mode 100644 otherlibs/graph/events.c delete mode 100644 otherlibs/graph/fill.c delete mode 100644 otherlibs/graph/graphics.ml delete mode 100644 otherlibs/graph/graphics.mli delete mode 100644 otherlibs/graph/graphicsX11.ml delete mode 100644 otherlibs/graph/graphicsX11.mli delete mode 100644 otherlibs/graph/image.c delete mode 100644 otherlibs/graph/image.h delete mode 100644 otherlibs/graph/libgraph.h delete mode 100644 otherlibs/graph/make_img.c delete mode 100644 otherlibs/graph/open.c delete mode 100644 otherlibs/graph/point_col.c delete mode 100644 otherlibs/graph/sound.c delete mode 100644 otherlibs/graph/subwindow.c delete mode 100644 otherlibs/graph/text.c delete mode 100644 otherlibs/threads/.depend delete mode 100644 otherlibs/threads/Makefile delete mode 100644 otherlibs/threads/condition.ml delete mode 100644 otherlibs/threads/condition.mli delete mode 100644 otherlibs/threads/event.ml delete mode 100644 otherlibs/threads/event.mli delete mode 100644 otherlibs/threads/marshal.ml delete mode 100644 otherlibs/threads/mutex.ml delete mode 100644 otherlibs/threads/mutex.mli delete mode 100644 otherlibs/threads/scheduler.c delete mode 100644 otherlibs/threads/stdlib.ml delete mode 100644 otherlibs/threads/thread.ml delete mode 100644 otherlibs/threads/thread.mli delete mode 100644 otherlibs/threads/threadUnix.ml delete mode 100644 otherlibs/threads/threadUnix.mli delete mode 100644 otherlibs/threads/unix.ml delete mode 100644 otherlibs/win32graph/Makefile delete mode 100644 otherlibs/win32graph/draw.c delete mode 100755 otherlibs/win32graph/events.c delete mode 100644 otherlibs/win32graph/libgraph.h delete mode 100644 otherlibs/win32graph/open.c mode change 100755 => 100644 otherlibs/win32unix/nonblock.c mode change 100755 => 100644 parsing/ast_iterator.ml mode change 100755 => 100644 parsing/ast_iterator.mli mode change 100755 => 100644 parsing/builtin_attributes.ml mode change 100755 => 100644 parsing/builtin_attributes.mli delete mode 100644 runtime/caml/int64_emul.h delete mode 100644 runtime/caml/int64_format.h delete mode 100644 runtime/caml/int64_native.h delete mode 100644 testsuite/interactive/lib-graph-2/Makefile delete mode 100644 testsuite/interactive/lib-graph-2/graph_test.ml delete mode 100644 testsuite/interactive/lib-graph-3/Makefile delete mode 100644 testsuite/interactive/lib-graph-3/sorts.ml delete mode 100644 testsuite/interactive/lib-graph/Makefile delete mode 100644 testsuite/interactive/lib-graph/graph_example.ml create mode 100644 testsuite/tests/arch-power/exn_raise.ml rename testsuite/{interactive/lib-graph-2/graph_test.reference => tests/arch-power/exn_raise.reference} (100%) create mode 100644 testsuite/tests/arch-power/ocamltests create mode 100644 testsuite/tests/asmgen/catch-multiple.cmm create mode 100644 testsuite/tests/basic-float/float_literals.ml create mode 100644 testsuite/tests/basic-modules/pr4008.ml mode change 100755 => 100644 testsuite/tests/basic/localexn.ml mode change 100755 => 100644 testsuite/tests/basic/localfunction.ml mode change 100755 => 100644 testsuite/tests/basic/localfunction.reference mode change 100755 => 100644 testsuite/tests/basic/opt_variants.ml mode change 100755 => 100644 testsuite/tests/basic/pr7657.ml create mode 100644 testsuite/tests/generalized-open/clambda_optim.ml create mode 100644 testsuite/tests/letrec-compilation/pr8681.ml create mode 100644 testsuite/tests/letrec-compilation/pr8681.reference mode change 100755 => 100644 testsuite/tests/lib-bytes/binary.ml mode change 100755 => 100644 testsuite/tests/lib-filename/extension.ml mode change 100755 => 100644 testsuite/tests/lib-filename/suffix.ml mode change 100755 => 100644 testsuite/tests/lib-obj/reachable_words.ml create mode 100644 testsuite/tests/lib-obj/with_tag.ml create mode 100644 testsuite/tests/lib-obj/with_tag.reference mode change 100755 => 100644 testsuite/tests/lib-stream/mpr7769.ml mode change 100755 => 100644 testsuite/tests/lib-stream/mpr7769.reference create mode 100644 testsuite/tests/lib-systhreads/testyield.ml create mode 100644 testsuite/tests/lib-threads/delayintr.ml create mode 100644 testsuite/tests/lib-threads/delayintr.reference create mode 100644 testsuite/tests/lib-threads/delayintr.run create mode 100755 testsuite/tests/lib-unix/unix-socket/is-linux.sh create mode 100644 testsuite/tests/lib-unix/unix-socket/ocamltests create mode 100644 testsuite/tests/lib-unix/unix-socket/recvfrom.ml create mode 100644 testsuite/tests/lib-unix/unix-socket/recvfrom_linux.ml create mode 100644 testsuite/tests/lib-unix/unix-socket/recvfrom_linux.reference create mode 100644 testsuite/tests/lib-unix/unix-socket/recvfrom_unix.ml create mode 100644 testsuite/tests/lib-unix/unix-socket/recvfrom_unix.reference create mode 100644 testsuite/tests/printing-types/disambiguation.ml create mode 100644 testsuite/tests/tool-debugger/printer/debuggee.ml create mode 100644 testsuite/tests/tool-debugger/printer/debuggee.reference create mode 100644 testsuite/tests/tool-debugger/printer/input_script create mode 100644 testsuite/tests/tool-debugger/printer/ocamltests create mode 100644 testsuite/tests/tool-debugger/printer/printer.ml create mode 100644 testsuite/tests/tool-ocamldep-shadowing/a.ml create mode 100644 testsuite/tests/tool-ocamldep-shadowing/a.reference rename testsuite/{interactive/lib-graph-3/sorts.reference => tests/tool-ocamldep-shadowing/dir1/b.ml} (100%) rename testsuite/{interactive/lib-graph/graph_example.reference => tests/tool-ocamldep-shadowing/dir2/b.mli} (100%) create mode 100644 testsuite/tests/tool-ocamldep-shadowing/dir2/c.mli create mode 100644 testsuite/tests/tool-ocamldep-shadowing/ocamltests create mode 100644 testsuite/tests/tool-toplevel-invocation/print_args.ml create mode 100644 testsuite/tests/tool-toplevel-invocation/print_args.reference create mode 100644 testsuite/tests/tool-toplevel/uncaught_exceptions.ml create mode 100644 testsuite/tests/typing-core-bugs/const_int_hint.ml mode change 100755 => 100644 testsuite/tests/typing-core-bugs/repeated_did_you_mean.ml mode change 100755 => 100644 testsuite/tests/typing-deprecated/alerts.ml delete mode 100644 testsuite/tests/typing-extensions/extensions.ocaml.reference delete mode 100644 testsuite/tests/typing-extensions/open_types.ocaml.reference create mode 100644 testsuite/tests/typing-misc/gpr2277.ml create mode 100644 testsuite/tests/typing-misc/is_expansive.ml create mode 100644 testsuite/tests/typing-misc/pr7937.ml create mode 100644 testsuite/tests/typing-missing-cmi-3/middle.ml create mode 100644 testsuite/tests/typing-missing-cmi-3/ocamltest create mode 100644 testsuite/tests/typing-missing-cmi-3/original.ml create mode 100644 testsuite/tests/typing-missing-cmi-3/user.ml create mode 100644 testsuite/tests/typing-modules/illegal_permutation.ml mode change 100755 => 100644 testsuite/tests/typing-modules/normalize_path.ml create mode 100644 testsuite/tests/typing-modules/pr8810.ml mode change 100755 => 100644 testsuite/tests/typing-warnings/open_warnings.ml mode change 100755 => 100644 testsuite/tests/warnings/deprecated_module.ml mode change 100755 => 100644 testsuite/tests/warnings/deprecated_module.mli mode change 100755 => 100644 testsuite/tests/warnings/deprecated_module_assigment.ml mode change 100755 => 100644 testsuite/tests/warnings/deprecated_module_use.ml mode change 100755 => 100644 testsuite/tests/warnings/w45.ml mode change 100755 => 100644 testsuite/tests/warnings/w50.ml mode change 100755 => 100644 testsuite/tests/warnings/w60.ml mode change 100755 => 100644 testsuite/tests/warnings/w60.mli mode change 100755 => 100644 testsuite/tests/win-unicode/mltest.compilers.reference create mode 100644 tools/mantis2gh_stripped.csv mode change 100755 => 100644 typing/TODO.md create mode 100644 typing/persistent_env.ml create mode 100644 typing/persistent_env.mli create mode 100644 typing/tast_iterator.ml create mode 100644 typing/tast_iterator.mli delete mode 100644 typing/typedtreeIter.ml delete mode 100644 typing/typedtreeIter.mli rename {middle_end => utils}/int_replace_polymorphic_compare.ml (100%) rename {middle_end => utils}/int_replace_polymorphic_compare.mli (100%) diff --git a/.depend b/.depend index cea6ca97..83c43d90 100644 --- a/.depend +++ b/.depend @@ -44,10 +44,13 @@ utils/config.cmx : \ utils/config.cmi utils/config.cmi : utils/consistbl.cmo : \ + utils/misc.cmi \ utils/consistbl.cmi utils/consistbl.cmx : \ + utils/misc.cmx \ utils/consistbl.cmi -utils/consistbl.cmi : +utils/consistbl.cmi : \ + utils/misc.cmi utils/identifiable.cmo : \ utils/misc.cmi \ utils/identifiable.cmi @@ -55,6 +58,11 @@ utils/identifiable.cmx : \ utils/misc.cmx \ utils/identifiable.cmi utils/identifiable.cmi : +utils/int_replace_polymorphic_compare.cmo : \ + utils/int_replace_polymorphic_compare.cmi +utils/int_replace_polymorphic_compare.cmx : \ + utils/int_replace_polymorphic_compare.cmi +utils/int_replace_polymorphic_compare.cmi : utils/load_path.cmo : \ utils/misc.cmi \ utils/load_path.cmi @@ -428,53 +436,6 @@ typing/btype.cmi : \ typing/types.cmi \ typing/path.cmi \ parsing/asttypes.cmi -typing/cmi_format.cmo : \ - typing/types.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - utils/config.cmi \ - typing/cmi_format.cmi -typing/cmi_format.cmx : \ - typing/types.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - utils/config.cmx \ - typing/cmi_format.cmi -typing/cmi_format.cmi : \ - typing/types.cmi \ - utils/misc.cmi -typing/cmt_format.cmo : \ - typing/types.cmi \ - typing/typedtree.cmi \ - typing/tast_mapper.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - utils/load_path.cmi \ - parsing/lexer.cmi \ - typing/env.cmi \ - utils/config.cmi \ - typing/cmi_format.cmi \ - utils/clflags.cmi \ - typing/cmt_format.cmi -typing/cmt_format.cmx : \ - typing/types.cmx \ - typing/typedtree.cmx \ - typing/tast_mapper.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - utils/load_path.cmx \ - parsing/lexer.cmx \ - typing/env.cmx \ - utils/config.cmx \ - typing/cmi_format.cmx \ - utils/clflags.cmx \ - typing/cmt_format.cmi -typing/cmt_format.cmi : \ - typing/types.cmi \ - typing/typedtree.cmi \ - parsing/location.cmi \ - typing/env.cmi \ - typing/cmi_format.cmi typing/ctype.cmo : \ typing/types.cmi \ typing/subst.cmi \ @@ -535,6 +496,7 @@ typing/env.cmo : \ typing/types.cmi \ typing/subst.cmi \ typing/predef.cmi \ + typing/persistent_env.cmi \ typing/path.cmi \ utils/misc.cmi \ parsing/longident.cmi \ @@ -542,9 +504,7 @@ typing/env.cmo : \ utils/load_path.cmi \ typing/ident.cmi \ typing/datarepr.cmi \ - utils/consistbl.cmi \ - utils/config.cmi \ - typing/cmi_format.cmi \ + file_formats/cmi_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ typing/btype.cmi \ @@ -555,6 +515,7 @@ typing/env.cmx : \ typing/types.cmx \ typing/subst.cmx \ typing/predef.cmx \ + typing/persistent_env.cmx \ typing/path.cmx \ utils/misc.cmx \ parsing/longident.cmx \ @@ -562,9 +523,7 @@ typing/env.cmx : \ utils/load_path.cmx \ typing/ident.cmx \ typing/datarepr.cmx \ - utils/consistbl.cmx \ - utils/config.cmx \ - typing/cmi_format.cmx \ + file_formats/cmi_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ typing/btype.cmx \ @@ -580,8 +539,7 @@ typing/env.cmi : \ parsing/location.cmi \ utils/load_path.cmi \ typing/ident.cmi \ - utils/consistbl.cmi \ - typing/cmi_format.cmi \ + file_formats/cmi_format.cmi \ parsing/asttypes.cmi typing/envaux.cmo : \ typing/subst.cmi \ @@ -679,7 +637,7 @@ typing/includemod.cmo : \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ - typing/cmt_format.cmi \ + file_formats/cmt_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ typing/btype.cmi \ @@ -700,7 +658,7 @@ typing/includemod.cmx : \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ - typing/cmt_format.cmx \ + file_formats/cmt_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ typing/btype.cmx \ @@ -763,8 +721,8 @@ typing/parmatch.cmo : \ utils/warnings.cmi \ typing/untypeast.cmi \ typing/types.cmi \ - typing/typedtreeIter.cmi \ typing/typedtree.cmi \ + typing/tast_iterator.cmi \ typing/subst.cmi \ typing/printpat.cmi \ typing/predef.cmi \ @@ -785,8 +743,8 @@ typing/parmatch.cmx : \ utils/warnings.cmx \ typing/untypeast.cmx \ typing/types.cmx \ - typing/typedtreeIter.cmx \ typing/typedtree.cmx \ + typing/tast_iterator.cmx \ typing/subst.cmx \ typing/printpat.cmx \ typing/predef.cmx \ @@ -818,6 +776,32 @@ typing/path.cmx : \ typing/path.cmi typing/path.cmi : \ typing/ident.cmi +typing/persistent_env.cmo : \ + utils/warnings.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + utils/load_path.cmi \ + utils/consistbl.cmi \ + utils/config.cmi \ + file_formats/cmi_format.cmi \ + utils/clflags.cmi \ + typing/persistent_env.cmi +typing/persistent_env.cmx : \ + utils/warnings.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + utils/load_path.cmx \ + utils/consistbl.cmx \ + utils/config.cmx \ + file_formats/cmi_format.cmx \ + utils/clflags.cmx \ + typing/persistent_env.cmi +typing/persistent_env.cmi : \ + typing/types.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + utils/consistbl.cmi \ + file_formats/cmi_format.cmi typing/predef.cmo : \ typing/types.cmi \ typing/path.cmi \ @@ -957,7 +941,7 @@ typing/rec_check.cmo : \ typing/typedtree.cmi \ typing/primitive.cmi \ typing/path.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ parsing/asttypes.cmi \ typing/rec_check.cmi @@ -967,7 +951,7 @@ typing/rec_check.cmx : \ typing/typedtree.cmx \ typing/primitive.cmx \ typing/path.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ typing/ident.cmx \ parsing/asttypes.cmi \ typing/rec_check.cmi @@ -1020,6 +1004,20 @@ typing/subst.cmi : \ typing/types.cmi \ typing/path.cmi \ typing/ident.cmi +typing/tast_iterator.cmo : \ + typing/typedtree.cmi \ + typing/env.cmi \ + parsing/asttypes.cmi \ + typing/tast_iterator.cmi +typing/tast_iterator.cmx : \ + typing/typedtree.cmx \ + typing/env.cmx \ + parsing/asttypes.cmi \ + typing/tast_iterator.cmi +typing/tast_iterator.cmi : \ + typing/typedtree.cmi \ + typing/env.cmi \ + parsing/asttypes.cmi typing/tast_mapper.cmo : \ typing/typedtree.cmi \ typing/env.cmi \ @@ -1056,7 +1054,7 @@ typing/typeclass.cmo : \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ - typing/cmt_format.cmi \ + file_formats/cmt_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ typing/btype.cmi \ @@ -1085,7 +1083,7 @@ typing/typeclass.cmx : \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ - typing/cmt_format.cmx \ + file_formats/cmt_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ typing/btype.cmx \ @@ -1115,6 +1113,7 @@ typing/typecore.cmo : \ typing/printpat.cmi \ typing/primitive.cmi \ typing/predef.cmi \ + typing/persistent_env.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ typing/parmatch.cmi \ @@ -1126,7 +1125,7 @@ typing/typecore.cmo : \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ - typing/cmt_format.cmi \ + file_formats/cmt_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ typing/btype.cmi \ @@ -1147,6 +1146,7 @@ typing/typecore.cmx : \ typing/printpat.cmx \ typing/primitive.cmx \ typing/predef.cmx \ + typing/persistent_env.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ typing/parmatch.cmx \ @@ -1158,7 +1158,7 @@ typing/typecore.cmx : \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ - typing/cmt_format.cmx \ + file_formats/cmt_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ typing/btype.cmx \ @@ -1376,19 +1376,6 @@ typing/typedtree.cmi : \ typing/ident.cmi \ typing/env.cmi \ parsing/asttypes.cmi -typing/typedtreeIter.cmo : \ - typing/typedtree.cmi \ - utils/misc.cmi \ - parsing/asttypes.cmi \ - typing/typedtreeIter.cmi -typing/typedtreeIter.cmx : \ - typing/typedtree.cmx \ - utils/misc.cmx \ - parsing/asttypes.cmi \ - typing/typedtreeIter.cmi -typing/typedtreeIter.cmi : \ - typing/typedtree.cmi \ - parsing/asttypes.cmi typing/typemod.cmo : \ utils/warnings.cmi \ typing/typetexp.cmi \ @@ -1412,8 +1399,8 @@ typing/typemod.cmo : \ typing/env.cmi \ typing/ctype.cmi \ utils/config.cmi \ - typing/cmt_format.cmi \ - typing/cmi_format.cmi \ + file_formats/cmt_format.cmi \ + file_formats/cmi_format.cmi \ utils/clflags.cmi \ parsing/builtin_attributes.cmi \ typing/btype.cmi \ @@ -1444,8 +1431,8 @@ typing/typemod.cmx : \ typing/env.cmx \ typing/ctype.cmx \ utils/config.cmx \ - typing/cmt_format.cmx \ - typing/cmi_format.cmx \ + file_formats/cmt_format.cmx \ + file_formats/cmi_format.cmx \ utils/clflags.cmx \ parsing/builtin_attributes.cmx \ typing/btype.cmx \ @@ -1459,20 +1446,19 @@ typing/typemod.cmi : \ typing/typedecl.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ - utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ typing/includemod.cmi \ typing/ident.cmi \ typing/env.cmi \ - typing/cmi_format.cmi + file_formats/cmi_format.cmi typing/typeopt.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ typing/typedecl.cmi \ typing/predef.cmi \ typing/path.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ typing/env.cmi \ typing/ctype.cmi \ @@ -1485,7 +1471,7 @@ typing/typeopt.cmx : \ typing/typedecl.cmx \ typing/predef.cmx \ typing/path.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ typing/ident.cmx \ typing/env.cmx \ typing/ctype.cmx \ @@ -1496,7 +1482,7 @@ typing/typeopt.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ typing/path.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/env.cmi typing/types.cmo : \ typing/primitive.cmi \ @@ -1612,12 +1598,12 @@ typing/untypeast.cmi : \ parsing/asttypes.cmi bytecomp/bytegen.cmo : \ typing/types.cmi \ - bytecomp/switch.cmi \ + lambda/switch.cmi \ typing/subst.cmi \ typing/primitive.cmi \ utils/misc.cmi \ - bytecomp/matching.cmi \ - bytecomp/lambda.cmi \ + lambda/matching.cmi \ + lambda/lambda.cmi \ bytecomp/instruct.cmi \ typing/ident.cmi \ typing/env.cmi \ @@ -1626,12 +1612,12 @@ bytecomp/bytegen.cmo : \ bytecomp/bytegen.cmi bytecomp/bytegen.cmx : \ typing/types.cmx \ - bytecomp/switch.cmx \ + lambda/switch.cmx \ typing/subst.cmx \ typing/primitive.cmx \ utils/misc.cmx \ - bytecomp/matching.cmx \ - bytecomp/lambda.cmx \ + lambda/matching.cmx \ + lambda/lambda.cmx \ bytecomp/instruct.cmx \ typing/ident.cmx \ typing/env.cmx \ @@ -1639,7 +1625,7 @@ bytecomp/bytegen.cmx : \ parsing/asttypes.cmi \ bytecomp/bytegen.cmi bytecomp/bytegen.cmi : \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ bytecomp/instruct.cmi bytecomp/bytelibrarian.cmo : \ utils/misc.cmi \ @@ -1647,7 +1633,7 @@ bytecomp/bytelibrarian.cmo : \ utils/load_path.cmi \ bytecomp/emitcode.cmi \ utils/config.cmi \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytelink.cmi \ bytecomp/bytelibrarian.cmi @@ -1657,7 +1643,7 @@ bytecomp/bytelibrarian.cmx : \ utils/load_path.cmx \ bytecomp/emitcode.cmx \ utils/config.cmx \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytelink.cmx \ bytecomp/bytelibrarian.cmi @@ -1665,7 +1651,7 @@ bytecomp/bytelibrarian.cmi : bytecomp/bytelink.cmo : \ utils/warnings.cmi \ bytecomp/symtable.cmi \ - bytecomp/opcodes.cmo \ + bytecomp/opcodes.cmi \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ @@ -1675,7 +1661,7 @@ bytecomp/bytelink.cmo : \ bytecomp/dll.cmi \ utils/consistbl.cmi \ utils/config.cmi \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmi \ utils/ccomp.cmi \ bytecomp/bytesections.cmi \ @@ -1693,20 +1679,21 @@ bytecomp/bytelink.cmx : \ bytecomp/dll.cmx \ utils/consistbl.cmx \ utils/config.cmx \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmx \ utils/ccomp.cmx \ bytecomp/bytesections.cmx \ bytecomp/bytelink.cmi bytecomp/bytelink.cmi : \ bytecomp/symtable.cmi \ - bytecomp/cmo_format.cmi + utils/misc.cmi \ + file_formats/cmo_format.cmi bytecomp/bytepackager.cmo : \ typing/typemod.cmi \ - bytecomp/translmod.cmi \ + lambda/translmod.cmi \ typing/subst.cmi \ - bytecomp/simplif.cmi \ - bytecomp/printlambda.cmi \ + lambda/simplif.cmi \ + lambda/printlambda.cmi \ typing/path.cmi \ utils/misc.cmi \ parsing/location.cmi \ @@ -1716,17 +1703,17 @@ bytecomp/bytepackager.cmo : \ typing/env.cmi \ bytecomp/emitcode.cmi \ utils/config.cmi \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytelink.cmi \ bytecomp/bytegen.cmi \ bytecomp/bytepackager.cmi bytecomp/bytepackager.cmx : \ typing/typemod.cmx \ - bytecomp/translmod.cmx \ + lambda/translmod.cmx \ typing/subst.cmx \ - bytecomp/simplif.cmx \ - bytecomp/printlambda.cmx \ + lambda/simplif.cmx \ + lambda/printlambda.cmx \ typing/path.cmx \ utils/misc.cmx \ parsing/location.cmx \ @@ -1736,7 +1723,7 @@ bytecomp/bytepackager.cmx : \ typing/env.cmx \ bytecomp/emitcode.cmx \ utils/config.cmx \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytelink.cmx \ bytecomp/bytegen.cmx \ @@ -1751,9 +1738,6 @@ bytecomp/bytesections.cmx : \ utils/config.cmx \ bytecomp/bytesections.cmi bytecomp/bytesections.cmi : -bytecomp/cmo_format.cmi : \ - bytecomp/lambda.cmi \ - typing/ident.cmi bytecomp/dll.cmo : \ utils/misc.cmi \ utils/config.cmi \ @@ -1764,34 +1748,34 @@ bytecomp/dll.cmx : \ bytecomp/dll.cmi bytecomp/dll.cmi : bytecomp/emitcode.cmo : \ - bytecomp/translmod.cmi \ + lambda/translmod.cmi \ typing/primitive.cmi \ - bytecomp/opcodes.cmo \ + bytecomp/opcodes.cmi \ utils/misc.cmi \ parsing/location.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ bytecomp/instruct.cmi \ typing/ident.cmi \ typing/env.cmi \ utils/config.cmi \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytegen.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ bytecomp/emitcode.cmi bytecomp/emitcode.cmx : \ - bytecomp/translmod.cmx \ + lambda/translmod.cmx \ typing/primitive.cmx \ bytecomp/opcodes.cmx \ utils/misc.cmx \ parsing/location.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ bytecomp/instruct.cmx \ typing/ident.cmx \ typing/env.cmx \ utils/config.cmx \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytegen.cmx \ typing/btype.cmx \ @@ -1801,12 +1785,12 @@ bytecomp/emitcode.cmi : \ utils/misc.cmi \ bytecomp/instruct.cmi \ typing/ident.cmi \ - bytecomp/cmo_format.cmi + file_formats/cmo_format.cmi bytecomp/instruct.cmo : \ typing/types.cmi \ typing/subst.cmi \ parsing/location.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ typing/env.cmi \ bytecomp/instruct.cmi @@ -1814,7 +1798,7 @@ bytecomp/instruct.cmx : \ typing/types.cmx \ typing/subst.cmx \ parsing/location.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ typing/ident.cmx \ typing/env.cmx \ bytecomp/instruct.cmi @@ -1822,84 +1806,9 @@ bytecomp/instruct.cmi : \ typing/types.cmi \ typing/subst.cmi \ parsing/location.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ typing/env.cmi -bytecomp/lambda.cmo : \ - typing/types.cmi \ - typing/primitive.cmi \ - typing/path.cmi \ - utils/misc.cmi \ - parsing/longident.cmi \ - parsing/location.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - parsing/asttypes.cmi \ - bytecomp/lambda.cmi -bytecomp/lambda.cmx : \ - typing/types.cmx \ - typing/primitive.cmx \ - typing/path.cmx \ - utils/misc.cmx \ - parsing/longident.cmx \ - parsing/location.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - parsing/asttypes.cmi \ - bytecomp/lambda.cmi -bytecomp/lambda.cmi : \ - typing/types.cmi \ - typing/primitive.cmi \ - typing/path.cmi \ - parsing/location.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - parsing/asttypes.cmi -bytecomp/matching.cmo : \ - typing/types.cmi \ - typing/typeopt.cmi \ - typing/typedtree.cmi \ - bytecomp/switch.cmi \ - typing/printpat.cmi \ - bytecomp/printlambda.cmi \ - typing/primitive.cmi \ - typing/predef.cmi \ - typing/parmatch.cmi \ - utils/misc.cmi \ - parsing/longident.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - utils/clflags.cmi \ - typing/btype.cmi \ - parsing/asttypes.cmi \ - bytecomp/matching.cmi -bytecomp/matching.cmx : \ - typing/types.cmx \ - typing/typeopt.cmx \ - typing/typedtree.cmx \ - bytecomp/switch.cmx \ - typing/printpat.cmx \ - bytecomp/printlambda.cmx \ - typing/primitive.cmx \ - typing/predef.cmx \ - typing/parmatch.cmx \ - utils/misc.cmx \ - parsing/longident.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - utils/clflags.cmx \ - typing/btype.cmx \ - parsing/asttypes.cmi \ - bytecomp/matching.cmi -bytecomp/matching.cmi : \ - typing/typedtree.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi bytecomp/meta.cmo : \ bytecomp/instruct.cmi \ bytecomp/meta.cmi @@ -1908,419 +1817,111 @@ bytecomp/meta.cmx : \ bytecomp/meta.cmi bytecomp/meta.cmi : \ bytecomp/instruct.cmi -bytecomp/opcodes.cmo : -bytecomp/opcodes.cmx : +bytecomp/opcodes.cmo : \ + bytecomp/opcodes.cmi +bytecomp/opcodes.cmx : \ + bytecomp/opcodes.cmi +bytecomp/opcodes.cmi : bytecomp/printinstr.cmo : \ - bytecomp/printlambda.cmi \ + lambda/printlambda.cmi \ parsing/location.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ bytecomp/instruct.cmi \ typing/ident.cmi \ bytecomp/printinstr.cmi bytecomp/printinstr.cmx : \ - bytecomp/printlambda.cmx \ + lambda/printlambda.cmx \ parsing/location.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ bytecomp/instruct.cmx \ typing/ident.cmx \ bytecomp/printinstr.cmi bytecomp/printinstr.cmi : \ bytecomp/instruct.cmi -bytecomp/printlambda.cmo : \ - typing/types.cmi \ - typing/printtyp.cmi \ - typing/primitive.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - parsing/asttypes.cmi \ - bytecomp/printlambda.cmi -bytecomp/printlambda.cmx : \ - typing/types.cmx \ - typing/printtyp.cmx \ - typing/primitive.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - parsing/asttypes.cmi \ - bytecomp/printlambda.cmi -bytecomp/printlambda.cmi : \ - bytecomp/lambda.cmi -bytecomp/runtimedef.cmo : \ - bytecomp/runtimedef.cmi -bytecomp/runtimedef.cmx : \ - bytecomp/runtimedef.cmi -bytecomp/runtimedef.cmi : -bytecomp/semantics_of_primitives.cmo : \ - bytecomp/lambda.cmi \ - bytecomp/semantics_of_primitives.cmi -bytecomp/semantics_of_primitives.cmx : \ - bytecomp/lambda.cmx \ - bytecomp/semantics_of_primitives.cmi -bytecomp/semantics_of_primitives.cmi : \ - bytecomp/lambda.cmi -bytecomp/simplif.cmo : \ - utils/warnings.cmi \ - typing/stypes.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - utils/clflags.cmi \ - parsing/asttypes.cmi \ - typing/annot.cmi \ - bytecomp/simplif.cmi -bytecomp/simplif.cmx : \ - utils/warnings.cmx \ - typing/stypes.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - utils/clflags.cmx \ - parsing/asttypes.cmi \ - typing/annot.cmi \ - bytecomp/simplif.cmi -bytecomp/simplif.cmi : \ - utils/misc.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi -bytecomp/switch.cmo : \ - parsing/location.cmi \ - bytecomp/switch.cmi -bytecomp/switch.cmx : \ - parsing/location.cmx \ - bytecomp/switch.cmi -bytecomp/switch.cmi : \ - parsing/location.cmi bytecomp/symtable.cmo : \ - bytecomp/runtimedef.cmi \ + lambda/runtimedef.cmi \ typing/predef.cmi \ utils/misc.cmi \ bytecomp/meta.cmi \ parsing/location.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ bytecomp/dll.cmi \ utils/config.cmi \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytesections.cmi \ parsing/asttypes.cmi \ bytecomp/symtable.cmi bytecomp/symtable.cmx : \ - bytecomp/runtimedef.cmx \ + lambda/runtimedef.cmx \ typing/predef.cmx \ utils/misc.cmx \ bytecomp/meta.cmx \ parsing/location.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ typing/ident.cmx \ bytecomp/dll.cmx \ utils/config.cmx \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytesections.cmx \ parsing/asttypes.cmi \ bytecomp/symtable.cmi bytecomp/symtable.cmi : \ utils/misc.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - bytecomp/cmo_format.cmi -bytecomp/translattribute.cmo : \ - utils/warnings.cmi \ - typing/typedtree.cmi \ - parsing/parsetree.cmi \ - utils/misc.cmi \ - parsing/longident.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - utils/config.cmi \ - bytecomp/translattribute.cmi -bytecomp/translattribute.cmx : \ - utils/warnings.cmx \ - typing/typedtree.cmx \ - parsing/parsetree.cmi \ - utils/misc.cmx \ - parsing/longident.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - utils/config.cmx \ - bytecomp/translattribute.cmi -bytecomp/translattribute.cmi : \ - typing/typedtree.cmi \ - parsing/parsetree.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi -bytecomp/translclass.cmo : \ - typing/types.cmi \ - typing/typeopt.cmi \ - typing/typedtree.cmi \ - bytecomp/translobj.cmi \ - bytecomp/translcore.cmi \ - typing/path.cmi \ - bytecomp/matching.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ - typing/env.cmi \ + file_formats/cmo_format.cmi +asmcomp/CSE.cmo : \ + asmcomp/mach.cmi \ + asmcomp/CSEgen.cmi \ + asmcomp/arch.cmo +asmcomp/CSE.cmx : \ + asmcomp/mach.cmx \ + asmcomp/CSEgen.cmx \ + asmcomp/arch.cmx +asmcomp/CSEgen.cmo : \ + asmcomp/reg.cmi \ + asmcomp/proc.cmi \ + asmcomp/mach.cmi \ + asmcomp/cmm.cmi \ + asmcomp/CSEgen.cmi +asmcomp/CSEgen.cmx : \ + asmcomp/reg.cmx \ + asmcomp/proc.cmx \ + asmcomp/mach.cmx \ + asmcomp/cmm.cmx \ + asmcomp/CSEgen.cmi +asmcomp/CSEgen.cmi : \ + asmcomp/mach.cmi +asmcomp/afl_instrument.cmo : \ + lambda/lambda.cmi \ + asmcomp/cmm.cmi \ utils/clflags.cmi \ - typing/btype.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi \ - bytecomp/translclass.cmi -bytecomp/translclass.cmx : \ - typing/types.cmx \ - typing/typeopt.cmx \ - typing/typedtree.cmx \ - bytecomp/translobj.cmx \ - bytecomp/translcore.cmx \ - typing/path.cmx \ - bytecomp/matching.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - typing/env.cmx \ + asmcomp/afl_instrument.cmi +asmcomp/afl_instrument.cmx : \ + lambda/lambda.cmx \ + asmcomp/cmm.cmx \ utils/clflags.cmx \ - typing/btype.cmx \ + middle_end/backend_var.cmx \ parsing/asttypes.cmi \ - bytecomp/translclass.cmi -bytecomp/translclass.cmi : \ - typing/typedtree.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - parsing/asttypes.cmi -bytecomp/translcore.cmo : \ - typing/types.cmi \ - typing/typeopt.cmi \ - typing/typedtree.cmi \ - typing/typecore.cmi \ - bytecomp/translprim.cmi \ - bytecomp/translobj.cmi \ - bytecomp/translattribute.cmi \ - typing/printtyp.cmi \ - typing/primitive.cmi \ - typing/predef.cmi \ - typing/path.cmi \ - parsing/parsetree.cmi \ - typing/parmatch.cmi \ - utils/misc.cmi \ - bytecomp/matching.cmi \ - parsing/longident.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - utils/config.cmi \ - utils/clflags.cmi \ - typing/btype.cmi \ - parsing/asttypes.cmi \ - bytecomp/translcore.cmi -bytecomp/translcore.cmx : \ - typing/types.cmx \ - typing/typeopt.cmx \ - typing/typedtree.cmx \ - typing/typecore.cmx \ - bytecomp/translprim.cmx \ - bytecomp/translobj.cmx \ - bytecomp/translattribute.cmx \ - typing/printtyp.cmx \ - typing/primitive.cmx \ - typing/predef.cmx \ - typing/path.cmx \ - parsing/parsetree.cmi \ - typing/parmatch.cmx \ - utils/misc.cmx \ - bytecomp/matching.cmx \ - parsing/longident.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - utils/config.cmx \ - utils/clflags.cmx \ - typing/btype.cmx \ - parsing/asttypes.cmi \ - bytecomp/translcore.cmi -bytecomp/translcore.cmi : \ - typing/typedtree.cmi \ - typing/path.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - parsing/asttypes.cmi -bytecomp/translmod.cmo : \ - typing/types.cmi \ - typing/typedtree.cmi \ - bytecomp/translprim.cmi \ - bytecomp/translobj.cmi \ - bytecomp/translcore.cmi \ - bytecomp/translclass.cmi \ - bytecomp/translattribute.cmi \ - typing/primitive.cmi \ - typing/predef.cmi \ - typing/path.cmi \ - typing/mtype.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - typing/ctype.cmi \ - utils/clflags.cmi \ - parsing/asttypes.cmi \ - bytecomp/translmod.cmi -bytecomp/translmod.cmx : \ - typing/types.cmx \ - typing/typedtree.cmx \ - bytecomp/translprim.cmx \ - bytecomp/translobj.cmx \ - bytecomp/translcore.cmx \ - bytecomp/translclass.cmx \ - bytecomp/translattribute.cmx \ - typing/primitive.cmx \ - typing/predef.cmx \ - typing/path.cmx \ - typing/mtype.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - typing/ctype.cmx \ - utils/clflags.cmx \ - parsing/asttypes.cmi \ - bytecomp/translmod.cmi -bytecomp/translmod.cmi : \ - typing/typedtree.cmi \ - typing/primitive.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi -bytecomp/translobj.cmo : \ - typing/primitive.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - utils/config.cmi \ - utils/clflags.cmi \ - typing/btype.cmi \ - parsing/asttypes.cmi \ - bytecomp/translobj.cmi -bytecomp/translobj.cmx : \ - typing/primitive.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - utils/config.cmx \ - utils/clflags.cmx \ - typing/btype.cmx \ - parsing/asttypes.cmi \ - bytecomp/translobj.cmi -bytecomp/translobj.cmi : \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi -bytecomp/translprim.cmo : \ - typing/types.cmi \ - typing/typeopt.cmi \ - typing/typedtree.cmi \ - typing/primitive.cmi \ - typing/predef.cmi \ - typing/path.cmi \ - utils/misc.cmi \ - bytecomp/matching.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - utils/config.cmi \ - utils/clflags.cmi \ - parsing/asttypes.cmi \ - bytecomp/translprim.cmi -bytecomp/translprim.cmx : \ - typing/types.cmx \ - typing/typeopt.cmx \ - typing/typedtree.cmx \ - typing/primitive.cmx \ - typing/predef.cmx \ - typing/path.cmx \ - utils/misc.cmx \ - bytecomp/matching.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - utils/config.cmx \ - utils/clflags.cmx \ - parsing/asttypes.cmi \ - bytecomp/translprim.cmi -bytecomp/translprim.cmi : \ - typing/types.cmi \ - typing/typedtree.cmi \ - typing/primitive.cmi \ - typing/path.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi -asmcomp/CSE.cmo : \ - asmcomp/mach.cmi \ - asmcomp/CSEgen.cmi \ - asmcomp/arch.cmo -asmcomp/CSE.cmx : \ - asmcomp/mach.cmx \ - asmcomp/CSEgen.cmx \ - asmcomp/arch.cmx -asmcomp/CSEgen.cmo : \ - asmcomp/reg.cmi \ - asmcomp/proc.cmi \ - asmcomp/mach.cmi \ - asmcomp/cmm.cmi \ - asmcomp/CSEgen.cmi -asmcomp/CSEgen.cmx : \ - asmcomp/reg.cmx \ - asmcomp/proc.cmx \ - asmcomp/mach.cmx \ - asmcomp/cmm.cmx \ - asmcomp/CSEgen.cmi -asmcomp/CSEgen.cmi : \ - asmcomp/mach.cmi -asmcomp/afl_instrument.cmo : \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/cmm.cmi \ - utils/clflags.cmi \ - asmcomp/backend_var.cmi \ - parsing/asttypes.cmi \ - asmcomp/afl_instrument.cmi -asmcomp/afl_instrument.cmx : \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ - asmcomp/cmm.cmx \ - utils/clflags.cmx \ - asmcomp/backend_var.cmx \ - parsing/asttypes.cmi \ - asmcomp/afl_instrument.cmi -asmcomp/afl_instrument.cmi : \ - asmcomp/cmm.cmi -asmcomp/arch.cmo : \ + asmcomp/afl_instrument.cmi +asmcomp/afl_instrument.cmi : \ + lambda/debuginfo.cmi \ + asmcomp/cmm.cmi +asmcomp/arch.cmo : \ utils/config.cmi \ utils/clflags.cmi asmcomp/arch.cmx : \ utils/config.cmx \ utils/clflags.cmx asmcomp/asmgen.cmo : \ - asmcomp/un_anf.cmi \ - bytecomp/translmod.cmi \ - middle_end/base_types/symbol.cmi \ + middle_end/flambda/un_anf.cmi \ + lambda/translmod.cmi \ + middle_end/symbol.cmi \ asmcomp/split.cmi \ asmcomp/spill.cmi \ asmcomp/selection.cmi \ @@ -2332,7 +1933,7 @@ asmcomp/asmgen.cmo : \ asmcomp/printmach.cmi \ asmcomp/printlinear.cmi \ asmcomp/printcmm.cmi \ - asmcomp/printclambda.cmi \ + middle_end/printclambda.cmi \ typing/primitive.cmi \ typing/path.cmi \ utils/misc.cmi \ @@ -2340,34 +1941,34 @@ asmcomp/asmgen.cmo : \ parsing/location.cmi \ asmcomp/liveness.cmi \ asmcomp/linscan.cmi \ - middle_end/base_types/linkage_name.cmi \ + middle_end/linkage_name.cmi \ asmcomp/linearize.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ asmcomp/interval.cmi \ asmcomp/interf.cmi \ typing/ident.cmi \ - asmcomp/flambda_to_clambda.cmi \ - middle_end/flambda.cmi \ + middle_end/flambda/flambda_to_clambda.cmi \ + middle_end/flambda/flambda.cmi \ asmcomp/emitaux.cmi \ asmcomp/emit.cmi \ asmcomp/deadcode.cmi \ utils/config.cmi \ - asmcomp/compilenv.cmi \ + middle_end/compilenv.cmi \ asmcomp/comballoc.cmi \ asmcomp/coloring.cmi \ asmcomp/cmmgen.cmi \ asmcomp/cmm.cmi \ - asmcomp/closure.cmi \ + middle_end/closure/closure.cmi \ utils/clflags.cmi \ - asmcomp/clambda.cmi \ + middle_end/clambda.cmi \ asmcomp/CSE.cmo \ - asmcomp/build_export_info.cmi \ + middle_end/flambda/build_export_info.cmi \ asmcomp/debug/available_regs.cmi \ asmcomp/asmgen.cmi asmcomp/asmgen.cmx : \ - asmcomp/un_anf.cmx \ - bytecomp/translmod.cmx \ - middle_end/base_types/symbol.cmx \ + middle_end/flambda/un_anf.cmx \ + lambda/translmod.cmx \ + middle_end/symbol.cmx \ asmcomp/split.cmx \ asmcomp/spill.cmx \ asmcomp/selection.cmx \ @@ -2379,7 +1980,7 @@ asmcomp/asmgen.cmx : \ asmcomp/printmach.cmx \ asmcomp/printlinear.cmx \ asmcomp/printcmm.cmx \ - asmcomp/printclambda.cmx \ + middle_end/printclambda.cmx \ typing/primitive.cmx \ typing/path.cmx \ utils/misc.cmx \ @@ -2387,46 +1988,46 @@ asmcomp/asmgen.cmx : \ parsing/location.cmx \ asmcomp/liveness.cmx \ asmcomp/linscan.cmx \ - middle_end/base_types/linkage_name.cmx \ + middle_end/linkage_name.cmx \ asmcomp/linearize.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ asmcomp/interval.cmx \ asmcomp/interf.cmx \ typing/ident.cmx \ - asmcomp/flambda_to_clambda.cmx \ - middle_end/flambda.cmx \ + middle_end/flambda/flambda_to_clambda.cmx \ + middle_end/flambda/flambda.cmx \ asmcomp/emitaux.cmx \ asmcomp/emit.cmx \ asmcomp/deadcode.cmx \ utils/config.cmx \ - asmcomp/compilenv.cmx \ + middle_end/compilenv.cmx \ asmcomp/comballoc.cmx \ asmcomp/coloring.cmx \ asmcomp/cmmgen.cmx \ asmcomp/cmm.cmx \ - asmcomp/closure.cmx \ + middle_end/closure/closure.cmx \ utils/clflags.cmx \ - asmcomp/clambda.cmx \ + middle_end/clambda.cmx \ asmcomp/CSE.cmx \ - asmcomp/build_export_info.cmx \ + middle_end/flambda/build_export_info.cmx \ asmcomp/debug/available_regs.cmx \ asmcomp/asmgen.cmi asmcomp/asmgen.cmi : \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ - middle_end/flambda.cmi \ + middle_end/flambda/flambda.cmi \ asmcomp/cmm.cmi \ middle_end/backend_intf.cmi asmcomp/asmlibrarian.cmo : \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ - asmcomp/export_info.cmi \ + middle_end/flambda/export_info.cmi \ utils/config.cmi \ - asmcomp/compilenv.cmi \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmi \ + file_formats/cmx_format.cmi \ utils/clflags.cmi \ - asmcomp/clambda.cmi \ + middle_end/clambda.cmi \ utils/ccomp.cmi \ asmcomp/asmlink.cmi \ asmcomp/asmlibrarian.cmi @@ -2434,18 +2035,18 @@ asmcomp/asmlibrarian.cmx : \ utils/misc.cmx \ parsing/location.cmx \ utils/load_path.cmx \ - asmcomp/export_info.cmx \ + middle_end/flambda/export_info.cmx \ utils/config.cmx \ - asmcomp/compilenv.cmx \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmx \ + file_formats/cmx_format.cmi \ utils/clflags.cmx \ - asmcomp/clambda.cmx \ + middle_end/clambda.cmx \ utils/ccomp.cmx \ asmcomp/asmlink.cmx \ asmcomp/asmlibrarian.cmi asmcomp/asmlibrarian.cmi : asmcomp/asmlink.cmo : \ - bytecomp/runtimedef.cmi \ + lambda/runtimedef.cmi \ utils/profile.cmi \ utils/misc.cmi \ parsing/location.cmi \ @@ -2454,8 +2055,8 @@ asmcomp/asmlink.cmo : \ asmcomp/emit.cmi \ utils/consistbl.cmi \ utils/config.cmi \ - asmcomp/compilenv.cmi \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmi \ + file_formats/cmx_format.cmi \ asmcomp/cmmgen.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ @@ -2463,7 +2064,7 @@ asmcomp/asmlink.cmo : \ asmcomp/asmgen.cmi \ asmcomp/asmlink.cmi asmcomp/asmlink.cmx : \ - bytecomp/runtimedef.cmx \ + lambda/runtimedef.cmx \ utils/profile.cmx \ utils/misc.cmx \ parsing/location.cmx \ @@ -2472,8 +2073,8 @@ asmcomp/asmlink.cmx : \ asmcomp/emit.cmx \ utils/consistbl.cmx \ utils/config.cmx \ - asmcomp/compilenv.cmx \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmx \ + file_formats/cmx_format.cmi \ asmcomp/cmmgen.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ @@ -2481,25 +2082,26 @@ asmcomp/asmlink.cmx : \ asmcomp/asmgen.cmx \ asmcomp/asmlink.cmi asmcomp/asmlink.cmi : \ - asmcomp/cmx_format.cmi + utils/misc.cmi \ + file_formats/cmx_format.cmi asmcomp/asmpackager.cmo : \ typing/typemod.cmi \ - bytecomp/translmod.cmi \ - bytecomp/simplif.cmi \ + lambda/translmod.cmi \ + lambda/simplif.cmi \ utils/profile.cmi \ utils/misc.cmi \ - middle_end/middle_end.cmi \ parsing/location.cmi \ utils/load_path.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi \ - asmcomp/export_info_for_pack.cmi \ - asmcomp/export_info.cmi \ + middle_end/flambda/flambda_middle_end.cmi \ + middle_end/flambda/export_info_for_pack.cmi \ + middle_end/flambda/export_info.cmi \ typing/env.cmi \ utils/config.cmi \ - asmcomp/compilenv.cmi \ - middle_end/base_types/compilation_unit.cmi \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmi \ + middle_end/compilation_unit.cmi \ + file_formats/cmx_format.cmi \ utils/clflags.cmi \ utils/ccomp.cmi \ asmcomp/asmlink.cmi \ @@ -2507,22 +2109,22 @@ asmcomp/asmpackager.cmo : \ asmcomp/asmpackager.cmi asmcomp/asmpackager.cmx : \ typing/typemod.cmx \ - bytecomp/translmod.cmx \ - bytecomp/simplif.cmx \ + lambda/translmod.cmx \ + lambda/simplif.cmx \ utils/profile.cmx \ utils/misc.cmx \ - middle_end/middle_end.cmx \ parsing/location.cmx \ utils/load_path.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ typing/ident.cmx \ - asmcomp/export_info_for_pack.cmx \ - asmcomp/export_info.cmx \ + middle_end/flambda/flambda_middle_end.cmx \ + middle_end/flambda/export_info_for_pack.cmx \ + middle_end/flambda/export_info.cmx \ typing/env.cmx \ utils/config.cmx \ - asmcomp/compilenv.cmx \ - middle_end/base_types/compilation_unit.cmx \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmx \ + middle_end/compilation_unit.cmx \ + file_formats/cmx_format.cmi \ utils/clflags.cmx \ utils/ccomp.cmx \ asmcomp/asmlink.cmx \ @@ -2531,20 +2133,6 @@ asmcomp/asmpackager.cmx : \ asmcomp/asmpackager.cmi : \ typing/env.cmi \ middle_end/backend_intf.cmi -asmcomp/backend_var.cmo : \ - typing/path.cmi \ - typing/ident.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/backend_var.cmi -asmcomp/backend_var.cmx : \ - typing/path.cmx \ - typing/ident.cmx \ - middle_end/debuginfo.cmx \ - asmcomp/backend_var.cmi -asmcomp/backend_var.cmi : \ - typing/path.cmi \ - typing/ident.cmi \ - middle_end/debuginfo.cmi asmcomp/branch_relaxation.cmo : \ utils/misc.cmi \ asmcomp/mach.cmi \ @@ -2570,221 +2158,100 @@ asmcomp/branch_relaxation_intf.cmx : \ asmcomp/linearize.cmx \ asmcomp/cmm.cmx \ asmcomp/arch.cmx -asmcomp/build_export_info.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - asmcomp/traverse_for_exported_symbols.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - utils/misc.cmi \ - middle_end/invariant_params.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/find_recursive_functions.cmi \ - asmcomp/export_info.cmi \ - middle_end/base_types/export_id.cmi \ - asmcomp/compilenv.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ - utils/clflags.cmi \ - middle_end/backend_intf.cmi \ - middle_end/allocated_const.cmi \ - asmcomp/build_export_info.cmi -asmcomp/build_export_info.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - asmcomp/traverse_for_exported_symbols.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - utils/misc.cmx \ - middle_end/invariant_params.cmx \ - middle_end/inline_and_simplify_aux.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/find_recursive_functions.cmx \ - asmcomp/export_info.cmx \ - middle_end/base_types/export_id.cmx \ - asmcomp/compilenv.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ - utils/clflags.cmx \ - middle_end/backend_intf.cmi \ - middle_end/allocated_const.cmx \ - asmcomp/build_export_info.cmi -asmcomp/build_export_info.cmi : \ - middle_end/flambda.cmi \ - asmcomp/export_info.cmi \ - middle_end/backend_intf.cmi -asmcomp/clambda.cmo : \ - typing/path.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/backend_var.cmi \ - parsing/asttypes.cmi \ - asmcomp/clambda.cmi -asmcomp/clambda.cmx : \ - typing/path.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - middle_end/debuginfo.cmx \ - asmcomp/backend_var.cmx \ - parsing/asttypes.cmi \ - asmcomp/clambda.cmi -asmcomp/clambda.cmi : \ - typing/path.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/backend_var.cmi \ - parsing/asttypes.cmi -asmcomp/closure.cmo : \ - utils/warnings.cmi \ - bytecomp/switch.cmi \ - bytecomp/simplif.cmi \ - bytecomp/semantics_of_primitives.cmi \ - typing/primitive.cmi \ - utils/numbers.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - middle_end/debuginfo.cmi \ - utils/config.cmi \ - asmcomp/compilenv.cmi \ - utils/clflags.cmi \ - asmcomp/clambda.cmi \ - asmcomp/backend_var.cmi \ - parsing/asttypes.cmi \ - asmcomp/arch.cmo \ - asmcomp/closure.cmi -asmcomp/closure.cmx : \ - utils/warnings.cmx \ - bytecomp/switch.cmx \ - bytecomp/simplif.cmx \ - bytecomp/semantics_of_primitives.cmx \ - typing/primitive.cmx \ - utils/numbers.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - middle_end/debuginfo.cmx \ - utils/config.cmx \ - asmcomp/compilenv.cmx \ - utils/clflags.cmx \ - asmcomp/clambda.cmx \ - asmcomp/backend_var.cmx \ - parsing/asttypes.cmi \ - asmcomp/arch.cmx \ - asmcomp/closure.cmi -asmcomp/closure.cmi : \ - bytecomp/lambda.cmi \ - asmcomp/clambda.cmi -asmcomp/closure_offsets.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - utils/misc.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi \ - asmcomp/closure_offsets.cmi -asmcomp/closure_offsets.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - utils/misc.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/closure_id.cmx \ - asmcomp/closure_offsets.cmi -asmcomp/closure_offsets.cmi : \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi asmcomp/cmm.cmo : \ utils/targetint.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/backend_var.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi \ asmcomp/arch.cmo \ asmcomp/cmm.cmi asmcomp/cmm.cmx : \ utils/targetint.cmx \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ - asmcomp/backend_var.cmx \ + lambda/lambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/backend_var.cmx \ parsing/asttypes.cmi \ asmcomp/arch.cmx \ asmcomp/cmm.cmi asmcomp/cmm.cmi : \ utils/targetint.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/backend_var.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi asmcomp/cmmgen.cmo : \ - asmcomp/un_anf.cmi \ + middle_end/flambda/un_anf.cmi \ typing/types.cmi \ utils/targetint.cmi \ - bytecomp/switch.cmi \ + lambda/switch.cmi \ asmcomp/strmatch.cmi \ asmcomp/proc.cmi \ - bytecomp/printlambda.cmi \ + middle_end/printclambda_primitives.cmi \ typing/primitive.cmi \ utils/numbers.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ - asmcomp/compilenv.cmi \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmi \ + file_formats/cmxs_format.cmi \ + file_formats/cmx_format.cmi \ + asmcomp/cmmgen_state.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ - asmcomp/clambda.cmi \ - asmcomp/backend_var.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/clambda.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi \ asmcomp/arch.cmo \ asmcomp/afl_instrument.cmi \ asmcomp/cmmgen.cmi asmcomp/cmmgen.cmx : \ - asmcomp/un_anf.cmx \ + middle_end/flambda/un_anf.cmx \ typing/types.cmx \ utils/targetint.cmx \ - bytecomp/switch.cmx \ + lambda/switch.cmx \ asmcomp/strmatch.cmx \ asmcomp/proc.cmx \ - bytecomp/printlambda.cmx \ + middle_end/printclambda_primitives.cmx \ typing/primitive.cmx \ utils/numbers.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ + lambda/lambda.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ - asmcomp/compilenv.cmx \ - asmcomp/cmx_format.cmi \ + middle_end/compilenv.cmx \ + file_formats/cmxs_format.cmi \ + file_formats/cmx_format.cmi \ + asmcomp/cmmgen_state.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ - asmcomp/clambda.cmx \ - asmcomp/backend_var.cmx \ + middle_end/clambda_primitives.cmx \ + middle_end/clambda.cmx \ + middle_end/backend_var.cmx \ parsing/asttypes.cmi \ asmcomp/arch.cmx \ asmcomp/afl_instrument.cmx \ asmcomp/cmmgen.cmi asmcomp/cmmgen.cmi : \ - asmcomp/cmx_format.cmi \ + file_formats/cmx_format.cmi \ + asmcomp/cmm.cmi \ + middle_end/clambda.cmi +asmcomp/cmmgen_state.cmo : \ + utils/misc.cmi \ + asmcomp/cmm.cmi \ + middle_end/clambda.cmi \ + asmcomp/cmmgen_state.cmi +asmcomp/cmmgen_state.cmx : \ + utils/misc.cmx \ + asmcomp/cmm.cmx \ + middle_end/clambda.cmx \ + asmcomp/cmmgen_state.cmi +asmcomp/cmmgen_state.cmi : \ + utils/misc.cmi \ asmcomp/cmm.cmi \ - asmcomp/clambda.cmi -asmcomp/cmx_format.cmi : \ - asmcomp/export_info.cmi \ - asmcomp/clambda.cmi + middle_end/clambda.cmi asmcomp/coloring.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ @@ -2808,57 +2275,6 @@ asmcomp/comballoc.cmx : \ asmcomp/comballoc.cmi asmcomp/comballoc.cmi : \ asmcomp/mach.cmi -asmcomp/compilenv.cmo : \ - utils/warnings.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - typing/path.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - utils/load_path.cmi \ - middle_end/base_types/linkage_name.cmi \ - typing/ident.cmi \ - asmcomp/export_info.cmi \ - typing/env.cmi \ - utils/config.cmi \ - middle_end/base_types/compilation_unit.cmi \ - asmcomp/cmx_format.cmi \ - middle_end/base_types/closure_id.cmi \ - utils/clflags.cmi \ - asmcomp/clambda.cmi \ - asmcomp/compilenv.cmi -asmcomp/compilenv.cmx : \ - utils/warnings.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - typing/path.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - utils/load_path.cmx \ - middle_end/base_types/linkage_name.cmx \ - typing/ident.cmx \ - asmcomp/export_info.cmx \ - typing/env.cmx \ - utils/config.cmx \ - middle_end/base_types/compilation_unit.cmx \ - asmcomp/cmx_format.cmi \ - middle_end/base_types/closure_id.cmx \ - utils/clflags.cmx \ - asmcomp/clambda.cmx \ - asmcomp/compilenv.cmi -asmcomp/compilenv.cmi : \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/base_types/linkage_name.cmi \ - typing/ident.cmi \ - asmcomp/export_info.cmi \ - middle_end/base_types/compilation_unit.cmi \ - asmcomp/cmx_format.cmi \ - middle_end/base_types/closure_id.cmi \ - asmcomp/clambda.cmi asmcomp/deadcode.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ @@ -2885,9 +2301,9 @@ asmcomp/emit.cmo : \ asmcomp/mach.cmi \ asmcomp/linearize.cmi \ asmcomp/emitaux.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ - asmcomp/compilenv.cmi \ + middle_end/compilenv.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ asmcomp/branch_relaxation.cmi \ @@ -2905,9 +2321,9 @@ asmcomp/emit.cmx : \ asmcomp/mach.cmx \ asmcomp/linearize.cmx \ asmcomp/emitaux.cmx \ - middle_end/debuginfo.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ - asmcomp/compilenv.cmx \ + middle_end/compilenv.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ asmcomp/branch_relaxation.cmx \ @@ -2917,185 +2333,21 @@ asmcomp/emit.cmi : \ asmcomp/linearize.cmi \ asmcomp/cmm.cmi asmcomp/emitaux.cmo : \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ asmcomp/arch.cmo \ asmcomp/emitaux.cmi asmcomp/emitaux.cmx : \ - middle_end/debuginfo.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ asmcomp/arch.cmx \ asmcomp/emitaux.cmi asmcomp/emitaux.cmi : \ - middle_end/debuginfo.cmi -asmcomp/export_info.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/export_id.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ - asmcomp/export_info.cmi -asmcomp/export_info.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/export_id.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ - asmcomp/export_info.cmi -asmcomp/export_info.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/export_id.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi -asmcomp/export_info_for_pack.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - utils/misc.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - asmcomp/export_info.cmi \ - middle_end/base_types/export_id.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ - asmcomp/export_info_for_pack.cmi -asmcomp/export_info_for_pack.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_origin.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - utils/misc.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - asmcomp/export_info.cmx \ - middle_end/base_types/export_id.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ - asmcomp/export_info_for_pack.cmi -asmcomp/export_info_for_pack.cmi : \ - asmcomp/export_info.cmi \ - middle_end/base_types/compilation_unit.cmi -asmcomp/flambda_to_clambda.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - typing/primitive.cmi \ - middle_end/parameter.cmi \ - utils/numbers.cmi \ - middle_end/base_types/mutable_variable.cmi \ - utils/misc.cmi \ - middle_end/base_types/linkage_name.cmi \ - bytecomp/lambda.cmi \ - middle_end/initialize_symbol_to_let_symbol.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - asmcomp/export_info.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/compilenv.cmi \ - asmcomp/closure_offsets.cmi \ - middle_end/base_types/closure_id.cmi \ - utils/clflags.cmi \ - asmcomp/clambda.cmi \ - asmcomp/backend_var.cmi \ - middle_end/allocated_const.cmi \ - asmcomp/flambda_to_clambda.cmi -asmcomp/flambda_to_clambda.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - typing/primitive.cmx \ - middle_end/parameter.cmx \ - utils/numbers.cmx \ - middle_end/base_types/mutable_variable.cmx \ - utils/misc.cmx \ - middle_end/base_types/linkage_name.cmx \ - bytecomp/lambda.cmx \ - middle_end/initialize_symbol_to_let_symbol.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - asmcomp/export_info.cmx \ - middle_end/debuginfo.cmx \ - asmcomp/compilenv.cmx \ - asmcomp/closure_offsets.cmx \ - middle_end/base_types/closure_id.cmx \ - utils/clflags.cmx \ - asmcomp/clambda.cmx \ - asmcomp/backend_var.cmx \ - middle_end/allocated_const.cmx \ - asmcomp/flambda_to_clambda.cmi -asmcomp/flambda_to_clambda.cmi : \ - middle_end/base_types/symbol.cmi \ - middle_end/flambda.cmi \ - asmcomp/export_info.cmi \ - asmcomp/clambda.cmi -asmcomp/import_approx.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - utils/misc.cmi \ - middle_end/freshening.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - asmcomp/export_info.cmi \ - middle_end/base_types/export_id.cmi \ - asmcomp/compilenv.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ - asmcomp/import_approx.cmi -asmcomp/import_approx.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - utils/misc.cmx \ - middle_end/freshening.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - asmcomp/export_info.cmx \ - middle_end/base_types/export_id.cmx \ - asmcomp/compilenv.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ - asmcomp/import_approx.cmi -asmcomp/import_approx.cmi : \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi + lambda/debuginfo.cmi asmcomp/interf.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ @@ -3128,7 +2380,7 @@ asmcomp/linearize.cmo : \ asmcomp/proc.cmi \ utils/misc.cmi \ asmcomp/mach.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ asmcomp/cmm.cmi \ asmcomp/linearize.cmi @@ -3137,14 +2389,14 @@ asmcomp/linearize.cmx : \ asmcomp/proc.cmx \ utils/misc.cmx \ asmcomp/mach.cmx \ - middle_end/debuginfo.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ asmcomp/cmm.cmx \ asmcomp/linearize.cmi asmcomp/linearize.cmi : \ asmcomp/reg.cmi \ asmcomp/mach.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ asmcomp/cmm.cmi asmcomp/linscan.cmo : \ asmcomp/reg.cmi \ @@ -3181,77 +2433,59 @@ asmcomp/mach.cmo : \ asmcomp/debug/reg_with_debug_info.cmi \ asmcomp/debug/reg_availability_set.cmi \ asmcomp/reg.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/arch.cmo \ asmcomp/mach.cmi asmcomp/mach.cmx : \ asmcomp/debug/reg_with_debug_info.cmx \ asmcomp/debug/reg_availability_set.cmx \ asmcomp/reg.cmx \ - middle_end/debuginfo.cmx \ + lambda/debuginfo.cmx \ asmcomp/cmm.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ asmcomp/arch.cmx \ asmcomp/mach.cmi asmcomp/mach.cmi : \ asmcomp/debug/reg_availability_set.cmi \ asmcomp/reg.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/arch.cmo -asmcomp/printclambda.cmo : \ - bytecomp/printlambda.cmi \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - asmcomp/clambda.cmi \ - asmcomp/backend_var.cmi \ - parsing/asttypes.cmi \ - asmcomp/printclambda.cmi -asmcomp/printclambda.cmx : \ - bytecomp/printlambda.cmx \ - bytecomp/lambda.cmx \ - typing/ident.cmx \ - asmcomp/clambda.cmx \ - asmcomp/backend_var.cmx \ - parsing/asttypes.cmi \ - asmcomp/printclambda.cmi -asmcomp/printclambda.cmi : \ - asmcomp/clambda.cmi asmcomp/printcmm.cmo : \ utils/targetint.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi \ asmcomp/printcmm.cmi asmcomp/printcmm.cmx : \ utils/targetint.cmx \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ + lambda/lambda.cmx \ + lambda/debuginfo.cmx \ asmcomp/cmm.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ parsing/asttypes.cmi \ asmcomp/printcmm.cmi asmcomp/printcmm.cmi : \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ asmcomp/cmm.cmi asmcomp/printlinear.cmo : \ asmcomp/printmach.cmi \ asmcomp/printcmm.cmi \ asmcomp/mach.cmi \ asmcomp/linearize.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ asmcomp/printlinear.cmi asmcomp/printlinear.cmx : \ asmcomp/printmach.cmx \ asmcomp/printcmm.cmx \ asmcomp/mach.cmx \ asmcomp/linearize.cmx \ - middle_end/debuginfo.cmx \ + lambda/debuginfo.cmx \ asmcomp/printlinear.cmi asmcomp/printlinear.cmi : \ asmcomp/linearize.cmi @@ -3262,11 +2496,11 @@ asmcomp/printmach.cmo : \ asmcomp/printcmm.cmi \ asmcomp/mach.cmi \ asmcomp/interval.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/arch.cmo \ asmcomp/printmach.cmi asmcomp/printmach.cmx : \ @@ -3276,11 +2510,11 @@ asmcomp/printmach.cmx : \ asmcomp/printcmm.cmx \ asmcomp/mach.cmx \ asmcomp/interval.cmx \ - middle_end/debuginfo.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ asmcomp/arch.cmx \ asmcomp/printmach.cmi asmcomp/printmach.cmi : \ @@ -3309,15 +2543,15 @@ asmcomp/proc.cmi : \ asmcomp/mach.cmi asmcomp/reg.cmo : \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/reg.cmi asmcomp/reg.cmx : \ asmcomp/cmm.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ asmcomp/reg.cmi asmcomp/reg.cmi : \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi + middle_end/backend_var.cmi asmcomp/reload.cmo : \ asmcomp/reloadgen.cmi \ asmcomp/reg.cmi \ @@ -3355,6 +2589,7 @@ asmcomp/schedgen.cmo : \ asmcomp/mach.cmi \ asmcomp/linearize.cmi \ asmcomp/cmm.cmi \ + utils/clflags.cmi \ asmcomp/arch.cmo \ asmcomp/schedgen.cmi asmcomp/schedgen.cmx : \ @@ -3363,6 +2598,7 @@ asmcomp/schedgen.cmx : \ asmcomp/mach.cmx \ asmcomp/linearize.cmx \ asmcomp/cmm.cmx \ + utils/clflags.cmx \ asmcomp/arch.cmx \ asmcomp/schedgen.cmi asmcomp/schedgen.cmi : \ @@ -3377,41 +2613,41 @@ asmcomp/scheduling.cmx : \ asmcomp/scheduling.cmi : \ asmcomp/linearize.cmi asmcomp/selectgen.cmo : \ - bytecomp/simplif.cmi \ + lambda/simplif.cmi \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ utils/numbers.cmi \ utils/misc.cmi \ asmcomp/mach.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi \ asmcomp/arch.cmo \ asmcomp/selectgen.cmi asmcomp/selectgen.cmx : \ - bytecomp/simplif.cmx \ + lambda/simplif.cmx \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ utils/numbers.cmx \ utils/misc.cmx \ asmcomp/mach.cmx \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ + lambda/lambda.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ asmcomp/cmm.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ parsing/asttypes.cmi \ asmcomp/arch.cmx \ asmcomp/selectgen.cmi asmcomp/selectgen.cmi : \ asmcomp/reg.cmi \ asmcomp/mach.cmi \ - middle_end/debuginfo.cmi \ + lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/arch.cmo asmcomp/selection.cmo : \ asmcomp/spacetime_profiling.cmi \ @@ -3441,11 +2677,11 @@ asmcomp/spacetime_profiling.cmo : \ asmcomp/proc.cmi \ utils/misc.cmi \ asmcomp/mach.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi \ asmcomp/arch.cmo \ asmcomp/spacetime_profiling.cmi @@ -3454,11 +2690,11 @@ asmcomp/spacetime_profiling.cmx : \ asmcomp/proc.cmx \ utils/misc.cmx \ asmcomp/mach.cmx \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ + lambda/lambda.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ asmcomp/cmm.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ parsing/asttypes.cmi \ asmcomp/arch.cmx \ asmcomp/spacetime_profiling.cmi @@ -3476,1804 +2712,2704 @@ asmcomp/spill.cmx : \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ utils/misc.cmx \ - asmcomp/mach.cmx \ - asmcomp/cmm.cmx \ + asmcomp/mach.cmx \ + asmcomp/cmm.cmx \ + utils/clflags.cmx \ + asmcomp/spill.cmi +asmcomp/spill.cmi : \ + asmcomp/mach.cmi +asmcomp/split.cmo : \ + asmcomp/reg.cmi \ + utils/misc.cmi \ + asmcomp/mach.cmi \ + asmcomp/split.cmi +asmcomp/split.cmx : \ + asmcomp/reg.cmx \ + utils/misc.cmx \ + asmcomp/mach.cmx \ + asmcomp/split.cmi +asmcomp/split.cmi : \ + asmcomp/mach.cmi +asmcomp/strmatch.cmo : \ + parsing/location.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ + asmcomp/cmm.cmi \ + middle_end/backend_var.cmi \ + parsing/asttypes.cmi \ + asmcomp/arch.cmo \ + asmcomp/strmatch.cmi +asmcomp/strmatch.cmx : \ + parsing/location.cmx \ + lambda/lambda.cmx \ + lambda/debuginfo.cmx \ + asmcomp/cmm.cmx \ + middle_end/backend_var.cmx \ + parsing/asttypes.cmi \ + asmcomp/arch.cmx \ + asmcomp/strmatch.cmi +asmcomp/strmatch.cmi : \ + parsing/location.cmi \ + lambda/debuginfo.cmi \ + asmcomp/cmm.cmi +asmcomp/x86_ast.cmi : +asmcomp/x86_dsl.cmo : \ + asmcomp/x86_proc.cmi \ + asmcomp/x86_ast.cmi \ + asmcomp/x86_dsl.cmi +asmcomp/x86_dsl.cmx : \ + asmcomp/x86_proc.cmx \ + asmcomp/x86_ast.cmi \ + asmcomp/x86_dsl.cmi +asmcomp/x86_dsl.cmi : \ + asmcomp/x86_ast.cmi +asmcomp/x86_gas.cmo : \ + asmcomp/x86_proc.cmi \ + asmcomp/x86_ast.cmi \ + utils/misc.cmi \ + asmcomp/x86_gas.cmi +asmcomp/x86_gas.cmx : \ + asmcomp/x86_proc.cmx \ + asmcomp/x86_ast.cmi \ + utils/misc.cmx \ + asmcomp/x86_gas.cmi +asmcomp/x86_gas.cmi : \ + asmcomp/x86_ast.cmi +asmcomp/x86_masm.cmo : \ + asmcomp/x86_proc.cmi \ + asmcomp/x86_ast.cmi \ + asmcomp/x86_masm.cmi +asmcomp/x86_masm.cmx : \ + asmcomp/x86_proc.cmx \ + asmcomp/x86_ast.cmi \ + asmcomp/x86_masm.cmi +asmcomp/x86_masm.cmi : \ + asmcomp/x86_ast.cmi +asmcomp/x86_proc.cmo : \ + asmcomp/x86_ast.cmi \ + utils/misc.cmi \ + utils/config.cmi \ + utils/clflags.cmi \ + utils/ccomp.cmi \ + asmcomp/x86_proc.cmi +asmcomp/x86_proc.cmx : \ + asmcomp/x86_ast.cmi \ + utils/misc.cmx \ + utils/config.cmx \ + utils/clflags.cmx \ + utils/ccomp.cmx \ + asmcomp/x86_proc.cmi +asmcomp/x86_proc.cmi : \ + asmcomp/x86_ast.cmi +middle_end/backend_intf.cmi : \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + typing/ident.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/backend_var.cmo : \ + typing/path.cmi \ + typing/ident.cmi \ + lambda/debuginfo.cmi \ + middle_end/backend_var.cmi +middle_end/backend_var.cmx : \ + typing/path.cmx \ + typing/ident.cmx \ + lambda/debuginfo.cmx \ + middle_end/backend_var.cmi +middle_end/backend_var.cmi : \ + typing/path.cmi \ + typing/ident.cmi \ + lambda/debuginfo.cmi +middle_end/clambda.cmo : \ + typing/path.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + lambda/debuginfo.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/backend_var.cmi \ + parsing/asttypes.cmi \ + middle_end/clambda.cmi +middle_end/clambda.cmx : \ + typing/path.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + lambda/debuginfo.cmx \ + middle_end/clambda_primitives.cmx \ + middle_end/backend_var.cmx \ + parsing/asttypes.cmi \ + middle_end/clambda.cmi +middle_end/clambda.cmi : \ + typing/path.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + lambda/debuginfo.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/backend_var.cmi \ + parsing/asttypes.cmi +middle_end/clambda_primitives.cmo : \ + typing/types.cmi \ + typing/primitive.cmi \ + lambda/lambda.cmi \ + parsing/asttypes.cmi \ + middle_end/clambda_primitives.cmi +middle_end/clambda_primitives.cmx : \ + typing/types.cmx \ + typing/primitive.cmx \ + lambda/lambda.cmx \ + parsing/asttypes.cmi \ + middle_end/clambda_primitives.cmi +middle_end/clambda_primitives.cmi : \ + typing/types.cmi \ + typing/primitive.cmi \ + lambda/lambda.cmi \ + parsing/asttypes.cmi +middle_end/compilation_unit.cmo : \ + utils/misc.cmi \ + middle_end/linkage_name.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + utils/identifiable.cmi \ + typing/ident.cmi \ + middle_end/compilation_unit.cmi +middle_end/compilation_unit.cmx : \ + utils/misc.cmx \ + middle_end/linkage_name.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + utils/identifiable.cmx \ + typing/ident.cmx \ + middle_end/compilation_unit.cmi +middle_end/compilation_unit.cmi : \ + middle_end/linkage_name.cmi \ + utils/identifiable.cmi \ + typing/ident.cmi +middle_end/compilenv.cmo : \ + utils/warnings.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + typing/path.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + utils/load_path.cmi \ + middle_end/linkage_name.cmi \ + typing/ident.cmi \ + middle_end/flambda/export_info.cmi \ + typing/env.cmi \ + utils/config.cmi \ + middle_end/compilation_unit.cmi \ + file_formats/cmx_format.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + utils/clflags.cmi \ + middle_end/clambda.cmi \ + middle_end/compilenv.cmi +middle_end/compilenv.cmx : \ + utils/warnings.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + typing/path.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + utils/load_path.cmx \ + middle_end/linkage_name.cmx \ + typing/ident.cmx \ + middle_end/flambda/export_info.cmx \ + typing/env.cmx \ + utils/config.cmx \ + middle_end/compilation_unit.cmx \ + file_formats/cmx_format.cmi \ + middle_end/flambda/base_types/closure_id.cmx \ + utils/clflags.cmx \ + middle_end/clambda.cmx \ + middle_end/compilenv.cmi +middle_end/compilenv.cmi : \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/linkage_name.cmi \ + typing/ident.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/compilation_unit.cmi \ + file_formats/cmx_format.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/clambda.cmi +middle_end/convert_primitives.cmo : \ + lambda/printlambda.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/convert_primitives.cmi +middle_end/convert_primitives.cmx : \ + lambda/printlambda.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ + middle_end/clambda_primitives.cmx \ + middle_end/convert_primitives.cmi +middle_end/convert_primitives.cmi : \ + lambda/lambda.cmi \ + middle_end/clambda_primitives.cmi +middle_end/internal_variable_names.cmo : \ + parsing/location.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/internal_variable_names.cmi +middle_end/internal_variable_names.cmx : \ + parsing/location.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/internal_variable_names.cmi +middle_end/internal_variable_names.cmi : \ + parsing/location.cmi \ + lambda/lambda.cmi +middle_end/linkage_name.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ + utils/identifiable.cmi \ + middle_end/linkage_name.cmi +middle_end/linkage_name.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ + utils/identifiable.cmx \ + middle_end/linkage_name.cmi +middle_end/linkage_name.cmi : \ + utils/identifiable.cmi +middle_end/printclambda.cmo : \ + lambda/printlambda.cmi \ + middle_end/printclambda_primitives.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + middle_end/clambda.cmi \ + middle_end/backend_var.cmi \ + parsing/asttypes.cmi \ + middle_end/printclambda.cmi +middle_end/printclambda.cmx : \ + lambda/printlambda.cmx \ + middle_end/printclambda_primitives.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + middle_end/clambda.cmx \ + middle_end/backend_var.cmx \ + parsing/asttypes.cmi \ + middle_end/printclambda.cmi +middle_end/printclambda.cmi : \ + middle_end/clambda.cmi +middle_end/printclambda_primitives.cmo : \ + lambda/printlambda.cmi \ + typing/primitive.cmi \ + lambda/lambda.cmi \ + middle_end/clambda_primitives.cmi \ + parsing/asttypes.cmi \ + middle_end/printclambda_primitives.cmi +middle_end/printclambda_primitives.cmx : \ + lambda/printlambda.cmx \ + typing/primitive.cmx \ + lambda/lambda.cmx \ + middle_end/clambda_primitives.cmx \ + parsing/asttypes.cmi \ + middle_end/printclambda_primitives.cmi +middle_end/printclambda_primitives.cmi : \ + middle_end/clambda_primitives.cmi +middle_end/semantics_of_primitives.cmo : \ + middle_end/clambda_primitives.cmi \ + middle_end/semantics_of_primitives.cmi +middle_end/semantics_of_primitives.cmx : \ + middle_end/clambda_primitives.cmx \ + middle_end/semantics_of_primitives.cmi +middle_end/semantics_of_primitives.cmi : \ + middle_end/clambda_primitives.cmi +middle_end/symbol.cmo : \ + middle_end/variable.cmi \ + utils/misc.cmi \ + middle_end/linkage_name.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + utils/identifiable.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/symbol.cmi +middle_end/symbol.cmx : \ + middle_end/variable.cmx \ + utils/misc.cmx \ + middle_end/linkage_name.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + utils/identifiable.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/symbol.cmi +middle_end/symbol.cmi : \ + middle_end/variable.cmi \ + middle_end/linkage_name.cmi \ + utils/identifiable.cmi \ + middle_end/compilation_unit.cmi +middle_end/variable.cmo : \ + utils/misc.cmi \ + middle_end/internal_variable_names.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + utils/identifiable.cmi \ + typing/ident.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/variable.cmi +middle_end/variable.cmx : \ + utils/misc.cmx \ + middle_end/internal_variable_names.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + utils/identifiable.cmx \ + typing/ident.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/variable.cmi +middle_end/variable.cmi : \ + middle_end/internal_variable_names.cmi \ + utils/identifiable.cmi \ + typing/ident.cmi \ + middle_end/compilation_unit.cmi +lambda/debuginfo.cmo : \ + parsing/location.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + lambda/debuginfo.cmi +lambda/debuginfo.cmx : \ + parsing/location.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + lambda/debuginfo.cmi +lambda/debuginfo.cmi : \ + parsing/location.cmi +lambda/lambda.cmo : \ + typing/types.cmi \ + typing/primitive.cmi \ + typing/path.cmi \ + utils/misc.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + parsing/asttypes.cmi \ + lambda/lambda.cmi +lambda/lambda.cmx : \ + typing/types.cmx \ + typing/primitive.cmx \ + typing/path.cmx \ + utils/misc.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + parsing/asttypes.cmi \ + lambda/lambda.cmi +lambda/lambda.cmi : \ + typing/types.cmi \ + typing/primitive.cmi \ + typing/path.cmi \ + parsing/location.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + parsing/asttypes.cmi +lambda/matching.cmo : \ + typing/types.cmi \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + lambda/switch.cmi \ + typing/printpat.cmi \ + lambda/printlambda.cmi \ + typing/primitive.cmi \ + typing/predef.cmi \ + typing/parmatch.cmi \ + utils/misc.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + utils/clflags.cmi \ + typing/btype.cmi \ + parsing/asttypes.cmi \ + lambda/matching.cmi +lambda/matching.cmx : \ + typing/types.cmx \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + lambda/switch.cmx \ + typing/printpat.cmx \ + lambda/printlambda.cmx \ + typing/primitive.cmx \ + typing/predef.cmx \ + typing/parmatch.cmx \ + utils/misc.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + utils/clflags.cmx \ + typing/btype.cmx \ + parsing/asttypes.cmi \ + lambda/matching.cmi +lambda/matching.cmi : \ + typing/typedtree.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi +lambda/printlambda.cmo : \ + typing/types.cmi \ + typing/printtyp.cmi \ + typing/primitive.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + parsing/asttypes.cmi \ + lambda/printlambda.cmi +lambda/printlambda.cmx : \ + typing/types.cmx \ + typing/printtyp.cmx \ + typing/primitive.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + parsing/asttypes.cmi \ + lambda/printlambda.cmi +lambda/printlambda.cmi : \ + typing/types.cmi \ + lambda/lambda.cmi +lambda/runtimedef.cmo : \ + lambda/runtimedef.cmi +lambda/runtimedef.cmx : \ + lambda/runtimedef.cmi +lambda/runtimedef.cmi : +lambda/simplif.cmo : \ + utils/warnings.cmi \ + typing/stypes.cmi \ + typing/primitive.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + utils/clflags.cmi \ + parsing/asttypes.cmi \ + typing/annot.cmi \ + lambda/simplif.cmi +lambda/simplif.cmx : \ + utils/warnings.cmx \ + typing/stypes.cmx \ + typing/primitive.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + utils/clflags.cmx \ + parsing/asttypes.cmi \ + typing/annot.cmi \ + lambda/simplif.cmi +lambda/simplif.cmi : \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi +lambda/switch.cmo : \ + parsing/location.cmi \ + lambda/switch.cmi +lambda/switch.cmx : \ + parsing/location.cmx \ + lambda/switch.cmi +lambda/switch.cmi : \ + parsing/location.cmi +lambda/translattribute.cmo : \ + utils/warnings.cmi \ + typing/typedtree.cmi \ + parsing/parsetree.cmi \ + utils/misc.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + utils/config.cmi \ + lambda/translattribute.cmi +lambda/translattribute.cmx : \ + utils/warnings.cmx \ + typing/typedtree.cmx \ + parsing/parsetree.cmi \ + utils/misc.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + utils/config.cmx \ + lambda/translattribute.cmi +lambda/translattribute.cmi : \ + typing/typedtree.cmi \ + parsing/parsetree.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi +lambda/translclass.cmo : \ + typing/types.cmi \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + lambda/translobj.cmi \ + lambda/translcore.cmi \ + typing/path.cmi \ + lambda/matching.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + utils/clflags.cmi \ + typing/btype.cmi \ + parsing/asttypes.cmi \ + lambda/translclass.cmi +lambda/translclass.cmx : \ + typing/types.cmx \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + lambda/translobj.cmx \ + lambda/translcore.cmx \ + typing/path.cmx \ + lambda/matching.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + utils/clflags.cmx \ + typing/btype.cmx \ + parsing/asttypes.cmi \ + lambda/translclass.cmi +lambda/translclass.cmi : \ + typing/typedtree.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + parsing/asttypes.cmi +lambda/translcore.cmo : \ + typing/types.cmi \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + typing/typecore.cmi \ + lambda/translprim.cmi \ + lambda/translobj.cmi \ + lambda/translattribute.cmi \ + typing/printtyp.cmi \ + typing/primitive.cmi \ + typing/predef.cmi \ + typing/path.cmi \ + parsing/parsetree.cmi \ + typing/parmatch.cmi \ + utils/misc.cmi \ + lambda/matching.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + utils/config.cmi \ + utils/clflags.cmi \ + typing/btype.cmi \ + parsing/asttypes.cmi \ + lambda/translcore.cmi +lambda/translcore.cmx : \ + typing/types.cmx \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + typing/typecore.cmx \ + lambda/translprim.cmx \ + lambda/translobj.cmx \ + lambda/translattribute.cmx \ + typing/printtyp.cmx \ + typing/primitive.cmx \ + typing/predef.cmx \ + typing/path.cmx \ + parsing/parsetree.cmi \ + typing/parmatch.cmx \ + utils/misc.cmx \ + lambda/matching.cmx \ + parsing/longident.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + utils/config.cmx \ + utils/clflags.cmx \ + typing/btype.cmx \ + parsing/asttypes.cmi \ + lambda/translcore.cmi +lambda/translcore.cmi : \ + typing/typedtree.cmi \ + typing/path.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + parsing/asttypes.cmi +lambda/translmod.cmo : \ + typing/types.cmi \ + typing/typedtree.cmi \ + lambda/translprim.cmi \ + lambda/translobj.cmi \ + lambda/translcore.cmi \ + lambda/translclass.cmi \ + lambda/translattribute.cmi \ + typing/primitive.cmi \ + typing/predef.cmi \ + typing/path.cmi \ + typing/mtype.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + typing/ctype.cmi \ + utils/clflags.cmi \ + parsing/asttypes.cmi \ + lambda/translmod.cmi +lambda/translmod.cmx : \ + typing/types.cmx \ + typing/typedtree.cmx \ + lambda/translprim.cmx \ + lambda/translobj.cmx \ + lambda/translcore.cmx \ + lambda/translclass.cmx \ + lambda/translattribute.cmx \ + typing/primitive.cmx \ + typing/predef.cmx \ + typing/path.cmx \ + typing/mtype.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + typing/ctype.cmx \ + utils/clflags.cmx \ + parsing/asttypes.cmi \ + lambda/translmod.cmi +lambda/translmod.cmi : \ + typing/typedtree.cmi \ + typing/primitive.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi +lambda/translobj.cmo : \ + typing/primitive.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + utils/config.cmi \ + utils/clflags.cmi \ + typing/btype.cmi \ + parsing/asttypes.cmi \ + lambda/translobj.cmi +lambda/translobj.cmx : \ + typing/primitive.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + utils/config.cmx \ + utils/clflags.cmx \ + typing/btype.cmx \ + parsing/asttypes.cmi \ + lambda/translobj.cmi +lambda/translobj.cmi : \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi +lambda/translprim.cmo : \ + typing/types.cmi \ + typing/typeopt.cmi \ + typing/typedtree.cmi \ + typing/primitive.cmi \ + typing/predef.cmi \ + typing/path.cmi \ + utils/misc.cmi \ + lambda/matching.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + utils/config.cmi \ + utils/clflags.cmi \ + parsing/asttypes.cmi \ + lambda/translprim.cmi +lambda/translprim.cmx : \ + typing/types.cmx \ + typing/typeopt.cmx \ + typing/typedtree.cmx \ + typing/primitive.cmx \ + typing/predef.cmx \ + typing/path.cmx \ + utils/misc.cmx \ + lambda/matching.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + utils/config.cmx \ utils/clflags.cmx \ - asmcomp/spill.cmi -asmcomp/spill.cmi : \ - asmcomp/mach.cmi -asmcomp/split.cmo : \ - asmcomp/reg.cmi \ + parsing/asttypes.cmi \ + lambda/translprim.cmi +lambda/translprim.cmi : \ + typing/types.cmi \ + typing/typedtree.cmi \ + typing/primitive.cmi \ + typing/path.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi +file_formats/cmi_format.cmo : \ + typing/types.cmi \ utils/misc.cmi \ - asmcomp/mach.cmi \ - asmcomp/split.cmi -asmcomp/split.cmx : \ - asmcomp/reg.cmx \ - utils/misc.cmx \ - asmcomp/mach.cmx \ - asmcomp/split.cmi -asmcomp/split.cmi : \ - asmcomp/mach.cmi -asmcomp/strmatch.cmo : \ parsing/location.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/cmm.cmi \ - asmcomp/backend_var.cmi \ - parsing/asttypes.cmi \ - asmcomp/arch.cmo \ - asmcomp/strmatch.cmi -asmcomp/strmatch.cmx : \ + utils/config.cmi \ + file_formats/cmi_format.cmi +file_formats/cmi_format.cmx : \ + typing/types.cmx \ + utils/misc.cmx \ parsing/location.cmx \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ - asmcomp/cmm.cmx \ - asmcomp/backend_var.cmx \ - parsing/asttypes.cmi \ - asmcomp/arch.cmx \ - asmcomp/strmatch.cmi -asmcomp/strmatch.cmi : \ + utils/config.cmx \ + file_formats/cmi_format.cmi +file_formats/cmi_format.cmi : \ + typing/types.cmi \ + utils/misc.cmi +file_formats/cmo_format.cmi : \ + utils/misc.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi +file_formats/cmt_format.cmo : \ + typing/types.cmi \ + typing/typedtree.cmi \ + typing/tast_mapper.cmi \ + utils/misc.cmi \ parsing/location.cmi \ - middle_end/debuginfo.cmi \ - asmcomp/cmm.cmi -asmcomp/traverse_for_exported_symbols.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - utils/misc.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - asmcomp/export_info.cmi \ - middle_end/base_types/export_id.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ - asmcomp/traverse_for_exported_symbols.cmi -asmcomp/traverse_for_exported_symbols.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - utils/misc.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - asmcomp/export_info.cmx \ - middle_end/base_types/export_id.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ - asmcomp/traverse_for_exported_symbols.cmi -asmcomp/traverse_for_exported_symbols.cmi : \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/flambda.cmi \ - asmcomp/export_info.cmi \ - middle_end/base_types/export_id.cmi \ - middle_end/base_types/closure_id.cmi -asmcomp/un_anf.cmo : \ - bytecomp/semantics_of_primitives.cmi \ - asmcomp/printclambda.cmi \ - utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/debuginfo.cmi \ + utils/load_path.cmi \ + parsing/lexer.cmi \ + typing/env.cmi \ + utils/config.cmi \ + file_formats/cmi_format.cmi \ utils/clflags.cmi \ - asmcomp/clambda.cmi \ - asmcomp/backend_var.cmi \ - parsing/asttypes.cmi \ - asmcomp/un_anf.cmi -asmcomp/un_anf.cmx : \ - bytecomp/semantics_of_primitives.cmx \ - asmcomp/printclambda.cmx \ + file_formats/cmt_format.cmi +file_formats/cmt_format.cmx : \ + typing/types.cmx \ + typing/typedtree.cmx \ + typing/tast_mapper.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/debuginfo.cmx \ + parsing/location.cmx \ + utils/load_path.cmx \ + parsing/lexer.cmx \ + typing/env.cmx \ + utils/config.cmx \ + file_formats/cmi_format.cmx \ utils/clflags.cmx \ - asmcomp/clambda.cmx \ - asmcomp/backend_var.cmx \ - parsing/asttypes.cmi \ - asmcomp/un_anf.cmi -asmcomp/un_anf.cmi : \ - asmcomp/clambda.cmi -asmcomp/x86_ast.cmi : -asmcomp/x86_dsl.cmo : \ - asmcomp/x86_proc.cmi \ - asmcomp/x86_ast.cmi \ - asmcomp/x86_dsl.cmi -asmcomp/x86_dsl.cmx : \ - asmcomp/x86_proc.cmx \ - asmcomp/x86_ast.cmi \ - asmcomp/x86_dsl.cmi -asmcomp/x86_dsl.cmi : \ - asmcomp/x86_ast.cmi -asmcomp/x86_gas.cmo : \ - asmcomp/x86_proc.cmi \ - asmcomp/x86_ast.cmi \ + file_formats/cmt_format.cmi +file_formats/cmt_format.cmi : \ + typing/types.cmi \ + typing/typedtree.cmi \ utils/misc.cmi \ - asmcomp/x86_gas.cmi -asmcomp/x86_gas.cmx : \ - asmcomp/x86_proc.cmx \ - asmcomp/x86_ast.cmi \ - utils/misc.cmx \ - asmcomp/x86_gas.cmi -asmcomp/x86_gas.cmi : \ - asmcomp/x86_ast.cmi -asmcomp/x86_masm.cmo : \ - asmcomp/x86_proc.cmi \ - asmcomp/x86_ast.cmi \ - asmcomp/x86_masm.cmi -asmcomp/x86_masm.cmx : \ - asmcomp/x86_proc.cmx \ - asmcomp/x86_ast.cmi \ - asmcomp/x86_masm.cmi -asmcomp/x86_masm.cmi : \ - asmcomp/x86_ast.cmi -asmcomp/x86_proc.cmo : \ - asmcomp/x86_ast.cmi \ + parsing/location.cmi \ + typing/env.cmi \ + file_formats/cmi_format.cmi +file_formats/cmx_format.cmi : \ + utils/misc.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/clambda.cmi +file_formats/cmxs_format.cmi : \ + utils/misc.cmi +middle_end/closure/closure.cmo : \ + utils/warnings.cmi \ + lambda/switch.cmi \ + lambda/simplif.cmi \ + middle_end/semantics_of_primitives.cmi \ + typing/primitive.cmi \ + utils/numbers.cmi \ utils/misc.cmi \ + parsing/location.cmi \ + lambda/lambda.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + lambda/debuginfo.cmi \ + middle_end/convert_primitives.cmi \ utils/config.cmi \ + middle_end/compilenv.cmi \ utils/clflags.cmi \ - utils/ccomp.cmi \ - asmcomp/x86_proc.cmi -asmcomp/x86_proc.cmx : \ - asmcomp/x86_ast.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/clambda.cmi \ + middle_end/backend_var.cmi \ + middle_end/backend_intf.cmi \ + parsing/asttypes.cmi \ + middle_end/closure/closure.cmi +middle_end/closure/closure.cmx : \ + utils/warnings.cmx \ + lambda/switch.cmx \ + lambda/simplif.cmx \ + middle_end/semantics_of_primitives.cmx \ + typing/primitive.cmx \ + utils/numbers.cmx \ utils/misc.cmx \ + parsing/location.cmx \ + lambda/lambda.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + lambda/debuginfo.cmx \ + middle_end/convert_primitives.cmx \ utils/config.cmx \ + middle_end/compilenv.cmx \ utils/clflags.cmx \ - utils/ccomp.cmx \ - asmcomp/x86_proc.cmi -asmcomp/x86_proc.cmi : \ - asmcomp/x86_ast.cmi -middle_end/alias_analysis.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda.cmi \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmi \ - middle_end/alias_analysis.cmi -middle_end/alias_analysis.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda.cmx \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmx \ - middle_end/alias_analysis.cmi -middle_end/alias_analysis.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - bytecomp/lambda.cmi \ - middle_end/flambda.cmi \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmi -middle_end/allocated_const.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/allocated_const.cmi -middle_end/allocated_const.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/allocated_const.cmi -middle_end/allocated_const.cmi : -middle_end/augment_specialised_args.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/projection.cmi \ - middle_end/pass_wrapper.cmi \ - middle_end/parameter.cmi \ + middle_end/clambda_primitives.cmx \ + middle_end/clambda.cmx \ + middle_end/backend_var.cmx \ + middle_end/backend_intf.cmi \ + parsing/asttypes.cmi \ + middle_end/closure/closure.cmi +middle_end/closure/closure.cmi : \ + lambda/lambda.cmi \ + middle_end/clambda.cmi \ + middle_end/backend_intf.cmi +middle_end/flambda/alias_analysis.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/alias_analysis.cmi +middle_end/flambda/alias_analysis.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/alias_analysis.cmi +middle_end/flambda/alias_analysis.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/flambda.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmi +middle_end/flambda/allocated_const.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/allocated_const.cmi +middle_end/flambda/allocated_const.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/allocated_const.cmi +middle_end/flambda/allocated_const.cmi : +middle_end/flambda/augment_specialised_args.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/pass_wrapper.cmi \ + middle_end/flambda/parameter.cmi \ utils/misc.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ utils/identifiable.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ middle_end/backend_intf.cmi \ - middle_end/augment_specialised_args.cmi -middle_end/augment_specialised_args.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/projection.cmx \ - middle_end/pass_wrapper.cmx \ - middle_end/parameter.cmx \ + middle_end/flambda/augment_specialised_args.cmi +middle_end/flambda/augment_specialised_args.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/pass_wrapper.cmx \ + middle_end/flambda/parameter.cmx \ utils/misc.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/inline_and_simplify_aux.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ utils/identifiable.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ middle_end/backend_intf.cmi \ - middle_end/augment_specialised_args.cmi -middle_end/augment_specialised_args.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/projection.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi -middle_end/backend_intf.cmi : \ - middle_end/base_types/symbol.cmi \ - middle_end/simple_value_approx.cmi \ - typing/ident.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/closure_conversion.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - bytecomp/simplif.cmi \ + middle_end/flambda/augment_specialised_args.cmi +middle_end/flambda/augment_specialised_args.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/build_export_info.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/traverse_for_exported_symbols.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + utils/misc.cmi \ + middle_end/flambda/invariant_params.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/find_recursive_functions.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/compilenv.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + utils/clflags.cmi \ + middle_end/backend_intf.cmi \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/build_export_info.cmi +middle_end/flambda/build_export_info.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/traverse_for_exported_symbols.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + utils/misc.cmx \ + middle_end/flambda/invariant_params.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/find_recursive_functions.cmx \ + middle_end/flambda/export_info.cmx \ + middle_end/flambda/base_types/export_id.cmx \ + middle_end/compilenv.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + utils/clflags.cmx \ + middle_end/backend_intf.cmi \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/build_export_info.cmi +middle_end/flambda/build_export_info.cmi : \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/backend_intf.cmi +middle_end/flambda/closure_conversion.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + lambda/simplif.cmi \ typing/predef.cmi \ - middle_end/parameter.cmi \ + middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ - middle_end/base_types/mutable_variable.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ utils/misc.cmi \ - middle_end/lift_code.cmi \ - bytecomp/lambda.cmi \ + middle_end/flambda/lift_code.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + utils/int_replace_polymorphic_compare.cmi \ typing/ident.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/convert_primitives.cmi \ utils/config.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/closure_conversion_aux.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/closure_conversion_aux.cmi \ utils/clflags.cmi \ + middle_end/clambda_primitives.cmi \ middle_end/backend_intf.cmi \ - middle_end/closure_conversion.cmi -middle_end/closure_conversion.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ - bytecomp/simplif.cmx \ + middle_end/flambda/closure_conversion.cmi +middle_end/flambda/closure_conversion.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + lambda/simplif.cmx \ typing/predef.cmx \ - middle_end/parameter.cmx \ + middle_end/flambda/parameter.cmx \ utils/numbers.cmx \ - middle_end/base_types/mutable_variable.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ utils/misc.cmx \ - middle_end/lift_code.cmx \ - bytecomp/lambda.cmx \ + middle_end/flambda/lift_code.cmx \ + lambda/lambda.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + utils/int_replace_polymorphic_compare.cmx \ typing/ident.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/convert_primitives.cmx \ utils/config.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/closure_conversion_aux.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/closure_conversion_aux.cmx \ utils/clflags.cmx \ + middle_end/clambda_primitives.cmx \ middle_end/backend_intf.cmi \ - middle_end/closure_conversion.cmi -middle_end/closure_conversion.cmi : \ - bytecomp/lambda.cmi \ + middle_end/flambda/closure_conversion.cmi +middle_end/flambda/closure_conversion.cmi : \ + lambda/lambda.cmi \ typing/ident.cmi \ - middle_end/flambda.cmi \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi -middle_end/closure_conversion_aux.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ +middle_end/flambda/closure_conversion_aux.cmo : \ + middle_end/variable.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ utils/numbers.cmi \ - middle_end/base_types/mutable_variable.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ utils/misc.cmi \ parsing/location.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ typing/ident.cmi \ - middle_end/closure_conversion_aux.cmi -middle_end/closure_conversion_aux.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ + middle_end/flambda/closure_conversion_aux.cmi +middle_end/flambda/closure_conversion_aux.cmx : \ + middle_end/variable.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ utils/numbers.cmx \ - middle_end/base_types/mutable_variable.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ utils/misc.cmx \ parsing/location.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ typing/ident.cmx \ - middle_end/closure_conversion_aux.cmi -middle_end/closure_conversion_aux.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/base_types/mutable_variable.cmi \ + middle_end/flambda/closure_conversion_aux.cmi +middle_end/flambda/closure_conversion_aux.cmi : \ + middle_end/variable.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ parsing/location.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/ident.cmi -middle_end/debuginfo.cmo : \ - parsing/location.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/debuginfo.cmi -middle_end/debuginfo.cmx : \ - parsing/location.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/debuginfo.cmi -middle_end/debuginfo.cmi : \ - parsing/location.cmi -middle_end/effect_analysis.cmo : \ - bytecomp/semantics_of_primitives.cmi \ - utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda.cmi \ - middle_end/effect_analysis.cmi -middle_end/effect_analysis.cmx : \ - bytecomp/semantics_of_primitives.cmx \ - utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda.cmx \ - middle_end/effect_analysis.cmi -middle_end/effect_analysis.cmi : \ - middle_end/flambda.cmi -middle_end/extract_projections.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/projection.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/freshening.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/extract_projections.cmi -middle_end/extract_projections.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/projection.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inline_and_simplify_aux.cmx \ - middle_end/freshening.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/extract_projections.cmi -middle_end/extract_projections.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/projection.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi -middle_end/find_recursive_functions.cmo : \ - middle_end/base_types/variable.cmi \ +middle_end/flambda/closure_offsets.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + utils/misc.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/closure_offsets.cmi +middle_end/flambda/closure_offsets.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + utils/misc.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/closure_offsets.cmi +middle_end/flambda/closure_offsets.cmi : \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/effect_analysis.cmo : \ + middle_end/semantics_of_primitives.cmi \ + utils/misc.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/flambda/effect_analysis.cmi +middle_end/flambda/effect_analysis.cmx : \ + middle_end/semantics_of_primitives.cmx \ + utils/misc.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/clambda_primitives.cmx \ + middle_end/flambda/effect_analysis.cmi +middle_end/flambda/effect_analysis.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/export_info.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/export_info.cmi +middle_end/flambda/export_info.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/export_id.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/export_info.cmi +middle_end/flambda/export_info.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/export_info_for_pack.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + utils/misc.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/export_info_for_pack.cmi +middle_end/flambda/export_info_for_pack.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_origin.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + utils/misc.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/export_info.cmx \ + middle_end/flambda/base_types/export_id.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/export_info_for_pack.cmi +middle_end/flambda/export_info_for_pack.cmi : \ + middle_end/flambda/export_info.cmi \ + middle_end/compilation_unit.cmi +middle_end/flambda/extract_projections.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/projection.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/freshening.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/extract_projections.cmi +middle_end/flambda/extract_projections.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/projection.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ + middle_end/flambda/freshening.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/extract_projections.cmi +middle_end/flambda/extract_projections.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/find_recursive_functions.cmo : \ + middle_end/variable.cmi \ utils/strongly_connected_components.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi \ - middle_end/find_recursive_functions.cmi -middle_end/find_recursive_functions.cmx : \ - middle_end/base_types/variable.cmx \ + middle_end/flambda/find_recursive_functions.cmi +middle_end/flambda/find_recursive_functions.cmx : \ + middle_end/variable.cmx \ utils/strongly_connected_components.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ middle_end/backend_intf.cmi \ - middle_end/find_recursive_functions.cmi -middle_end/find_recursive_functions.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/flambda.cmi \ + middle_end/flambda/find_recursive_functions.cmi +middle_end/flambda/find_recursive_functions.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi -middle_end/flambda.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/projection.cmi \ - bytecomp/printlambda.cmi \ - middle_end/parameter.cmi \ +middle_end/flambda/flambda.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/projection.cmi \ + lambda/printlambda.cmi \ + middle_end/printclambda_primitives.cmi \ + middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ - middle_end/base_types/mutable_variable.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ + lambda/debuginfo.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmi \ - middle_end/flambda.cmi -middle_end/flambda.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ - middle_end/base_types/set_of_closures_origin.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - middle_end/projection.cmx \ - bytecomp/printlambda.cmx \ - middle_end/parameter.cmx \ + middle_end/clambda_primitives.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/flambda.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + middle_end/flambda/base_types/set_of_closures_origin.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + middle_end/flambda/projection.cmx \ + lambda/printlambda.cmx \ + middle_end/printclambda_primitives.cmx \ + middle_end/flambda/parameter.cmx \ utils/numbers.cmx \ - middle_end/base_types/mutable_variable.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ + lambda/debuginfo.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmx \ - middle_end/flambda.cmi -middle_end/flambda.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/projection.cmi \ - middle_end/parameter.cmi \ + middle_end/clambda_primitives.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/flambda.cmi +middle_end/flambda/flambda.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ - middle_end/base_types/mutable_variable.cmi \ - bytecomp/lambda.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ + lambda/lambda.cmi \ utils/identifiable.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmi -middle_end/flambda_invariants.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/projection.cmi \ - bytecomp/printlambda.cmi \ - middle_end/parameter.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/clambda_primitives.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmi +middle_end/flambda/flambda_invariants.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/printclambda_primitives.cmi \ + middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ - middle_end/base_types/mutable_variable.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/clambda_primitives.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/flambda_invariants.cmi +middle_end/flambda/flambda_invariants.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + middle_end/flambda/base_types/set_of_closures_origin.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/printclambda_primitives.cmx \ + middle_end/flambda/parameter.cmx \ + utils/numbers.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/clambda_primitives.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/flambda_invariants.cmi +middle_end/flambda/flambda_invariants.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/flambda_iterators.cmo : \ + middle_end/variable.cmi \ + utils/misc.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/flambda_iterators.cmi +middle_end/flambda/flambda_iterators.cmx : \ + middle_end/variable.cmx \ + utils/misc.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/flambda_iterators.cmi +middle_end/flambda/flambda_iterators.cmi : \ + middle_end/variable.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/flambda_middle_end.cmo : \ + utils/warnings.cmi \ + middle_end/variable.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/share_constants.cmi \ + middle_end/flambda/remove_unused_program_constructs.cmi \ + middle_end/flambda/remove_unused_closure_vars.cmi \ + middle_end/flambda/ref_to_variables.cmi \ + utils/profile.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + parsing/location.cmi \ + middle_end/flambda/lift_let_to_initialize_symbol.cmi \ + middle_end/flambda/lift_constants.cmi \ + middle_end/flambda/lift_code.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify.cmi \ + middle_end/flambda/initialize_symbol_to_let_symbol.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda_invariants.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/closure_conversion.cmi \ + utils/clflags.cmi \ + middle_end/backend_intf.cmi \ + middle_end/flambda/flambda_middle_end.cmi +middle_end/flambda/flambda_middle_end.cmx : \ + utils/warnings.cmx \ + middle_end/variable.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/share_constants.cmx \ + middle_end/flambda/remove_unused_program_constructs.cmx \ + middle_end/flambda/remove_unused_closure_vars.cmx \ + middle_end/flambda/ref_to_variables.cmx \ + utils/profile.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + middle_end/flambda/lift_let_to_initialize_symbol.cmx \ + middle_end/flambda/lift_constants.cmx \ + middle_end/flambda/lift_code.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inline_and_simplify.cmx \ + middle_end/flambda/initialize_symbol_to_let_symbol.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda_invariants.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/closure_conversion.cmx \ + utils/clflags.cmx \ + middle_end/backend_intf.cmi \ + middle_end/flambda/flambda_middle_end.cmi +middle_end/flambda/flambda_middle_end.cmi : \ + lambda/lambda.cmi \ typing/ident.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmi \ - middle_end/flambda_invariants.cmi -middle_end/flambda_invariants.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ - middle_end/base_types/set_of_closures_origin.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - middle_end/projection.cmx \ - bytecomp/printlambda.cmx \ - middle_end/parameter.cmx \ + middle_end/flambda/flambda.cmi \ + middle_end/backend_intf.cmi +middle_end/flambda/flambda_to_clambda.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + typing/primitive.cmi \ + middle_end/flambda/parameter.cmi \ + utils/numbers.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ + utils/misc.cmi \ + middle_end/linkage_name.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/initialize_symbol_to_let_symbol.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/export_info.cmi \ + lambda/debuginfo.cmi \ + middle_end/compilenv.cmi \ + middle_end/flambda/closure_offsets.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + utils/clflags.cmi \ + middle_end/clambda.cmi \ + middle_end/backend_var.cmi \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/flambda_to_clambda.cmi +middle_end/flambda/flambda_to_clambda.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + typing/primitive.cmx \ + middle_end/flambda/parameter.cmx \ utils/numbers.cmx \ - middle_end/base_types/mutable_variable.cmx \ - utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - typing/ident.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmx \ - middle_end/flambda_invariants.cmi -middle_end/flambda_invariants.cmi : \ - middle_end/flambda.cmi -middle_end/flambda_iterators.cmo : \ - middle_end/base_types/variable.cmi \ - utils/misc.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda.cmi \ - middle_end/flambda_iterators.cmi -middle_end/flambda_iterators.cmx : \ - middle_end/base_types/variable.cmx \ - utils/misc.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda.cmx \ - middle_end/flambda_iterators.cmi -middle_end/flambda_iterators.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/flambda.cmi -middle_end/flambda_utils.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - bytecomp/switch.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/projection.cmi \ - middle_end/parameter.cmi \ + middle_end/flambda/base_types/mutable_variable.cmx \ + utils/misc.cmx \ + middle_end/linkage_name.cmx \ + lambda/lambda.cmx \ + middle_end/flambda/initialize_symbol_to_let_symbol.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/export_info.cmx \ + lambda/debuginfo.cmx \ + middle_end/compilenv.cmx \ + middle_end/flambda/closure_offsets.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + utils/clflags.cmx \ + middle_end/clambda.cmx \ + middle_end/backend_var.cmx \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/flambda_to_clambda.cmi +middle_end/flambda/flambda_to_clambda.cmi : \ + middle_end/symbol.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/clambda.cmi +middle_end/flambda/flambda_utils.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + lambda/switch.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ - middle_end/base_types/mutable_variable.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmi \ - middle_end/flambda_utils.cmi -middle_end/flambda_utils.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/symbol.cmx \ - bytecomp/switch.cmx \ - middle_end/base_types/static_exception.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - middle_end/projection.cmx \ - middle_end/parameter.cmx \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/clambda_primitives.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/flambda_utils.cmi +middle_end/flambda/flambda_utils.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/symbol.cmx \ + lambda/switch.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/parameter.cmx \ utils/numbers.cmx \ - middle_end/base_types/mutable_variable.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ - parsing/asttypes.cmi \ - middle_end/allocated_const.cmx \ - middle_end/flambda_utils.cmi -middle_end/flambda_utils.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - bytecomp/switch.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/projection.cmi \ - middle_end/parameter.cmi \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/clambda_primitives.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/flambda_utils.cmi +middle_end/flambda/flambda_utils.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + lambda/switch.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/parameter.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/freshening.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/projection.cmi \ - middle_end/parameter.cmi \ - middle_end/base_types/mutable_variable.cmi \ - utils/misc.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/freshening.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/parameter.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ + utils/misc.cmi \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/freshening.cmi -middle_end/freshening.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ - middle_end/projection.cmx \ - middle_end/parameter.cmx \ - middle_end/base_types/mutable_variable.cmx \ - utils/misc.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/freshening.cmi +middle_end/flambda/freshening.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/parameter.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ + utils/misc.cmx \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/freshening.cmi -middle_end/freshening.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/base_types/mutable_variable.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/inconstant_idents.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/parameter.cmi \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/freshening.cmi +middle_end/flambda/freshening.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/import_approx.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + utils/misc.cmi \ + middle_end/flambda/freshening.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/compilenv.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/import_approx.cmi +middle_end/flambda/import_approx.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + utils/misc.cmx \ + middle_end/flambda/freshening.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/export_info.cmx \ + middle_end/flambda/base_types/export_id.cmx \ + middle_end/compilenv.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/import_approx.cmi +middle_end/flambda/import_approx.cmi : \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi +middle_end/flambda/inconstant_idents.cmo : \ + middle_end/variable.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/parameter.cmi \ utils/numbers.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ middle_end/backend_intf.cmi \ parsing/asttypes.cmi \ - middle_end/inconstant_idents.cmi -middle_end/inconstant_idents.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - middle_end/parameter.cmx \ + middle_end/flambda/inconstant_idents.cmi +middle_end/flambda/inconstant_idents.cmx : \ + middle_end/variable.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + middle_end/flambda/parameter.cmx \ utils/numbers.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ middle_end/backend_intf.cmi \ parsing/asttypes.cmi \ - middle_end/inconstant_idents.cmi -middle_end/inconstant_idents.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/compilation_unit.cmi \ + middle_end/flambda/inconstant_idents.cmi +middle_end/flambda/inconstant_idents.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/compilation_unit.cmi \ middle_end/backend_intf.cmi -middle_end/initialize_symbol_to_let_symbol.cmo : \ - middle_end/base_types/variable.cmi \ - utils/misc.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda.cmi \ - middle_end/initialize_symbol_to_let_symbol.cmi -middle_end/initialize_symbol_to_let_symbol.cmx : \ - middle_end/base_types/variable.cmx \ - utils/misc.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda.cmx \ - middle_end/initialize_symbol_to_let_symbol.cmi -middle_end/initialize_symbol_to_let_symbol.cmi : \ - middle_end/flambda.cmi -middle_end/inline_and_simplify.cmo : \ +middle_end/flambda/initialize_symbol_to_let_symbol.cmo : \ + middle_end/variable.cmi \ + utils/misc.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/initialize_symbol_to_let_symbol.cmi +middle_end/flambda/initialize_symbol_to_let_symbol.cmx : \ + middle_end/variable.cmx \ + utils/misc.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/initialize_symbol_to_let_symbol.cmi +middle_end/flambda/initialize_symbol_to_let_symbol.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/inline_and_simplify.cmo : \ utils/warnings.cmi \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/unbox_specialised_args.cmi \ - middle_end/unbox_free_vars_of_closures.cmi \ - middle_end/unbox_closures.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/simplify_primitives.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/remove_unused_arguments.cmi \ - middle_end/remove_free_vars_equal_to_args.cmi \ - middle_end/projection.cmi \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/unbox_specialised_args.cmi \ + middle_end/flambda/unbox_free_vars_of_closures.cmi \ + middle_end/flambda/unbox_closures.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/simplify_primitives.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/remove_unused_arguments.cmi \ + middle_end/flambda/remove_free_vars_equal_to_args.cmi \ + middle_end/flambda/projection.cmi \ typing/predef.cmi \ - middle_end/parameter.cmi \ + middle_end/flambda/parameter.cmi \ utils/misc.cmi \ parsing/location.cmi \ - middle_end/lift_code.cmi \ - bytecomp/lambda.cmi \ - middle_end/invariant_params.cmi \ + middle_end/flambda/lift_code.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/invariant_params.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_stats.cmi \ - middle_end/inlining_decision.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_stats.cmi \ + middle_end/flambda/inlining_decision.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ typing/ident.cmi \ - middle_end/freshening.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/find_recursive_functions.cmi \ - middle_end/effect_analysis.cmi \ - middle_end/debuginfo.cmi \ + middle_end/flambda/freshening.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/find_recursive_functions.cmi \ + middle_end/flambda/effect_analysis.cmi \ + lambda/debuginfo.cmi \ utils/config.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ + middle_end/clambda_primitives.cmi \ middle_end/backend_intf.cmi \ - middle_end/allocated_const.cmi \ - middle_end/inline_and_simplify.cmi -middle_end/inline_and_simplify.cmx : \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/inline_and_simplify.cmi +middle_end/flambda/inline_and_simplify.cmx : \ utils/warnings.cmx \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/unbox_specialised_args.cmx \ - middle_end/unbox_free_vars_of_closures.cmx \ - middle_end/unbox_closures.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ - middle_end/simplify_primitives.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/remove_unused_arguments.cmx \ - middle_end/remove_free_vars_equal_to_args.cmx \ - middle_end/projection.cmx \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/unbox_specialised_args.cmx \ + middle_end/flambda/unbox_free_vars_of_closures.cmx \ + middle_end/flambda/unbox_closures.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + middle_end/flambda/simplify_primitives.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/remove_unused_arguments.cmx \ + middle_end/flambda/remove_free_vars_equal_to_args.cmx \ + middle_end/flambda/projection.cmx \ typing/predef.cmx \ - middle_end/parameter.cmx \ + middle_end/flambda/parameter.cmx \ utils/misc.cmx \ parsing/location.cmx \ - middle_end/lift_code.cmx \ - bytecomp/lambda.cmx \ - middle_end/invariant_params.cmx \ + middle_end/flambda/lift_code.cmx \ + lambda/lambda.cmx \ + middle_end/flambda/invariant_params.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_stats.cmx \ - middle_end/inlining_decision.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/inline_and_simplify_aux.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_stats.cmx \ + middle_end/flambda/inlining_decision.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ typing/ident.cmx \ - middle_end/freshening.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/find_recursive_functions.cmx \ - middle_end/effect_analysis.cmx \ - middle_end/debuginfo.cmx \ + middle_end/flambda/freshening.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/find_recursive_functions.cmx \ + middle_end/flambda/effect_analysis.cmx \ + lambda/debuginfo.cmx \ utils/config.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ + middle_end/clambda_primitives.cmx \ middle_end/backend_intf.cmi \ - middle_end/allocated_const.cmx \ - middle_end/inline_and_simplify.cmi -middle_end/inline_and_simplify.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/inline_and_simplify.cmi +middle_end/flambda/inline_and_simplify.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi -middle_end/inline_and_simplify_aux.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/projection.cmi \ - middle_end/parameter.cmi \ - middle_end/base_types/mutable_variable.cmi \ - utils/misc.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_stats.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/freshening.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ +middle_end/flambda/inline_and_simplify_aux.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/parameter.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ + utils/misc.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_stats.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/freshening.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ middle_end/backend_intf.cmi \ - middle_end/inline_and_simplify_aux.cmi -middle_end/inline_and_simplify_aux.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/static_exception.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/base_types/set_of_closures_origin.cmx \ - middle_end/projection.cmx \ - middle_end/parameter.cmx \ - middle_end/base_types/mutable_variable.cmx \ - utils/misc.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_stats.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/freshening.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmi +middle_end/flambda/inline_and_simplify_aux.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/static_exception.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_origin.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/parameter.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ + utils/misc.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_stats.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/freshening.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ middle_end/backend_intf.cmi \ - middle_end/inline_and_simplify_aux.cmi -middle_end/inline_and_simplify_aux.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/static_exception.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/projection.cmi \ - middle_end/base_types/mutable_variable.cmi \ - middle_end/inlining_stats_types.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/freshening.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi +middle_end/flambda/inline_and_simplify_aux.cmi : \ + middle_end/variable.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/static_exception.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ + middle_end/flambda/inlining_stats_types.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/freshening.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ middle_end/backend_intf.cmi -middle_end/inlining_cost.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/projection.cmi \ +middle_end/flambda/inlining_cost.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/projection.cmi \ typing/primitive.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ utils/clflags.cmi \ - middle_end/inlining_cost.cmi -middle_end/inlining_cost.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/projection.cmx \ + middle_end/clambda_primitives.cmi \ + middle_end/flambda/inlining_cost.cmi +middle_end/flambda/inlining_cost.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/projection.cmx \ typing/primitive.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ utils/clflags.cmx \ - middle_end/inlining_cost.cmi -middle_end/inlining_cost.cmi : \ - middle_end/projection.cmi \ - middle_end/flambda.cmi -middle_end/inlining_decision.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/parameter.cmi \ - utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_transforms.cmi \ - middle_end/inlining_stats_types.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi \ + middle_end/clambda_primitives.cmx \ + middle_end/flambda/inlining_cost.cmi +middle_end/flambda/inlining_cost.cmi : \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/inlining_decision.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/parameter.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_transforms.cmi \ + middle_end/flambda/inlining_stats_types.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ - middle_end/inlining_decision.cmi -middle_end/inlining_decision.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/parameter.cmx \ - utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_transforms.cmx \ - middle_end/inlining_stats_types.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/inline_and_simplify_aux.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/inlining_decision.cmi +middle_end/flambda/inlining_decision.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/parameter.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_transforms.cmx \ + middle_end/flambda/inlining_stats_types.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ - middle_end/inlining_decision.cmi -middle_end/inlining_decision.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/simple_value_approx.cmi \ - bytecomp/lambda.cmi \ - middle_end/inlining_decision_intf.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/inlining_decision_intf.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/inlining_stats.cmo : \ - utils/misc.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_stats_types.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_id.cmi \ + middle_end/flambda/inlining_decision.cmi +middle_end/flambda/inlining_decision.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/inlining_decision_intf.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/inlining_decision_intf.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/inlining_stats.cmo : \ + utils/misc.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_stats_types.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ - middle_end/inlining_stats.cmi -middle_end/inlining_stats.cmx : \ + middle_end/flambda/inlining_stats.cmi +middle_end/flambda/inlining_stats.cmx : \ utils/misc.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_stats_types.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/closure_id.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_stats_types.cmx \ + lambda/debuginfo.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ - middle_end/inlining_stats.cmi -middle_end/inlining_stats.cmi : \ - middle_end/inlining_stats_types.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/inlining_stats_types.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inlining_stats_types.cmi -middle_end/inlining_stats_types.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/inlining_stats_types.cmi -middle_end/inlining_stats_types.cmi : \ - middle_end/inlining_cost.cmi -middle_end/inlining_transforms.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/simple_value_approx.cmi \ - middle_end/projection.cmi \ - middle_end/parameter.cmi \ - bytecomp/lambda.cmi \ + middle_end/flambda/inlining_stats.cmi +middle_end/flambda/inlining_stats.cmi : \ + middle_end/flambda/inlining_stats_types.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/inlining_stats_types.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inlining_stats_types.cmi +middle_end/flambda/inlining_stats_types.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inlining_stats_types.cmi +middle_end/flambda/inlining_stats_types.cmi : \ + middle_end/flambda/inlining_cost.cmi +middle_end/flambda/inlining_transforms.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/parameter.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_decision_intf.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/inlining_transforms.cmi -middle_end/inlining_transforms.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/simple_value_approx.cmx \ - middle_end/projection.cmx \ - middle_end/parameter.cmx \ - bytecomp/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_decision_intf.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/inlining_transforms.cmi +middle_end/flambda/inlining_transforms.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/parameter.cmx \ + lambda/lambda.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_decision_intf.cmi \ - middle_end/inlining_cost.cmx \ - middle_end/inline_and_simplify_aux.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/inlining_transforms.cmi -middle_end/inlining_transforms.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/simple_value_approx.cmi \ - bytecomp/lambda.cmi \ - middle_end/inlining_decision_intf.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/int_replace_polymorphic_compare.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi -middle_end/int_replace_polymorphic_compare.cmx : \ - middle_end/int_replace_polymorphic_compare.cmi -middle_end/int_replace_polymorphic_compare.cmi : -middle_end/internal_variable_names.cmo : \ - parsing/location.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/internal_variable_names.cmi -middle_end/internal_variable_names.cmx : \ - parsing/location.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/internal_variable_names.cmi -middle_end/internal_variable_names.cmi : \ - parsing/location.cmi \ - bytecomp/lambda.cmi -middle_end/invariant_params.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/parameter.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_decision_intf.cmi \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/inlining_transforms.cmi +middle_end/flambda/inlining_transforms.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/inlining_decision_intf.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/invariant_params.cmo : \ + middle_end/variable.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/parameter.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ middle_end/backend_intf.cmi \ - middle_end/invariant_params.cmi -middle_end/invariant_params.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/parameter.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/invariant_params.cmi +middle_end/flambda/invariant_params.cmx : \ + middle_end/variable.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/parameter.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ middle_end/backend_intf.cmi \ - middle_end/invariant_params.cmi -middle_end/invariant_params.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/flambda.cmi \ + middle_end/flambda/invariant_params.cmi +middle_end/flambda/invariant_params.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi -middle_end/lift_code.cmo : \ - middle_end/base_types/variable.cmi \ +middle_end/flambda/lift_code.cmo : \ + middle_end/variable.cmi \ utils/strongly_connected_components.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/lift_code.cmi -middle_end/lift_code.cmx : \ - middle_end/base_types/variable.cmx \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/lift_code.cmi +middle_end/flambda/lift_code.cmx : \ + middle_end/variable.cmx \ utils/strongly_connected_components.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/lift_code.cmi -middle_end/lift_code.cmi : \ - middle_end/base_types/variable.cmi \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/lift_code.cmi +middle_end/flambda/lift_code.cmi : \ + middle_end/variable.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/flambda.cmi -middle_end/lift_constants.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/lift_constants.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ utils/strongly_connected_components.cmi \ - middle_end/simple_value_approx.cmi \ + middle_end/flambda/simple_value_approx.cmi \ utils/misc.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inconstant_idents.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inconstant_idents.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ middle_end/backend_intf.cmi \ parsing/asttypes.cmi \ - middle_end/allocated_const.cmi \ - middle_end/alias_analysis.cmi \ - middle_end/lift_constants.cmi -middle_end/lift_constants.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/alias_analysis.cmi \ + middle_end/flambda/lift_constants.cmi +middle_end/flambda/lift_constants.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ utils/strongly_connected_components.cmx \ - middle_end/simple_value_approx.cmx \ + middle_end/flambda/simple_value_approx.cmx \ utils/misc.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inconstant_idents.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_id.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inconstant_idents.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ middle_end/backend_intf.cmi \ parsing/asttypes.cmi \ - middle_end/allocated_const.cmx \ - middle_end/alias_analysis.cmx \ - middle_end/lift_constants.cmi -middle_end/lift_constants.cmi : \ - middle_end/flambda.cmi \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/alias_analysis.cmx \ + middle_end/flambda/lift_constants.cmi +middle_end/flambda/lift_constants.cmi : \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi -middle_end/lift_let_to_initialize_symbol.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ +middle_end/flambda/lift_let_to_initialize_symbol.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - parsing/asttypes.cmi \ - middle_end/lift_let_to_initialize_symbol.cmi -middle_end/lift_let_to_initialize_symbol.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/lift_let_to_initialize_symbol.cmi +middle_end/flambda/lift_let_to_initialize_symbol.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ - parsing/asttypes.cmi \ - middle_end/lift_let_to_initialize_symbol.cmi -middle_end/lift_let_to_initialize_symbol.cmi : \ - middle_end/flambda.cmi \ - middle_end/backend_intf.cmi -middle_end/middle_end.cmo : \ - utils/warnings.cmi \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/share_constants.cmi \ - middle_end/remove_unused_program_constructs.cmi \ - middle_end/remove_unused_closure_vars.cmi \ - middle_end/ref_to_variables.cmi \ - utils/profile.cmi \ - utils/misc.cmi \ - parsing/location.cmi \ - middle_end/lift_let_to_initialize_symbol.cmi \ - middle_end/lift_constants.cmi \ - middle_end/lift_code.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify.cmi \ - middle_end/initialize_symbol_to_let_symbol.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda_invariants.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/closure_conversion.cmi \ - utils/clflags.cmi \ - middle_end/backend_intf.cmi \ - middle_end/middle_end.cmi -middle_end/middle_end.cmx : \ - utils/warnings.cmx \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/share_constants.cmx \ - middle_end/remove_unused_program_constructs.cmx \ - middle_end/remove_unused_closure_vars.cmx \ - middle_end/ref_to_variables.cmx \ - utils/profile.cmx \ - utils/misc.cmx \ - parsing/location.cmx \ - middle_end/lift_let_to_initialize_symbol.cmx \ - middle_end/lift_constants.cmx \ - middle_end/lift_code.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/inline_and_simplify.cmx \ - middle_end/initialize_symbol_to_let_symbol.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda_invariants.cmx \ - middle_end/flambda.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/closure_conversion.cmx \ - utils/clflags.cmx \ - middle_end/backend_intf.cmi \ - middle_end/middle_end.cmi -middle_end/middle_end.cmi : \ - bytecomp/lambda.cmi \ - typing/ident.cmi \ - middle_end/flambda.cmi \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + lambda/debuginfo.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/lift_let_to_initialize_symbol.cmi +middle_end/flambda/lift_let_to_initialize_symbol.cmi : \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi -middle_end/parameter.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ +middle_end/flambda/parameter.cmo : \ + middle_end/variable.cmi \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/parameter.cmi -middle_end/parameter.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/parameter.cmi +middle_end/flambda/parameter.cmx : \ + middle_end/variable.cmx \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/parameter.cmi -middle_end/parameter.cmi : \ - middle_end/base_types/variable.cmi \ + middle_end/flambda/parameter.cmi +middle_end/flambda/parameter.cmi : \ + middle_end/variable.cmi \ utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/pass_wrapper.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ + middle_end/compilation_unit.cmi +middle_end/flambda/pass_wrapper.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ utils/clflags.cmi \ - middle_end/pass_wrapper.cmi -middle_end/pass_wrapper.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/pass_wrapper.cmi +middle_end/flambda/pass_wrapper.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ utils/clflags.cmx \ - middle_end/pass_wrapper.cmi -middle_end/pass_wrapper.cmi : -middle_end/projection.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/pass_wrapper.cmi +middle_end/flambda/pass_wrapper.cmi : +middle_end/flambda/projection.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/projection.cmi -middle_end/projection.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/projection.cmi +middle_end/flambda/projection.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/projection.cmi -middle_end/projection.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/projection.cmi +middle_end/flambda/projection.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ utils/identifiable.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/ref_to_variables.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/mutable_variable.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/ref_to_variables.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ parsing/asttypes.cmi \ - middle_end/ref_to_variables.cmi -middle_end/ref_to_variables.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/mutable_variable.cmx \ + middle_end/flambda/ref_to_variables.cmi +middle_end/flambda/ref_to_variables.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/mutable_variable.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - parsing/asttypes.cmi \ - middle_end/ref_to_variables.cmi -middle_end/ref_to_variables.cmi : \ - middle_end/flambda.cmi -middle_end/remove_free_vars_equal_to_args.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/pass_wrapper.cmi \ - middle_end/parameter.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/remove_free_vars_equal_to_args.cmi -middle_end/remove_free_vars_equal_to_args.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/pass_wrapper.cmx \ - middle_end/parameter.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/remove_free_vars_equal_to_args.cmi -middle_end/remove_free_vars_equal_to_args.cmi : \ - middle_end/flambda.cmi -middle_end/remove_unused_arguments.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/projection.cmi \ - middle_end/parameter.cmi \ - middle_end/invariant_params.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/find_recursive_functions.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/ref_to_variables.cmi +middle_end/flambda/ref_to_variables.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/remove_free_vars_equal_to_args.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/pass_wrapper.cmi \ + middle_end/flambda/parameter.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/remove_free_vars_equal_to_args.cmi +middle_end/flambda/remove_free_vars_equal_to_args.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/pass_wrapper.cmx \ + middle_end/flambda/parameter.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/remove_free_vars_equal_to_args.cmi +middle_end/flambda/remove_free_vars_equal_to_args.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/remove_unused_arguments.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/parameter.cmi \ + middle_end/flambda/invariant_params.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/find_recursive_functions.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ - middle_end/remove_unused_arguments.cmi -middle_end/remove_unused_arguments.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/projection.cmx \ - middle_end/parameter.cmx \ - middle_end/invariant_params.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/find_recursive_functions.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/remove_unused_arguments.cmi +middle_end/flambda/remove_unused_arguments.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/parameter.cmx \ + middle_end/flambda/invariant_params.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/find_recursive_functions.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ - middle_end/remove_unused_arguments.cmi -middle_end/remove_unused_arguments.cmi : \ - middle_end/flambda.cmi \ + middle_end/flambda/remove_unused_arguments.cmi +middle_end/flambda/remove_unused_arguments.cmi : \ + middle_end/flambda/flambda.cmi \ middle_end/backend_intf.cmi -middle_end/remove_unused_closure_vars.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/parameter.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/remove_unused_closure_vars.cmi -middle_end/remove_unused_closure_vars.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/parameter.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/remove_unused_closure_vars.cmi -middle_end/remove_unused_closure_vars.cmi : \ - middle_end/flambda.cmi -middle_end/remove_unused_program_constructs.cmo : \ - middle_end/base_types/symbol.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda.cmi \ - middle_end/effect_analysis.cmi \ - middle_end/remove_unused_program_constructs.cmi -middle_end/remove_unused_program_constructs.cmx : \ - middle_end/base_types/symbol.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda.cmx \ - middle_end/effect_analysis.cmx \ - middle_end/remove_unused_program_constructs.cmi -middle_end/remove_unused_program_constructs.cmi : \ - middle_end/flambda.cmi -middle_end/share_constants.cmo : \ - middle_end/base_types/symbol.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/share_constants.cmi -middle_end/share_constants.cmx : \ - middle_end/base_types/symbol.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/share_constants.cmi -middle_end/share_constants.cmi : \ - middle_end/flambda.cmi -middle_end/simple_value_approx.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/parameter.cmi \ - utils/misc.cmi \ - bytecomp/lambda.cmi \ +middle_end/flambda/remove_unused_closure_vars.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/parameter.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/remove_unused_closure_vars.cmi +middle_end/flambda/remove_unused_closure_vars.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/parameter.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/remove_unused_closure_vars.cmi +middle_end/flambda/remove_unused_closure_vars.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/remove_unused_program_constructs.cmo : \ + middle_end/symbol.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/effect_analysis.cmi \ + middle_end/flambda/remove_unused_program_constructs.cmi +middle_end/flambda/remove_unused_program_constructs.cmx : \ + middle_end/symbol.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/effect_analysis.cmx \ + middle_end/flambda/remove_unused_program_constructs.cmi +middle_end/flambda/remove_unused_program_constructs.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/share_constants.cmo : \ + middle_end/symbol.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/share_constants.cmi +middle_end/flambda/share_constants.cmx : \ + middle_end/symbol.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/share_constants.cmi +middle_end/flambda/share_constants.cmi : \ + middle_end/flambda/flambda.cmi +middle_end/flambda/simple_value_approx.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/parameter.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/freshening.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/export_id.cmi \ - middle_end/effect_analysis.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/allocated_const.cmi \ - middle_end/simple_value_approx.cmi -middle_end/simple_value_approx.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/base_types/var_within_closure.cmx \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/base_types/set_of_closures_origin.cmx \ - middle_end/base_types/set_of_closures_id.cmx \ - middle_end/parameter.cmx \ - utils/misc.cmx \ - bytecomp/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/freshening.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/flambda/effect_analysis.cmi \ + lambda/debuginfo.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/allocated_const.cmi \ + middle_end/flambda/simple_value_approx.cmi +middle_end/flambda/simple_value_approx.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/base_types/set_of_closures_origin.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + middle_end/flambda/parameter.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/freshening.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/export_id.cmx \ - middle_end/effect_analysis.cmx \ - middle_end/debuginfo.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/closure_origin.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/allocated_const.cmx \ - middle_end/simple_value_approx.cmi -middle_end/simple_value_approx.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/var_within_closure.cmi \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/base_types/set_of_closures_origin.cmi \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/parameter.cmi \ - bytecomp/lambda.cmi \ - middle_end/freshening.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/export_id.cmi \ - middle_end/debuginfo.cmi \ - middle_end/base_types/closure_origin.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/simplify_boxed_integer_ops.cmo : \ - middle_end/simplify_common.cmi \ - middle_end/simplify_boxed_integer_ops_intf.cmi \ - middle_end/simple_value_approx.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/simplify_boxed_integer_ops.cmi -middle_end/simplify_boxed_integer_ops.cmx : \ - middle_end/simplify_common.cmx \ - middle_end/simplify_boxed_integer_ops_intf.cmi \ - middle_end/simple_value_approx.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/simplify_boxed_integer_ops.cmi -middle_end/simplify_boxed_integer_ops.cmi : \ - middle_end/simplify_boxed_integer_ops_intf.cmi -middle_end/simplify_boxed_integer_ops_intf.cmi : \ - middle_end/simple_value_approx.cmi \ - bytecomp/lambda.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/flambda.cmi -middle_end/simplify_common.cmo : \ - middle_end/simple_value_approx.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/effect_analysis.cmi \ - middle_end/simplify_common.cmi -middle_end/simplify_common.cmx : \ - middle_end/simple_value_approx.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/effect_analysis.cmx \ - middle_end/simplify_common.cmi -middle_end/simplify_common.cmi : \ - middle_end/simple_value_approx.cmi \ - bytecomp/lambda.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/flambda.cmi -middle_end/simplify_primitives.cmo : \ - middle_end/base_types/tag.cmi \ - middle_end/base_types/symbol.cmi \ - middle_end/simplify_common.cmi \ - middle_end/simplify_boxed_integer_ops.cmi \ - middle_end/simple_value_approx.cmi \ - bytecomp/semantics_of_primitives.cmi \ - utils/misc.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/flambda.cmi \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/freshening.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/export_id.cmx \ + middle_end/flambda/effect_analysis.cmx \ + lambda/debuginfo.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_origin.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/allocated_const.cmx \ + middle_end/flambda/simple_value_approx.cmi +middle_end/flambda/simple_value_approx.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/parameter.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/freshening.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + lambda/debuginfo.cmi \ + middle_end/flambda/base_types/closure_origin.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/simplify_boxed_integer_ops.cmo : \ + middle_end/flambda/simplify_common.cmi \ + middle_end/flambda/simplify_boxed_integer_ops_intf.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/flambda/simplify_boxed_integer_ops.cmi +middle_end/flambda/simplify_boxed_integer_ops.cmx : \ + middle_end/flambda/simplify_common.cmx \ + middle_end/flambda/simplify_boxed_integer_ops_intf.cmi \ + middle_end/flambda/simple_value_approx.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/clambda_primitives.cmx \ + middle_end/flambda/simplify_boxed_integer_ops.cmi +middle_end/flambda/simplify_boxed_integer_ops.cmi : \ + middle_end/flambda/simplify_boxed_integer_ops_intf.cmi +middle_end/flambda/simplify_boxed_integer_ops_intf.cmi : \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/clambda_primitives.cmi +middle_end/flambda/simplify_common.cmo : \ + middle_end/flambda/simple_value_approx.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/effect_analysis.cmi \ + middle_end/flambda/simplify_common.cmi +middle_end/flambda/simplify_common.cmx : \ + middle_end/flambda/simple_value_approx.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/effect_analysis.cmx \ + middle_end/flambda/simplify_common.cmi +middle_end/flambda/simplify_common.cmi : \ + middle_end/flambda/simple_value_approx.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/simplify_primitives.cmo : \ + middle_end/flambda/base_types/tag.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simplify_common.cmi \ + middle_end/flambda/simplify_boxed_integer_ops.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/semantics_of_primitives.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/flambda.cmi \ utils/clflags.cmi \ - parsing/asttypes.cmi \ - middle_end/simplify_primitives.cmi -middle_end/simplify_primitives.cmx : \ - middle_end/base_types/tag.cmx \ - middle_end/base_types/symbol.cmx \ - middle_end/simplify_common.cmx \ - middle_end/simplify_boxed_integer_ops.cmx \ - middle_end/simple_value_approx.cmx \ - bytecomp/semantics_of_primitives.cmx \ - utils/misc.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/flambda.cmx \ + middle_end/clambda_primitives.cmi \ + parsing/asttypes.cmi \ + middle_end/flambda/simplify_primitives.cmi +middle_end/flambda/simplify_primitives.cmx : \ + middle_end/flambda/base_types/tag.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/simplify_common.cmx \ + middle_end/flambda/simplify_boxed_integer_ops.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/semantics_of_primitives.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/flambda.cmx \ utils/clflags.cmx \ + middle_end/clambda_primitives.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/simplify_primitives.cmi +middle_end/flambda/simplify_primitives.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/flambda.cmi \ + lambda/debuginfo.cmi \ + middle_end/clambda_primitives.cmi +middle_end/flambda/traverse_for_exported_symbols.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + utils/misc.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/traverse_for_exported_symbols.cmi +middle_end/flambda/traverse_for_exported_symbols.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/base_types/var_within_closure.cmx \ + middle_end/symbol.cmx \ + middle_end/flambda/simple_value_approx.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + utils/misc.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/export_info.cmx \ + middle_end/flambda/base_types/export_id.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/traverse_for_exported_symbols.cmi +middle_end/flambda/traverse_for_exported_symbols.cmi : \ + middle_end/flambda/base_types/var_within_closure.cmi \ + middle_end/symbol.cmi \ + middle_end/flambda/simple_value_approx.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/export_info.cmi \ + middle_end/flambda/base_types/export_id.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/un_anf.cmo : \ + middle_end/semantics_of_primitives.cmi \ + middle_end/printclambda.cmi \ + utils/misc.cmi \ + lambda/lambda.cmi \ + lambda/debuginfo.cmi \ + utils/clflags.cmi \ + middle_end/clambda_primitives.cmi \ + middle_end/clambda.cmi \ + middle_end/backend_var.cmi \ parsing/asttypes.cmi \ - middle_end/simplify_primitives.cmi -middle_end/simplify_primitives.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/simple_value_approx.cmi \ - bytecomp/lambda.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/flambda.cmi \ - middle_end/debuginfo.cmi -middle_end/unbox_closures.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/base_types/closure_id.cmi \ + middle_end/flambda/un_anf.cmi +middle_end/flambda/un_anf.cmx : \ + middle_end/semantics_of_primitives.cmx \ + middle_end/printclambda.cmx \ + utils/misc.cmx \ + lambda/lambda.cmx \ + lambda/debuginfo.cmx \ + utils/clflags.cmx \ + middle_end/clambda_primitives.cmx \ + middle_end/clambda.cmx \ + middle_end/backend_var.cmx \ + parsing/asttypes.cmi \ + middle_end/flambda/un_anf.cmi +middle_end/flambda/un_anf.cmi : \ + middle_end/clambda.cmi +middle_end/flambda/unbox_closures.cmo : \ + middle_end/variable.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ utils/clflags.cmi \ - middle_end/augment_specialised_args.cmi \ - middle_end/unbox_closures.cmi -middle_end/unbox_closures.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/inline_and_simplify_aux.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/base_types/closure_id.cmx \ + middle_end/flambda/augment_specialised_args.cmi \ + middle_end/flambda/unbox_closures.cmi +middle_end/flambda/unbox_closures.cmx : \ + middle_end/variable.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ utils/clflags.cmx \ - middle_end/augment_specialised_args.cmx \ - middle_end/unbox_closures.cmi -middle_end/unbox_closures.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi -middle_end/unbox_free_vars_of_closures.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/projection.cmi \ - middle_end/pass_wrapper.cmi \ + middle_end/flambda/augment_specialised_args.cmx \ + middle_end/flambda/unbox_closures.cmi +middle_end/flambda/unbox_closures.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/unbox_free_vars_of_closures.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/pass_wrapper.cmi \ utils/misc.cmi \ middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda_utils.cmi \ - middle_end/flambda_iterators.cmi \ - middle_end/flambda.cmi \ - middle_end/extract_projections.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda_utils.cmi \ + middle_end/flambda/flambda_iterators.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/extract_projections.cmi \ utils/clflags.cmi \ - middle_end/unbox_free_vars_of_closures.cmi -middle_end/unbox_free_vars_of_closures.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/projection.cmx \ - middle_end/pass_wrapper.cmx \ + middle_end/flambda/unbox_free_vars_of_closures.cmi +middle_end/flambda/unbox_free_vars_of_closures.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/pass_wrapper.cmx \ utils/misc.cmx \ middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inlining_cost.cmx \ - middle_end/inline_and_simplify_aux.cmx \ - middle_end/flambda_utils.cmx \ - middle_end/flambda_iterators.cmx \ - middle_end/flambda.cmx \ - middle_end/extract_projections.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inlining_cost.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ + middle_end/flambda/flambda_utils.cmx \ + middle_end/flambda/flambda_iterators.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/extract_projections.cmx \ utils/clflags.cmx \ - middle_end/unbox_free_vars_of_closures.cmi -middle_end/unbox_free_vars_of_closures.cmi : \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi -middle_end/unbox_specialised_args.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/projection.cmi \ - middle_end/invariant_params.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi \ - middle_end/extract_projections.cmi \ + middle_end/flambda/unbox_free_vars_of_closures.cmi +middle_end/flambda/unbox_free_vars_of_closures.cmi : \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/unbox_specialised_args.cmo : \ + middle_end/variable.cmi \ + middle_end/flambda/projection.cmi \ + middle_end/flambda/invariant_params.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi \ + middle_end/flambda/extract_projections.cmi \ utils/clflags.cmi \ - middle_end/augment_specialised_args.cmi \ - middle_end/unbox_specialised_args.cmi -middle_end/unbox_specialised_args.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/projection.cmx \ - middle_end/invariant_params.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/inline_and_simplify_aux.cmx \ - middle_end/flambda.cmx \ - middle_end/extract_projections.cmx \ + middle_end/flambda/augment_specialised_args.cmi \ + middle_end/flambda/unbox_specialised_args.cmi +middle_end/flambda/unbox_specialised_args.cmx : \ + middle_end/variable.cmx \ + middle_end/flambda/projection.cmx \ + middle_end/flambda/invariant_params.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/inline_and_simplify_aux.cmx \ + middle_end/flambda/flambda.cmx \ + middle_end/flambda/extract_projections.cmx \ utils/clflags.cmx \ - middle_end/augment_specialised_args.cmx \ - middle_end/unbox_specialised_args.cmi -middle_end/unbox_specialised_args.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/inlining_cost.cmi \ - middle_end/inline_and_simplify_aux.cmi \ - middle_end/flambda.cmi -middle_end/base_types/closure_element.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/base_types/closure_element.cmi -middle_end/base_types/closure_element.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/base_types/closure_element.cmi -middle_end/base_types/closure_element.cmi : \ - middle_end/base_types/variable.cmi \ - utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/closure_id.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/base_types/closure_element.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/base_types/closure_id.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/base_types/closure_element.cmx \ - middle_end/base_types/closure_id.cmi -middle_end/base_types/closure_id.cmi : \ - middle_end/base_types/closure_element.cmi -middle_end/base_types/closure_origin.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/base_types/closure_id.cmi \ - middle_end/base_types/closure_origin.cmi -middle_end/base_types/closure_origin.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/base_types/closure_id.cmx \ - middle_end/base_types/closure_origin.cmi -middle_end/base_types/closure_origin.cmi : \ + middle_end/flambda/augment_specialised_args.cmx \ + middle_end/flambda/unbox_specialised_args.cmi +middle_end/flambda/unbox_specialised_args.cmi : \ + middle_end/variable.cmi \ + middle_end/flambda/inlining_cost.cmi \ + middle_end/flambda/inline_and_simplify_aux.cmi \ + middle_end/flambda/flambda.cmi +middle_end/flambda/base_types/closure_element.cmo : \ + middle_end/variable.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/closure_element.cmi +middle_end/flambda/base_types/closure_element.cmx : \ + middle_end/variable.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/closure_element.cmi +middle_end/flambda/base_types/closure_element.cmi : \ + middle_end/variable.cmi \ utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/closure_id.cmi -middle_end/base_types/compilation_unit.cmo : \ - utils/misc.cmi \ - middle_end/base_types/linkage_name.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - utils/identifiable.cmi \ - typing/ident.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/compilation_unit.cmx : \ - utils/misc.cmx \ - middle_end/base_types/linkage_name.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - utils/identifiable.cmx \ - typing/ident.cmx \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/compilation_unit.cmi : \ - middle_end/base_types/linkage_name.cmi \ + middle_end/compilation_unit.cmi +middle_end/flambda/base_types/closure_id.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/closure_element.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/base_types/closure_id.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/closure_element.cmx \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/base_types/closure_id.cmi : \ + middle_end/flambda/base_types/closure_element.cmi +middle_end/flambda/base_types/closure_origin.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/closure_id.cmi \ + middle_end/flambda/base_types/closure_origin.cmi +middle_end/flambda/base_types/closure_origin.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/closure_id.cmx \ + middle_end/flambda/base_types/closure_origin.cmi +middle_end/flambda/base_types/closure_origin.cmi : \ utils/identifiable.cmi \ - typing/ident.cmi -middle_end/base_types/export_id.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/closure_id.cmi +middle_end/flambda/base_types/export_id.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/base_types/id_types.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/export_id.cmi -middle_end/base_types/export_id.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/id_types.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/export_id.cmi +middle_end/flambda/base_types/export_id.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/base_types/id_types.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/export_id.cmi -middle_end/base_types/export_id.cmi : \ - utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/id_types.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/id_types.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/export_id.cmi +middle_end/flambda/base_types/export_id.cmi : \ utils/identifiable.cmi \ - middle_end/base_types/id_types.cmi -middle_end/base_types/id_types.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ - utils/identifiable.cmx \ - middle_end/base_types/id_types.cmi -middle_end/base_types/id_types.cmi : \ - utils/identifiable.cmi -middle_end/base_types/linkage_name.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ + middle_end/compilation_unit.cmi +middle_end/flambda/base_types/id_types.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/base_types/linkage_name.cmi -middle_end/base_types/linkage_name.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/id_types.cmi +middle_end/flambda/base_types/id_types.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/base_types/linkage_name.cmi -middle_end/base_types/linkage_name.cmi : \ + middle_end/flambda/base_types/id_types.cmi +middle_end/flambda/base_types/id_types.cmi : \ utils/identifiable.cmi -middle_end/base_types/mutable_variable.cmo : \ - middle_end/base_types/variable.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/base_types/mutable_variable.cmi -middle_end/base_types/mutable_variable.cmx : \ - middle_end/base_types/variable.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/base_types/mutable_variable.cmi -middle_end/base_types/mutable_variable.cmi : \ - middle_end/base_types/variable.cmi \ +middle_end/flambda/base_types/mutable_variable.cmo : \ + middle_end/variable.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/mutable_variable.cmi +middle_end/flambda/base_types/mutable_variable.cmx : \ + middle_end/variable.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/mutable_variable.cmi +middle_end/flambda/base_types/mutable_variable.cmi : \ + middle_end/variable.cmi \ middle_end/internal_variable_names.cmi \ utils/identifiable.cmi \ typing/ident.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/set_of_closures_id.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ + middle_end/compilation_unit.cmi +middle_end/flambda/base_types/set_of_closures_id.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/base_types/id_types.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/set_of_closures_id.cmi -middle_end/base_types/set_of_closures_id.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/id_types.cmi \ + middle_end/compilation_unit.cmi \ + middle_end/flambda/base_types/set_of_closures_id.cmi +middle_end/flambda/base_types/set_of_closures_id.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/base_types/id_types.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/set_of_closures_id.cmi -middle_end/base_types/set_of_closures_id.cmi : \ + middle_end/flambda/base_types/id_types.cmx \ + middle_end/compilation_unit.cmx \ + middle_end/flambda/base_types/set_of_closures_id.cmi +middle_end/flambda/base_types/set_of_closures_id.cmi : \ utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/set_of_closures_origin.cmo : \ - middle_end/base_types/set_of_closures_id.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/base_types/set_of_closures_origin.cmi -middle_end/base_types/set_of_closures_origin.cmx : \ - middle_end/base_types/set_of_closures_id.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/base_types/set_of_closures_origin.cmi -middle_end/base_types/set_of_closures_origin.cmi : \ - middle_end/base_types/set_of_closures_id.cmi \ + middle_end/compilation_unit.cmi +middle_end/flambda/base_types/set_of_closures_origin.cmo : \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/set_of_closures_origin.cmi +middle_end/flambda/base_types/set_of_closures_origin.cmx : \ + middle_end/flambda/base_types/set_of_closures_id.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/set_of_closures_origin.cmi +middle_end/flambda/base_types/set_of_closures_origin.cmi : \ + middle_end/flambda/base_types/set_of_closures_id.cmi \ utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/static_exception.cmo : \ + middle_end/compilation_unit.cmi +middle_end/flambda/base_types/static_exception.cmo : \ utils/numbers.cmi \ - bytecomp/lambda.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/base_types/static_exception.cmi -middle_end/base_types/static_exception.cmx : \ + lambda/lambda.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/static_exception.cmi +middle_end/flambda/base_types/static_exception.cmx : \ utils/numbers.cmx \ - bytecomp/lambda.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/base_types/static_exception.cmi -middle_end/base_types/static_exception.cmi : \ + lambda/lambda.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/static_exception.cmi +middle_end/flambda/base_types/static_exception.cmi : \ utils/identifiable.cmi -middle_end/base_types/symbol.cmo : \ - middle_end/base_types/variable.cmi \ - utils/misc.cmi \ - middle_end/base_types/linkage_name.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/symbol.cmi -middle_end/base_types/symbol.cmx : \ - middle_end/base_types/variable.cmx \ - utils/misc.cmx \ - middle_end/base_types/linkage_name.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - utils/identifiable.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/symbol.cmi -middle_end/base_types/symbol.cmi : \ - middle_end/base_types/variable.cmi \ - middle_end/base_types/linkage_name.cmi \ - utils/identifiable.cmi \ - middle_end/base_types/compilation_unit.cmi -middle_end/base_types/tag.cmo : \ +middle_end/flambda/base_types/tag.cmo : \ utils/numbers.cmi \ utils/misc.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ + utils/int_replace_polymorphic_compare.cmi \ utils/identifiable.cmi \ - middle_end/base_types/tag.cmi -middle_end/base_types/tag.cmx : \ + middle_end/flambda/base_types/tag.cmi +middle_end/flambda/base_types/tag.cmx : \ utils/numbers.cmx \ utils/misc.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ + utils/int_replace_polymorphic_compare.cmx \ utils/identifiable.cmx \ - middle_end/base_types/tag.cmi -middle_end/base_types/tag.cmi : \ + middle_end/flambda/base_types/tag.cmi +middle_end/flambda/base_types/tag.cmi : \ utils/identifiable.cmi -middle_end/base_types/var_within_closure.cmo : \ - middle_end/int_replace_polymorphic_compare.cmi \ - middle_end/base_types/closure_element.cmi \ - middle_end/base_types/var_within_closure.cmi -middle_end/base_types/var_within_closure.cmx : \ - middle_end/int_replace_polymorphic_compare.cmx \ - middle_end/base_types/closure_element.cmx \ - middle_end/base_types/var_within_closure.cmi -middle_end/base_types/var_within_closure.cmi : \ - middle_end/base_types/closure_element.cmi -middle_end/base_types/variable.cmo : \ - utils/misc.cmi \ - middle_end/internal_variable_names.cmi \ - middle_end/int_replace_polymorphic_compare.cmi \ - utils/identifiable.cmi \ - typing/ident.cmi \ - middle_end/base_types/compilation_unit.cmi \ - middle_end/base_types/variable.cmi -middle_end/base_types/variable.cmx : \ - utils/misc.cmx \ - middle_end/internal_variable_names.cmx \ - middle_end/int_replace_polymorphic_compare.cmx \ - utils/identifiable.cmx \ - typing/ident.cmx \ - middle_end/base_types/compilation_unit.cmx \ - middle_end/base_types/variable.cmi -middle_end/base_types/variable.cmi : \ - middle_end/internal_variable_names.cmi \ - utils/identifiable.cmi \ - typing/ident.cmi \ - middle_end/base_types/compilation_unit.cmi +middle_end/flambda/base_types/var_within_closure.cmo : \ + utils/int_replace_polymorphic_compare.cmi \ + middle_end/flambda/base_types/closure_element.cmi \ + middle_end/flambda/base_types/var_within_closure.cmi +middle_end/flambda/base_types/var_within_closure.cmx : \ + utils/int_replace_polymorphic_compare.cmx \ + middle_end/flambda/base_types/closure_element.cmx \ + middle_end/flambda/base_types/var_within_closure.cmi +middle_end/flambda/base_types/var_within_closure.cmi : \ + middle_end/flambda/base_types/closure_element.cmi asmcomp/debug/available_regs.cmo : \ asmcomp/debug/reg_with_debug_info.cmi \ asmcomp/debug/reg_availability_set.cmi \ @@ -5283,7 +5419,7 @@ asmcomp/debug/available_regs.cmo : \ utils/misc.cmi \ asmcomp/mach.cmi \ utils/clflags.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/debug/available_regs.cmi asmcomp/debug/available_regs.cmx : \ asmcomp/debug/reg_with_debug_info.cmx \ @@ -5294,56 +5430,60 @@ asmcomp/debug/available_regs.cmx : \ utils/misc.cmx \ asmcomp/mach.cmx \ utils/clflags.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ asmcomp/debug/available_regs.cmi asmcomp/debug/available_regs.cmi : \ asmcomp/mach.cmi +asmcomp/debug/compute_ranges.cmo : \ + asmcomp/printlinear.cmi \ + utils/numbers.cmi \ + utils/misc.cmi \ + asmcomp/linearize.cmi \ + utils/int_replace_polymorphic_compare.cmi \ + asmcomp/debug/compute_ranges_intf.cmo \ + asmcomp/cmm.cmi \ + asmcomp/debug/compute_ranges.cmi +asmcomp/debug/compute_ranges.cmx : \ + asmcomp/printlinear.cmx \ + utils/numbers.cmx \ + utils/misc.cmx \ + asmcomp/linearize.cmx \ + utils/int_replace_polymorphic_compare.cmx \ + asmcomp/debug/compute_ranges_intf.cmx \ + asmcomp/cmm.cmx \ + asmcomp/debug/compute_ranges.cmi +asmcomp/debug/compute_ranges.cmi : \ + asmcomp/debug/compute_ranges_intf.cmo +asmcomp/debug/compute_ranges_intf.cmo : \ + utils/numbers.cmi \ + asmcomp/linearize.cmi \ + utils/identifiable.cmi +asmcomp/debug/compute_ranges_intf.cmx : \ + utils/numbers.cmx \ + asmcomp/linearize.cmx \ + utils/identifiable.cmx asmcomp/debug/reg_availability_set.cmo : \ asmcomp/debug/reg_with_debug_info.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/debug/reg_availability_set.cmi asmcomp/debug/reg_availability_set.cmx : \ asmcomp/debug/reg_with_debug_info.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ asmcomp/debug/reg_availability_set.cmi asmcomp/debug/reg_availability_set.cmi : \ asmcomp/debug/reg_with_debug_info.cmi \ asmcomp/reg.cmi asmcomp/debug/reg_with_debug_info.cmo : \ asmcomp/reg.cmi \ - asmcomp/backend_var.cmi \ + middle_end/backend_var.cmi \ asmcomp/debug/reg_with_debug_info.cmi asmcomp/debug/reg_with_debug_info.cmx : \ asmcomp/reg.cmx \ - asmcomp/backend_var.cmx \ + middle_end/backend_var.cmx \ asmcomp/debug/reg_with_debug_info.cmi asmcomp/debug/reg_with_debug_info.cmi : \ asmcomp/reg.cmi \ - asmcomp/backend_var.cmi -driver/compdynlink.cmi : -driver/compdynlink_common.cmo : \ - driver/compdynlink_types.cmi \ - driver/compdynlink_platform_intf.cmi \ - driver/compdynlink_common.cmi -driver/compdynlink_common.cmx : \ - driver/compdynlink_types.cmx \ - driver/compdynlink_platform_intf.cmx \ - driver/compdynlink_common.cmi -driver/compdynlink_common.cmi : \ - driver/compdynlink_platform_intf.cmi -driver/compdynlink_platform_intf.cmo : \ - driver/compdynlink_types.cmi \ - driver/compdynlink_platform_intf.cmi -driver/compdynlink_platform_intf.cmx : \ - driver/compdynlink_types.cmx \ - driver/compdynlink_platform_intf.cmi -driver/compdynlink_platform_intf.cmi : \ - driver/compdynlink_types.cmi -driver/compdynlink_types.cmo : \ - driver/compdynlink_types.cmi -driver/compdynlink_types.cmx : \ - driver/compdynlink_types.cmi -driver/compdynlink_types.cmi : + middle_end/backend_var.cmi driver/compenv.cmo : \ utils/warnings.cmi \ utils/profile.cmi \ @@ -5364,26 +5504,26 @@ driver/compenv.cmx : \ driver/compenv.cmi driver/compenv.cmi : driver/compile.cmo : \ - bytecomp/translmod.cmi \ - bytecomp/simplif.cmi \ + lambda/translmod.cmi \ + lambda/simplif.cmi \ utils/profile.cmi \ - bytecomp/printlambda.cmi \ + lambda/printlambda.cmi \ bytecomp/printinstr.cmi \ utils/misc.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ bytecomp/emitcode.cmi \ driver/compile_common.cmi \ utils/clflags.cmi \ bytecomp/bytegen.cmi \ driver/compile.cmi driver/compile.cmx : \ - bytecomp/translmod.cmx \ - bytecomp/simplif.cmx \ + lambda/translmod.cmx \ + lambda/simplif.cmx \ utils/profile.cmx \ - bytecomp/printlambda.cmx \ + lambda/printlambda.cmx \ bytecomp/printinstr.cmx \ utils/misc.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ bytecomp/emitcode.cmx \ driver/compile_common.cmx \ utils/clflags.cmx \ @@ -5467,23 +5607,6 @@ driver/compmisc.cmx : \ driver/compmisc.cmi : \ typing/env.cmi \ utils/clflags.cmi -driver/compplugin.cmo : \ - parsing/location.cmi \ - utils/load_path.cmi \ - driver/compmisc.cmi \ - driver/compenv.cmi \ - driver/compdynlink.cmi \ - utils/clflags.cmi \ - driver/compplugin.cmi -driver/compplugin.cmx : \ - parsing/location.cmx \ - utils/load_path.cmx \ - driver/compmisc.cmx \ - driver/compenv.cmx \ - driver/compdynlink.cmi \ - utils/clflags.cmx \ - driver/compplugin.cmi -driver/compplugin.cmi : driver/errors.cmo : \ parsing/location.cmi \ driver/errors.cmi @@ -5499,7 +5622,6 @@ driver/main.cmo : \ driver/main_args.cmi \ parsing/location.cmi \ utils/config.cmi \ - driver/compplugin.cmi \ driver/compmisc.cmi \ driver/compile.cmi \ driver/compenv.cmi \ @@ -5516,7 +5638,6 @@ driver/main.cmx : \ driver/main_args.cmx \ parsing/location.cmx \ utils/config.cmx \ - driver/compplugin.cmx \ driver/compmisc.cmx \ driver/compile.cmx \ driver/compenv.cmx \ @@ -5550,7 +5671,6 @@ driver/makedepend.cmo : \ parsing/lexer.cmi \ parsing/depend.cmi \ utils/config.cmi \ - driver/compplugin.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ driver/makedepend.cmi @@ -5565,35 +5685,34 @@ driver/makedepend.cmx : \ parsing/lexer.cmx \ parsing/depend.cmx \ utils/config.cmx \ - driver/compplugin.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ driver/makedepend.cmi driver/makedepend.cmi : driver/optcompile.cmo : \ - bytecomp/translmod.cmi \ - bytecomp/simplif.cmi \ + lambda/translmod.cmi \ + lambda/simplif.cmi \ utils/profile.cmi \ - bytecomp/printlambda.cmi \ + lambda/printlambda.cmi \ utils/misc.cmi \ - middle_end/middle_end.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ + middle_end/flambda/flambda_middle_end.cmi \ utils/config.cmi \ - asmcomp/compilenv.cmi \ + middle_end/compilenv.cmi \ driver/compile_common.cmi \ utils/clflags.cmi \ asmcomp/asmgen.cmi \ driver/optcompile.cmi driver/optcompile.cmx : \ - bytecomp/translmod.cmx \ - bytecomp/simplif.cmx \ + lambda/translmod.cmx \ + lambda/simplif.cmx \ utils/profile.cmx \ - bytecomp/printlambda.cmx \ + lambda/printlambda.cmx \ utils/misc.cmx \ - middle_end/middle_end.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ + middle_end/flambda/flambda_middle_end.cmx \ utils/config.cmx \ - asmcomp/compilenv.cmx \ + middle_end/compilenv.cmx \ driver/compile_common.cmx \ utils/clflags.cmx \ asmcomp/asmgen.cmx \ @@ -5619,11 +5738,10 @@ driver/optmain.cmo : \ driver/makedepend.cmi \ driver/main_args.cmi \ parsing/location.cmi \ - asmcomp/import_approx.cmi \ + middle_end/flambda/import_approx.cmi \ utils/config.cmi \ - driver/compplugin.cmi \ driver/compmisc.cmi \ - asmcomp/compilenv.cmi \ + middle_end/compilenv.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ middle_end/backend_intf.cmi \ @@ -5642,11 +5760,10 @@ driver/optmain.cmx : \ driver/makedepend.cmx \ driver/main_args.cmx \ parsing/location.cmx \ - asmcomp/import_approx.cmx \ + middle_end/flambda/import_approx.cmx \ utils/config.cmx \ - driver/compplugin.cmx \ driver/compmisc.cmx \ - asmcomp/compilenv.cmx \ + middle_end/compilenv.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ middle_end/backend_intf.cmi \ @@ -5683,17 +5800,16 @@ driver/pparse.cmx : \ parsing/ast_invariants.cmx \ driver/pparse.cmi driver/pparse.cmi : \ - parsing/parsetree.cmi \ - utils/misc.cmi + parsing/parsetree.cmi toplevel/expunge.cmo : \ bytecomp/symtable.cmi \ - bytecomp/runtimedef.cmi \ + lambda/runtimedef.cmi \ utils/misc.cmi \ typing/ident.cmi \ bytecomp/bytesections.cmi toplevel/expunge.cmx : \ bytecomp/symtable.cmx \ - bytecomp/runtimedef.cmx \ + lambda/runtimedef.cmx \ utils/misc.cmx \ typing/ident.cmx \ bytecomp/bytesections.cmx @@ -5744,7 +5860,6 @@ toplevel/opttopdirs.cmo : \ typing/env.cmi \ typing/ctype.cmi \ utils/config.cmi \ - driver/compdynlink.cmi \ utils/clflags.cmi \ asmcomp/asmlink.cmi \ toplevel/opttopdirs.cmi @@ -5760,7 +5875,6 @@ toplevel/opttopdirs.cmx : \ typing/env.cmx \ typing/ctype.cmx \ utils/config.cmx \ - driver/compdynlink.cmi \ utils/clflags.cmx \ asmcomp/asmlink.cmx \ toplevel/opttopdirs.cmi @@ -5772,12 +5886,12 @@ toplevel/opttoploop.cmo : \ typing/typemod.cmi \ typing/typedtree.cmi \ typing/typecore.cmi \ - bytecomp/translmod.cmi \ - bytecomp/simplif.cmi \ + lambda/translmod.cmi \ + lambda/simplif.cmi \ asmcomp/proc.cmi \ typing/printtyped.cmi \ typing/printtyp.cmi \ - bytecomp/printlambda.cmi \ + lambda/printlambda.cmi \ parsing/printast.cmi \ typing/predef.cmi \ parsing/pprintast.cmi \ @@ -5788,20 +5902,20 @@ toplevel/opttoploop.cmo : \ typing/outcometree.cmi \ typing/oprint.cmi \ utils/misc.cmi \ - middle_end/middle_end.cmi \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ parsing/lexer.cmi \ - bytecomp/lambda.cmi \ + lambda/lambda.cmi \ typing/includemod.cmi \ - asmcomp/import_approx.cmi \ + middle_end/flambda/import_approx.cmi \ typing/ident.cmi \ toplevel/genprintval.cmi \ + middle_end/flambda/flambda_middle_end.cmi \ typing/env.cmi \ utils/config.cmi \ driver/compmisc.cmi \ - asmcomp/compilenv.cmi \ + middle_end/compilenv.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ typing/btype.cmi \ @@ -5818,12 +5932,12 @@ toplevel/opttoploop.cmx : \ typing/typemod.cmx \ typing/typedtree.cmx \ typing/typecore.cmx \ - bytecomp/translmod.cmx \ - bytecomp/simplif.cmx \ + lambda/translmod.cmx \ + lambda/simplif.cmx \ asmcomp/proc.cmx \ typing/printtyped.cmx \ typing/printtyp.cmx \ - bytecomp/printlambda.cmx \ + lambda/printlambda.cmx \ parsing/printast.cmx \ typing/predef.cmx \ parsing/pprintast.cmx \ @@ -5834,20 +5948,20 @@ toplevel/opttoploop.cmx : \ typing/outcometree.cmi \ typing/oprint.cmx \ utils/misc.cmx \ - middle_end/middle_end.cmx \ parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ parsing/lexer.cmx \ - bytecomp/lambda.cmx \ + lambda/lambda.cmx \ typing/includemod.cmx \ - asmcomp/import_approx.cmx \ + middle_end/flambda/import_approx.cmx \ typing/ident.cmx \ toplevel/genprintval.cmx \ + middle_end/flambda/flambda_middle_end.cmx \ typing/env.cmx \ utils/config.cmx \ driver/compmisc.cmx \ - asmcomp/compilenv.cmx \ + middle_end/compilenv.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ typing/btype.cmx \ @@ -5905,9 +6019,10 @@ toplevel/topdirs.cmo : \ bytecomp/symtable.cmi \ typing/printtyp.cmi \ typing/predef.cmi \ + typing/persistent_env.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ - bytecomp/opcodes.cmo \ + bytecomp/opcodes.cmi \ utils/misc.cmi \ bytecomp/meta.cmi \ parsing/longident.cmi \ @@ -5917,9 +6032,8 @@ toplevel/topdirs.cmo : \ typing/env.cmi \ bytecomp/dll.cmi \ typing/ctype.cmi \ - utils/consistbl.cmi \ utils/config.cmi \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -5934,6 +6048,7 @@ toplevel/topdirs.cmx : \ bytecomp/symtable.cmx \ typing/printtyp.cmx \ typing/predef.cmx \ + typing/persistent_env.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ bytecomp/opcodes.cmx \ @@ -5946,9 +6061,8 @@ toplevel/topdirs.cmx : \ typing/env.cmx \ bytecomp/dll.cmx \ typing/ctype.cmx \ - utils/consistbl.cmx \ utils/config.cmx \ - bytecomp/cmo_format.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmx \ typing/btype.cmx \ parsing/asttypes.cmi \ @@ -5963,12 +6077,12 @@ toplevel/toploop.cmo : \ typing/typemod.cmi \ typing/typedtree.cmi \ typing/typecore.cmi \ - bytecomp/translmod.cmi \ + lambda/translmod.cmi \ bytecomp/symtable.cmi \ - bytecomp/simplif.cmi \ + lambda/simplif.cmi \ typing/printtyped.cmi \ typing/printtyp.cmi \ - bytecomp/printlambda.cmi \ + lambda/printlambda.cmi \ bytecomp/printinstr.cmi \ parsing/printast.cmi \ typing/predef.cmi \ @@ -5991,7 +6105,6 @@ toplevel/toploop.cmo : \ typing/env.cmi \ bytecomp/emitcode.cmi \ bytecomp/dll.cmi \ - utils/consistbl.cmi \ utils/config.cmi \ driver/compmisc.cmi \ driver/compenv.cmi \ @@ -6008,12 +6121,12 @@ toplevel/toploop.cmx : \ typing/typemod.cmx \ typing/typedtree.cmx \ typing/typecore.cmx \ - bytecomp/translmod.cmx \ + lambda/translmod.cmx \ bytecomp/symtable.cmx \ - bytecomp/simplif.cmx \ + lambda/simplif.cmx \ typing/printtyped.cmx \ typing/printtyp.cmx \ - bytecomp/printlambda.cmx \ + lambda/printlambda.cmx \ bytecomp/printinstr.cmx \ parsing/printast.cmx \ typing/predef.cmx \ @@ -6036,7 +6149,6 @@ toplevel/toploop.cmx : \ typing/env.cmx \ bytecomp/emitcode.cmx \ bytecomp/dll.cmx \ - utils/consistbl.cmx \ utils/config.cmx \ driver/compmisc.cmx \ driver/compenv.cmx \ @@ -6113,20 +6225,3 @@ toplevel/trace.cmi : \ typing/path.cmi \ parsing/longident.cmi \ typing/env.cmi -driver/compdynlink.cmx : \ - driver/compdynlink_types.cmx \ - driver/compdynlink_common.cmx \ - asmcomp/cmx_format.cmi \ - driver/compdynlink.cmi -driver/compdynlink.cmo : \ - bytecomp/symtable.cmi \ - bytecomp/opcodes.cmo \ - utils/misc.cmi \ - bytecomp/meta.cmi \ - typing/ident.cmi \ - bytecomp/dll.cmi \ - utils/config.cmi \ - driver/compdynlink_types.cmi \ - driver/compdynlink_common.cmi \ - bytecomp/cmo_format.cmi \ - driver/compdynlink.cmi diff --git a/.gitattributes b/.gitattributes index ceac151d..ce51bd79 100644 --- a/.gitattributes +++ b/.gitattributes @@ -27,6 +27,10 @@ *.png binary *.tfm binary +# configure is declared as binary so that it doesn't get included in diffs. +# This also means it will have the correct Unix line-endings, even on Windows. +/configure binary + # 'union' merge driver just unions textual content in case of conflict # http://krlmlr.github.io/using-gitattributes-to-avoid-merge-conflicts/ /.mailmap merge=union @@ -41,6 +45,7 @@ README* typo.missing-header *.adoc typo.missing-header stdlib/*.mld typo.missing-header +tools/mantis2gh_stripped.csv typo.missing-header *.adoc typo.long-line=may @@ -55,7 +60,7 @@ stdlib/*.mld typo.missing-header /tools/ci/appveyor/appveyor_build.cmd typo.very-long-line typo.missing-header typo.non-ascii /tools/ci/appveyor/appveyor_build.sh typo.non-ascii /tools/ci/inria/remove-sinh-primitive.patch typo.white-at-eol typo.missing-header typo.long-line -/tools/release-checklist typo.missing-header +/tools/release-checklist typo.missing-header typo.very-long-line # ignore auto-generated .depend files .depend typo.prune @@ -69,9 +74,6 @@ asmcomp/*/emit.mlp typo.tab=may typo.long-line=may # The build-aux directory contains bundled files so do not check it build-aux typo.prune -/config/gnu typo.prune -/config/gnu/** typo.prune - /manual typo.prune /manual/** typo.prune @@ -94,8 +96,6 @@ otherlibs/win32unix/readlink.c typo.long-line otherlibs/win32unix/stat.c typo.long-line otherlibs/win32unix/symlink.c typo.long-line -runtime/i386.S typo.long-line - stdlib/hashbang typo.white-at-eol typo.missing-lf testsuite/tests/** typo.missing-header typo.long-line=may @@ -139,7 +139,6 @@ menhir-bench.bash typo.missing-header typo.utf8 /tools/ci/appveyor/appveyor_build.cmd text eol=crlf -configure text eol=lf configure.ac text eol=lf autogen text eol=lf build-aux/compile text eol=lf @@ -147,15 +146,6 @@ build-aux/config.guess text eol=lf build-aux/config.sub text eol=lf build-aux/install text eol=lf build-aux/missing text eol=lf -config/auto-aux/hasgot text eol=lf -config/auto-aux/hasgot2 text eol=lf -config/auto-aux/runtest text eol=lf -config/auto-aux/searchpath text eol=lf -config/auto-aux/solaris-ld text eol=lf -config/auto-aux/tryassemble text eol=lf -config/auto-aux/trycompile text eol=lf -config/gnu/config.guess text eol=lf -config/gnu/config.sub text eol=lf ocamldoc/remove_DEBUG text eol=lf ocamltest/getocamloptdefaultflags text eol=lf stdlib/Compflags text eol=lf @@ -176,11 +166,7 @@ tools/markdown-add-pr-links.sh text eol=lf runtime/caml/m.h.in text eol=lf runtime/caml/s.h.in text eol=lf -# These two are cat scripts, so may not actually require this -config/auto-aux/sharpbang text eol=lf -config/auto-aux/sharpbang2 text eol=lf - -# Similarly, these are all Perl scripts, so may not actually require this +# These are all Perl scripts, so may not actually require this manual/tools/caml-tex text eol=lf manual/tools/format-intf text eol=lf manual/tools/htmlcut text eol=lf diff --git a/.gitignore b/.gitignore index 1f324126..04ddcaa0 100644 --- a/.gitignore +++ b/.gitignore @@ -67,27 +67,22 @@ _build /boot/ocamlrun /boot/camlheader +/boot/ocamlc.opt /bytecomp/runtimedef.ml /bytecomp/opcodes.ml +/bytecomp/opcodes.mli /debugger/lexer.ml /debugger/parser.ml /debugger/parser.mli /debugger/ocamldebug -/driver/compdynlink.mlopt -/driver/compdynlink.mlbyte -/driver/compdynlink.mli -/driver/compdynlink_common.ml -/driver/compdynlink_common.mli -/driver/compdynlink_platform_intf.ml -/driver/compdynlink_platform_intf.mli -/driver/compdynlink_types.ml -/driver/compdynlink_types.mli /emacs/ocamltags /emacs/*.elc +/lambda/runtimedef.ml + /lex/parser.ml /lex/parser.mli /lex/lexer.ml @@ -128,11 +123,15 @@ _build /otherlibs/dynlink/extract_crc /otherlibs/dynlink/dynlink_platform_intf.mli +/otherlibs/dynlink/byte/dynlink.mli +/otherlibs/dynlink/native/dynlink.mli +/otherlibs/dynlink/dynlink_compilerlibs/Makefile +/otherlibs/dynlink/dynlink_compilerlibs/*.ml +/otherlibs/dynlink/dynlink_compilerlibs/*.mli +/otherlibs/dynlink/dynlink_compilerlibs/.depend /otherlibs/threads/marshal.mli /otherlibs/threads/stdlib.mli /otherlibs/threads/unix.mli -/otherlibs/win32graph/graphics.ml -/otherlibs/win32graph/graphics.mli /otherlibs/win32unix/unixLabels.ml* /otherlibs/win32unix/unix.mli /otherlibs/win32unix/access.c diff --git a/.mailmap b/.mailmap index 6959fe22..d83748cc 100644 --- a/.mailmap +++ b/.mailmap @@ -47,6 +47,8 @@ Nicolás Ojeda Bär # Preferred Name Gabriel Radanne +Vincent Laviron +Jeremy Yallop ### Remembering naming preferences for contributors diff --git a/.travis.yml b/.travis.yml index 60b2d7ab..da9f2a3c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,6 +13,7 @@ #* * #************************************************************************** +dist: xenial sudo: false language: c git: @@ -35,9 +36,9 @@ matrix: - env: CI_KIND=changes - env: CI_KIND=manual - env: CI_KIND=check-typo - - env: CI_KIND=tests - allow_failures: - - env: CI_KIND=tests +# - env: CI_KIND=tests +# allow_failures: +# - env: CI_KIND=tests addons: apt: packages: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7cfbf6b2..b60089b2 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -139,6 +139,56 @@ you only see a transient failure once and your change has no reason to affect threading, it's probably not your fault. +### Benchmarking + +If your contribution can impact the performance of the code generated +by the native compiler, you can use the infrastructure that the +flambda team put together to benchmark the compiler to assess the +consequences of your contribution. It has two main accessible parts: + +- The website that hosts benchmarks results, at +[http://bench.flambda.ocamlpro.com/](http://bench.flambda.ocamlpro.com/). +It exposes two ways to compare compilers: the first, under the header +`Plot a given benchmark`, allows to select a benchmark and +see graphs plotting the evolution of the performance of the different +compilers over time. The second, under `Compare two runs`, allows +to get an overview of the differences between a reference compiler +(selected using the `ref` button) and a compiler under test (using +the `tst` button). Clicking on the `Compare` button at the bottom +right of the page will create a new page containing summaries and +raw data comparing the selected runs. + +- The git repository containing the data about which benchmarks +to run, on which compilers, at [https://github.com/OCamlPro/ocamlbench-repo]( +https://github.com/OCamlPro/ocamlbench-repo). This needs to be a valid +opam 2.0 repository, and contains the benchmarks as normal packages +and the compilers as versions of the package `ocaml-variants`. +To add a compiler to the list, you must have a publicly accessible +version of your branch (if you're making a pull request again the +compiler, you should have a branch on github that was used to make +the pull request, that you can use for this purpose). +Then, you should make a pull request against `ocamlbench-repo` +that adds a repertory in the `packages/ocaml-variants` sub-folder +which contains a single `opam` file. The contents of the file +should be inspired from the other files already present, with +the main points of interest being the `url` field, which should +point to your branch, the `build` field that should be adapted +if the features that you want to benchmark depend on configure-time +options, and the `setenv` field that can be used to pass compiler +options via the `OCAMLPARAM` environment variable. +The `trunk+flambda+opt` compiler, for instance, both uses a +`configure` option and sets the `OCAMLPARAM` variable. +The folder you add has to be named `ocaml-variants.%VERSION%+%DESCR%`, +where `%VERSION%` is the version that will be used by opam to +check compatibility with the opam packages that are needed for the +benchmarks, and `%DESCR%` should be a short description of the feature +you're benchmarking (if you're making a pull request against `ocaml`, +you can use the PR number in the description, e.g. `+gpr0000`). +Once your pull request is merged, it will likely take a few hours +until the benchmark server picks up the new definition and again +up to a few hours before the results are available on the results page. + + ## Description of the proposed change ### In the merge request interface @@ -193,12 +243,11 @@ Any user-visible change should have a `Changes` entry: - using the label "`*`" if it breaks existing programs, "`-`" otherwise -- with the issue number `PR#{N}` if from mantis, `GPR#{N}` if from github - (several numbers separated by commas can be used) +- with all relevant issue and PR numbers `#{N}`, in ascending numerical order + (separated by commas if necessary) -- maintaining the order: each section lists Mantis PRs first in ascending - numerical order, followed by Github PRs in ascending numerical order, - followed by changes that are not related to a PR. +- maintaining the order: the entries in each section should be sorted by + issue/PR number (the first of each entry, if more than one is available) - with a concise readable description of the change (possibly taken from a commit message, but it should make sense to end-users diff --git a/Changes b/Changes index 670abe75..d4b8a994 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,283 @@ +OCaml 4.09.0 +------------ + +(Changes that can break existing programs are marked with a "*") + +### Runtime system: + +* #1725, #2279: Deprecate Obj.set_tag and Obj.truncate + (Stephen Dolan, review by Gabriel Scherer, Damien Doligez and Xavier Leroy) + +* #2240: Constify "identifier" in struct custom_operations + (Cedric Cellier, review by Xavier Leroy) + +* #2293: Constify "caml_named_value" + (Stephen Dolan, review by Xavier Leroy) + +- #8787, #8788: avoid integer overflow in caml_output_value_to_bytes + (Jeremy Yallop, report by Marcello Seri) + + +- #2075, #7729: rename _T macro used to support Unicode in the (Windows) runtime + in order to avoid compiler warning + (Nicolás Ojeda Bär, review by Gabriel Scherer and David Allsopp) + +- #2250: Remove extra integer sign-extension in compare functions + (Stefan Muenzel, review by Xavier Leroy) + +- #8607: Remove obsolete macros for pre-2002 MSVC support + (Stephen Dolan, review by Nicolás Ojeda Bär and David Allsopp) + +- #8656: Fix a bug in [caml_modify_generational_global_root] + (Jacques-Henri Jourdan, review by Gabriel Scherer) + +### Standard library: + +- #2262: take precision (.) and flags ('+' and ' ') into account + in printf %F + (Pierre Roux, review by Gabriel Scherer) + +- #6148, #8596: optimize some buffer operations + (Damien Doligez, reports by John Whitington and Alain Frisch, + review by Jeremy Yallop and Gabriel Scherer) + +### Other libraries: + +* #2318: Delete the graphics library. This library is now available + as a separate "graphics" package in opam. Its new home is: + https://github.com/ocaml/graphics + (Jérémie Dimino, review by Nicolas Ojeda Bar, Xavier Leroy and + Sébastien Hinderer) + +* #2289: Delete the vmthreads library. This library was deprecated in 4.08.0. + (Jérémie Dimino) + +- #2112: Fix Thread.yield unfairness with busy threads yielding to each + other. + (Andrew Hunter, review by Jacques-Henri Jourdan, Spiros Eliopoulos, Stephen + Weeks, & Mark Shinwell) + +- #7903, #2306: Make Thread.delay interruptible by signals again + (Xavier Leroy, review by Jacques-Henri Jourdan and Edwin Török) + +- #2248: Unix alloc_sockaddr: Fix read of uninitialized memory for an + unbound Unix socket. Add support for receiving abstract (Linux) socket paths. + (Tim Cuthbertson, review by Sébastien Hinderer and Jérémie Dimino) + +### Compiler user-interface and warnings: + +* #2276: Remove support for compiler plugins and hooks (also adds + [Dynlink.unsafe_get_global_value]) + (Mark Shinwell, Xavier Clerc, review by Nicolás Ojeda Bär, + Florian Angeletti, David Allsopp and Xavier Leroy) + +- #2301: Hint on type error on int literal + (Jules Aguillon, review by Nicolás Ojeda Bär , Florian Angeletti, + Gabriel Scherer and Armaël Guéneau) + +* #2314: Remove support for gprof profiling. + (Mark Shinwell, review by Xavier Clerc and Stephen Dolan) + +- #2190: fix pretty printing (using Pprintast) of "lazy ..." patterns and + "fun (type t) -> ..." expressions. + (Nicolás Ojeda Bär, review by Gabriel Scherer) + +- #2277: Use newtype names as type variable names + The inferred type of (fun (type t) (x : t) -> x) + is now printed as ('t -> 't) rather than ('a -> 'a). + (Matthew Ryan) + + +- #2309: New options -with-runtime and -without-runtime in ocamlopt/ocamlc + that control the inclusion of the runtime system in the generated program. + (Lucas Pluvinage, review by Daniel Bünzli, Damien Doligez, David Allsopp + and Florian Angeletti) + +- #3819, #8546 more explanations and tests for illegal permutation + (Florian Angeletti, review by Gabriel Scherer) + +- #8537: fix the -runtime-variant option for bytecode + (Damien Doligez, review by David Allsopp) + +- #8541: Correctly print multi-lines locations + (Louis Roché, review by Gabriel Scherer) + +- #8579: Better error message for private constructors + of an extensible variant type + (Guillaume Bury, review by many fine eyes) + +### Code generation and optimizations: + +- #2278: Remove native code generation support for 32-bit Intel macOS, + iOS and other Darwin targets. + (Mark Shinwell, review by Nicolas Ojeda Bar and Xavier Leroy) + +- #8547: Optimize matches that are an affine function of the input. + (Stefan Muenzel, review by Alain Frisch, Gabriel Scherer) + + +- #1904, #7931: Add FreeBSD/aarch64 support + (Greg V, review by Sébastien Hinderer, Stephen Dolan, Damien Doligez + and Xavier Leroy) + +- #8507: Shorten symbol names of anonymous functions in Flambda mode + (the directory portions are now hidden) + (Mark Shinwell, review by Nicolás Ojeda Bär) + +- #8681, #8699, #8712: Fix code generation with nested let rec of functions. + (Stephen Dolan, Leo White, Gabriel Scherer and Pierre Chambart, + review by Gabriel Scherer, reports by Alexey Solovyev and Jonathan French) + +### Manual and documentation: + +- #7584, #8538: Document .cmt* files in the "overview" of ocaml{c,opt} + (Oxana Kostikova, rewiew by Florian Angeletti) + + +- #8757: Rename Pervasives to Stdlib in core library documentation. + (Ian Zimmerman, review by David Allsopp) + +- #8515: manual, precise constraints on reexported types + (Florian Angeletti, review by Gabriel Scherer) + +### Tools: + +- #2221: ocamldep will now correctly allow a .ml file in an include directory + that appears first in the search order to shadow a .mli appearing in a later + include directory. + (Nicolás Ojeda Bär, review by Florian Angeletti) + +### Internal/compiler-libs changes: + +- #1579: Add a separate types for clambda primitives + (Pierre Chambart, review by Vincent Laviron and Mark Shinwell) + +- #1965: remove loop constructors in Cmm and Mach + (Vincent Laviron) + +- #1973: fix compilation of catches with multiple handlers + (Vincent Laviron) + +- #2228, #8545: refactoring the handling of .cmi files + by moving the logic from Env to a new module Persistent_env + (Gabriel Scherer, review by Jérémie Dimino and Thomas Refis) + +- #2229: Env: remove prefix_idents cache + (Thomas Refis, review by Frédéric Bour and Gabriel Scherer) + +- #2237, #8582: Reorder linearisation of Trywith to avoid a call instruction + (Vincent Laviron and Greta Yorsh, additional review by Mark Shinwell; + fix in #8582 by Mark Shinwell, Xavier Leroy and Anil Madhavapeddy) + +- #2265: Add bytecomp/opcodes.mli + (Mark Shinwell, review by Nicolas Ojeda Bar) + +- #2268: Improve packing mechanism used for building compilerlibs modules + into the Dynlink libraries + (Mark Shinwell, Stephen Dolan, review by David Allsopp) + +- #2280: Don't make more Clambda constants after starting Cmmgen + (Mark Shinwell, review by Vincent Laviron) + +- #2281: Move some middle-end files around + (Mark Shinwell, review by Pierre Chambart and Vincent Laviron) + +- #2283: Add [is_prefix] and [find_and_chop_longest_common_prefix] to + [Misc.Stdlib.List] + (Mark Shinwell, review by Alain Frisch and Stephen Dolan) + +- #2284: Add various utility functions to [Misc] and remove functions + from [Misc.Stdlib.Option] that are now in [Stdlib.Option] + (Mark Shinwell, review by Thomas Refis) + +- #2286: Functorise [Consistbl] + (Mark Shinwell, review by Gabriel Radanne) + +- #2291: Add [Compute_ranges] pass + (Mark Shinwell, review by Vincent Laviron) + +- #2292: Add [Proc.frame_required] and [Proc.prologue_required]. + Move tail recursion label creation to [Linearize]. Correctly position + [Lprologue] relative to [Iname_for_debugger] operations. + (Mark Shinwell, review by Vincent Laviron) + +- #2308: More debugging information on [Cmm] terms + (Mark Shinwell, review by Stephen Dolan) + +- #7878, #8542: Replaced TypedtreeIter with tast_iterator + (Isaac "Izzy" Avram, review by Gabriel Scherer and Nicolás Ojeda Bär) + +- #8598: Replace "not is_nonexpansive" by "maybe_expansive". + (Thomas Refis, review by David Allsopp, Florian Angeletti, Gabriel Radanne, + Gabriel Scherer and Xavier Leroy) + +### Compiler distribution build system: + +- #2267: merge generation of header programs, also fixing parallel build on + Cygwin. + (David Allsopp, review by Sébastien Hinderer) + +- #8514: Use boot/ocamlc.opt for building, if available. + (Stephen Dolan, review by Gabriel Scherer) + +### Bug fixes: + +- #8864, #8865: Fix native compilation of left shift by (word_size - 1) + (Vincent Laviron, report by Murilo Giacometti Rocha, review by Xavier Leroy) + +- #2296: Fix parsing of hexadecimal floats with underscores in the exponent. + (Hugo Heuzard and Xavier Leroy, review by Gabriel Scherer) + +- #8800: Fix soundness bug in extension constructor inclusion + (Leo White, review by Jacques Garrigue) + +- #8848: Fix x86 stack probe CFI information in caml_c_call and + caml_call_gc + (Tom Kelly, review by Xavier Leroy) + + +- #7156, #8594: make top level use custom printers if they are available + (Andrew Litteken, report by Martin Jambon, review by Nicolás Ojeda Bär, + Thomas Refis, Armaël Guéneau, Gabriel Scherer, David Allsopp) + +- #3249: ocamlmklib should reject .cmxa files + (Xavier Leroy) + +- #7937, #2287: fix uncaught Unify exception when looking for type + declaration + (Florian Angeletti, review by Jacques Garrigue) + +- #8610, #8613: toplevel printing, consistent deduplicated name for types + (Florian Angeletti, review by Thomas Refis and Gabriel Scherer, + reported by Xavier Clerc) + +- #8635, #8636: Fix a bad side-effect of the -allow-approx option of + ocamldep. It used to turn some errors into successes + (Jérémie Dimino) + +- #8701, #8725: Variance of constrained parameters causes principality issues + (Jacques Garrigue, report by Leo White, review by Gabriel Scherer) + +- #8777(partial): fix position information in some polymorphic variant + error messages about missing tags + (Florian Angeletti, review by Thomas Refis) + +- #8779, more cautious variance computation to avoid missing cmis + (Florian Angeletti, report by Antonio Nuno Monteiro, review by Leo White) + +- #8810: Env.lookup_module: don't allow creating loops + (Thomas Refis, report by Leo White, review by Jacques Garrigue) + +- #8862, #8871: subst: preserve scopes + (Thomas Refis, report by Leo White, review by Jacques Garrigue) + +- #8921, #8924: Fix stack overflow with Flambda + (Vincent Laviron, review by Pierre Chambart and Leo White, + report by Aleksandr Kuzmenko) + +- #8944: Fix "open struct .. end" on clambda backend + (Thomas Refis, review by Leo White, report by Damon Wang and Mark Shinwell) + OCaml 4.08.1 (5 August 2019) ---------------------------- @@ -28,8 +308,6 @@ OCaml 4.08.1 (5 August 2019) OCaml 4.08.0 (13 June 2019) --------------------------- -(Changes that can break existing programs are marked with a "*") - ### Language features: - #1947: Introduce binding operators (let*, let+, and* etc.) diff --git a/HACKING.adoc b/HACKING.adoc index 3941a6f3..2958e851 100644 --- a/HACKING.adoc +++ b/HACKING.adoc @@ -124,7 +124,7 @@ link:driver/pparse.ml[]. ==== Typing -- link:typing/[] Type-checks the AST and produces a typed representation of the program -(link:parsing/typedtree.mli[] has some helpful comments). See +(link:typing/typedtree.mli[] has some helpful comments). See link:typing/HACKING.adoc[]. ==== The bytecode compiler -- link:bytecomp/[] @@ -179,13 +179,13 @@ has excellent documentation. VERSION:: version string asmcomp/:: native-code compiler and linker boot/:: bootstrap compiler + build-aux/: autotools support scripts bytecomp/:: bytecode compiler and linker compilerlibs/:: the OCaml compiler as a library - config/:: configuration files configure:: configure script + configure.ac: autoconf input file debugger/:: source-level replay debugger driver/:: driver code for the compilers - emacs/:: editing mode and debugger interface for GNU Emacs flexdll/:: git submodule -- see link:README.win32.adoc[] lex/:: lexer generator man/:: man pages @@ -243,6 +243,19 @@ bytecode runtime (which is written in C) has been built to compile the standard library and then to build a fresh compiler. Details can be found in link:BOOTSTRAP.adoc[]. +=== Speeding up builds + +Once you've built a natively-compiled `ocamlc.opt`, you can use it to +speed up future builds by copying it to `boot`: + +---- +cp ocamlc.opt boot/ +---- + +If `boot/ocamlc` changes (e.g. because you ran `make bootstrap`), then +the build will revert to the slower bytecode-compiled `ocamlc` until +you do the above step again. + === Continuous integration ==== Github's CI: Travis and AppVeyor diff --git a/INSTALL.adoc b/INSTALL.adoc index c281eeb8..2643c6f2 100644 --- a/INSTALL.adoc +++ b/INSTALL.adoc @@ -48,10 +48,6 @@ Examples: CC='gcc -m32' AS='as --32' ASPP='gcc -m32 -c' \ PARTIALLD='ld -r -melf_i386' -* For AIX 4.3 with the IBM compiler `xlc`: - - ./configure -cc "xlc_r -D_AIX43 -Wl,-bexpall,-brtl -qmaxmem=8192" - * For AIX 7.x with the IBM compiler `xlc`: ./configure CC=xlc @@ -63,9 +59,10 @@ By default, build is 32-bit. For 64-bit build, please set environment variable ` If something goes wrong during the automatic configuration, or if the generated files cause errors later on, then look at the template files: - config/Makefile-templ - config/m-templ.h - config/s-templ.h + Makefile.config.in + Makefile.common.in + runtime/caml/m.h.in + runtime/caml/s.h.in + for guidance on how to edit the generated files by hand. @@ -131,7 +128,7 @@ After installation, do *not* strip the `ocamldebug` executables. code and OCaml bytecode) and stripping erases the bytecode! Other executables such as `ocamlrun` can safely be stripped. -== If something goes wwong +== If something goes wrong Read the "common problems" and "machine-specific hints" section at the end of this file. diff --git a/Makefile b/Makefile index 83598d6c..47548c79 100644 --- a/Makefile +++ b/Makefile @@ -41,14 +41,15 @@ else LN = ln -sf endif -CAMLRUN ?= boot/ocamlrun include stdlib/StdlibModules -CAMLC=$(CAMLRUN) boot/ocamlc -g -nostdlib -I boot -use-prims runtime/primitives +CAMLC=$(BOOT_OCAMLC) -g -nostdlib -I boot -use-prims runtime/primitives CAMLOPT=$(CAMLRUN) ./ocamlopt -g -nostdlib -I stdlib -I otherlibs/dynlink ARCHES=amd64 i386 arm arm64 power s390x -INCLUDES=-I utils -I parsing -I typing -I bytecomp -I middle_end \ - -I middle_end/base_types -I asmcomp -I asmcomp/debug \ +INCLUDES=-I utils -I parsing -I typing -I bytecomp -I file_formats \ + -I lambda -I middle_end -I middle_end/closure \ + -I middle_end/flambda -I middle_end/flambda/base_types \ + -I asmcomp -I asmcomp/debug \ -I driver -I toplevel COMPFLAGS=-strict-sequence -principal -absname -w +a-4-9-40-41-42-44-45-48-66 \ @@ -77,7 +78,8 @@ UTILS=utils/config.cmo utils/build_path_prefix_map.cmo utils/misc.cmo \ utils/terminfo.cmo utils/ccomp.cmo utils/warnings.cmo \ utils/consistbl.cmo \ utils/strongly_connected_components.cmo \ - utils/targetint.cmo + utils/targetint.cmo \ + utils/int_replace_polymorphic_compare.cmo PARSING=parsing/location.cmo parsing/longident.cmo \ parsing/docstrings.cmo parsing/syntaxerr.cmo \ @@ -92,12 +94,13 @@ TYPING=typing/ident.cmo typing/path.cmo \ typing/primitive.cmo typing/types.cmo \ typing/btype.cmo typing/oprint.cmo \ typing/subst.cmo typing/predef.cmo \ - typing/datarepr.cmo typing/cmi_format.cmo typing/env.cmo \ + typing/datarepr.cmo file_formats/cmi_format.cmo \ + typing/persistent_env.cmo typing/env.cmo \ typing/typedtree.cmo typing/printtyped.cmo typing/ctype.cmo \ typing/printtyp.cmo typing/includeclass.cmo \ typing/mtype.cmo typing/envaux.cmo typing/includecore.cmo \ - typing/typedtreeIter.cmo typing/tast_mapper.cmo \ - typing/cmt_format.cmo typing/untypeast.cmo \ + typing/tast_iterator.cmo typing/tast_mapper.cmo \ + file_formats/cmt_format.cmo typing/untypeast.cmo \ typing/includemod.cmo typing/typetexp.cmo typing/printpat.cmo \ typing/parmatch.cmo typing/stypes.cmo \ typing/typedecl_properties.cmo typing/typedecl_variance.cmo \ @@ -106,25 +109,24 @@ TYPING=typing/ident.cmo typing/path.cmo \ typing/rec_check.cmo typing/typecore.cmo typing/typeclass.cmo \ typing/typemod.cmo -COMP=bytecomp/lambda.cmo bytecomp/printlambda.cmo \ - bytecomp/semantics_of_primitives.cmo \ - bytecomp/switch.cmo bytecomp/matching.cmo \ - bytecomp/translobj.cmo bytecomp/translattribute.cmo \ - bytecomp/translprim.cmo bytecomp/translcore.cmo \ - bytecomp/translclass.cmo bytecomp/translmod.cmo \ - bytecomp/simplif.cmo bytecomp/runtimedef.cmo \ +LAMBDA=lambda/debuginfo.cmo \ + lambda/lambda.cmo lambda/printlambda.cmo \ + lambda/switch.cmo lambda/matching.cmo \ + lambda/translobj.cmo lambda/translattribute.cmo \ + lambda/translprim.cmo lambda/translcore.cmo \ + lambda/translclass.cmo lambda/translmod.cmo \ + lambda/simplif.cmo lambda/runtimedef.cmo + +COMP=\ bytecomp/meta.cmo bytecomp/opcodes.cmo \ bytecomp/bytesections.cmo bytecomp/dll.cmo \ bytecomp/symtable.cmo \ driver/pparse.cmo driver/main_args.cmo \ driver/compenv.cmo driver/compmisc.cmo \ - driver/compdynlink_types.cmo driver/compdynlink_platform_intf.cmo \ - driver/compdynlink_common.cmo driver/compdynlink.cmo \ - driver/compplugin.cmo driver/makedepend.cmo \ + driver/makedepend.cmo \ driver/compile_common.cmo - -COMMON=$(UTILS) $(PARSING) $(TYPING) $(COMP) +COMMON=$(UTILS) $(PARSING) $(TYPING) $(LAMBDA) $(COMP) BYTECOMP=bytecomp/instruct.cmo bytecomp/bytegen.cmo \ bytecomp/printinstr.cmo bytecomp/emitcode.cmo \ @@ -152,24 +154,14 @@ endif ASMCOMP=\ $(ARCH_SPECIFIC_ASMCOMP) \ asmcomp/arch.cmo \ - asmcomp/backend_var.cmo \ asmcomp/cmm.cmo asmcomp/printcmm.cmo \ asmcomp/reg.cmo asmcomp/debug/reg_with_debug_info.cmo \ asmcomp/debug/reg_availability_set.cmo \ asmcomp/mach.cmo asmcomp/proc.cmo \ - asmcomp/clambda.cmo asmcomp/printclambda.cmo \ - asmcomp/export_info.cmo \ - asmcomp/export_info_for_pack.cmo \ - asmcomp/compilenv.cmo \ - asmcomp/closure.cmo \ - asmcomp/traverse_for_exported_symbols.cmo \ - asmcomp/build_export_info.cmo \ - asmcomp/closure_offsets.cmo \ - asmcomp/flambda_to_clambda.cmo \ - asmcomp/import_approx.cmo \ - asmcomp/un_anf.cmo \ asmcomp/afl_instrument.cmo \ - asmcomp/strmatch.cmo asmcomp/cmmgen.cmo \ + asmcomp/strmatch.cmo \ + asmcomp/cmmgen_state.cmo \ + asmcomp/cmmgen.cmo \ asmcomp/interval.cmo \ asmcomp/printmach.cmo asmcomp/selectgen.cmo \ asmcomp/spacetime_profiling.cmo asmcomp/selection.cmo \ @@ -183,6 +175,8 @@ ASMCOMP=\ asmcomp/deadcode.cmo \ asmcomp/printlinear.cmo asmcomp/linearize.cmo \ asmcomp/debug/available_regs.cmo \ + asmcomp/debug/compute_ranges_intf.cmo \ + asmcomp/debug/compute_ranges.cmo \ asmcomp/schedgen.cmo asmcomp/scheduling.cmo \ asmcomp/branch_relaxation_intf.cmo \ asmcomp/branch_relaxation.cmo \ @@ -190,68 +184,96 @@ ASMCOMP=\ asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo asmcomp/asmpackager.cmo \ driver/opterrors.cmo driver/optcompile.cmo +# Files under middle_end/ are not to reference files under asmcomp/. +# This ensures that the middle end can be linked (e.g. for objinfo) even when +# the native code compiler is not present for some particular target. + +MIDDLE_END_CLOSURE=\ + middle_end/closure/closure.cmo + +# Owing to dependencies through [Compilenv], which would be +# difficult to remove, some of the lower parts of Flambda (anything that is +# saved in a .cmx file) have to be included in the [MIDDLE_END] stanza, below. +MIDDLE_END_FLAMBDA=\ + middle_end/flambda/import_approx.cmo \ + middle_end/flambda/lift_code.cmo \ + middle_end/flambda/closure_conversion_aux.cmo \ + middle_end/flambda/closure_conversion.cmo \ + middle_end/flambda/initialize_symbol_to_let_symbol.cmo \ + middle_end/flambda/lift_let_to_initialize_symbol.cmo \ + middle_end/flambda/find_recursive_functions.cmo \ + middle_end/flambda/invariant_params.cmo \ + middle_end/flambda/inconstant_idents.cmo \ + middle_end/flambda/alias_analysis.cmo \ + middle_end/flambda/lift_constants.cmo \ + middle_end/flambda/share_constants.cmo \ + middle_end/flambda/simplify_common.cmo \ + middle_end/flambda/remove_unused_arguments.cmo \ + middle_end/flambda/remove_unused_closure_vars.cmo \ + middle_end/flambda/remove_unused_program_constructs.cmo \ + middle_end/flambda/simplify_boxed_integer_ops.cmo \ + middle_end/flambda/simplify_primitives.cmo \ + middle_end/flambda/inlining_stats_types.cmo \ + middle_end/flambda/inlining_stats.cmo \ + middle_end/flambda/inline_and_simplify_aux.cmo \ + middle_end/flambda/remove_free_vars_equal_to_args.cmo \ + middle_end/flambda/extract_projections.cmo \ + middle_end/flambda/augment_specialised_args.cmo \ + middle_end/flambda/unbox_free_vars_of_closures.cmo \ + middle_end/flambda/unbox_specialised_args.cmo \ + middle_end/flambda/unbox_closures.cmo \ + middle_end/flambda/inlining_transforms.cmo \ + middle_end/flambda/inlining_decision.cmo \ + middle_end/flambda/inline_and_simplify.cmo \ + middle_end/flambda/ref_to_variables.cmo \ + middle_end/flambda/flambda_invariants.cmo \ + middle_end/flambda/traverse_for_exported_symbols.cmo \ + middle_end/flambda/build_export_info.cmo \ + middle_end/flambda/closure_offsets.cmo \ + middle_end/flambda/un_anf.cmo \ + middle_end/flambda/flambda_to_clambda.cmo \ + middle_end/flambda/flambda_middle_end.cmo + MIDDLE_END=\ - middle_end/int_replace_polymorphic_compare.cmo \ - middle_end/debuginfo.cmo \ - middle_end/base_types/tag.cmo \ - middle_end/base_types/linkage_name.cmo \ - middle_end/base_types/compilation_unit.cmo \ middle_end/internal_variable_names.cmo \ - middle_end/base_types/variable.cmo \ - middle_end/base_types/mutable_variable.cmo \ - middle_end/base_types/id_types.cmo \ - middle_end/base_types/set_of_closures_id.cmo \ - middle_end/base_types/set_of_closures_origin.cmo \ - middle_end/base_types/closure_element.cmo \ - middle_end/base_types/closure_id.cmo \ - middle_end/base_types/closure_origin.cmo \ - middle_end/base_types/var_within_closure.cmo \ - middle_end/base_types/static_exception.cmo \ - middle_end/base_types/export_id.cmo \ - middle_end/base_types/symbol.cmo \ - middle_end/pass_wrapper.cmo \ - middle_end/allocated_const.cmo \ - middle_end/parameter.cmo \ - middle_end/projection.cmo \ - middle_end/flambda.cmo \ - middle_end/flambda_iterators.cmo \ - middle_end/flambda_utils.cmo \ - middle_end/inlining_cost.cmo \ - middle_end/effect_analysis.cmo \ - middle_end/freshening.cmo \ - middle_end/simple_value_approx.cmo \ - middle_end/lift_code.cmo \ - middle_end/closure_conversion_aux.cmo \ - middle_end/closure_conversion.cmo \ - middle_end/initialize_symbol_to_let_symbol.cmo \ - middle_end/lift_let_to_initialize_symbol.cmo \ - middle_end/find_recursive_functions.cmo \ - middle_end/invariant_params.cmo \ - middle_end/inconstant_idents.cmo \ - middle_end/alias_analysis.cmo \ - middle_end/lift_constants.cmo \ - middle_end/share_constants.cmo \ - middle_end/simplify_common.cmo \ - middle_end/remove_unused_arguments.cmo \ - middle_end/remove_unused_closure_vars.cmo \ - middle_end/remove_unused_program_constructs.cmo \ - middle_end/simplify_boxed_integer_ops.cmo \ - middle_end/simplify_primitives.cmo \ - middle_end/inlining_stats_types.cmo \ - middle_end/inlining_stats.cmo \ - middle_end/inline_and_simplify_aux.cmo \ - middle_end/remove_free_vars_equal_to_args.cmo \ - middle_end/extract_projections.cmo \ - middle_end/augment_specialised_args.cmo \ - middle_end/unbox_free_vars_of_closures.cmo \ - middle_end/unbox_specialised_args.cmo \ - middle_end/unbox_closures.cmo \ - middle_end/inlining_transforms.cmo \ - middle_end/inlining_decision.cmo \ - middle_end/inline_and_simplify.cmo \ - middle_end/ref_to_variables.cmo \ - middle_end/flambda_invariants.cmo \ - middle_end/middle_end.cmo + middle_end/linkage_name.cmo \ + middle_end/compilation_unit.cmo \ + middle_end/variable.cmo \ + middle_end/flambda/base_types/closure_element.cmo \ + middle_end/flambda/base_types/closure_id.cmo \ + middle_end/symbol.cmo \ + middle_end/backend_var.cmo \ + middle_end/clambda_primitives.cmo \ + middle_end/printclambda_primitives.cmo \ + middle_end/clambda.cmo \ + middle_end/printclambda.cmo \ + middle_end/semantics_of_primitives.cmo \ + middle_end/convert_primitives.cmo \ + middle_end/flambda/base_types/id_types.cmo \ + middle_end/flambda/base_types/export_id.cmo \ + middle_end/flambda/base_types/tag.cmo \ + middle_end/flambda/base_types/mutable_variable.cmo \ + middle_end/flambda/base_types/set_of_closures_id.cmo \ + middle_end/flambda/base_types/set_of_closures_origin.cmo \ + middle_end/flambda/base_types/closure_origin.cmo \ + middle_end/flambda/base_types/var_within_closure.cmo \ + middle_end/flambda/base_types/static_exception.cmo \ + middle_end/flambda/pass_wrapper.cmo \ + middle_end/flambda/allocated_const.cmo \ + middle_end/flambda/parameter.cmo \ + middle_end/flambda/projection.cmo \ + middle_end/flambda/flambda.cmo \ + middle_end/flambda/flambda_iterators.cmo \ + middle_end/flambda/flambda_utils.cmo \ + middle_end/flambda/freshening.cmo \ + middle_end/flambda/effect_analysis.cmo \ + middle_end/flambda/inlining_cost.cmo \ + middle_end/flambda/simple_value_approx.cmo \ + middle_end/flambda/export_info.cmo \ + middle_end/flambda/export_info_for_pack.cmo \ + middle_end/compilenv.cmo \ + $(MIDDLE_END_CLOSURE) \ + $(MIDDLE_END_FLAMBDA) OPTCOMP=$(MIDDLE_END) $(ASMCOMP) @@ -323,7 +345,7 @@ coldstart: $(MAKE) -C runtime $(BOOT_FLEXLINK_CMD) all cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) $(MAKE) -C stdlib $(BOOT_FLEXLINK_CMD) \ - COMPILER="../boot/ocamlc -use-prims ../runtime/primitives" all + CAMLC='$$(BOOT_OCAMLC) -use-prims ../runtime/primitives' all cd stdlib; cp $(LIBFILES) ../boot cd boot; $(LN) ../runtime/libcamlrun.$(A) . @@ -474,11 +496,12 @@ flexdll: flexdll/Makefile flexlink flexlink: flexdll/Makefile $(MAKE) -C runtime BOOTSTRAPPING_FLEXLINK=yes ocamlrun$(EXE) cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) - $(MAKE) -C stdlib COMPILER=../boot/ocamlc stdlib.cma std_exit.cmo - cd stdlib && cp stdlib.cma std_exit.cmo *.cmi ../boot + $(MAKE) -C stdlib COMPILER=../boot/ocamlc \ + $(filter-out *.cmi,$(LIBFILES)) + cd stdlib && cp $(LIBFILES) ../boot/ $(MAKE) -C flexdll MSVC_DETECT=0 OCAML_CONFIG_FILE=../Makefile.config \ CHAINS=$(FLEXDLL_CHAIN) NATDYNLINK=false \ - OCAMLOPT="../boot/ocamlrun ../boot/ocamlc -I ../boot" \ + OCAMLOPT="../boot/ocamlrun ../boot/ocamlc -nostdlib -I ../boot" \ flexlink.exe $(MAKE) -C runtime clean $(MAKE) partialclean @@ -489,7 +512,8 @@ flexlink.opt: mv flexlink.exe flexlink && \ ($(MAKE) OCAML_FLEXLINK="../boot/ocamlrun ./flexlink" MSVC_DETECT=0 \ OCAML_CONFIG_FILE=../Makefile.config \ - OCAMLOPT="../ocamlopt.opt -I ../stdlib" flexlink.exe || \ + OCAMLOPT="../ocamlopt.opt -nostdlib -I ../stdlib" \ + flexlink.exe || \ (mv flexlink flexlink.exe && false)) && \ mv flexlink.exe flexlink.opt && \ mv flexlink flexlink.exe @@ -499,8 +523,7 @@ INSTALL_FLEXDLLDIR=$(INSTALL_LIBDIR)/flexdll .PHONY: install-flexdll install-flexdll: - cat stdlib/camlheader flexdll/flexlink.exe > \ - "$(INSTALL_BINDIR)/flexlink.exe" + $(INSTALL_PROG) flexdll/flexlink.exe "$(INSTALL_BINDIR)/flexlink$(EXE)" ifneq "$(filter-out mingw,$(TOOLCHAIN))" "" $(INSTALL_DATA) flexdll/default$(filter-out _i386,_$(ARCH)).manifest \ "$(INSTALL_BINDIR)/" @@ -535,6 +558,8 @@ endif parsing/*.cmi \ typing/*.cmi \ bytecomp/*.cmi \ + file_formats/*.cmi \ + lambda/*.cmi \ driver/*.cmi \ toplevel/*.cmi \ "$(INSTALL_COMPLIBDIR)" @@ -543,6 +568,8 @@ ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" utils/*.cmt utils/*.cmti utils/*.mli \ parsing/*.cmt parsing/*.cmti parsing/*.mli \ typing/*.cmt typing/*.cmti typing/*.mli \ + file_formats/*.cmt file_formats/*.cmti file_formats/*.mli \ + lambda/*.cmt lambda/*.cmti lambda/*.mli \ bytecomp/*.cmt bytecomp/*.cmti bytecomp/*.mli \ driver/*.cmt driver/*.cmti driver/*.mli \ toplevel/*.cmt toplevel/*.cmti toplevel/*.mli \ @@ -608,24 +635,46 @@ endif middle_end/*.cmi \ "$(INSTALL_COMPLIBDIR)" $(INSTALL_DATA) \ - middle_end/base_types/*.cmi \ + middle_end/closure/*.cmi \ + "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + middle_end/flambda/*.cmi \ + "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + middle_end/flambda/base_types/*.cmi \ "$(INSTALL_COMPLIBDIR)" $(INSTALL_DATA) \ asmcomp/*.cmi \ "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + asmcomp/debug/*.cmi \ + "$(INSTALL_COMPLIBDIR)" ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" $(INSTALL_DATA) \ middle_end/*.cmt middle_end/*.cmti \ middle_end/*.mli \ "$(INSTALL_COMPLIBDIR)" $(INSTALL_DATA) \ - middle_end/base_types/*.cmt middle_end/base_types/*.cmti \ - middle_end/base_types/*.mli \ + middle_end/closure/*.cmt middle_end/closure/*.cmti \ + middle_end/closure/*.mli \ + "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + middle_end/flambda/*.cmt middle_end/flambda/*.cmti \ + middle_end/flambda/*.mli \ + "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + middle_end/flambda/base_types/*.cmt \ + middle_end/flambda/base_types/*.cmti \ + middle_end/flambda/base_types/*.mli \ "$(INSTALL_COMPLIBDIR)" $(INSTALL_DATA) \ asmcomp/*.cmt asmcomp/*.cmti \ asmcomp/*.mli \ "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + asmcomp/debug/*.cmt asmcomp/debug/*.cmti \ + asmcomp/debug/*.mli \ + "$(INSTALL_COMPLIBDIR)" endif $(INSTALL_DATA) \ compilerlibs/ocamloptcomp.cma $(OPTSTART) \ @@ -664,8 +713,14 @@ installoptopt: $(LN) ocamllex.opt$(EXE) ocamllex$(EXE) $(INSTALL_DATA) \ utils/*.cmx parsing/*.cmx typing/*.cmx bytecomp/*.cmx \ + file_formats/*.cmx \ + lambda/*.cmx \ driver/*.cmx asmcomp/*.cmx middle_end/*.cmx \ - middle_end/base_types/*.cmx "$(INSTALL_COMPLIBDIR)" + middle_end/closure/*.cmx \ + middle_end/flambda/*.cmx \ + middle_end/flambda/base_types/*.cmx \ + asmcomp/debug/*.cmx \ + "$(INSTALL_COMPLIBDIR)" $(INSTALL_DATA) \ compilerlibs/ocamlcommon.cmxa compilerlibs/ocamlcommon.$(A) \ compilerlibs/ocamlbytecomp.cmxa compilerlibs/ocamlbytecomp.$(A) \ @@ -694,8 +749,12 @@ install-compiler-sources: ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" $(INSTALL_DATA) \ utils/*.ml parsing/*.ml typing/*.ml bytecomp/*.ml driver/*.ml \ - toplevel/*.ml middle_end/*.ml middle_end/base_types/*.ml \ + file_formats/*.ml \ + lambda/*.ml \ + toplevel/*.ml middle_end/*.ml middle_end/closure/*.ml \ + middle_end/flambda/*.ml middle_end/flambda/base_types/*.ml \ asmcomp/*.ml \ + asmcmp/debug/*.ml \ "$(INSTALL_COMPLIBDIR)" endif @@ -796,7 +855,7 @@ natruntop: # Native dynlink -otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/natdynlink.ml +otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/native/dynlink.ml $(MAKE) -C otherlibs/dynlink allopt # The lexer @@ -851,14 +910,14 @@ $(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(OPTCOMP:.cmo=.cmx): ocamlopt runtime/primitives: $(MAKE) -C runtime primitives -bytecomp/runtimedef.ml: bytecomp/generate_runtimedef.sh runtime/caml/fail.h \ +lambda/runtimedef.ml: lambda/generate_runtimedef.sh runtime/caml/fail.h \ runtime/primitives $^ > $@ partialclean:: - rm -f bytecomp/runtimedef.ml + rm -f lambda/runtimedef.ml -beforedepend:: bytecomp/runtimedef.ml +beforedepend:: lambda/runtimedef.ml # Choose the right machine-dependent files @@ -919,8 +978,8 @@ clean:: $(MAKE) -C runtime clean rm -f stdlib/libcamlrun.$(A) -otherlibs_all := bigarray dynlink graph raw_spacetime_lib \ - str systhreads threads unix win32graph win32unix +otherlibs_all := bigarray dynlink raw_spacetime_lib \ + str systhreads unix win32unix subdirs := debugger lex ocamldoc ocamltest runtime stdlib tools \ $(addprefix otherlibs/, $(otherlibs_all)) \ @@ -1103,10 +1162,7 @@ lintapidiff: grep -Ev internal\|obj\|spacetime\|stdLabels\|moreLabels |\ tools/lintapidiff.opt $(VERSIONS) -# The middle end (whose .cma library is currently only used for linking -# the "ocamlobjinfo" program, since we cannot depend on the whole native code -# compiler for "make world" and the list of dependencies for -# asmcomp/export_info.cmo is long). +# The middle end. compilerlibs/ocamlmiddleend.cma: $(MIDDLE_END) $(CAMLC) -a -o $@ $^ @@ -1120,9 +1176,7 @@ partialclean:: # Tools .PHONY: ocamltools -ocamltools: ocamlc ocamllex asmcomp/cmx_format.cmi \ - asmcomp/printclambda.cmo compilerlibs/ocamlmiddleend.cma \ - asmcomp/export_info.cmo +ocamltools: ocamlc ocamllex compilerlibs/ocamlmiddleend.cma $(MAKE) -C tools all .PHONY: ocamltoolsopt @@ -1130,9 +1184,7 @@ ocamltoolsopt: ocamlopt $(MAKE) -C tools opt .PHONY: ocamltoolsopt.opt -ocamltoolsopt.opt: ocamlc.opt ocamllex.opt asmcomp/cmx_format.cmi \ - asmcomp/printclambda.cmx compilerlibs/ocamlmiddleend.cmxa \ - asmcomp/export_info.cmx +ocamltoolsopt.opt: ocamlc.opt ocamllex.opt compilerlibs/ocamlmiddleend.cmxa $(MAKE) -C tools opt.opt partialclean:: @@ -1168,78 +1220,6 @@ else @echo "Architecture tests are disabled on 32-bit platforms." endif -# Compiler Plugins - -DYNLINK_DIR=otherlibs/dynlink - -driver/compdynlink.mlbyte: $(DYNLINK_DIR)/dynlink.ml driver/compdynlink.mli \ - driver/compify_dynlink.sh - driver/compify_dynlink.sh $< $@ - -driver/compdynlink_common.ml: $(DYNLINK_DIR)/dynlink_common.ml \ - driver/compify_dynlink.sh - driver/compify_dynlink.sh $< $@ - -driver/compdynlink_common.mli: $(DYNLINK_DIR)/dynlink_common.mli \ - driver/compify_dynlink.sh - driver/compify_dynlink.sh $< $@ - -driver/compdynlink_types.mli: $(DYNLINK_DIR)/dynlink_types.mli - cp $(DYNLINK_DIR)/dynlink_types.mli driver/compdynlink_types.mli - -driver/compdynlink_types.ml: $(DYNLINK_DIR)/dynlink_types.ml - cp $(DYNLINK_DIR)/dynlink_types.ml driver/compdynlink_types.ml - -driver/compdynlink_platform_intf.ml: $(DYNLINK_DIR)/dynlink_platform_intf.ml \ - driver/compify_dynlink.sh - driver/compify_dynlink.sh $< $@ - -ifeq ($(NATDYNLINK),true) -driver/compdynlink.mlopt: $(DYNLINK_DIR)/natdynlink.ml driver/compdynlink.mli - cat $(DYNLINK_DIR)/natdynlink.ml | \ - sed 's/Dynlink_/Compdynlink_/g' \ - > driver/compdynlink.mlopt -else -driver/compdynlink.mlopt: $(DYNLINK_DIR)/nodynlink.ml driver/compdynlink.mli - cat $(DYNLINK_DIR)/nodynlink.ml | \ - sed 's/Dynlink_/Compdynlink_/g' \ - > driver/compdynlink.mlopt -endif - -driver/compdynlink.mli: $(DYNLINK_DIR)/dynlink.mli \ - driver/compify_dynlink.sh - driver/compify_dynlink.sh $< $@ - -# See comment in otherlibs/dynlink/Makefile about these two rules. -driver/compdynlink_platform_intf.mli: driver/compdynlink_platform_intf.ml - cp $< $@ - -driver/compdynlink.cmo: driver/compdynlink.mlbyte - $(CAMLC) $(COMPFLAGS) -c -impl $< - -driver/compdynlink.cmx: driver/compdynlink.mlopt - $(CAMLOPT) $(COMPFLAGS) -c -impl $< - -beforedepend:: driver/compdynlink.mlbyte \ - driver/compdynlink.mlopt \ - driver/compdynlink_platform_intf.ml \ - driver/compdynlink_platform_intf.mli \ - driver/compdynlink_types.ml \ - driver/compdynlink_types.mli \ - driver/compdynlink.mli \ - driver/compdynlink_common.ml \ - driver/compdynlink_common.mli -partialclean:: - rm -f driver/compdynlink.mlbyte - rm -f driver/compdynlink.mlopt - rm -f driver/compdynlink.mli - rm -f driver/compdynlink_platform_intf.ml - rm -f driver/compdynlink_platform_intf.mli - rm -f driver/compdynlink_common.ml - rm -f driver/compdynlink_common.mli - rm -f driver/compdynlink_types.mli - rm -f driver/compdynlink_types.ml - # The native toplevel compilerlibs/ocamlopttoplevel.cmxa: $(OPTTOPLEVEL:.cmo=.cmx) @@ -1257,6 +1237,7 @@ endif ocamlnat$(EXE): compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \ compilerlibs/ocamlbytecomp.cmxa \ + otherlibs/dynlink/dynlink.cmxa \ compilerlibs/ocamlopttoplevel.cmxa \ $(OPTTOPLEVELSTART:.cmo=.cmx) $(CAMLOPT_CMD) $(LINKFLAGS) -linkall -o $@ $^ @@ -1271,13 +1252,17 @@ toplevel/opttoploop.cmx: otherlibs/dynlink/dynlink.cmxa bytecomp/opcodes.ml: runtime/caml/instruct.h tools/make_opcodes runtime/ocamlrun tools/make_opcodes -opcodes < $< > $@ +bytecomp/opcodes.mli: bytecomp/opcodes.ml + $(CAMLC) -i $< > $@ + tools/make_opcodes: tools/make_opcodes.mll $(MAKE) -C tools make_opcodes partialclean:: rm -f bytecomp/opcodes.ml + rm -f bytecomp/opcodes.mli -beforedepend:: bytecomp/opcodes.ml +beforedepend:: bytecomp/opcodes.ml bytecomp/opcodes.mli ifneq "$(wildcard .git)" "" include Makefile.dev @@ -1297,30 +1282,28 @@ endif $(CAMLOPT) $(COMPFLAGS) -c $< partialclean:: - for d in utils parsing typing bytecomp asmcomp middle_end \ - middle_end/base_types asmcomp/debug driver toplevel tools; do \ + for d in utils parsing typing bytecomp asmcomp middle_end file_formats \ + lambda middle_end/closure middle_end/flambda \ + middle_end/flambda/base_types asmcomp/debug \ + driver toplevel tools; do \ rm -f $$d/*.cm[ioxt] $$d/*.cmti $$d/*.annot $$d/*.$(S) \ - $$d/*.$(O) $$d/*.$(SO) $d/*~; \ + $$d/*.$(O) $$d/*.$(SO); \ done - rm -f *~ .PHONY: depend depend: beforedepend (for d in utils parsing typing bytecomp asmcomp middle_end \ - middle_end/base_types asmcomp/debug driver toplevel; \ - do $(CAMLDEP) $(DEPFLAGS) $(DEPINCLUDES) $$d/*.mli $$d/*.ml || exit; \ - done) > .depend - $(CAMLDEP) $(DEPFLAGS) $(DEPINCLUDES) -native \ - -impl driver/compdynlink.mlopt >> .depend - $(CAMLDEP) $(DEPFLAGS) $(DEPINCLUDES) -bytecode \ - -impl driver/compdynlink.mlbyte >> .depend + lambda file_formats middle_end/closure middle_end/flambda \ + middle_end/flambda/base_types asmcomp/debug \ + driver toplevel; \ + do $(CAMLDEP) $(DEPFLAGS) $(DEPINCLUDES) $$d/*.mli $$d/*.ml || exit; \ + done) > .depend .PHONY: distclean distclean: clean rm -f boot/ocamlrun boot/ocamlrun$(EXE) boot/camlheader \ - boot/*.cm* boot/libcamlrun.$(A) + boot/*.cm* boot/libcamlrun.$(A) boot/ocamlc.opt rm -f Makefile.config runtime/caml/m.h runtime/caml/s.h - rm -f Makefile.common config.log config.status libtool rm -f tools/*.bak rm -f ocaml ocamlc rm -f testsuite/_log* diff --git a/Makefile.common.in b/Makefile.common.in index 585aab9d..acd48010 100644 --- a/Makefile.common.in +++ b/Makefile.common.in @@ -35,6 +35,16 @@ else FLEXDLL_SUBMODULE_PRESENT = endif +# Use boot/ocamlc.opt if available +CAMLRUN ?= $(ROOTDIR)/boot/ocamlrun +ifeq (0,$(shell \ + test $(ROOTDIR)/boot/ocamlc.opt -nt $(ROOTDIR)/boot/ocamlc; \ + echo $$?)) + BOOT_OCAMLC = $(ROOTDIR)/boot/ocamlc.opt +else + BOOT_OCAMLC = $(CAMLRUN) $(ROOTDIR)/boot/ocamlc +endif + ifeq "$(FLEXDLL_SUBMODULE_PRESENT)" "" FLEXLINK_ENV = CAMLOPT_CMD = $(CAMLOPT) diff --git a/Makefile.config.in b/Makefile.config.in index 391e469a..3e0bedf7 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -146,24 +146,13 @@ ASPP=@ASPP@ ### Set to "true" to install ".byte" executables (ocamlc.byte, etc.) INSTALL_BYTECODE_PROGRAMS=@install_bytecode_programs@ -### Extra flags to use for assembling .S files in profiling mode -ASPPPROFFLAGS=@asppprofflags@ - -### true if profiling with gprof is supported, false otherwise -PROFILING=@profiling@ - -### Option to give to the C compiler for profiling -CC_PROFILE=@cc_profile@ - ############# Configuration for the contributed libraries ### Which libraries to compile and install # Currently available: # unix Unix system calls # str Regular expressions and high-level string processing -# threads Lightweight concurrent processes # systhreads Same as threads, requires POSIX threads -# graph Portable drawing primitives for X11 # dynlink Dynamic linking of bytecode # bigarray Large, multidimensional numerical arrays OTHERLIBRARIES=@otherlibraries@ @@ -173,18 +162,8 @@ OTHERLIBRARIES=@otherlibraries@ PTHREAD_LINK=@pthread_link@ PTHREAD_CAML_LINK=$(addprefix -cclib ,$(PTHREAD_LINK)) -### -I options for finding the X11/*.h includes -# Needed for the "graph" package -X11_INCDDIR=@x_includes@ -X11_INCLUDES=$(addprefix -I,$(X11_INCDDIR)) - -### Link-time options to ocamlc or ocamlopt for linking with X11 libraries -# Needed for the "graph" package -X11_LINK=@x_libraries@ - UNIX_OR_WIN32=@unix_or_win32@ UNIXLIB=@unixlib@ -GRAPHLIB=@graphlib@ LIBBFD_LINK=@libbfd_link@ LIBBFD_INCLUDE=@libbfd_include@ INSTALL_SOURCE_ARTIFACTS=@install_source_artifacts@ @@ -251,7 +230,20 @@ MAX_TESTSUITE_DIR_RETRIES=@max_testsuite_dir_retries@ FLAT_FLOAT_ARRAY=@flat_float_array@ AWK=@AWK@ -# The following variables were defined only in the config/Makefile.* files. + +### Native command to build ocamlrun.exe + +ifeq "$(TOOLCHAIN)" "msvc" + MERGEMANIFESTEXE=test ! -f $(1).manifest \ + || mt -nologo -outputresource:$(1) -manifest $(1).manifest \ + && rm -f $(1).manifest + MKEXE_BOOT=$(CC) $(OC_CFLAGS) $(OUTPUTEXE)$(1) $(2) \ + /link /subsystem:console $(OC_LDFLAGS) && ($(MERGEMANIFESTEXE)) +else + MKEXE_BOOT=$(CC) $(OC_CFLAGS) $(OC_LDFLAGS) $(OUTPUTEXE)$(1) $(2) +endif # ifeq "$(TOOLCHAIN)" "msvc" + +# The following variables were defined only in the Windows-specific makefiles. # They were not defined by the configure script used on Unix systems, # so we also make sure to provide them only under Windows # User code should absolutely not rely on their presence because @@ -273,18 +265,4 @@ ifeq "$(UNIX_OR_WIN32)" "win32" # (see ocamlmklibconfig.ml in tools/Makefile) FLEXLINK_FLAGS=@flexlink_flags@ FLEXLINK=$(FLEXLINK_CMD) $(FLEXLINK_FLAGS) - - ### Native command to build ocamlrun.exe - - ifeq "$(TOOLCHAIN)" "mingw" - MKEXE_BOOT=$(CC) $(OC_CFLAGS) $(OC_LDFLAGS) $(OUTPUTEXE)$(1) $(2) - endif # ifeq "$(TOOLCHAIN)" "mingw" - - ifeq "$(TOOLCHAIN)" "msvc" - MERGEMANIFESTEXE=test ! -f $(1).manifest \ - || mt -nologo -outputresource:$(1) -manifest $(1).manifest \ - && rm -f $(1).manifest - MKEXE_BOOT=$(CC) $(OC_CFLAGS) $(OUTPUTEXE)$(1) $(2) \ - /link /subsystem:console $(OC_LDFLAGS) && ($(MERGEMANIFESTEXE)) - endif # ifeq "$(TOOLCHAIN)" "msvc" endif # ifeq "$(UNIX_OR_WIN32)" "win32" diff --git a/README.adoc b/README.adoc index 53cd4512..504c7a70 100644 --- a/README.adoc +++ b/README.adoc @@ -1,10 +1,18 @@ |===== -| Branch `trunk` | Branch `4.06` | Branch `4.05` | Branch `4.04` +| Branch `trunk` | Branch `4.08` | Branch `4.07` | Branch `4.06` | Branch `4.05` | image:https://travis-ci.org/ocaml/ocaml.svg?branch=trunk["TravisCI Build Status (trunk branch)", link="https://travis-ci.org/ocaml/ocaml"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=trunk&svg=true["AppVeyor Build Status (trunk branch)", link="https://ci.appveyor.com/project/avsm/ocaml"] +| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.08["TravisCI Build Status (4.08 branch)", + link="https://travis-ci.org/ocaml/ocaml"] + image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.08&svg=true["AppVeyor Build Status (4.08 branch)", + link="https://ci.appveyor.com/project/avsm/ocaml"] +| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.07["TravisCI Build Status (4.07 branch)", + link="https://travis-ci.org/ocaml/ocaml"] + image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.07&svg=true["AppVeyor Build Status (4.07 branch)", + link="https://ci.appveyor.com/project/avsm/ocaml"] | image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.06["TravisCI Build Status (4.06 branch)", link="https://travis-ci.org/ocaml/ocaml"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.06&svg=true["AppVeyor Build Status (4.06 branch)", @@ -13,11 +21,6 @@ link="https://travis-ci.org/ocaml/ocaml"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.05&svg=true["AppVeyor Build Status (4.05 branch)", link="https://ci.appveyor.com/project/avsm/ocaml"] -| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.04["TravisCI Build Status (4.04 branch)", - link="https://travis-ci.org/ocaml/ocaml"] - image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.04&svg=true["AppVeyor Build Status (4.04 branch)", - link="https://ci.appveyor.com/project/avsm/ocaml"] - |===== = README = @@ -42,35 +45,29 @@ generated programs deliver excellent performance, while retaining the moderate memory requirements of the bytecode compiler. The native-code compiler currently runs on the following platforms: -Tier 1 (actively used and maintained by the core OCaml team): - -AMD64 (Opteron):: Linux, OS X, MS Windows -IA32 (Pentium):: Linux, FreeBSD, OS X, MS Windows -PowerPC:: Linux, OS X -ARM:: Linux +|==== +| | Tier 1 (actively maintained) | Tier 2 (maintained when possible) -Tier 2 (maintained when possible, with help from users): - -AMD64:: FreeBSD, OpenBSD, NetBSD -IA32 (Pentium):: NetBSD, OpenBSD, Solaris 9 -PowerPC:: NetBSD -ARM:: NetBSD +| x86 64 bits | Linux, macOS, Windows, FreeBSD | NetBSD, OpenBSD +| x86 32 bits | Linux, Windows | FreeBSD, NetBSD, OpenBSD +| ARM 64 bits | Linux | FreeBSD +| ARM 32 bits | Linux | FreeBSD, NetBSD, OpenBSD +| Power 64 bits | Linux | +| Power 32 bits | | Linux +| IBM Z (s390x) | Linux | +|==== Other operating systems for the processors above have not been tested, but the compiler may work under other operating systems with little work. -Before the introduction of objects, OCaml was known as Caml Special Light. -OCaml is almost upwards compatible with Caml Special Light, except for a few -additional reserved keywords that have forced some renaming of standard -library functions. == Copyright All files marked "Copyright INRIA" in this distribution are copyright 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, -2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 Institut National de -Recherche en Informatique et en Automatique (INRIA) and distributed under -the conditions stated in file LICENSE. +2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 +Institut National de Recherche en Informatique et en Automatique (INRIA) +and distributed under the conditions stated in file LICENSE. == Installation @@ -80,7 +77,7 @@ Windows, see link:README.win32.adoc[]. == Documentation -The OCaml manual is distributed in HTML, PDF, Postscript, DVI, and Emacs +The OCaml manual is distributed in HTML, PDF, and Emacs Info files. It is available at http://caml.inria.fr/pub/docs/manual-ocaml/ @@ -117,14 +114,12 @@ long history and welcomes questions. == Bug Reports and User Feedback -Please report bugs using the Web interface to the bug-tracking system at -http://caml.inria.fr/bin/caml-bugs +Please report bugs using the issue tracker at +https://github.com/ocaml/ocaml/issues To be effective, bug reports should include a complete program (preferably small) that exhibits the unexpected behavior, and the configuration you are using (machine type, etc). -You can also contact the implementors directly at mailto:caml@inria.fr[]. - For information on contributing to OCaml, see link:HACKING.adoc[] and link:CONTRIBUTING.md[]. diff --git a/README.win32.adoc b/README.win32.adoc index 8ad56c88..c8ab81c4 100644 --- a/README.win32.adoc +++ b/README.win32.adoc @@ -21,7 +21,6 @@ Here is a summary of the main differences between these ports: | Replay debugger | yes <> | yes <> | yes | The Unix library | partial | partial | full | The Threads library | yes | yes | yes -| The Graphics library | yes | yes | no | Restrictions on generated executables? | none | none | yes <> |===== @@ -103,6 +102,7 @@ Visual C/C++ Compiler as well as the Build Tools for Visual Studio. | Visual Studio 2013 | 18.00.x.x | 32/64-bit | | Visual Studio 2015 | 19.00.x.x | 32/64-bit | Build Tools for Visual Studio 2015 also provides 32/64-bit compilers | Visual Studio 2017 | 19.10.x.x | 32/64-bit | Build Tools for Visual Studio 2017 also provides 32/64-bit compilers +| Visual Studio 2019 | 19.20.x.x | 32/64-bit | Build Tools for Visual Studio 2019 also provides 32/64-bit compilers |===== [[vs1]] @@ -226,7 +226,7 @@ your `~/.bashrc` file. the performance of bytecode programs is about 2/3 of that obtained under Unix/GCC, Cygwin or Mingw-w64 on similar hardware. -* Libraries available in this port: `bigarray`, `dynlink`, `graphics`, `num`, +* Libraries available in this port: `bigarray`, `dynlink`, `num`, `str`, `threads`, and large parts of `unix`. * The replay debugger is partially supported (no reverse execution). @@ -282,7 +282,7 @@ After installing, you will need to ensure that `ocamlopt` (or `ocamlc -custom`) can access the C compiler. You can do this either by using OCaml from Cygwin's bash or by adding Cygwin's bin directory (e.g. `C:\cygwin\bin`) to your `PATH`. -* Libraries available in this port: `bigarray`, `dynlink`, `graphics`, `num`, +* Libraries available in this port: `bigarray`, `dynlink`, `num`, `str`, `threads`, and large parts of `unix`. * The replay debugger is partially supported (no reverse execution). diff --git a/VERSION b/VERSION index 2c3d7f94..7128cac1 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.08.1 +4.09.0 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/aclocal.m4 b/aclocal.m4 index 543fff72..ff12869a 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -69,7 +69,6 @@ AC_DEFUN([OCAML_SIGNAL_HANDLERS_SEMANTICS], [ [AC_DEFINE([POSIX_SIGNALS]) AC_MSG_NOTICE([POSIX signal handling found.])], [AC_MSG_NOTICE([assuming signals have the System V semantics.]) - AC_CHECK_FUNCS([sigsetmask], [AC_DEFINE([HAS_SIGSETMASK])]) ] ) ]) diff --git a/asmcomp/CSEgen.ml b/asmcomp/CSEgen.ml index 09ecca70..d71198ad 100644 --- a/asmcomp/CSEgen.ml +++ b/asmcomp/CSEgen.ml @@ -347,9 +347,6 @@ method private cse n i = let n1 = set_unknown_regs n (Proc.destroyed_at_oper i.desc) in {i with desc = Iswitch(index, Array.map (self#cse n1) cases); next = self#cse empty_numbering i.next} - | Iloop(body) -> - {i with desc = Iloop(self#cse empty_numbering body); - next = self#cse empty_numbering i.next} | Icatch(rec_flag, handlers, body) -> let aux (nfail, handler) = nfail, self#cse empty_numbering handler diff --git a/asmcomp/afl_instrument.ml b/asmcomp/afl_instrument.ml index 8397c30d..9e008411 100644 --- a/asmcomp/afl_instrument.ml +++ b/asmcomp/afl_instrument.ml @@ -20,11 +20,11 @@ open Cmm module V = Backend_var module VP = Backend_var.With_provenance -let afl_area_ptr = Cconst_symbol "caml_afl_area_ptr" -let afl_prev_loc = Cconst_symbol "caml_afl_prev_loc" +let afl_area_ptr dbg = Cconst_symbol ("caml_afl_area_ptr", dbg) +let afl_prev_loc dbg = Cconst_symbol ("caml_afl_prev_loc", dbg) let afl_map_size = 1 lsl 16 -let rec with_afl_logging b = +let rec with_afl_logging b dbg = if !Clflags.afl_inst_ratio < 100 && Random.int 100 >= !Clflags.afl_inst_ratio then instrument b else let instrumentation = @@ -40,31 +40,36 @@ let rec with_afl_logging b = let cur_location = Random.int afl_map_size in let cur_pos = V.create_local "pos" in let afl_area = V.create_local "shared_mem" in - let op oper args = Cop (oper, args, Debuginfo.none) in + let op oper args = Cop (oper, args, dbg) in Clet(VP.create afl_area, - op (Cload (Word_int, Asttypes.Mutable)) [afl_area_ptr], + op (Cload (Word_int, Asttypes.Mutable)) [afl_area_ptr dbg], Clet(VP.create cur_pos, op Cxor [op (Cload (Word_int, Asttypes.Mutable)) - [afl_prev_loc]; Cconst_int cur_location], + [afl_prev_loc dbg]; Cconst_int (cur_location, dbg)], Csequence( op (Cstore(Byte_unsigned, Assignment)) [op Cadda [Cvar afl_area; Cvar cur_pos]; op Cadda [op (Cload (Byte_unsigned, Asttypes.Mutable)) [op Cadda [Cvar afl_area; Cvar cur_pos]]; - Cconst_int 1]], + Cconst_int (1, dbg)]], op (Cstore(Word_int, Assignment)) - [afl_prev_loc; Cconst_int (cur_location lsr 1)]))) in + [afl_prev_loc dbg; Cconst_int (cur_location lsr 1, dbg)]))) in Csequence(instrumentation, instrument b) and instrument = function (* these cases add logging, as they may be targets of conditional branches *) - | Cifthenelse (cond, t, f) -> - Cifthenelse (instrument cond, with_afl_logging t, with_afl_logging f) - | Cloop e -> - Cloop (with_afl_logging e) - | Ctrywith (e, ex, handler) -> - Ctrywith (instrument e, ex, with_afl_logging handler) + | Cifthenelse (cond, t_dbg, t, f_dbg, f, dbg) -> + Cifthenelse (instrument cond, t_dbg, with_afl_logging t t_dbg, + f_dbg, with_afl_logging f f_dbg, dbg) + | Ctrywith (e, ex, handler, dbg) -> + Ctrywith (instrument e, ex, with_afl_logging handler dbg, dbg) | Cswitch (e, cases, handlers, dbg) -> - Cswitch (instrument e, cases, Array.map with_afl_logging handlers, dbg) + let handlers = + Array.map (fun (handler, handler_dbg) -> + let handler = with_afl_logging handler handler_dbg in + handler, handler_dbg) + handlers + in + Cswitch (instrument e, cases, handlers, dbg) (* these cases add no logging, but instrument subexpressions *) | Clet (v, e, body) -> Clet (v, instrument e, instrument body) @@ -75,9 +80,11 @@ and instrument = function | Cop (op, es, dbg) -> Cop (op, List.map instrument es, dbg) | Csequence (e1, e2) -> Csequence (instrument e1, instrument e2) | Ccatch (isrec, cases, body) -> - Ccatch (isrec, - List.map (fun (nfail, ids, e) -> nfail, ids, instrument e) cases, - instrument body) + let cases = + List.map (fun (nfail, ids, e, dbg) -> nfail, ids, instrument e, dbg) + cases + in + Ccatch (isrec, cases, instrument body) | Cexit (ex, args) -> Cexit (ex, List.map instrument args) (* these are base cases and have no logging *) @@ -85,16 +92,17 @@ and instrument = function | Cconst_symbol _ | Cconst_pointer _ | Cconst_natpointer _ | Cblockheader _ | Cvar _ as c -> c -let instrument_function c = - with_afl_logging c +let instrument_function c dbg = + with_afl_logging c dbg -let instrument_initialiser c = +let instrument_initialiser c dbg = (* Each instrumented module calls caml_setup_afl at initialisation, which is a no-op on the second and subsequent calls *) with_afl_logging (Csequence (Cop (Cextcall ("caml_setup_afl", typ_int, false, None), - [Cconst_int 0], - Debuginfo.none), + [Cconst_int (0, dbg ())], + dbg ()), c)) + (dbg ()) diff --git a/asmcomp/afl_instrument.mli b/asmcomp/afl_instrument.mli index 1eb439b2..c98cbcd1 100644 --- a/asmcomp/afl_instrument.mli +++ b/asmcomp/afl_instrument.mli @@ -1,4 +1,21 @@ -(* Instrumentation for afl-fuzz *) +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Stephen Dolan, University of Cambridge *) +(* *) +(* Copyright 2016 Stephen Dolan. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) -val instrument_function : Cmm.expression -> Cmm.expression -val instrument_initialiser : Cmm.expression -> Cmm.expression +(** Instrumentation for afl-fuzz. *) + +val instrument_function : Cmm.expression -> Debuginfo.t -> Cmm.expression +val instrument_initialiser + : Cmm.expression + -> (unit -> Debuginfo.t) + -> Cmm.expression diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 4acbd694..e5b42b83 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -33,6 +33,7 @@ module String = Misc.Stdlib.String emit.mlp files for certain other targets; the reference here ensures that when releases are being prepared the .depend files are correct for all targets. *) +[@@@ocaml.warning "-66"] open! Branch_relaxation let _label s = D.label ~typ:QWORD s @@ -73,9 +74,6 @@ let stack_offset = ref 0 (* Layout of the stack frame *) -let frame_required () = - fp || !contains_calls || num_stack_slots.(0) > 0 || num_stack_slots.(1) > 0 - let frame_size () = (* includes return address *) if frame_required() then begin let sz = @@ -473,23 +471,6 @@ let emit_global_label s = D.global lbl; _label lbl -(* Emission of the profiling prelude *) - -let emit_profile () = - if system = S_gnu || system = S_linux then begin - (* mcount preserves rax, rcx, rdx, rsi, rdi, r8, r9 explicitly - and rbx, rbp, r12-r15 like all C functions. This includes - all the registers used for argument passing, so we don't - need to preserve other regs. We do need to initialize rbp - like mcount expects it, though. *) - I.push r10; - if not fp then I.mov rsp rbp; - (* No Spacetime instrumentation needed: [mcount] cannot call anything - OCaml-related. *) - emit_call "mcount"; - I.pop r10 - end - (* Output the assembly code for an instruction *) (* Name of current function *) @@ -503,12 +484,12 @@ let emit_instr fallthrough i = match i.desc with | Lend -> () | Lprologue -> + assert (Proc.prologue_required ()); if fp then begin I.push rbp; cfi_adjust_cfa_offset 8; I.mov rsp rbp; end; - if !Clflags.gprofile then emit_profile(); if frame_required() then begin let n = frame_size() - 8 - (if fp then 8 else 0) in if n <> 0 @@ -516,8 +497,7 @@ let emit_instr fallthrough i = I.sub (int n) rsp; cfi_adjust_cfa_offset n; end; - end; - def_label !tailrec_entry_point + end | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in if src.loc <> dst.loc then @@ -865,14 +845,22 @@ let emit_instr fallthrough i = ConstLabel lbl)) done; D.text () - | Lsetuptrap lbl -> - I.call (label lbl) - | Lpushtrap -> - cfi_adjust_cfa_offset 8; - I.push r14; - cfi_adjust_cfa_offset 8; - I.mov rsp r14; - stack_offset := !stack_offset + 16 + | Lentertrap -> + () + | Lpushtrap { lbl_handler; } -> + let load_label_addr s arg = + if !Clflags.pic_code then + I.lea (mem64_rip NONE (emit_label s)) arg + else + I.mov (sym (emit_label s)) arg + in + cfi_adjust_cfa_offset 16; + I.sub (int 16) rsp; + stack_offset := !stack_offset + 16; + I.mov r14 (mem64 QWORD 0 RSP); + load_label_addr lbl_handler r14; + I.mov r14 (mem64 QWORD 8 RSP); + I.mov rsp r14 | Lpoptrap -> I.pop r14; cfi_adjust_cfa_offset (-8); @@ -890,7 +878,8 @@ let emit_instr fallthrough i = | Cmm.Raise_notrace -> I.mov r14 rsp; I.pop r14; - I.ret () + I.pop r11; + I.jmp r11 end let rec emit_all fallthrough i = @@ -907,7 +896,7 @@ let all_functions = ref [] let fundecl fundecl = function_name := fundecl.fun_name; fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := new_label(); + tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; stack_offset := 0; call_gc_sites := []; bound_error_sites := []; diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index db94a476..4c3c636b 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -377,6 +377,12 @@ let op_is_pure = function let num_stack_slots = [| 0; 0 |] let contains_calls = ref false +let frame_required () = + fp || !contains_calls || num_stack_slots.(0) > 0 || num_stack_slots.(1) > 0 + +let prologue_required () = + frame_required () + (* Calling the assembler *) let assemble_file infile outfile = diff --git a/asmcomp/amd64/selection.ml b/asmcomp/amd64/selection.ml index db7ee0a6..3fd47b7b 100644 --- a/asmcomp/amd64/selection.ml +++ b/asmcomp/amd64/selection.ml @@ -31,25 +31,25 @@ type addressing_expr = let rec select_addr exp = match exp with - Cconst_symbol s when not !Clflags.dlcode -> + Cconst_symbol (s, _) when not !Clflags.dlcode -> (Asymbol s, 0) - | Cop((Caddi | Caddv | Cadda), [arg; Cconst_int m], _) -> + | Cop((Caddi | Caddv | Cadda), [arg; Cconst_int (m, _)], _) -> let (a, n) = select_addr arg in (a, n + m) - | Cop(Csubi, [arg; Cconst_int m], _) -> + | Cop(Csubi, [arg; Cconst_int (m, _)], _) -> let (a, n) = select_addr arg in (a, n - m) - | Cop((Caddi | Caddv | Cadda), [Cconst_int m; arg], _) -> + | Cop((Caddi | Caddv | Cadda), [Cconst_int (m, _); arg], _) -> let (a, n) = select_addr arg in (a, n + m) - | Cop(Clsl, [arg; Cconst_int(1|2|3 as shift)], _) -> + | Cop(Clsl, [arg; Cconst_int((1|2|3 as shift), _)], _) -> begin match select_addr arg with (Alinear e, n) -> (Ascale(e, 1 lsl shift), n lsl shift) | _ -> (Alinear exp, 0) end - | Cop(Cmuli, [arg; Cconst_int(2|4|8 as mult)], _) -> + | Cop(Cmuli, [arg; Cconst_int((2|4|8 as mult), _)], _) -> begin match select_addr arg with (Alinear e, n) -> (Ascale(e, mult), n * mult) | _ -> (Alinear exp, 0) end - | Cop(Cmuli, [Cconst_int(2|4|8 as mult); arg], _) -> + | Cop(Cmuli, [Cconst_int((2|4|8 as mult), _); arg], _) -> begin match select_addr arg with (Alinear e, n) -> (Ascale(e, mult), n * mult) | _ -> (Alinear exp, 0) @@ -169,16 +169,16 @@ method select_addressing _chunk exp = method! select_store is_assign addr exp = match exp with - Cconst_int n when self#is_immediate n -> + Cconst_int (n, _dbg) when self#is_immediate n -> (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) - | (Cconst_natint n) when self#is_immediate_natint n -> + | (Cconst_natint (n, _dbg)) when self#is_immediate_natint n -> (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) | (Cblockheader(n, _dbg)) when self#is_immediate_natint n && not Config.spacetime -> (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) - | Cconst_pointer n when self#is_immediate n -> + | Cconst_pointer (n, _dbg) when self#is_immediate n -> (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) - | Cconst_natpointer n when self#is_immediate_natint n -> + | Cconst_natpointer (n, _dbg) when self#is_immediate_natint n -> (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) | _ -> super#select_store is_assign addr exp @@ -214,7 +214,7 @@ method! select_operation op args dbg = (* Recognize store instructions *) | Cstore ((Word_int|Word_val as chunk), _init) -> begin match args with - [loc; Cop(Caddi, [Cop(Cload _, [loc'], _); Cconst_int n], _)] + [loc; Cop(Caddi, [Cop(Cload _, [loc'], _); Cconst_int (n, _dbg)], _)] when loc = loc' && self#is_immediate n -> let (addr, arg) = self#select_addressing chunk loc in (Ispecific(Ioffset_loc(n, addr)), [arg]) @@ -234,7 +234,7 @@ method! select_operation op args dbg = | Casr -> begin match args with (* Recognize sign extension *) - [Cop(Clsl, [k; Cconst_int 32], _); Cconst_int 32] -> + [Cop(Clsl, [k; Cconst_int (32, _)], _); Cconst_int (32, _)] -> (Ispecific Isextend32, [k]) | _ -> super#select_operation op args dbg end @@ -263,15 +263,15 @@ method! mark_c_tailcall = (* Deal with register constraints *) -method! insert_op_debug op dbg rs rd = +method! insert_op_debug env op dbg rs rd = try let (rsrc, rdst) = pseudoregs_for_operation op rs rd in - self#insert_moves rs rsrc; - self#insert_debug (Iop op) dbg rsrc rdst; - self#insert_moves rdst rd; + self#insert_moves env rs rsrc; + self#insert_debug env (Iop op) dbg rsrc rdst; + self#insert_moves env rdst rd; rd with Use_default -> - super#insert_op_debug op dbg rs rd + super#insert_op_debug env op dbg rs rd end diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index a523fbb9..00d01748 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -285,6 +285,14 @@ let symbol_literals = ref ([] : (string * label) list) (* Total space (in words) occupied by pending literals *) let size_literals = ref 0 +(* Pending offset computations : {lbl; dst; src;} --> lbl: .word dst-(src+N) *) +type offset_computation = + { lbl : label; + dst : label; + src : label; + } +let offset_literals = ref ([] : offset_computation list) + (* Label a floating-point literal *) let float_literal f = try @@ -312,6 +320,13 @@ let symbol_literal s = symbol_literals := (s, lbl) :: !symbol_literals; lbl +(* Add an offset computation *) +let offset_literal dst src = + let lbl = new_label() in + size_literals := !size_literals + 1; + offset_literals := { lbl; dst; src; } :: !offset_literals; + lbl + (* Emit all pending literals *) let emit_literals() = if !float_literals <> [] then begin @@ -337,6 +352,20 @@ let emit_literals() = gotrel_literals := []; symbol_literals := [] end; + if !offset_literals <> [] then begin + (* Additions using the pc register read a value 4 or 8 bytes greater than + the instruction's address, depending on the Thumb setting. However in + Thumb mode we must follow interworking conventions and ensure that the + bottom bit of the pc value is set when reloaded from the trap frame. + Hence "3" not "4". *) + let offset = if !thumb then 3 else 8 in + ` .align 2\n`; + List.iter + (fun { lbl; dst; src; } -> + `{emit_label lbl}: .word {emit_label dst}-({emit_label src}+{emit_int offset})\n`) + !offset_literals; + offset_literals := [] + end; size_literals := 0 (* Emit code to load the address of a symbol *) @@ -396,15 +425,15 @@ let emit_set_condition cmp rd = end end -(* Emission of the profiling prelude *) - -let emit_profile() = - match Config.system with - "linux_eabi" | "linux_eabihf" | "netbsd" -> - ` push \{lr}\n`; - ` {emit_call "__gnu_mcount_nc"}\n`; - 2 - | _ -> 0 +(* Emit code to load the address of a label in the lr register *) +let emit_load_handler_address handler = + (* PIC code *) + let lbl_src = new_label() in + let lbl_offset = offset_literal handler lbl_src in + ` ldr lr, {emit_label lbl_offset}\n`; + `{emit_label lbl_src}:\n`; + ` add lr, pc, lr\n`; + 2 (* Output the assembly code for an instruction *) @@ -413,12 +442,9 @@ let emit_instr i = match i.desc with | Lend -> 0 | Lprologue -> - let num_instrs0 = - if !Clflags.gprofile then emit_profile() - else 0 - in + assert (Proc.prologue_required ()); let n = frame_size() in - let num_instrs1 = + let num_instrs = if n > 0 then begin let num_instrs = emit_stack_adjustment (-n) in if !contains_calls then begin @@ -433,7 +459,7 @@ let emit_instr i = end in `{emit_label !tailrec_entry_point}:\n`; - num_instrs0 + num_instrs1 + num_instrs | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in if src.loc = dst.loc then 0 else begin @@ -838,13 +864,14 @@ let emit_instr i = done; 2 + Array.length jumptbl end - | Lsetuptrap lbl -> - ` bl {emit_label lbl}\n`; 1 - | Lpushtrap -> + | Lentertrap -> + 0 + | Lpushtrap { lbl_handler; } -> + let s = emit_load_handler_address lbl_handler in stack_offset := !stack_offset + 8; ` push \{trap_ptr, lr}\n`; cfi_adjust_cfa_offset 8; - ` mov trap_ptr, sp\n`; 2 + ` mov trap_ptr, sp\n`; s + 2 | Lpoptrap -> ` pop \{trap_ptr, lr}\n`; cfi_adjust_cfa_offset (-8); @@ -905,7 +932,7 @@ let rec emit_all ninstr fallthrough i = let fundecl fundecl = function_name := fundecl.fun_name; fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := new_label(); + tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; float_literals := []; gotrel_literals := []; symbol_literals := []; diff --git a/asmcomp/arm/proc.ml b/asmcomp/arm/proc.ml index 1622fa49..8ad7bebc 100644 --- a/asmcomp/arm/proc.ml +++ b/asmcomp/arm/proc.ml @@ -345,6 +345,15 @@ let op_is_pure = function let num_stack_slots = [| 0; 0; 0 |] let contains_calls = ref false +let frame_required () = + !contains_calls + || num_stack_slots.(0) > 0 + || num_stack_slots.(1) > 0 + || num_stack_slots.(2) > 0 + +let prologue_required () = + frame_required () + (* Calling the assembler *) let assemble_file infile outfile = diff --git a/asmcomp/arm/selection.ml b/asmcomp/arm/selection.ml index 747e86a2..f43c13d9 100644 --- a/asmcomp/arm/selection.ml +++ b/asmcomp/arm/selection.ml @@ -131,10 +131,11 @@ method! effects_of e = | e -> super#effects_of e method select_addressing chunk = function - | Cop((Cadda | Caddv), [arg; Cconst_int n], _) + | Cop((Cadda | Caddv), [arg; Cconst_int (n, _)], _) when is_offset chunk n -> (Iindexed n, arg) - | Cop((Cadda | Caddv as op), [arg1; Cop(Caddi, [arg2; Cconst_int n], _)], dbg) + | Cop((Cadda | Caddv as op), + [arg1; Cop(Caddi, [arg2; Cconst_int (n, _)], _)], dbg) when is_offset chunk n -> (Iindexed n, Cop(op, [arg1; arg2], dbg)) | arg -> @@ -142,10 +143,10 @@ method select_addressing chunk = function method select_shift_arith op dbg arithop arithrevop args = match args with - [arg1; Cop(Clsl | Clsr | Casr as op, [arg2; Cconst_int n], _)] + [arg1; Cop(Clsl | Clsr | Casr as op, [arg2; Cconst_int (n, _)], _)] when n > 0 && n < 32 -> (Ispecific(Ishiftarith(arithop, select_shiftop op, n)), [arg1; arg2]) - | [Cop(Clsl | Clsr | Casr as op, [arg1; Cconst_int n], _); arg2] + | [Cop(Clsl | Clsr | Casr as op, [arg1; Cconst_int (n, _)], _); arg2] when n > 0 && n < 32 -> (Ispecific(Ishiftarith(arithrevop, select_shiftop op, n)), [arg2; arg1]) | args -> @@ -184,15 +185,15 @@ method private iextcall (func, alloc) = method! select_operation op args dbg = match (op, args) with (* Recognize special shift arithmetic *) - ((Caddv | Cadda | Caddi), [arg; Cconst_int n]) + ((Caddv | Cadda | Caddi), [arg; Cconst_int (n, _)]) when n < 0 && self#is_immediate (-n) -> (Iintop_imm(Isub, -n), [arg]) | ((Caddv | Cadda | Caddi as op), args) -> self#select_shift_arith op dbg Ishiftadd Ishiftadd args - | (Csubi, [arg; Cconst_int n]) + | (Csubi, [arg; Cconst_int (n, _)]) when n < 0 && self#is_immediate (-n) -> (Iintop_imm(Iadd, -n), [arg]) - | (Csubi, [Cconst_int n; arg]) + | (Csubi, [Cconst_int (n, _); arg]) when self#is_immediate n -> (Ispecific(Irevsubimm n), [arg]) | (Csubi as op, args) -> @@ -204,7 +205,7 @@ method! select_operation op args dbg = | (Cxor as op, args) -> self#select_shift_arith op dbg Ishiftxor Ishiftxor args | (Ccheckbound, - [Cop(Clsl | Clsr | Casr as op, [arg1; Cconst_int n], _); arg2]) + [Cop(Clsl | Clsr | Casr as op, [arg1; Cconst_int (n, _)], _); arg2]) when n > 0 && n < 32 -> (Ispecific(Ishiftcheckbound(select_shiftop op, n)), [arg1; arg2]) (* ARM does not support immediate operands for multiplication *) @@ -304,15 +305,15 @@ method! select_condition = function (* Deal with some register constraints *) -method! insert_op_debug op dbg rs rd = +method! insert_op_debug env op dbg rs rd = try let (rsrc, rdst) = pseudoregs_for_operation op rs rd in - self#insert_moves rs rsrc; - self#insert_debug (Iop op) dbg rsrc rdst; - self#insert_moves rdst rd; + self#insert_moves env rs rsrc; + self#insert_debug env (Iop op) dbg rsrc rdst; + self#insert_moves env rdst rd; rd with Use_default -> - super#insert_op_debug op dbg rs rd + super#insert_op_debug env op dbg rs rd end diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index 58792663..a00cbced 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -494,8 +494,8 @@ module BR = Branch_relaxation.Make (struct + begin match lbl1 with None -> 0 | Some _ -> 1 end + begin match lbl2 with None -> 0 | Some _ -> 1 end | Lswitch jumptbl -> 3 + Array.length jumptbl - | Lsetuptrap _ -> 2 - | Lpushtrap -> 3 + | Lentertrap -> 0 + | Lpushtrap _ -> 4 | Lpoptrap -> 1 | Lraise k -> begin match k with @@ -559,17 +559,6 @@ let assembly_code_for_allocation ?label_after_call_gc i ~n ~far = `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n` end -(* Emission of the profiling prelude *) - -let emit_profile() = () (* TODO *) -(* - match Config.system with - "linux_eabi" | "linux_eabihf" | "netbsd" -> - ` push \{lr}\n`; - ` {emit_call "__gnu_mcount_nc"}\n` - | _ -> () -*) - (* Output the assembly code for an instruction *) let emit_instr i = @@ -577,15 +566,14 @@ let emit_instr i = match i.desc with | Lend -> () | Lprologue -> - if !Clflags.gprofile then emit_profile(); + assert (Proc.prologue_required ()); let n = frame_size() in if n > 0 then emit_stack_adjustment (-n); if !contains_calls then begin cfi_offset ~reg:30 (* return address *) ~offset:(-8); ` str x30, [sp, #{emit_int (n-8)}]\n` - end; - `{emit_label !tailrec_entry_point}:\n`; + end | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in if src.loc <> dst.loc then begin @@ -607,7 +595,7 @@ let emit_instr i = if f = 0L then ` fmov {emit_reg i.res.(0)}, xzr\n` else if is_immediate_float f then - ` fmov {emit_reg i.res.(0)}, #{emit_printf "0x%Lx" f}\n` + ` fmov {emit_reg i.res.(0)}, #{emit_printf "%.7f" (Int64.float_of_bits f)}\n` else begin let lbl = float_literal f in ` adrp {emit_reg reg_tmp1}, {emit_label lbl}\n`; @@ -873,12 +861,10 @@ let emit_instr i = ` .word {emit_label jumptbl.(j)} - {emit_label lbltbl}\n` done *) - | Lsetuptrap lbl -> - let lblnext = new_label() in - ` adr {emit_reg reg_tmp1}, {emit_label lblnext}\n`; - ` b {emit_label lbl}\n`; - `{emit_label lblnext}:\n` - | Lpushtrap -> + | Lentertrap -> + () + | Lpushtrap { lbl_handler; } -> + ` adr {emit_reg reg_tmp1}, {emit_label lbl_handler}\n`; stack_offset := !stack_offset + 16; ` str {emit_reg reg_trap_ptr}, [sp, -16]!\n`; ` str {emit_reg reg_tmp1}, [sp, #8]\n`; @@ -910,7 +896,7 @@ let rec emit_all i = let fundecl fundecl = function_name := fundecl.fun_name; fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := new_label(); + tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; float_literals := []; stack_offset := 0; call_gc_sites := []; diff --git a/asmcomp/arm64/proc.ml b/asmcomp/arm64/proc.ml index 14ba08d5..095f22f2 100644 --- a/asmcomp/arm64/proc.ml +++ b/asmcomp/arm64/proc.ml @@ -254,6 +254,14 @@ let op_is_pure = function let num_stack_slots = [| 0; 0 |] let contains_calls = ref false +let frame_required () = + !contains_calls + || num_stack_slots.(0) > 0 + || num_stack_slots.(1) > 0 + +let prologue_required () = + frame_required () + (* Calling the assembler *) let assemble_file infile outfile = diff --git a/asmcomp/arm64/selection.ml b/asmcomp/arm64/selection.ml index b714d003..90166141 100644 --- a/asmcomp/arm64/selection.ml +++ b/asmcomp/arm64/selection.ml @@ -109,16 +109,17 @@ method! effects_of e = | e -> super#effects_of e method select_addressing chunk = function - | Cop((Caddv | Cadda), [Cconst_symbol s; Cconst_int n], _) + | Cop((Caddv | Cadda), [Cconst_symbol (s, _); Cconst_int (n, _)], _) when use_direct_addressing s -> (Ibased(s, n), Ctuple []) - | Cop((Caddv | Cadda), [arg; Cconst_int n], _) + | Cop((Caddv | Cadda), [arg; Cconst_int (n, _)], _) when is_offset chunk n -> (Iindexed n, arg) - | Cop((Caddv | Cadda as op), [arg1; Cop(Caddi, [arg2; Cconst_int n], _)], dbg) + | Cop((Caddv | Cadda as op), + [arg1; Cop(Caddi, [arg2; Cconst_int (n, _)], _)], dbg) when is_offset chunk n -> (Iindexed n, Cop(op, [arg1; arg2], dbg)) - | Cconst_symbol s + | Cconst_symbol (s, _) when use_direct_addressing s -> (Ibased(s, 0), Ctuple []) | arg -> @@ -130,20 +131,20 @@ method! select_operation op args dbg = | Caddi | Caddv | Cadda -> begin match args with (* Add immediate *) - | [arg; Cconst_int n] when self#is_immediate n -> + | [arg; Cconst_int (n, _)] when self#is_immediate n -> ((if n >= 0 then Iintop_imm(Iadd, n) else Iintop_imm(Isub, -n)), [arg]) - | [Cconst_int n; arg] when self#is_immediate n -> + | [Cconst_int (n, _); arg] when self#is_immediate n -> ((if n >= 0 then Iintop_imm(Iadd, n) else Iintop_imm(Isub, -n)), [arg]) (* Shift-add *) - | [arg1; Cop(Clsl, [arg2; Cconst_int n], _)] when n > 0 && n < 64 -> + | [arg1; Cop(Clsl, [arg2; Cconst_int (n, _)], _)] when n > 0 && n < 64 -> (Ispecific(Ishiftarith(Ishiftadd, n)), [arg1; arg2]) - | [arg1; Cop(Casr, [arg2; Cconst_int n], _)] when n > 0 && n < 64 -> + | [arg1; Cop(Casr, [arg2; Cconst_int (n, _)], _)] when n > 0 && n < 64 -> (Ispecific(Ishiftarith(Ishiftadd, -n)), [arg1; arg2]) - | [Cop(Clsl, [arg1; Cconst_int n], _); arg2] when n > 0 && n < 64 -> + | [Cop(Clsl, [arg1; Cconst_int (n, _)], _); arg2] when n > 0 && n < 64 -> (Ispecific(Ishiftarith(Ishiftadd, n)), [arg2; arg1]) - | [Cop(Casr, [arg1; Cconst_int n], _); arg2] when n > 0 && n < 64 -> + | [Cop(Casr, [arg1; Cconst_int (n, _)], _); arg2] when n > 0 && n < 64 -> (Ispecific(Ishiftarith(Ishiftadd, -n)), [arg2; arg1]) (* Multiply-add *) | [arg1; Cop(Cmuli, args2, dbg)] | [Cop(Cmuli, args2, dbg); arg1] -> @@ -162,13 +163,13 @@ method! select_operation op args dbg = | Csubi -> begin match args with (* Sub immediate *) - | [arg; Cconst_int n] when self#is_immediate n -> + | [arg; Cconst_int (n, _)] when self#is_immediate n -> ((if n >= 0 then Iintop_imm(Isub, n) else Iintop_imm(Iadd, -n)), [arg]) (* Shift-sub *) - | [arg1; Cop(Clsl, [arg2; Cconst_int n], _)] when n > 0 && n < 64 -> + | [arg1; Cop(Clsl, [arg2; Cconst_int (n, _)], _)] when n > 0 && n < 64 -> (Ispecific(Ishiftarith(Ishiftsub, n)), [arg1; arg2]) - | [arg1; Cop(Casr, [arg2; Cconst_int n], _)] when n > 0 && n < 64 -> + | [arg1; Cop(Casr, [arg2; Cconst_int (n, _)], _)] when n > 0 && n < 64 -> (Ispecific(Ishiftarith(Ishiftsub, -n)), [arg1; arg2]) (* Multiply-sub *) | [arg1; Cop(Cmuli, args2, dbg)] -> @@ -186,7 +187,7 @@ method! select_operation op args dbg = (* Checkbounds *) | Ccheckbound -> begin match args with - | [Cop(Clsr, [arg1; Cconst_int n], _); arg2] when n > 0 && n < 64 -> + | [Cop(Clsr, [arg1; Cconst_int (n, _)], _); arg2] when n > 0 && n < 64 -> (Ispecific(Ishiftcheckbound { shift = n; label_after_error = None; }), [arg1; arg2]) | _ -> @@ -242,9 +243,9 @@ method! select_operation op args dbg = super#select_operation op args dbg method select_logical op = function - | [arg; Cconst_int n] when is_logical_immediate n -> + | [arg; Cconst_int (n, _)] when is_logical_immediate n -> (Iintop_imm(op, n), [arg]) - | [Cconst_int n; arg] when is_logical_immediate n -> + | [Cconst_int (n, _); arg] when is_logical_immediate n -> (Iintop_imm(op, n), [arg]) | args -> (Iintop op, args) diff --git a/asmcomp/asmgen.ml b/asmcomp/asmgen.ml index ddbbae8d..46f7b270 100644 --- a/asmcomp/asmgen.ml +++ b/asmcomp/asmgen.ml @@ -102,6 +102,7 @@ let (++) x f = f x let compile_fundecl ~ppf_dump fd_cmm = Proc.init (); + Cmmgen.reset (); Reg.reset(); fd_cmm ++ Profile.record ~accumulate:true "selection" Selection.fundecl @@ -220,9 +221,11 @@ let flambda_gen_implementation ?toplevel ~backend ~ppf_dump end_gen_implementation ?toplevel ~ppf_dump (clambda, preallocated, constants) -let lambda_gen_implementation ?toplevel ~ppf_dump +let lambda_gen_implementation ?toplevel ~backend ~ppf_dump (lambda:Lambda.program) = - let clambda = Closure.intro lambda.main_module_block_size lambda.code in + let clambda = + Closure.intro ~backend ~size:lambda.main_module_block_size lambda.code + in let provenance : Clambda.usymbol_provenance = { original_idents = []; module_path = @@ -239,8 +242,9 @@ let lambda_gen_implementation ?toplevel ~ppf_dump } in let clambda_and_constants = - clambda, [preallocated_block], [] + clambda, [preallocated_block], Compilenv.structured_constants () in + Compilenv.clear_structured_constants (); raw_clambda_dump_if ppf_dump clambda_and_constants; end_gen_implementation ?toplevel ~ppf_dump clambda_and_constants @@ -257,10 +261,10 @@ let compile_implementation_gen ?toplevel prefixname gen_implementation ?toplevel ~ppf_dump program) let compile_implementation_clambda ?toplevel prefixname - ~ppf_dump (program:Lambda.program) = + ~backend ~ppf_dump (program:Lambda.program) = compile_implementation_gen ?toplevel prefixname ~required_globals:program.Lambda.required_globals - ~ppf_dump lambda_gen_implementation program + ~ppf_dump (lambda_gen_implementation ~backend) program let compile_implementation_flambda ?toplevel prefixname ~required_globals ~backend ~ppf_dump (program:Flambda.program) = diff --git a/asmcomp/asmgen.mli b/asmcomp/asmgen.mli index f2f4ccae..16045621 100644 --- a/asmcomp/asmgen.mli +++ b/asmcomp/asmgen.mli @@ -25,6 +25,7 @@ val compile_implementation_flambda : val compile_implementation_clambda : ?toplevel:(string -> bool) -> string -> + backend:(module Backend_intf.S) -> ppf_dump:Format.formatter -> Lambda.program -> unit val compile_phrase : diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index f77b6cc3..8c4457c8 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -23,23 +23,26 @@ open Compilenv module String = Misc.Stdlib.String type error = - File_not_found of string - | Not_an_object_file of string - | Missing_implementations of (string * string list) list - | Inconsistent_interface of string * string * string - | Inconsistent_implementation of string * string * string - | Assembler_error of string + | File_not_found of filepath + | Not_an_object_file of filepath + | Missing_implementations of (modname * string list) list + | Inconsistent_interface of modname * filepath * filepath + | Inconsistent_implementation of modname * filepath * filepath + | Assembler_error of filepath | Linking_error - | Multiple_definition of string * string * string - | Missing_cmx of string * string + | Multiple_definition of modname * filepath * filepath + | Missing_cmx of filepath * modname exception Error of error (* Consistency check between interfaces and implementations *) -let crc_interfaces = Consistbl.create () +module Cmi_consistbl = Consistbl.Make (Misc.Stdlib.String) +let crc_interfaces = Cmi_consistbl.create () let interfaces = ref ([] : string list) -let crc_implementations = Consistbl.create () + +module Cmx_consistbl = Consistbl.Make (Misc.Stdlib.String) +let crc_implementations = Cmx_consistbl.create () let implementations = ref ([] : string list) let implementations_defined = ref ([] : (string * string) list) let cmx_required = ref ([] : string list) @@ -53,10 +56,10 @@ let check_consistency file_name unit crc = None -> () | Some crc -> if name = unit.ui_name - then Consistbl.set crc_interfaces name crc file_name - else Consistbl.check crc_interfaces name crc file_name) + then Cmi_consistbl.set crc_interfaces name crc file_name + else Cmi_consistbl.check crc_interfaces name crc file_name) unit.ui_imports_cmi - with Consistbl.Inconsistency(name, user, auth) -> + with Cmi_consistbl.Inconsistency(name, user, auth) -> raise(Error(Inconsistent_interface(name, user, auth))) end; begin try @@ -68,9 +71,9 @@ let check_consistency file_name unit crc = if List.mem name !cmx_required then raise(Error(Missing_cmx(file_name, name))) | Some crc -> - Consistbl.check crc_implementations name crc file_name) + Cmx_consistbl.check crc_implementations name crc file_name) unit.ui_imports_cmx - with Consistbl.Inconsistency(name, user, auth) -> + with Cmx_consistbl.Inconsistency(name, user, auth) -> raise(Error(Inconsistent_implementation(name, user, auth))) end; begin try @@ -79,16 +82,16 @@ let check_consistency file_name unit crc = with Not_found -> () end; implementations := unit.ui_name :: !implementations; - Consistbl.set crc_implementations unit.ui_name crc file_name; + Cmx_consistbl.set crc_implementations unit.ui_name crc file_name; implementations_defined := (unit.ui_name, file_name) :: !implementations_defined; if unit.ui_symbol <> unit.ui_name then cmx_required := unit.ui_name :: !cmx_required let extract_crc_interfaces () = - Consistbl.extract !interfaces crc_interfaces + Cmi_consistbl.extract !interfaces crc_interfaces let extract_crc_implementations () = - Consistbl.extract !implementations crc_implementations + Cmx_consistbl.extract !implementations crc_implementations (* Add C objects and options and "custom" info from a library descriptor. See bytecomp/bytelink.ml for comments on the order of C objects. *) @@ -106,12 +109,9 @@ let add_ccobjs origin l = end let runtime_lib () = - let libname = - if !Clflags.gprofile - then "libasmrunp" ^ ext_lib - else "libasmrun" ^ !Clflags.runtime_variant ^ ext_lib in + let libname = "libasmrun" ^ !Clflags.runtime_variant ^ ext_lib in try - if !Clflags.nopervasives then [] + if !Clflags.nopervasives || not !Clflags.with_runtime then [] else [ Load_path.find libname ] with Not_found -> raise(Error(File_not_found libname)) @@ -328,10 +328,8 @@ let call_linker file_list startup_file output_name = let link ~ppf_dump objfiles output_name = Profile.record_call output_name (fun () -> - let stdlib = - if !Clflags.gprofile then "stdlib.p.cmxa" else "stdlib.cmxa" in - let stdexit = - if !Clflags.gprofile then "std_exit.p.cmx" else "std_exit.cmx" in + let stdlib = "stdlib.cmxa" in + let stdexit = "std_exit.cmx" in let objfiles = if !Clflags.nopervasives then objfiles else if !Clflags.output_c_object then stdlib :: objfiles @@ -431,8 +429,8 @@ let () = ) let reset () = - Consistbl.clear crc_interfaces; - Consistbl.clear crc_implementations; + Cmi_consistbl.clear crc_interfaces; + Cmx_consistbl.clear crc_implementations; implementations_defined := []; cmx_required := []; interfaces := []; diff --git a/asmcomp/asmlink.mli b/asmcomp/asmlink.mli index 80d66099..1c832276 100644 --- a/asmcomp/asmlink.mli +++ b/asmcomp/asmlink.mli @@ -15,6 +15,7 @@ (* Link a set of .cmx/.o files and produce an executable or a plugin *) +open Misc open Format val link: ppf_dump:formatter -> string list -> string -> unit @@ -24,20 +25,20 @@ val link_shared: ppf_dump:formatter -> string list -> string -> unit val call_linker_shared: string list -> string -> unit val reset : unit -> unit -val check_consistency: string -> Cmx_format.unit_infos -> Digest.t -> unit -val extract_crc_interfaces: unit -> (string * Digest.t option) list -val extract_crc_implementations: unit -> (string * Digest.t option) list +val check_consistency: filepath -> Cmx_format.unit_infos -> Digest.t -> unit +val extract_crc_interfaces: unit -> crcs +val extract_crc_implementations: unit -> crcs type error = - File_not_found of string - | Not_an_object_file of string - | Missing_implementations of (string * string list) list - | Inconsistent_interface of string * string * string - | Inconsistent_implementation of string * string * string - | Assembler_error of string + | File_not_found of filepath + | Not_an_object_file of filepath + | Missing_implementations of (modname * string list) list + | Inconsistent_interface of modname * filepath * filepath + | Inconsistent_implementation of modname * filepath * filepath + | Assembler_error of filepath | Linking_error - | Multiple_definition of string * string * string - | Missing_cmx of string * string + | Multiple_definition of modname * filepath * filepath + | Missing_cmx of filepath * modname exception Error of error diff --git a/asmcomp/asmpackager.ml b/asmcomp/asmpackager.ml index f079e0e6..df9686aa 100644 --- a/asmcomp/asmpackager.ml +++ b/asmcomp/asmpackager.ml @@ -101,9 +101,9 @@ let make_package_object ~ppf_dump members targetobj targetname coercion let prefixname = Filename.remove_extension objtemp in if Config.flambda then begin let size, lam = Translmod.transl_package_flambda components coercion in - let lam = Simplif.simplify_lambda targetname lam in + let lam = Simplif.simplify_lambda lam in let flam = - Middle_end.middle_end ~ppf_dump + Flambda_middle_end.middle_end ~ppf_dump ~prefixname ~backend ~size @@ -117,9 +117,9 @@ let make_package_object ~ppf_dump members targetobj targetname coercion let main_module_block_size, code = Translmod.transl_store_package components (Ident.create_persistent targetname) coercion in - let code = Simplif.simplify_lambda targetname code in + let code = Simplif.simplify_lambda code in Asmgen.compile_implementation_clambda - prefixname ~ppf_dump { Lambda.code; main_module_block_size; + prefixname ~backend ~ppf_dump { Lambda.code; main_module_block_size; module_ident; required_globals = Ident.Set.empty } end; let objfiles = diff --git a/asmcomp/cmm.ml b/asmcomp/cmm.ml index 3c0b2d78..b2d58d0b 100644 --- a/asmcomp/cmm.ml +++ b/asmcomp/cmm.ml @@ -159,12 +159,12 @@ and operation = | Ccheckbound type expression = - Cconst_int of int - | Cconst_natint of nativeint - | Cconst_float of float - | Cconst_symbol of string - | Cconst_pointer of int - | Cconst_natpointer of nativeint + Cconst_int of int * Debuginfo.t + | Cconst_natint of nativeint * Debuginfo.t + | Cconst_float of float * Debuginfo.t + | Cconst_symbol of string * Debuginfo.t + | Cconst_pointer of int * Debuginfo.t + | Cconst_natpointer of nativeint * Debuginfo.t | Cblockheader of nativeint * Debuginfo.t | Cvar of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression @@ -174,16 +174,18 @@ type expression = | Ctuple of expression list | Cop of operation * expression list * Debuginfo.t | Csequence of expression * expression - | Cifthenelse of expression * expression * expression - | Cswitch of expression * int array * expression array * Debuginfo.t - | Cloop of expression + | Cifthenelse of expression * Debuginfo.t * expression + * Debuginfo.t * expression * Debuginfo.t + | Cswitch of expression * int array * (expression * Debuginfo.t) array + * Debuginfo.t | Ccatch of rec_flag * (int * (Backend_var.With_provenance.t * machtype) list - * expression) list + * expression * Debuginfo.t) list * expression | Cexit of int * expression list | Ctrywith of expression * Backend_var.With_provenance.t * expression + * Debuginfo.t type codegen_option = | Reduce_code_size @@ -215,8 +217,8 @@ type phrase = Cfunction of fundecl | Cdata of data_item list -let ccatch (i, ids, e1, e2)= - Ccatch(Nonrecursive, [i, ids, e2], e1) +let ccatch (i, ids, e1, e2, dbg) = + Ccatch(Nonrecursive, [i, ids, e2, dbg], e1) let reset () = label_counter := 99 diff --git a/asmcomp/cmm.mli b/asmcomp/cmm.mli index 219083a1..a46e6599 100644 --- a/asmcomp/cmm.mli +++ b/asmcomp/cmm.mli @@ -152,17 +152,15 @@ and operation = | Craise of raise_kind | Ccheckbound -(** Not all cmm expressions currently have [Debuginfo.t] values attached to - them. The ones that do are those that are likely to generate code that - can fairly robustly be mapped back to a source location. In the future - it might be the case that more [Debuginfo.t] annotations are desirable. *) +(** Every basic block should have a corresponding [Debuginfo.t] for its + beginning. *) and expression = - Cconst_int of int - | Cconst_natint of nativeint - | Cconst_float of float - | Cconst_symbol of string - | Cconst_pointer of int - | Cconst_natpointer of nativeint + Cconst_int of int * Debuginfo.t + | Cconst_natint of nativeint * Debuginfo.t + | Cconst_float of float * Debuginfo.t + | Cconst_symbol of string * Debuginfo.t + | Cconst_pointer of int * Debuginfo.t + | Cconst_natpointer of nativeint * Debuginfo.t | Cblockheader of nativeint * Debuginfo.t | Cvar of Backend_var.t | Clet of Backend_var.With_provenance.t * expression * expression @@ -172,16 +170,18 @@ and expression = | Ctuple of expression list | Cop of operation * expression list * Debuginfo.t | Csequence of expression * expression - | Cifthenelse of expression * expression * expression - | Cswitch of expression * int array * expression array * Debuginfo.t - | Cloop of expression + | Cifthenelse of expression * Debuginfo.t * expression + * Debuginfo.t * expression * Debuginfo.t + | Cswitch of expression * int array * (expression * Debuginfo.t) array + * Debuginfo.t | Ccatch of rec_flag * (int * (Backend_var.With_provenance.t * machtype) list - * expression) list + * expression * Debuginfo.t) list * expression | Cexit of int * expression list | Ctrywith of expression * Backend_var.With_provenance.t * expression + * Debuginfo.t type codegen_option = | Reduce_code_size @@ -215,7 +215,7 @@ type phrase = val ccatch : int * (Backend_var.With_provenance.t * machtype) list - * expression * expression + * expression * expression * Debuginfo.t -> expression val reset : unit -> unit diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 68e36d0d..598debb6 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -15,6 +15,8 @@ (* Translation from closed lambda to C-- *) +[@@@ocaml.warning "-40"] + open Misc open Arch open Asttypes @@ -22,8 +24,10 @@ open Primitive open Types open Lambda open Clambda +open Clambda_primitives open Cmm open Cmx_format +open Cmxs_format module String = Misc.Stdlib.String module V = Backend_var @@ -86,7 +90,7 @@ let caml_black = Nativeint.shift_left (Nativeint.of_int 3) 8 (* Block headers. Meaning of the tag field: see stdlib/obj.ml *) -let floatarray_tag = Cconst_int Obj.double_array_tag +let floatarray_tag dbg = Cconst_int (Obj.double_array_tag, dbg) let block_header tag sz = Nativeint.add (Nativeint.shift_left (Nativeint.of_int sz) 10) @@ -110,6 +114,10 @@ let string_header len = let boxedint32_header = block_header Obj.custom_tag 2 let boxedint64_header = block_header Obj.custom_tag (1 + 8 / size_addr) let boxedintnat_header = block_header Obj.custom_tag 2 +let caml_nativeint_ops = "caml_nativeint_ops" +let caml_int32_ops = "caml_int32_ops" +let caml_int64_ops = "caml_int64_ops" + let alloc_float_header dbg = Cblockheader (float_header, dbg) let alloc_floatarray_header len dbg = Cblockheader (floatarray_header len, dbg) @@ -124,11 +132,17 @@ let alloc_boxedintnat_header dbg = Cblockheader (boxedintnat_header, dbg) let max_repr_int = max_int asr 1 let min_repr_int = min_int asr 1 -let int_const n = +let int_const dbg n = if n <= max_repr_int && n >= min_repr_int - then Cconst_int((n lsl 1) + 1) + then Cconst_int((n lsl 1) + 1, dbg) else Cconst_natint - (Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n) + (Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n, dbg) + +let natint_const_untagged dbg n = + if n > Nativeint.of_int max_int + || n < Nativeint.of_int min_int + then Cconst_natint (n,dbg) + else Cconst_int (Nativeint.to_int n, dbg) let cint_const n = Cint(Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n) @@ -139,55 +153,55 @@ let targetint_const n = let add_no_overflow n x c dbg = let d = n + x in - if d = 0 then c else Cop(Caddi, [c; Cconst_int d], dbg) + if d = 0 then c else Cop(Caddi, [c; Cconst_int (d, dbg)], dbg) let rec add_const c n dbg = if n = 0 then c else match c with - | Cconst_int x when no_overflow_add x n -> Cconst_int (x + n) - | Cop(Caddi, [Cconst_int x; c], _) + | Cconst_int (x, _) when no_overflow_add x n -> Cconst_int (x + n, dbg) + | Cop(Caddi, [Cconst_int (x, _); c], _) when no_overflow_add n x -> add_no_overflow n x c dbg - | Cop(Caddi, [c; Cconst_int x], _) + | Cop(Caddi, [c; Cconst_int (x, _)], _) when no_overflow_add n x -> add_no_overflow n x c dbg - | Cop(Csubi, [Cconst_int x; c], _) when no_overflow_add n x -> - Cop(Csubi, [Cconst_int (n + x); c], dbg) - | Cop(Csubi, [c; Cconst_int x], _) when no_overflow_sub n x -> + | Cop(Csubi, [Cconst_int (x, _); c], _) when no_overflow_add n x -> + Cop(Csubi, [Cconst_int (n + x, dbg); c], dbg) + | Cop(Csubi, [c; Cconst_int (x, _)], _) when no_overflow_sub n x -> add_const c (n - x) dbg - | c -> Cop(Caddi, [c; Cconst_int n], dbg) + | c -> Cop(Caddi, [c; Cconst_int (n, dbg)], dbg) let incr_int c dbg = add_const c 1 dbg let decr_int c dbg = add_const c (-1) dbg let rec add_int c1 c2 dbg = match (c1, c2) with - | (Cconst_int n, c) | (c, Cconst_int n) -> + | (Cconst_int (n, _), c) | (c, Cconst_int (n, _)) -> add_const c n dbg - | (Cop(Caddi, [c1; Cconst_int n1], _), c2) -> + | (Cop(Caddi, [c1; Cconst_int (n1, _)], _), c2) -> add_const (add_int c1 c2 dbg) n1 dbg - | (c1, Cop(Caddi, [c2; Cconst_int n2], _)) -> + | (c1, Cop(Caddi, [c2; Cconst_int (n2, _)], _)) -> add_const (add_int c1 c2 dbg) n2 dbg | (_, _) -> Cop(Caddi, [c1; c2], dbg) let rec sub_int c1 c2 dbg = match (c1, c2) with - | (c1, Cconst_int n2) when n2 <> min_int -> + | (c1, Cconst_int (n2, _)) when n2 <> min_int -> add_const c1 (-n2) dbg - | (c1, Cop(Caddi, [c2; Cconst_int n2], _)) when n2 <> min_int -> + | (c1, Cop(Caddi, [c2; Cconst_int (n2, _)], _)) when n2 <> min_int -> add_const (sub_int c1 c2 dbg) (-n2) dbg - | (Cop(Caddi, [c1; Cconst_int n1], _), c2) -> + | (Cop(Caddi, [c1; Cconst_int (n1, _)], _), c2) -> add_const (sub_int c1 c2 dbg) n1 dbg | (c1, c2) -> Cop(Csubi, [c1; c2], dbg) let rec lsl_int c1 c2 dbg = match (c1, c2) with - | (Cop(Clsl, [c; Cconst_int n1], _), Cconst_int n2) + | (Cop(Clsl, [c; Cconst_int (n1, _)], _), Cconst_int (n2, _)) when n1 > 0 && n2 > 0 && n1 + n2 < size_int * 8 -> - Cop(Clsl, [c; Cconst_int (n1 + n2)], dbg) - | (Cop(Caddi, [c1; Cconst_int n1], _), Cconst_int n2) + Cop(Clsl, [c; Cconst_int (n1 + n2, dbg)], dbg) + | (Cop(Caddi, [c1; Cconst_int (n1, _)], _), Cconst_int (n2, _)) when no_overflow_lsl n1 n2 -> add_const (lsl_int c1 c2 dbg) (n1 lsl n2) dbg | (_, _) -> @@ -195,80 +209,87 @@ let rec lsl_int c1 c2 dbg = let is_power2 n = n = 1 lsl Misc.log2 n -and mult_power2 c n dbg = lsl_int c (Cconst_int (Misc.log2 n)) dbg +and mult_power2 c n dbg = lsl_int c (Cconst_int (Misc.log2 n, dbg)) dbg let rec mul_int c1 c2 dbg = match (c1, c2) with - | (c, Cconst_int 0) | (Cconst_int 0, c) -> Csequence (c, Cconst_int 0) - | (c, Cconst_int 1) | (Cconst_int 1, c) -> + | (c, Cconst_int (0, _)) | (Cconst_int (0, _), c) -> + Csequence (c, Cconst_int (0, dbg)) + | (c, Cconst_int (1, _)) | (Cconst_int (1, _), c) -> c - | (c, Cconst_int(-1)) | (Cconst_int(-1), c) -> - sub_int (Cconst_int 0) c dbg - | (c, Cconst_int n) when is_power2 n -> mult_power2 c n dbg - | (Cconst_int n, c) when is_power2 n -> mult_power2 c n dbg - | (Cop(Caddi, [c; Cconst_int n], _), Cconst_int k) | - (Cconst_int k, Cop(Caddi, [c; Cconst_int n], _)) + | (c, Cconst_int(-1, _)) | (Cconst_int(-1, _), c) -> + sub_int (Cconst_int (0, dbg)) c dbg + | (c, Cconst_int (n, _)) when is_power2 n -> mult_power2 c n dbg + | (Cconst_int (n, _), c) when is_power2 n -> mult_power2 c n dbg + | (Cop(Caddi, [c; Cconst_int (n, _)], _), Cconst_int (k, _)) | + (Cconst_int (k, _), Cop(Caddi, [c; Cconst_int (n, _)], _)) when no_overflow_mul n k -> - add_const (mul_int c (Cconst_int k) dbg) (n * k) dbg + add_const (mul_int c (Cconst_int (k, dbg)) dbg) (n * k) dbg | (c1, c2) -> Cop(Cmuli, [c1; c2], dbg) let ignore_low_bit_int = function - Cop(Caddi, [(Cop(Clsl, [_; Cconst_int n], _) as c); Cconst_int 1], _) + Cop(Caddi, + [(Cop(Clsl, [_; Cconst_int (n, _)], _) as c); Cconst_int (1, _)], _) when n > 0 -> c - | Cop(Cor, [c; Cconst_int 1], _) -> c + | Cop(Cor, [c; Cconst_int (1, _)], _) -> c | c -> c let lsr_int c1 c2 dbg = match c2 with - Cconst_int 0 -> + Cconst_int (0, _) -> c1 - | Cconst_int n when n > 0 -> + | Cconst_int (n, _) when n > 0 -> Cop(Clsr, [ignore_low_bit_int c1; c2], dbg) | _ -> Cop(Clsr, [c1; c2], dbg) let asr_int c1 c2 dbg = match c2 with - Cconst_int 0 -> + Cconst_int (0, _) -> c1 - | Cconst_int n when n > 0 -> + | Cconst_int (n, _) when n > 0 -> Cop(Casr, [ignore_low_bit_int c1; c2], dbg) | _ -> Cop(Casr, [c1; c2], dbg) let tag_int i dbg = match i with - Cconst_int n -> - int_const n - | Cop(Casr, [c; Cconst_int n], _) when n > 0 -> - Cop(Cor, [asr_int c (Cconst_int (n - 1)) dbg; Cconst_int 1], dbg) + | Cconst_int (n, _) -> + int_const dbg n + | Cop(Casr, [c; Cconst_int (n, _)], _) when n > 0 -> + Cop(Cor, + [asr_int c (Cconst_int (n - 1, dbg)) dbg; Cconst_int (1, dbg)], + dbg) | c -> - incr_int (lsl_int c (Cconst_int 1) dbg) dbg + incr_int (lsl_int c (Cconst_int (1, dbg)) dbg) dbg let force_tag_int i dbg = match i with - Cconst_int n -> - int_const n - | Cop(Casr, [c; Cconst_int n], dbg') when n > 0 -> - Cop(Cor, [asr_int c (Cconst_int (n - 1)) dbg'; Cconst_int 1], dbg) + Cconst_int (n, _) -> + int_const dbg n + | Cop(Casr, [c; Cconst_int (n, _)], dbg') when n > 0 -> + Cop(Cor, [asr_int c (Cconst_int (n - 1, dbg)) dbg'; Cconst_int (1, dbg)], + dbg) | c -> - Cop(Cor, [lsl_int c (Cconst_int 1) dbg; Cconst_int 1], dbg) + Cop(Cor, [lsl_int c (Cconst_int (1, dbg)) dbg; Cconst_int (1, dbg)], dbg) let untag_int i dbg = match i with - Cconst_int n -> Cconst_int(n asr 1) - | Cop(Caddi, [Cop(Clsl, [c; Cconst_int 1], _); Cconst_int 1], _) -> c - | Cop(Cor, [Cop(Casr, [c; Cconst_int n], _); Cconst_int 1], _) + Cconst_int (n, _) -> Cconst_int(n asr 1, dbg) + | Cop(Caddi, [Cop(Clsl, [c; Cconst_int (1, _)], _); Cconst_int (1, _)], _) -> + c + | Cop(Cor, [Cop(Casr, [c; Cconst_int (n, _)], _); Cconst_int (1, _)], _) when n > 0 && n < size_int * 8 -> - Cop(Casr, [c; Cconst_int (n+1)], dbg) - | Cop(Cor, [Cop(Clsr, [c; Cconst_int n], _); Cconst_int 1], _) + Cop(Casr, [c; Cconst_int (n+1, dbg)], dbg) + | Cop(Cor, [Cop(Clsr, [c; Cconst_int (n, _)], _); Cconst_int (1, _)], _) when n > 0 && n < size_int * 8 -> - Cop(Clsr, [c; Cconst_int (n+1)], dbg) - | Cop(Cor, [c; Cconst_int 1], _) -> Cop(Casr, [c; Cconst_int 1], dbg) - | c -> Cop(Casr, [c; Cconst_int 1], dbg) + Cop(Clsr, [c; Cconst_int (n+1, dbg)], dbg) + | Cop(Cor, [c; Cconst_int (1, _)], _) -> + Cop(Casr, [c; Cconst_int (1, dbg)], dbg) + | c -> Cop(Casr, [c; Cconst_int (1, dbg)], dbg) (* Description of the "then" and "else" continuations in [transl_if]. If the "then" continuation is true and the "else" continuation is false then @@ -285,16 +306,18 @@ let invert_then_else = function | Then_false_else_true -> Then_true_else_false | Unknown -> Unknown -let mk_if_then_else cond ifso ifnot = +let mk_if_then_else dbg cond ifso_dbg ifso ifnot_dbg ifnot = match cond with - | Cconst_int 0 -> ifnot - | Cconst_int 1 -> ifso + | Cconst_int (0, _) -> ifnot + | Cconst_int (1, _) -> ifso | _ -> - Cifthenelse(cond, ifso, ifnot) + Cifthenelse(cond, ifso_dbg, ifso, ifnot_dbg, ifnot, dbg) let mk_not dbg cmm = match cmm with - | Cop(Caddi, [Cop(Clsl, [c; Cconst_int 1], _); Cconst_int 1], dbg') -> begin + | Cop(Caddi, + [Cop(Clsl, [c; Cconst_int (1, _)], _); Cconst_int (1, _)], dbg') -> + begin match c with | Cop(Ccmpi cmp, [c1; c2], dbg'') -> tag_int @@ -307,15 +330,22 @@ let mk_not dbg cmm = (Cop(Ccmpf (negate_float_comparison cmp), [c1; c2], dbg'')) dbg' | _ -> (* 0 -> 3, 1 -> 1 *) - Cop(Csubi, [Cconst_int 3; Cop(Clsl, [c; Cconst_int 1], dbg)], dbg) + Cop(Csubi, + [Cconst_int (3, dbg); Cop(Clsl, [c; Cconst_int (1, dbg)], dbg)], dbg) end - | Cconst_int 3 -> Cconst_int 1 - | Cconst_int 1 -> Cconst_int 3 + | Cconst_int (3, _) -> Cconst_int (1, dbg) + | Cconst_int (1, _) -> Cconst_int (3, dbg) | c -> (* 1 -> 3, 3 -> 1 *) - Cop(Csubi, [Cconst_int 4; c], dbg) + Cop(Csubi, [Cconst_int (4, dbg); c], dbg) +let create_loop body dbg = + let cont = next_raise_count () in + let call_cont = Cexit (cont, []) in + let body = Csequence (body, call_cont) in + Ccatch (Recursive, [cont, [], body, dbg], call_cont) + (* Turning integer divisions into multiply-high then shift. The [division_parameters] function is used in module Emit for those target platforms that support this optimization. *) @@ -408,21 +438,22 @@ let validate d m p = let raise_regular dbg exc = Csequence( Cop(Cstore (Thirtytwo_signed, Assignment), - [(Cconst_symbol "caml_backtrace_pos"); Cconst_int 0], dbg), + [(Cconst_symbol ("caml_backtrace_pos", dbg)); + Cconst_int (0, dbg)], dbg), Cop(Craise Raise_withtrace,[exc], dbg)) let raise_symbol dbg symb = - raise_regular dbg (Cconst_symbol symb) + raise_regular dbg (Cconst_symbol (symb, dbg)) let rec div_int c1 c2 is_safe dbg = match (c1, c2) with - (c1, Cconst_int 0) -> + (c1, Cconst_int (0, _)) -> Csequence(c1, raise_symbol dbg "caml_exn_Division_by_zero") - | (c1, Cconst_int 1) -> + | (c1, Cconst_int (1, _)) -> c1 - | (Cconst_int n1, Cconst_int n2) -> - Cconst_int (n1 / n2) - | (c1, Cconst_int n) when n <> min_int -> + | (Cconst_int (n1, _), Cconst_int (n2, _)) -> + Cconst_int (n1 / n2, dbg) + | (c1, Cconst_int (n, _)) when n <> min_int -> let l = Misc.log2 n in if n = 1 lsl l then (* Algorithm: @@ -432,12 +463,16 @@ let rec div_int c1 c2 is_safe dbg = res = shift-right-signed(c1 + t, l) *) Cop(Casr, [bind "dividend" c1 (fun c1 -> - let t = asr_int c1 (Cconst_int (l - 1)) dbg in - let t = lsr_int t (Cconst_int (Nativeint.size - l)) dbg in + let t = asr_int c1 (Cconst_int (l - 1, dbg)) dbg in + let t = + lsr_int t (Cconst_int (Nativeint.size - l, dbg)) dbg + in add_int c1 t dbg); - Cconst_int l], dbg) + Cconst_int (l, dbg)], dbg) else if n < 0 then - sub_int (Cconst_int 0) (div_int c1 (Cconst_int (-n)) is_safe dbg) dbg + sub_int (Cconst_int (0, dbg)) + (div_int c1 (Cconst_int (-n, dbg)) is_safe dbg) + dbg else begin let (m, p) = divimm_parameters (Nativeint.of_int n) in (* Algorithm: @@ -447,10 +482,12 @@ let rec div_int c1 c2 is_safe dbg = res = t + sign-bit(c1) *) bind "dividend" c1 (fun c1 -> - let t = Cop(Cmulhi, [c1; Cconst_natint m], dbg) in + let t = Cop(Cmulhi, [c1; Cconst_natint (m, dbg)], dbg) in let t = if m < 0n then Cop(Caddi, [t; c1], dbg) else t in - let t = if p > 0 then Cop(Casr, [t; Cconst_int p], dbg) else t in - add_int t (lsr_int c1 (Cconst_int (Nativeint.size - 1)) dbg) dbg) + let t = + if p > 0 then Cop(Casr, [t; Cconst_int (p, dbg)], dbg) else t + in + add_int t (lsr_int c1 (Cconst_int (Nativeint.size - 1, dbg)) dbg) dbg) end | (c1, c2) when !Clflags.unsafe || is_safe = Lambda.Unsafe -> Cop(Cdivi, [c1; c2], dbg) @@ -458,18 +495,21 @@ let rec div_int c1 c2 is_safe dbg = bind "divisor" c2 (fun c2 -> bind "dividend" c1 (fun c1 -> Cifthenelse(c2, + dbg, Cop(Cdivi, [c1; c2], dbg), - raise_symbol dbg "caml_exn_Division_by_zero"))) + dbg, + raise_symbol dbg "caml_exn_Division_by_zero", + dbg))) let mod_int c1 c2 is_safe dbg = match (c1, c2) with - (c1, Cconst_int 0) -> + (c1, Cconst_int (0, _)) -> Csequence(c1, raise_symbol dbg "caml_exn_Division_by_zero") - | (c1, Cconst_int (1 | (-1))) -> - Csequence(c1, Cconst_int 0) - | (Cconst_int n1, Cconst_int n2) -> - Cconst_int (n1 mod n2) - | (c1, (Cconst_int n as c2)) when n <> min_int -> + | (c1, Cconst_int ((1 | (-1)), _)) -> + Csequence(c1, Cconst_int (0, dbg)) + | (Cconst_int (n1, _), Cconst_int (n2, _)) -> + Cconst_int (n1 mod n2, dbg) + | (c1, (Cconst_int (n, _) as c2)) when n <> min_int -> let l = Misc.log2 n in if n = 1 lsl l then (* Algorithm: @@ -480,10 +520,10 @@ let mod_int c1 c2 is_safe dbg = res = c1 - t *) bind "dividend" c1 (fun c1 -> - let t = asr_int c1 (Cconst_int (l - 1)) dbg in - let t = lsr_int t (Cconst_int (Nativeint.size - l)) dbg in + let t = asr_int c1 (Cconst_int (l - 1, dbg)) dbg in + let t = lsr_int t (Cconst_int (Nativeint.size - l, dbg)) dbg in let t = add_int c1 t dbg in - let t = Cop(Cand, [t; Cconst_int (-n)], dbg) in + let t = Cop(Cand, [t; Cconst_int (-n, dbg)], dbg) in sub_int c1 t dbg) else bind "dividend" c1 (fun c1 -> @@ -495,15 +535,18 @@ let mod_int c1 c2 is_safe dbg = bind "divisor" c2 (fun c2 -> bind "dividend" c1 (fun c1 -> Cifthenelse(c2, + dbg, Cop(Cmodi, [c1; c2], dbg), - raise_symbol dbg "caml_exn_Division_by_zero"))) + dbg, + raise_symbol dbg "caml_exn_Division_by_zero", + dbg))) (* Division or modulo on boxed integers. The overflow case min_int / -1 can occur, in which case we force x / -1 = -x and x mod -1 = 0. (PR#5513). *) let is_different_from x = function - Cconst_int n -> n <> x - | Cconst_natint n -> n <> Nativeint.of_int x + Cconst_int (n, _) -> n <> x + | Cconst_natint (n, _) -> n <> Nativeint.of_int x | _ -> false let safe_divmod_bi mkop is_safe mkm1 c1 c2 bi dbg = @@ -513,27 +556,33 @@ let safe_divmod_bi mkop is_safe mkm1 c1 c2 bi dbg = if Arch.division_crashes_on_overflow && (size_int = 4 || bi <> Pint32) && not (is_different_from (-1) c2) - then Cifthenelse(Cop(Ccmpi Cne, [c2; Cconst_int(-1)], dbg), c, mkm1 c1 dbg) - else c)) + then + Cifthenelse(Cop(Ccmpi Cne, [c2; Cconst_int (-1, dbg)], dbg), + dbg, c, + dbg, mkm1 c1 dbg, + dbg) + else + c)) let safe_div_bi is_safe = safe_divmod_bi div_int is_safe - (fun c1 dbg -> Cop(Csubi, [Cconst_int 0; c1], dbg)) + (fun c1 dbg -> Cop(Csubi, [Cconst_int (0, dbg); c1], dbg)) let safe_mod_bi is_safe = - safe_divmod_bi mod_int is_safe (fun _ _ -> Cconst_int 0) + safe_divmod_bi mod_int is_safe (fun _ dbg -> Cconst_int (0, dbg)) (* Bool *) let test_bool dbg cmm = match cmm with - | Cop(Caddi, [Cop(Clsl, [c; Cconst_int 1], _); Cconst_int 1], _) -> c - | Cconst_int n -> + | Cop(Caddi, [Cop(Clsl, [c; Cconst_int (1, _)], _); Cconst_int (1, _)], _) -> + c + | Cconst_int (n, dbg) -> if n = 1 then - Cconst_int 0 + Cconst_int (0, dbg) else - Cconst_int 1 - | c -> Cop(Ccmpi Cne, [c; Cconst_int 1], dbg) + Cconst_int (1, dbg) + | c -> Cop(Ccmpi Cne, [c; Cconst_int (1, dbg)], dbg) (* Float *) @@ -541,7 +590,7 @@ let box_float dbg c = Cop(Calloc, [alloc_float_header dbg; c], dbg) let map_ccatch f rec_flag handlers body = let handlers = List.map - (fun (n, ids, handler) -> (n, ids, f handler)) + (fun (n, ids, handler, dbg) -> (n, ids, f handler, dbg)) handlers in Ccatch(rec_flag, handlers, f body) @@ -550,14 +599,19 @@ let rec unbox_float dbg cmm = | Cop(Calloc, [Cblockheader (header, _); c], _) when header = float_header -> c | Clet(id, exp, body) -> Clet(id, exp, unbox_float dbg body) - | Cifthenelse(cond, e1, e2) -> - Cifthenelse(cond, unbox_float dbg e1, unbox_float dbg e2) + | Cifthenelse(cond, ifso_dbg, e1, ifnot_dbg, e2, dbg) -> + Cifthenelse(cond, + ifso_dbg, unbox_float dbg e1, + ifnot_dbg, unbox_float dbg e2, + dbg) | Csequence(e1, e2) -> Csequence(e1, unbox_float dbg e2) | Cswitch(e, tbl, el, dbg') -> - Cswitch(e, tbl, Array.map (unbox_float dbg) el, dbg') + Cswitch(e, tbl, + Array.map (fun (expr, dbg) -> unbox_float dbg expr, dbg) el, dbg') | Ccatch(rec_flag, handlers, body) -> map_ccatch (unbox_float dbg) rec_flag handlers body - | Ctrywith(e1, id, e2) -> Ctrywith(unbox_float dbg e1, id, unbox_float dbg e2) + | Ctrywith(e1, id, e2, dbg) -> + Ctrywith(unbox_float dbg e1, id, unbox_float dbg e2, dbg) | c -> Cop(Cload (Double_u, Immutable), [c], dbg) (* Complex *) @@ -567,25 +621,31 @@ let box_complex dbg c_re c_im = let complex_re c dbg = Cop(Cload (Double_u, Immutable), [c], dbg) let complex_im c dbg = Cop(Cload (Double_u, Immutable), - [Cop(Cadda, [c; Cconst_int size_float], dbg)], dbg) + [Cop(Cadda, [c; Cconst_int (size_float, dbg)], dbg)], + dbg) (* Unit *) -let return_unit c = Csequence(c, Cconst_pointer 1) +let return_unit dbg c = Csequence(c, Cconst_pointer (1, dbg)) let rec remove_unit = function - Cconst_pointer 1 -> Ctuple [] - | Csequence(c, Cconst_pointer 1) -> c + Cconst_pointer (1, _) -> Ctuple [] + | Csequence(c, Cconst_pointer (1, _)) -> c | Csequence(c1, c2) -> Csequence(c1, remove_unit c2) - | Cifthenelse(cond, ifso, ifnot) -> - Cifthenelse(cond, remove_unit ifso, remove_unit ifnot) + | Cifthenelse(cond, ifso_dbg, ifso, ifnot_dbg, ifnot, dbg) -> + Cifthenelse(cond, + ifso_dbg, remove_unit ifso, + ifnot_dbg, + remove_unit ifnot, dbg) | Cswitch(sel, index, cases, dbg) -> - Cswitch(sel, index, Array.map remove_unit cases, dbg) + Cswitch(sel, index, + Array.map (fun (case, dbg) -> remove_unit case, dbg) cases, + dbg) | Ccatch(rec_flag, handlers, body) -> map_ccatch remove_unit rec_flag handlers body - | Ctrywith(body, exn, handler) -> - Ctrywith(remove_unit body, exn, remove_unit handler) + | Ctrywith(body, exn, handler, dbg) -> + Ctrywith(remove_unit body, exn, remove_unit handler, dbg) | Clet(id, c1, c2) -> Clet(id, c1, remove_unit c2) | Cop(Capply _mty, args, dbg) -> @@ -601,7 +661,7 @@ let rec remove_unit = function let field_address ptr n dbg = if n = 0 then ptr - else Cop(Cadda, [ptr; Cconst_int(n * size_addr)], dbg) + else Cop(Cadda, [ptr; Cconst_int(n * size_addr, dbg)], dbg) let get_field env ptr n dbg = let mut = @@ -629,11 +689,11 @@ let get_header ptr dbg = (* We cannot deem this as [Immutable] due to the presence of [Obj.truncate] and [Obj.set_tag]. *) Cop(Cload (Word_int, Mutable), - [Cop(Cadda, [ptr; Cconst_int(-size_int)], dbg)], dbg) + [Cop(Cadda, [ptr; Cconst_int(-size_int, dbg)], dbg)], dbg) let get_header_without_profinfo ptr dbg = if Config.profinfo then - Cop(Cand, [get_header ptr dbg; Cconst_int non_profinfo_mask], dbg) + Cop(Cand, [get_header ptr dbg; Cconst_int (non_profinfo_mask, dbg)], dbg) else get_header ptr dbg @@ -642,13 +702,13 @@ let tag_offset = let get_tag ptr dbg = if Proc.word_addressed then (* If byte loads are slow *) - Cop(Cand, [get_header ptr dbg; Cconst_int 255], dbg) + Cop(Cand, [get_header ptr dbg; Cconst_int (255, dbg)], dbg) else (* If byte loads are efficient *) Cop(Cload (Byte_unsigned, Mutable), (* Same comment as [get_header] above *) - [Cop(Cadda, [ptr; Cconst_int(tag_offset)], dbg)], dbg) + [Cop(Cadda, [ptr; Cconst_int(tag_offset, dbg)], dbg)], dbg) let get_size ptr dbg = - Cop(Clsr, [get_header_without_profinfo ptr dbg; Cconst_int 10], dbg) + Cop(Clsr, [get_header_without_profinfo ptr dbg; Cconst_int (10, dbg)], dbg) (* Array indexing *) @@ -659,19 +719,21 @@ let wordsize_shift = 9 let numfloat_shift = 9 + log2_size_float - log2_size_addr let is_addr_array_hdr hdr dbg = - Cop(Ccmpi Cne, [Cop(Cand, [hdr; Cconst_int 255], dbg); floatarray_tag], dbg) + Cop(Ccmpi Cne, + [Cop(Cand, [hdr; Cconst_int (255, dbg)], dbg); floatarray_tag dbg], + dbg) let is_addr_array_ptr ptr dbg = - Cop(Ccmpi Cne, [get_tag ptr dbg; floatarray_tag], dbg) + Cop(Ccmpi Cne, [get_tag ptr dbg; floatarray_tag dbg], dbg) let addr_array_length hdr dbg = - Cop(Clsr, [hdr; Cconst_int wordsize_shift], dbg) + Cop(Clsr, [hdr; Cconst_int (wordsize_shift, dbg)], dbg) let float_array_length hdr dbg = - Cop(Clsr, [hdr; Cconst_int numfloat_shift], dbg) + Cop(Clsr, [hdr; Cconst_int (numfloat_shift, dbg)], dbg) let lsl_const c n dbg = if n = 0 then c - else Cop(Clsl, [c; Cconst_int n], dbg) + else Cop(Clsl, [c; Cconst_int (n, dbg)], dbg) (* Produces a pointer to the element of the array [ptr] on the position [ofs] with the given element [log2size] log2 element size. [ofs] is given as a @@ -688,22 +750,25 @@ let array_indexing ?typ log2size ptr ofs dbg = | Some Int -> Caddi | _ -> assert false in match ofs with - | Cconst_int n -> + | Cconst_int (n, _) -> let i = n asr 1 in - if i = 0 then ptr else Cop(add, [ptr; Cconst_int(i lsl log2size)], dbg) - | Cop(Caddi, [Cop(Clsl, [c; Cconst_int 1], _); Cconst_int 1], dbg') -> + if i = 0 then ptr + else Cop(add, [ptr; Cconst_int(i lsl log2size, dbg)], dbg) + | Cop(Caddi, + [Cop(Clsl, [c; Cconst_int (1, _)], _); Cconst_int (1, _)], dbg') -> Cop(add, [ptr; lsl_const c log2size dbg], dbg') - | Cop(Caddi, [c; Cconst_int n], dbg') when log2size = 0 -> - Cop(add, [Cop(add, [ptr; untag_int c dbg], dbg); Cconst_int (n asr 1)], + | Cop(Caddi, [c; Cconst_int (n, _)], dbg') when log2size = 0 -> + Cop(add, + [Cop(add, [ptr; untag_int c dbg], dbg); Cconst_int (n asr 1, dbg)], dbg') - | Cop(Caddi, [c; Cconst_int n], _) -> + | Cop(Caddi, [c; Cconst_int (n, _)], _) -> Cop(add, [Cop(add, [ptr; lsl_const c (log2size - 1) dbg], dbg); - Cconst_int((n-1) lsl (log2size - 1))], dbg) + Cconst_int((n-1) lsl (log2size - 1), dbg)], dbg) | _ when log2size = 0 -> Cop(add, [ptr; untag_int ofs dbg], dbg) | _ -> Cop(add, [Cop(add, [ptr; lsl_const ofs (log2size - 1) dbg], dbg); - Cconst_int((-1) lsl (log2size - 1))], dbg) + Cconst_int((-1) lsl (log2size - 1), dbg)], dbg) let addr_array_ref arr ofs dbg = Cop(Cload (Word_val, Mutable), @@ -736,20 +801,23 @@ let float_array_set arr ofs newval dbg = let string_length exp dbg = bind "str" exp (fun str -> - let tmp_var = V.create_local "tmp" in + let tmp_var = V.create_local "*tmp*" in Clet(VP.create tmp_var, Cop(Csubi, [Cop(Clsl, [get_size str dbg; - Cconst_int log2_size_addr], + Cconst_int (log2_size_addr, dbg)], dbg); - Cconst_int 1], + Cconst_int (1, dbg)], dbg), Cop(Csubi, [Cvar tmp_var; Cop(Cload (Byte_unsigned, Mutable), [Cop(Cadda, [str; Cvar tmp_var], dbg)], dbg)], dbg))) +let bigstring_length ba dbg = + Cop(Cload (Word_int, Mutable), [field_address ba 5 dbg], dbg) + (* Message sending *) let lookup_tag obj tag dbg = @@ -768,7 +836,7 @@ let call_cached_method obj tag cache pos args dbg = let cache = array_indexing log2_size_addr cache pos dbg in Compilenv.need_send_fun arity; Cop(Capply typ_val, - Cconst_symbol("caml_send" ^ Int.to_string arity) :: + Cconst_symbol("caml_send" ^ Int.to_string arity, dbg) :: obj :: tag :: cache :: args, dbg) @@ -778,14 +846,14 @@ let make_alloc_generic set_fn dbg tag wordsize args = if wordsize <= Config.max_young_wosize then Cop(Calloc, Cblockheader(block_header tag wordsize, dbg) :: args, dbg) else begin - let id = V.create_local "alloc" in + let id = V.create_local "*alloc*" in let rec fill_fields idx = function [] -> Cvar id - | e1::el -> Csequence(set_fn (Cvar id) (Cconst_int idx) e1 dbg, + | e1::el -> Csequence(set_fn (Cvar id) (Cconst_int (idx, dbg)) e1 dbg, fill_fields (idx + 2) el) in Clet(VP.create id, Cop(Cextcall("caml_alloc", typ_val, true, None), - [Cconst_int wordsize; Cconst_int tag], dbg), + [Cconst_int (wordsize, dbg); Cconst_int (tag, dbg)], dbg), fill_fields 1 args) end @@ -803,8 +871,9 @@ let make_float_alloc dbg tag args = (* Bounds checking *) let make_checkbound dbg = function - | [Cop(Clsr, [a1; Cconst_int n], _); Cconst_int m] when (m lsl n) > n -> - Cop(Ccheckbound, [a1; Cconst_int(m lsl n + 1 lsl n - 1)], dbg) + | [Cop(Clsr, [a1; Cconst_int (n, _)], _); Cconst_int (m, _)] + when (m lsl n) > n -> + Cop(Ccheckbound, [a1; Cconst_int(m lsl n + 1 lsl n - 1, dbg)], dbg) | args -> Cop(Ccheckbound, args, dbg) @@ -830,6 +899,7 @@ let fundecls_size fundecls = type rhs_kind = | RHS_block of int + | RHS_infix of { blocksize : int; offset : int } | RHS_floatblock of int | RHS_nonrec ;; @@ -871,6 +941,11 @@ let rec expr_size env = function expr_size env closure | Usequence(_exp, exp') -> expr_size env exp' + | Uoffset (exp, offset) -> + (match expr_size env exp with + | RHS_block blocksize -> RHS_infix { blocksize; offset } + | RHS_nonrec -> RHS_nonrec + | _ -> assert false) | _ -> RHS_nonrec (* Record application and currying functions *) @@ -889,50 +964,107 @@ let transl_int_comparison cmp = cmp let transl_float_comparison cmp = cmp -(* Translate structured constants *) +(* Translate structured constants to Cmm data items *) -let transl_constant = function +let transl_constant dbg = function | Uconst_int n -> - int_const n + int_const dbg n | Uconst_ptr n -> if n <= max_repr_int && n >= min_repr_int - then Cconst_pointer((n lsl 1) + 1) + then Cconst_pointer((n lsl 1) + 1, dbg) else Cconst_natpointer - (Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n) + (Nativeint.add (Nativeint.shift_left (Nativeint.of_int n) 1) 1n, + dbg) | Uconst_ref (label, _) -> - Cconst_symbol label + Cconst_symbol (label, dbg) -let transl_structured_constant cst = - let label = Compilenv.new_structured_constant cst ~shared:true in - Cconst_symbol label +let cdefine_symbol (symb, (global : Cmmgen_state.is_global)) = + match global with + | Global -> [Cglobal_symbol symb; Cdefine_symbol symb] + | Local -> [Cdefine_symbol symb] -(* Translate constant closures *) +let emit_block symb is_global white_header cont = + (* Headers for structured constants must be marked black in case we + are in no-naked-pointers mode. See [caml_darken]. *) + let black_header = Nativeint.logor white_header caml_black in + Cint black_header :: cdefine_symbol (symb, is_global) @ cont -type is_global = Global | Not_global +let rec emit_structured_constant (sym, is_global) cst cont = + match cst with + | Uconst_float s -> + emit_block sym is_global float_header (Cdouble s :: cont) + | Uconst_string s -> + emit_block sym is_global (string_header (String.length s)) + (emit_string_constant s cont) + | Uconst_int32 n -> + emit_block sym is_global boxedint32_header + (emit_boxed_int32_constant n cont) + | Uconst_int64 n -> + emit_block sym is_global boxedint64_header + (emit_boxed_int64_constant n cont) + | Uconst_nativeint n -> + emit_block sym is_global boxedintnat_header + (emit_boxed_nativeint_constant n cont) + | Uconst_block (tag, csts) -> + let cont = List.fold_right emit_constant csts cont in + emit_block sym is_global (block_header tag (List.length csts)) cont + | Uconst_float_array fields -> + emit_block sym is_global (floatarray_header (List.length fields)) + (Misc.map_end (fun f -> Cdouble f) fields cont) + | Uconst_closure(fundecls, lbl, fv) -> + Cmmgen_state.add_constant lbl (Const_closure (is_global, fundecls, fv)); + List.iter (fun f -> Cmmgen_state.add_function f) fundecls; + cont -type symbol_defn = string * is_global +and emit_constant cst cont = + match cst with + | Uconst_int n | Uconst_ptr n -> + cint_const n + :: cont + | Uconst_ref (sym, _) -> + Csymbol_address sym :: cont -type cmm_constant = - | Const_closure of symbol_defn * ufunction list * uconstant list - | Const_table of symbol_defn * data_item list +and emit_string_constant s cont = + let n = size_int - 1 - (String.length s) mod size_int in + Cstring s :: Cskip n :: Cint8 n :: cont -let cmm_constants = - ref ([] : cmm_constant list) +and emit_boxed_int32_constant n cont = + let n = Nativeint.of_int32 n in + if size_int = 8 then + Csymbol_address caml_int32_ops :: Cint32 n :: Cint32 0n :: cont + else + Csymbol_address caml_int32_ops :: Cint n :: cont -let add_cmm_constant c = - cmm_constants := c :: !cmm_constants +and emit_boxed_nativeint_constant n cont = + Csymbol_address caml_nativeint_ops :: Cint n :: cont + +and emit_boxed_int64_constant n cont = + let lo = Int64.to_nativeint n in + if size_int = 8 then + Csymbol_address caml_int64_ops :: Cint lo :: cont + else begin + let hi = Int64.to_nativeint (Int64.shift_right n 32) in + if big_endian then + Csymbol_address caml_int64_ops :: Cint hi :: Cint lo :: cont + else + Csymbol_address caml_int64_ops :: Cint lo :: Cint hi :: cont + end (* Boxed integers *) -let box_int_constant bi n = +let box_int_constant sym bi n = match bi with - Pnativeint -> Uconst_nativeint n - | Pint32 -> Uconst_int32 (Nativeint.to_int32 n) - | Pint64 -> Uconst_int64 (Int64.of_nativeint n) - -let caml_nativeint_ops = "caml_nativeint_ops" -let caml_int32_ops = "caml_int32_ops" -let caml_int64_ops = "caml_int64_ops" + Pnativeint -> + emit_block sym Local boxedintnat_header + (emit_boxed_nativeint_constant n []) + | Pint32 -> + let n = Nativeint.to_int32 n in + emit_block sym Local boxedint32_header + (emit_boxed_int32_constant n []) + | Pint64 -> + let n = Int64.of_nativeint n in + emit_block sym Local boxedint64_header + (emit_boxed_int64_constant n []) let operations_boxed_int bi = match bi with @@ -948,76 +1080,92 @@ let alloc_header_boxed_int bi = let box_int dbg bi arg = match arg with - Cconst_int n -> - transl_structured_constant (box_int_constant bi (Nativeint.of_int n)) - | Cconst_natint n -> - transl_structured_constant (box_int_constant bi n) + | Cconst_int (n, _) -> + let sym = Compilenv.new_const_symbol () in + let data_items = box_int_constant sym bi (Nativeint.of_int n) in + Cmmgen_state.add_data_items data_items; + Cconst_symbol (sym, dbg) + | Cconst_natint (n, _) -> + let sym = Compilenv.new_const_symbol () in + let data_items = box_int_constant sym bi n in + Cmmgen_state.add_data_items data_items; + Cconst_symbol (sym, dbg) | _ -> let arg' = if bi = Pint32 && size_int = 8 && big_endian - then Cop(Clsl, [arg; Cconst_int 32], dbg) + then Cop(Clsl, [arg; Cconst_int (32, dbg)], dbg) else arg in Cop(Calloc, [alloc_header_boxed_int bi dbg; - Cconst_symbol(operations_boxed_int bi); + Cconst_symbol(operations_boxed_int bi, dbg); arg'], dbg) let split_int64_for_32bit_target arg dbg = bind "split_int64" arg (fun arg -> - let first = Cop (Cadda, [Cconst_int size_int; arg], dbg) in - let second = Cop (Cadda, [Cconst_int (2 * size_int); arg], dbg) in + let first = Cop (Cadda, [Cconst_int (size_int, dbg); arg], dbg) in + let second = Cop (Cadda, [Cconst_int (2 * size_int, dbg); arg], dbg) in Ctuple [Cop (Cload (Thirtytwo_unsigned, Mutable), [first], dbg); Cop (Cload (Thirtytwo_unsigned, Mutable), [second], dbg)]) let alloc_matches_boxed_int bi ~hdr ~ops = match bi, hdr, ops with - | Pnativeint, Cblockheader (hdr, _dbg), Cconst_symbol sym -> + | Pnativeint, Cblockheader (hdr, _dbg), Cconst_symbol (sym, _) -> Nativeint.equal hdr boxedintnat_header && String.equal sym caml_nativeint_ops - | Pint32, Cblockheader (hdr, _dbg), Cconst_symbol sym -> + | Pint32, Cblockheader (hdr, _dbg), Cconst_symbol (sym, _) -> Nativeint.equal hdr boxedint32_header && String.equal sym caml_int32_ops - | Pint64, Cblockheader (hdr, _dbg), Cconst_symbol sym -> + | Pint64, Cblockheader (hdr, _dbg), Cconst_symbol (sym, _) -> Nativeint.equal hdr boxedint64_header && String.equal sym caml_int64_ops | (Pnativeint | Pint32 | Pint64), _, _ -> false let rec unbox_int bi arg dbg = match arg with - Cop(Calloc, [hdr; ops; Cop(Clsl, [contents; Cconst_int 32], dbg')], _dbg) + Cop(Calloc, [hdr; ops; Cop(Clsl, [contents; Cconst_int (32, _)], dbg')], + _dbg) when bi = Pint32 && size_int = 8 && big_endian && alloc_matches_boxed_int bi ~hdr ~ops -> (* Force sign-extension of low 32 bits *) - Cop(Casr, [Cop(Clsl, [contents; Cconst_int 32], dbg'); Cconst_int 32], + Cop(Casr, [Cop(Clsl, [contents; Cconst_int (32, dbg)], dbg'); + Cconst_int (32, dbg)], dbg) | Cop(Calloc, [hdr; ops; contents], _dbg) when bi = Pint32 && size_int = 8 && not big_endian && alloc_matches_boxed_int bi ~hdr ~ops -> (* Force sign-extension of low 32 bits *) - Cop(Casr, [Cop(Clsl, [contents; Cconst_int 32], dbg); Cconst_int 32], dbg) + Cop(Casr, [Cop(Clsl, [contents; Cconst_int (32, dbg)], dbg); + Cconst_int (32, dbg)], + dbg) | Cop(Calloc, [hdr; ops; contents], _dbg) when alloc_matches_boxed_int bi ~hdr ~ops -> contents | Clet(id, exp, body) -> Clet(id, exp, unbox_int bi body dbg) - | Cifthenelse(cond, e1, e2) -> - Cifthenelse(cond, unbox_int bi e1 dbg, unbox_int bi e2 dbg) + | Cifthenelse(cond, ifso_dbg, e1, ifnot_dbg, e2, dbg) -> + Cifthenelse(cond, + ifso_dbg, unbox_int bi e1 ifso_dbg, + ifnot_dbg, unbox_int bi e2 ifnot_dbg, + dbg) | Csequence(e1, e2) -> Csequence(e1, unbox_int bi e2 dbg) | Cswitch(e, tbl, el, dbg') -> - Cswitch(e, tbl, Array.map (fun e -> unbox_int bi e dbg) el, dbg') + Cswitch(e, tbl, + Array.map (fun (e, dbg) -> unbox_int bi e dbg, dbg) el, + dbg') | Ccatch(rec_flag, handlers, body) -> map_ccatch (fun e -> unbox_int bi e dbg) rec_flag handlers body - | Ctrywith(e1, id, e2) -> - Ctrywith(unbox_int bi e1 dbg, id, unbox_int bi e2 dbg) + | Ctrywith(e1, id, e2, handler_dbg) -> + Ctrywith(unbox_int bi e1 dbg, id, + unbox_int bi e2 handler_dbg, handler_dbg) | _ -> if size_int = 4 && bi = Pint64 then split_int64_for_32bit_target arg dbg else Cop( Cload((if bi = Pint32 then Thirtytwo_signed else Word_int), Mutable), - [Cop(Cadda, [arg; Cconst_int size_addr], dbg)], dbg) + [Cop(Cadda, [arg; Cconst_int (size_addr, dbg)], dbg)], dbg) let make_unsigned_int bi arg dbg = if bi = Pint32 && size_int = 8 - then Cop(Cand, [arg; Cconst_natint 0xFFFFFFFFn], dbg) + then Cop(Cand, [arg; Cconst_natint (0xFFFFFFFFn, dbg)], dbg) else arg (* Boxed numbers *) @@ -1106,7 +1254,7 @@ let bigarray_indexing unsafe elt_kind layout b args dbg = ba_indexing (4 + List.length args) (-1) (List.rev args) | Pbigarray_fortran_layout -> ba_indexing 5 1 - (List.map (fun idx -> sub_int idx (Cconst_int 2) dbg) args) + (List.map (fun idx -> sub_int idx (Cconst_int (2, dbg)) dbg) args) and elt_size = bigarray_elt_size elt_kind in (* [array_indexing] can simplify the given expressions *) @@ -1141,7 +1289,7 @@ let bigarray_get unsafe elt_kind layout b args dbg = (Cop(Cload (kind, Mutable), [addr], dbg)) (fun reval -> bind "imval" (Cop(Cload (kind, Mutable), - [Cop(Cadda, [addr; Cconst_int sz], dbg)], dbg)) + [Cop(Cadda, [addr; Cconst_int (sz, dbg)], dbg)], dbg)) (fun imval -> box_complex dbg reval imval))) | _ -> Cop(Cload (bigarray_word_kind elt_kind, Mutable), @@ -1160,7 +1308,8 @@ let bigarray_set unsafe elt_kind layout b args newval dbg = Csequence( Cop(Cstore (kind, Assignment), [addr; complex_re newv dbg], dbg), Cop(Cstore (kind, Assignment), - [Cop(Cadda, [addr; Cconst_int sz], dbg); complex_im newv dbg], + [Cop(Cadda, [addr; Cconst_int (sz, dbg)], dbg); + complex_im newv dbg], dbg)))) | _ -> Cop(Cstore (bigarray_word_kind elt_kind, Assignment), @@ -1171,11 +1320,13 @@ let unaligned_load_16 ptr idx dbg = if Arch.allow_unaligned_access then Cop(Cload (Sixteen_unsigned, Mutable), [add_int ptr idx dbg], dbg) else + let cconst_int i = Cconst_int (i, dbg) in let v1 = Cop(Cload (Byte_unsigned, Mutable), [add_int ptr idx dbg], dbg) in let v2 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 1) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 1) dbg], dbg) + in let b1, b2 = if Arch.big_endian then v1, v2 else v2, v1 in - Cop(Cor, [lsl_int b1 (Cconst_int 8) dbg; b2], dbg) + Cop(Cor, [lsl_int b1 (cconst_int 8) dbg; b2], dbg) let unaligned_set_16 ptr idx newval dbg = if Arch.allow_unaligned_access @@ -1183,35 +1334,41 @@ let unaligned_set_16 ptr idx newval dbg = Cop(Cstore (Sixteen_unsigned, Assignment), [add_int ptr idx dbg; newval], dbg) else + let cconst_int i = Cconst_int (i, dbg) in let v1 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int 8], dbg); Cconst_int 0xFF], dbg) + Cop(Cand, [Cop(Clsr, [newval; cconst_int 8], dbg); + cconst_int 0xFF], dbg) in - let v2 = Cop(Cand, [newval; Cconst_int 0xFF], dbg) in + let v2 = Cop(Cand, [newval; cconst_int 0xFF], dbg) in let b1, b2 = if Arch.big_endian then v1, v2 else v2, v1 in Csequence( Cop(Cstore (Byte_unsigned, Assignment), [add_int ptr idx dbg; b1], dbg), Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 1) dbg; b2], dbg)) + [add_int (add_int ptr idx dbg) (cconst_int 1) dbg; b2], dbg)) let unaligned_load_32 ptr idx dbg = if Arch.allow_unaligned_access then Cop(Cload (Thirtytwo_unsigned, Mutable), [add_int ptr idx dbg], dbg) else + let cconst_int i = Cconst_int (i, dbg) in let v1 = Cop(Cload (Byte_unsigned, Mutable), [add_int ptr idx dbg], dbg) in let v2 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 1) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 1) dbg], dbg) + in let v3 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 2) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 2) dbg], dbg) + in let v4 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 3) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 3) dbg], dbg) + in let b1, b2, b3, b4 = if Arch.big_endian then v1, v2, v3, v4 else v4, v3, v2, v1 in Cop(Cor, - [Cop(Cor, [lsl_int b1 (Cconst_int 24) dbg; - lsl_int b2 (Cconst_int 16) dbg], dbg); - Cop(Cor, [lsl_int b3 (Cconst_int 8) dbg; b4], dbg)], + [Cop(Cor, [lsl_int b1 (cconst_int 24) dbg; + lsl_int b2 (cconst_int 16) dbg], dbg); + Cop(Cor, [lsl_int b3 (cconst_int 8) dbg; b4], dbg)], dbg) let unaligned_set_32 ptr idx newval dbg = @@ -1220,16 +1377,17 @@ let unaligned_set_32 ptr idx newval dbg = Cop(Cstore (Thirtytwo_unsigned, Assignment), [add_int ptr idx dbg; newval], dbg) else + let cconst_int i = Cconst_int (i, dbg) in let v1 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int 24], dbg); Cconst_int 0xFF], dbg) + Cop(Cand, [Cop(Clsr, [newval; cconst_int 24], dbg); cconst_int 0xFF], dbg) in let v2 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int 16], dbg); Cconst_int 0xFF], dbg) + Cop(Cand, [Cop(Clsr, [newval; cconst_int 16], dbg); cconst_int 0xFF], dbg) in let v3 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int 8], dbg); Cconst_int 0xFF], dbg) + Cop(Cand, [Cop(Clsr, [newval; cconst_int 8], dbg); cconst_int 0xFF], dbg) in - let v4 = Cop(Cand, [newval; Cconst_int 0xFF], dbg) in + let v4 = Cop(Cand, [newval; cconst_int 0xFF], dbg) in let b1, b2, b3, b4 = if Arch.big_endian then v1, v2, v3, v4 @@ -1239,48 +1397,59 @@ let unaligned_set_32 ptr idx newval dbg = Cop(Cstore (Byte_unsigned, Assignment), [add_int ptr idx dbg; b1], dbg), Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 1) dbg; b2], dbg)), + [add_int (add_int ptr idx dbg) (cconst_int 1) dbg; b2], + dbg)), Csequence( Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 2) dbg; b3], dbg), + [add_int (add_int ptr idx dbg) (cconst_int 2) dbg; b3], + dbg), Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 3) dbg; b4], dbg))) + [add_int (add_int ptr idx dbg) (cconst_int 3) dbg; b4], + dbg))) let unaligned_load_64 ptr idx dbg = assert(size_int = 8); if Arch.allow_unaligned_access then Cop(Cload (Word_int, Mutable), [add_int ptr idx dbg], dbg) else + let cconst_int i = Cconst_int (i, dbg) in let v1 = Cop(Cload (Byte_unsigned, Mutable), [add_int ptr idx dbg], dbg) in let v2 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 1) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 1) dbg], dbg) + in let v3 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 2) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 2) dbg], dbg) + in let v4 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 3) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 3) dbg], dbg) + in let v5 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 4) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 4) dbg], dbg) + in let v6 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 5) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 5) dbg], dbg) + in let v7 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 6) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 6) dbg], dbg) + in let v8 = Cop(Cload (Byte_unsigned, Mutable), - [add_int (add_int ptr idx dbg) (Cconst_int 7) dbg], dbg) in + [add_int (add_int ptr idx dbg) (cconst_int 7) dbg], dbg) + in let b1, b2, b3, b4, b5, b6, b7, b8 = if Arch.big_endian then v1, v2, v3, v4, v5, v6, v7, v8 else v8, v7, v6, v5, v4, v3, v2, v1 in Cop(Cor, [Cop(Cor, - [Cop(Cor, [lsl_int b1 (Cconst_int (8*7)) dbg; - lsl_int b2 (Cconst_int (8*6)) dbg], dbg); - Cop(Cor, [lsl_int b3 (Cconst_int (8*5)) dbg; - lsl_int b4 (Cconst_int (8*4)) dbg], dbg)], + [Cop(Cor, [lsl_int b1 (cconst_int (8*7)) dbg; + lsl_int b2 (cconst_int (8*6)) dbg], dbg); + Cop(Cor, [lsl_int b3 (cconst_int (8*5)) dbg; + lsl_int b4 (cconst_int (8*4)) dbg], dbg)], dbg); Cop(Cor, - [Cop(Cor, [lsl_int b5 (Cconst_int (8*3)) dbg; - lsl_int b6 (Cconst_int (8*2)) dbg], dbg); - Cop(Cor, [lsl_int b7 (Cconst_int 8) dbg; + [Cop(Cor, [lsl_int b5 (cconst_int (8*3)) dbg; + lsl_int b6 (cconst_int (8*2)) dbg], dbg); + Cop(Cor, [lsl_int b7 (cconst_int 8) dbg; b8], dbg)], dbg)], dbg) @@ -1289,35 +1458,36 @@ let unaligned_set_64 ptr idx newval dbg = if Arch.allow_unaligned_access then Cop(Cstore (Word_int, Assignment), [add_int ptr idx dbg; newval], dbg) else + let cconst_int i = Cconst_int (i, dbg) in let v1 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int (8*7)], dbg); Cconst_int 0xFF], + Cop(Cand, [Cop(Clsr, [newval; cconst_int (8*7)], dbg); cconst_int 0xFF], dbg) in let v2 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int (8*6)], dbg); Cconst_int 0xFF], + Cop(Cand, [Cop(Clsr, [newval; cconst_int (8*6)], dbg); cconst_int 0xFF], dbg) in let v3 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int (8*5)], dbg); Cconst_int 0xFF], + Cop(Cand, [Cop(Clsr, [newval; cconst_int (8*5)], dbg); cconst_int 0xFF], dbg) in let v4 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int (8*4)], dbg); Cconst_int 0xFF], + Cop(Cand, [Cop(Clsr, [newval; cconst_int (8*4)], dbg); cconst_int 0xFF], dbg) in let v5 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int (8*3)], dbg); Cconst_int 0xFF], + Cop(Cand, [Cop(Clsr, [newval; cconst_int (8*3)], dbg); cconst_int 0xFF], dbg) in let v6 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int (8*2)], dbg); Cconst_int 0xFF], + Cop(Cand, [Cop(Clsr, [newval; cconst_int (8*2)], dbg); cconst_int 0xFF], dbg) in let v7 = - Cop(Cand, [Cop(Clsr, [newval; Cconst_int 8], dbg); Cconst_int 0xFF], + Cop(Cand, [Cop(Clsr, [newval; cconst_int 8], dbg); cconst_int 0xFF], dbg) in - let v8 = Cop(Cand, [newval; Cconst_int 0xFF], dbg) in + let v8 = Cop(Cand, [newval; cconst_int 0xFF], dbg) in let b1, b2, b3, b4, b5, b6, b7, b8 = if Arch.big_endian then v1, v2, v3, v4, v5, v6, v7, v8 @@ -1329,47 +1499,76 @@ let unaligned_set_64 ptr idx newval dbg = [add_int ptr idx dbg; b1], dbg), Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 1) dbg; b2], + [add_int (add_int ptr idx dbg) (cconst_int 1) dbg; b2], dbg)), Csequence( Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 2) dbg; b3], + [add_int (add_int ptr idx dbg) (cconst_int 2) dbg; b3], dbg), Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 3) dbg; b4], + [add_int (add_int ptr idx dbg) (cconst_int 3) dbg; b4], dbg))), Csequence( Csequence( Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 4) dbg; b5], + [add_int (add_int ptr idx dbg) (cconst_int 4) dbg; b5], dbg), Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 5) dbg; b6], + [add_int (add_int ptr idx dbg) (cconst_int 5) dbg; b6], dbg)), Csequence( Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 6) dbg; b7], + [add_int (add_int ptr idx dbg) (cconst_int 6) dbg; b7], dbg), Cop(Cstore (Byte_unsigned, Assignment), - [add_int (add_int ptr idx dbg) (Cconst_int 7) dbg; b8], + [add_int (add_int ptr idx dbg) (cconst_int 7) dbg; b8], dbg)))) let max_or_zero a dbg = bind "size" a (fun a -> (* equivalent to - Cifthenelse(Cop(Ccmpi Cle, [a; Cconst_int 0]), Cconst_int 0, a) + Cifthenelse(Cop(Ccmpi Cle, [a; cconst_int 0]), cconst_int 0, a) if a is positive, sign is 0 hence sign_negation is full of 1 so sign_negation&a = a if a is negative, sign is full of 1 hence sign_negation is 0 so sign_negation&a = 0 *) - let sign = Cop(Casr, [a; Cconst_int (size_int * 8 - 1)], dbg) in - let sign_negation = Cop(Cxor, [sign; Cconst_int (-1)], dbg) in + let sign = Cop(Casr, [a; Cconst_int (size_int * 8 - 1, dbg)], dbg) in + let sign_negation = Cop(Cxor, [sign; Cconst_int (-1, dbg)], dbg) in Cop(Cand, [sign_negation; a], dbg)) -let check_bound unsafe dbg a1 a2 k = - if unsafe then k - else Csequence(make_checkbound dbg [max_or_zero a1 dbg; a2], k) +let check_bound safety access_size dbg length a2 k = + match safety with + | Unsafe -> k + | Safe -> + let offset = + match access_size with + | Sixteen -> 1 + | Thirty_two -> 3 + | Sixty_four -> 7 + in + let a1 = + sub_int length (Cconst_int (offset, dbg)) dbg + in + Csequence(make_checkbound dbg [max_or_zero a1 dbg; a2], k) + +let unaligned_set size ptr idx newval dbg = + match size with + | Sixteen -> unaligned_set_16 ptr idx newval dbg + | Thirty_two -> unaligned_set_32 ptr idx newval dbg + | Sixty_four -> unaligned_set_64 ptr idx newval dbg + +let unaligned_load size ptr idx dbg = + match size with + | Sixteen -> unaligned_load_16 ptr idx dbg + | Thirty_two -> unaligned_load_32 ptr idx dbg + | Sixty_four -> unaligned_load_64 ptr idx dbg + +let box_sized size dbg exp = + match size with + | Sixteen -> tag_int exp dbg + | Thirty_two -> box_int dbg Pint32 exp + | Sixty_four -> box_int dbg Pint64 exp (* Simplification of some primitives into C calls *) @@ -1424,11 +1623,11 @@ let simplif_primitive_32bits = function Pccall (default_prim ("caml_ba_get_" ^ Int.to_string n)) | Pbigarrayset(_unsafe, n, Pbigarray_int64, _layout) -> Pccall (default_prim ("caml_ba_set_" ^ Int.to_string n)) - | Pstring_load_64(_) -> Pccall (default_prim "caml_string_get64") - | Pbytes_load_64(_) -> Pccall (default_prim "caml_bytes_get64") - | Pbytes_set_64(_) -> Pccall (default_prim "caml_bytes_set64") - | Pbigstring_load_64(_) -> Pccall (default_prim "caml_ba_uint8_get64") - | Pbigstring_set_64(_) -> Pccall (default_prim "caml_ba_uint8_set64") + | Pstring_load(Sixty_four, _) -> Pccall (default_prim "caml_string_get64") + | Pbytes_load(Sixty_four, _) -> Pccall (default_prim "caml_bytes_get64") + | Pbytes_set(Sixty_four, _) -> Pccall (default_prim "caml_bytes_set64") + | Pbigstring_load(Sixty_four,_) -> Pccall (default_prim "caml_ba_uint8_get64") + | Pbigstring_set(Sixty_four,_) -> Pccall (default_prim "caml_ba_uint8_set64") | Pbbswap Pint64 -> Pccall (default_prim "caml_int64_bswap") | p -> p @@ -1454,31 +1653,64 @@ let transl_isout h arg dbg = tag_int (Cop(Ccmpa Clt, [h ; arg], dbg)) dbg (* Build an actual switch (ie jump table) *) let make_switch arg cases actions dbg = - let is_const = function + let extract_uconstant = + function (* Constant integers loaded from a table should end in 1, so that Cload never produces untagged integers *) - | Cconst_int n - | Cconst_pointer n -> (n land 1) = 1 - | Cconst_natint n - | Cconst_natpointer n -> (Nativeint.(to_int (logand n one) = 1)) - | Cconst_symbol _ -> true - | _ -> false in - if Array.for_all is_const actions then - let to_data_item = function - | Cconst_int n - | Cconst_pointer n -> Cint (Nativeint.of_int n) - | Cconst_natint n - | Cconst_natpointer n -> Cint n - | Cconst_symbol s -> Csymbol_address s - | _ -> assert false in - let const_actions = Array.map to_data_item actions in + | Cconst_int (n, _), _dbg + | Cconst_pointer (n, _), _dbg when (n land 1) = 1 -> + Some (Cint (Nativeint.of_int n)) + | Cconst_natint (n, _), _dbg + | Cconst_natpointer (n, _), _dbg + when Nativeint.(to_int (logand n one) = 1) -> + Some (Cint n) + | Cconst_symbol (s,_), _dbg -> + Some (Csymbol_address s) + | _ -> None + in + let extract_affine ~cases ~const_actions = + let length = Array.length cases in + if length >= 2 + then begin + match const_actions.(cases.(0)), const_actions.(cases.(1)) with + | Cint v0, Cint v1 -> + let slope = Nativeint.sub v1 v0 in + let check i = function + | Cint v -> v = Nativeint.(add (mul (of_int i) slope) v0) + | _ -> false + in + if Misc.Stdlib.Array.for_alli + (fun i idx -> check i const_actions.(idx)) cases + then Some (v0, slope) + else None + | _, _ -> + None + end + else None + in + let make_table_lookup ~cases ~const_actions arg dbg = let table = Compilenv.new_const_symbol () in - add_cmm_constant (Const_table ((table, Not_global), + Cmmgen_state.add_constant table (Const_table (Local, Array.to_list (Array.map (fun act -> const_actions.(act)) cases))); - addr_array_ref (Cconst_symbol table) (tag_int arg dbg) dbg - else - Cswitch (arg,cases,actions,dbg) + addr_array_ref (Cconst_symbol (table, dbg)) (tag_int arg dbg) dbg + in + let make_affine_computation ~offset ~slope arg dbg = + (* In case the resulting integers are an affine function of the index, we + don't emit a table, and just compute the result directly *) + add_int + (mul_int arg (natint_const_untagged dbg slope) dbg) + (natint_const_untagged dbg offset) + dbg + in + match Misc.Stdlib.Array.all_somes (Array.map extract_uconstant actions) with + | None -> + Cswitch (arg,cases,actions,dbg) + | Some const_actions -> + match extract_affine ~cases ~const_actions with + | Some (offset, slope) -> + make_affine_computation ~offset ~slope arg dbg + | None -> make_table_lookup ~cases ~const_actions arg dbg module SArgBlocks = struct @@ -1493,20 +1725,27 @@ struct type act = expression - let make_const i = Cconst_int i - (* CR mshinwell: fix debuginfo *) + (* CR mshinwell: GPR#2294 will fix the Debuginfo here *) + + let make_const i = Cconst_int (i, Debuginfo.none) let make_prim p args = Cop (p,args, Debuginfo.none) let make_offset arg n = add_const arg n Debuginfo.none let make_isout h arg = Cop (Ccmpa Clt, [h ; arg], Debuginfo.none) let make_isin h arg = Cop (Ccmpa Cge, [h ; arg], Debuginfo.none) - let make_if cond ifso ifnot = Cifthenelse (cond, ifso, ifnot) + let make_if cond ifso ifnot = + Cifthenelse (cond, Debuginfo.none, ifso, Debuginfo.none, ifnot, + Debuginfo.none) let make_switch loc arg cases actions = - make_switch arg cases actions (Debuginfo.from_location loc) + let dbg = Debuginfo.from_location loc in + let actions = Array.map (fun expr -> expr, dbg) actions in + make_switch arg cases actions dbg let bind arg body = bind "switcher" arg body - let make_catch handler = match handler with + let make_catch handler = + match handler with | Cexit (i,[]) -> i,fun e -> e | _ -> + let dbg = Debuginfo.none in let i = next_raise_count () in (* Printf.eprintf "SHARE CMM: %i\n" i ; @@ -1518,7 +1757,7 @@ struct | Cexit (j,_) -> if i=j then handler else body - | _ -> ccatch (i,[],body,handler)) + | _ -> ccatch (i,[],body,handler, dbg)) let make_exit i = Cexit (i,[]) @@ -1655,14 +1894,19 @@ let rec is_unboxed_number ~strict env e = | Some (_, bn) -> Boxed (bn, false) end + (* CR mshinwell: Changes to [Clambda] will provide the [Debuginfo] here *) | Uconst(Uconst_ref(_, Some (Uconst_float _))) -> - Boxed (Boxed_float Debuginfo.none, true) + let dbg = Debuginfo.none in + Boxed (Boxed_float dbg, true) | Uconst(Uconst_ref(_, Some (Uconst_int32 _))) -> - Boxed (Boxed_integer (Pint32, Debuginfo.none), true) + let dbg = Debuginfo.none in + Boxed (Boxed_integer (Pint32, dbg), true) | Uconst(Uconst_ref(_, Some (Uconst_int64 _))) -> - Boxed (Boxed_integer (Pint64, Debuginfo.none), true) + let dbg = Debuginfo.none in + Boxed (Boxed_integer (Pint64, dbg), true) | Uconst(Uconst_ref(_, Some (Uconst_nativeint _))) -> - Boxed (Boxed_integer (Pnativeint, Debuginfo.none), true) + let dbg = Debuginfo.none in + Boxed (Boxed_integer (Pnativeint, dbg), true) | Uprim(p, _, dbg) -> begin match simplif_primitive p with | Pccall p -> unboxed_number_kind_of_unbox dbg p.prim_native_repr_res @@ -1699,12 +1943,16 @@ let rec is_unboxed_number ~strict env e = Boxed (Boxed_integer (Pint64, dbg), false) | Pbigarrayref(_, _, Pbigarray_native_int,_) -> Boxed (Boxed_integer (Pnativeint, dbg), false) - | Pstring_load_32(_) | Pbytes_load_32(_) -> + | Pstring_load(Thirty_two,_) + | Pbytes_load(Thirty_two,_) -> Boxed (Boxed_integer (Pint32, dbg), false) - | Pstring_load_64(_) | Pbytes_load_64(_) -> + | Pstring_load(Sixty_four,_) + | Pbytes_load(Sixty_four,_) -> + Boxed (Boxed_integer (Pint64, dbg), false) + | Pbigstring_load(Thirty_two,_) -> + Boxed (Boxed_integer (Pint32, dbg), false) + | Pbigstring_load(Sixty_four,_) -> Boxed (Boxed_integer (Pint64, dbg), false) - | Pbigstring_load_32(_) -> Boxed (Boxed_integer (Pint32, dbg), false) - | Pbigstring_load_64(_) -> Boxed (Boxed_integer (Pint64, dbg), false) | Praise _ -> No_result | _ -> No_unboxing end @@ -1738,8 +1986,6 @@ let assignment_kind ptr init = (* Translate an expression *) -let functions = (Queue.create() : ufunction Queue.t) - let strmatch_compile = let module S = Strmatch.Make @@ -1757,28 +2003,33 @@ let rec transl env e = | Some (unboxed_id, bn) -> box_number bn (Cvar unboxed_id) end | Uconst sc -> - transl_constant sc + transl_constant Debuginfo.none sc | Uclosure(fundecls, []) -> - let lbl = Compilenv.new_const_symbol() in - add_cmm_constant ( - Const_closure ((lbl, Not_global), fundecls, [])); - List.iter (fun f -> Queue.add f functions) fundecls; - Cconst_symbol lbl + let sym = Compilenv.new_const_symbol() in + Cmmgen_state.add_constant sym (Const_closure (Local, fundecls, [])); + List.iter (fun f -> Cmmgen_state.add_function f) fundecls; + let dbg = + match fundecls with + | [] -> Debuginfo.none + | fundecl::_ -> fundecl.dbg + in + Cconst_symbol (sym, dbg) | Uclosure(fundecls, clos_vars) -> let rec transl_fundecls pos = function [] -> List.map (transl env) clos_vars | f :: rem -> - Queue.add f functions; + Cmmgen_state.add_function f; + let dbg = f.dbg in let without_header = if f.arity = 1 || f.arity = 0 then - Cconst_symbol f.label :: - int_const f.arity :: + Cconst_symbol (f.label, dbg) :: + int_const dbg f.arity :: transl_fundecls (pos + 3) rem else - Cconst_symbol(curry_function f.arity) :: - int_const f.arity :: - Cconst_symbol f.label :: + Cconst_symbol (curry_function f.arity, dbg) :: + int_const dbg f.arity :: + Cconst_symbol (f.label, dbg) :: transl_fundecls (pos + 4) rem in if pos = 0 then without_header @@ -1793,27 +2044,32 @@ let rec transl env e = | Uoffset(arg, offset) -> (* produces a valid Caml value, pointing just after an infix header *) let ptr = transl env arg in + let dbg = Debuginfo.none in if offset = 0 then ptr - else Cop(Caddv, [ptr; Cconst_int(offset * size_addr)], Debuginfo.none) + else Cop(Caddv, [ptr; Cconst_int(offset * size_addr, dbg)], dbg) | Udirect_apply(lbl, args, dbg) -> - Cop(Capply typ_val, Cconst_symbol lbl :: List.map (transl env) args, dbg) + Cop(Capply typ_val, + Cconst_symbol (lbl, dbg) :: List.map (transl env) args, + dbg) | Ugeneric_apply(clos, [arg], dbg) -> bind "fun" (transl env clos) (fun clos -> - Cop(Capply typ_val, [get_field env clos 0 dbg; transl env arg; clos], + Cop(Capply typ_val, + [get_field env clos 0 dbg; transl env arg; clos], dbg)) | Ugeneric_apply(clos, args, dbg) -> let arity = List.length args in - let cargs = Cconst_symbol(apply_function arity) :: + let cargs = Cconst_symbol(apply_function arity, dbg) :: List.map (transl env) (args @ [clos]) in Cop(Capply typ_val, cargs, dbg) | Usend(kind, met, obj, args, dbg) -> let call_met obj args clos = if args = [] then - Cop(Capply typ_val, [get_field env clos 0 dbg; obj; clos], dbg) + Cop(Capply typ_val, + [get_field env clos 0 dbg; obj; clos], dbg) else let arity = List.length args + 1 in - let cargs = Cconst_symbol(apply_function arity) :: obj :: + let cargs = Cconst_symbol(apply_function arity, dbg) :: obj :: (List.map (transl env) args) @ [clos] in Cop(Capply typ_val, cargs, dbg) in @@ -1861,8 +2117,8 @@ let rec transl env e = (* Primitives *) | Uprim(prim, args, dbg) -> begin match (simplif_primitive prim, args) with - (Pgetglobal id, []) -> - Cconst_symbol (V.name id) + | (Pread_symbol sym, []) -> + Cconst_symbol (sym, dbg) | (Pmakeblock _, []) -> assert false | (Pmakeblock(tag, _mut, _kind), args) -> @@ -1888,7 +2144,7 @@ let rec transl env e = in transl_ccall env prim_obj_dup [arg] dbg | (Pmakearray _, []) -> - transl_structured_constant (Uconst_block(0, [])) + Misc.fatal_error "Pmakearray is not allowed for an empty array" | (Pmakearray (kind, _), args) -> transl_make_array dbg env kind args | (Pbigarrayref(unsafe, _num_dims, elt_kind, layout), arg1 :: argl) -> let elt = @@ -1905,7 +2161,7 @@ let rec transl env e = end | (Pbigarrayset(unsafe, _num_dims, elt_kind, layout), arg1 :: argl) -> let (argidx, argnewval) = split_last argl in - return_unit(bigarray_set unsafe elt_kind layout + return_unit dbg (bigarray_set unsafe elt_kind layout (transl env arg1) (List.map (transl env) argidx) (match elt_kind with @@ -1929,7 +2185,33 @@ let rec transl env e = transl_prim_2 env p arg1 arg2 dbg | (p, [arg1; arg2; arg3]) -> transl_prim_3 env p arg1 arg2 arg3 dbg - | (_, _) -> + | (Pread_symbol _, _::_::_::_::_) + | (Pbigarrayset (_, _, _, _), []) + | (Pbigarrayref (_, _, _, _), []) + | ((Pbigarraydim _ | Pduparray (_, _)), ([] | _::_::_::_::_)) + -> + fatal_error "Cmmgen.transl:prim, wrong arity" + | ((Pfield_computed|Psequand + | Psequor | Pnot | Pnegint | Paddint | Psubint + | Pmulint | Pandint | Porint | Pxorint | Plslint + | Plsrint | Pasrint | Pintoffloat | Pfloatofint + | Pnegfloat | Pabsfloat | Paddfloat | Psubfloat + | Pmulfloat | Pdivfloat | Pstringlength | Pstringrefu + | Pstringrefs | Pbyteslength | Pbytesrefu | Pbytessetu + | Pbytesrefs | Pbytessets | Pisint | Pisout + | Pbswap16 | Pint_as_pointer | Popaque | Pfield _ + | Psetfield (_, _, _) | Psetfield_computed (_, _) + | Pfloatfield _ | Psetfloatfield (_, _) | Pduprecord (_, _) + | Praise _ | Pdivint _ | Pmodint _ | Pintcomp _ | Poffsetint _ + | Poffsetref _ | Pfloatcomp _ | Parraylength _ + | Parrayrefu _ | Parraysetu _ | Parrayrefs _ | Parraysets _ + | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _) | Pnegbint _ + | Paddbint _ | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ + | Pandbint _ | Porbint _ | Pxorbint _ | Plslbint _ | Plsrbint _ + | Pasrbint _ | Pbintcomp (_, _) | Pstring_load _ | Pbytes_load _ + | Pbytes_set _ | Pbigstring_load _ | Pbigstring_set _ + | Pbbswap _), _) + -> fatal_error "Cmmgen.transl:prim" end @@ -1942,7 +2224,7 @@ let rec transl env e = make_switch (untag_int (transl env arg) dbg) s.us_index_consts - (Array.map (transl env) s.us_actions_consts) + (Array.map (fun expr -> transl env expr, dbg) s.us_actions_consts) dbg else if Array.length s.us_index_consts = 0 then bind "switch" (transl env arg) (fun arg -> @@ -1951,11 +2233,14 @@ let rec transl env e = else bind "switch" (transl env arg) (fun arg -> Cifthenelse( - Cop(Cand, [arg; Cconst_int 1], dbg), + Cop(Cand, [arg; Cconst_int (1, dbg)], dbg), + dbg, transl_switch loc env (untag_int arg dbg) s.us_index_consts s.us_actions_consts, + dbg, transl_switch loc env - (get_tag arg dbg) s.us_index_blocks s.us_actions_blocks)) + (get_tag arg dbg) s.us_index_blocks s.us_actions_blocks, + dbg)) | Ustringswitch(arg,sw,d) -> let dbg = Debuginfo.none in bind "switch" (transl env arg) @@ -1965,38 +2250,45 @@ let rec transl env e = | Ustaticfail (nfail, args) -> Cexit (nfail, List.map (transl env) args) | Ucatch(nfail, [], body, handler) -> - make_catch nfail (transl env body) (transl env handler) + let dbg = Debuginfo.none in + make_catch nfail (transl env body) (transl env handler) dbg | Ucatch(nfail, ids, body, handler) -> + let dbg = Debuginfo.none in (* CR-someday mshinwell: consider how we can do better than [typ_val] when appropriate. *) let ids_with_types = List.map (fun (i, _) -> (i, Cmm.typ_val)) ids in - ccatch(nfail, ids_with_types, transl env body, transl env handler) + ccatch(nfail, ids_with_types, transl env body, transl env handler, dbg) | Utrywith(body, exn, handler) -> - Ctrywith(transl env body, exn, transl env handler) + let dbg = Debuginfo.none in + Ctrywith(transl env body, exn, transl env handler, dbg) | Uifthenelse(cond, ifso, ifnot) -> + let ifso_dbg = Debuginfo.none in + let ifnot_dbg = Debuginfo.none in let dbg = Debuginfo.none in - transl_if env cond dbg Unknown - (transl env ifso) (transl env ifnot) + transl_if env Unknown dbg cond + ifso_dbg (transl env ifso) ifnot_dbg (transl env ifnot) | Usequence(exp1, exp2) -> Csequence(remove_unit(transl env exp1), transl env exp2) | Uwhile(cond, body) -> let dbg = Debuginfo.none in let raise_num = next_raise_count () in - return_unit + return_unit dbg (ccatch (raise_num, [], - Cloop(transl_if env cond dbg Unknown - (remove_unit(transl env body)) - (Cexit (raise_num,[]))), - Ctuple [])) + create_loop(transl_if env Unknown dbg cond + dbg (remove_unit(transl env body)) + dbg (Cexit (raise_num,[]))) + dbg, + Ctuple [], + dbg)) | Ufor(id, low, high, dir, body) -> let dbg = Debuginfo.none in let tst = match dir with Upto -> Cgt | Downto -> Clt in let inc = match dir with Upto -> Caddi | Downto -> Csubi in let raise_num = next_raise_count () in - let id_prev = VP.rename id in - return_unit + let id_prev = VP.create (V.create_local "*id_prev*") in + return_unit dbg (Clet (id, transl env low, bind_nonvar "bound" (transl env high) (fun high -> @@ -2004,32 +2296,39 @@ let rec transl env e = (raise_num, [], Cifthenelse (Cop(Ccmpi tst, [Cvar (VP.var id); high], dbg), + dbg, Cexit (raise_num, []), - Cloop + dbg, + create_loop (Csequence (remove_unit(transl env body), Clet(id_prev, Cvar (VP.var id), Csequence (Cassign(VP.var id, - Cop(inc, [Cvar (VP.var id); Cconst_int 2], + Cop(inc, [Cvar (VP.var id); Cconst_int (2, dbg)], dbg)), Cifthenelse (Cop(Ccmpi Ceq, [Cvar (VP.var id_prev); high], dbg), - Cexit (raise_num,[]), Ctuple [])))))), - Ctuple [])))) + dbg, Cexit (raise_num,[]), + dbg, Ctuple [], + dbg))))) + dbg, + dbg), + Ctuple [], + dbg)))) | Uassign(id, exp) -> let dbg = Debuginfo.none in begin match is_unboxed_id id env with | None -> - return_unit (Cassign(id, transl env exp)) + return_unit dbg (Cassign(id, transl env exp)) | Some (unboxed_id, bn) -> - return_unit(Cassign(unboxed_id, + return_unit dbg (Cassign(unboxed_id, transl_unbox_number dbg env bn exp)) end | Uunreachable -> let dbg = Debuginfo.none in - Cop(Cload (Word_int, Mutable), [Cconst_int 0], dbg) + Cop(Cload (Word_int, Mutable), [Cconst_int (0, dbg)], dbg) and transl_make_array dbg env kind args = match kind with @@ -2077,10 +2376,8 @@ and transl_ccall env prim args dbg = and transl_prim_1 env p arg dbg = match p with (* Generic operations *) - Pidentity | Pbytes_to_string | Pbytes_of_string | Popaque -> + Popaque -> transl env arg - | Pignore -> - return_unit(remove_unit (transl env arg)) (* Heap operations *) | Pfield n -> get_field env (transl env arg) n dbg @@ -2088,11 +2385,12 @@ and transl_prim_1 env p arg dbg = let ptr = transl env arg in box_float dbg ( Cop(Cload (Double_u, Mutable), - [if n = 0 then ptr - else Cop(Cadda, [ptr; Cconst_int(n * size_float)], dbg)], + [if n = 0 + then ptr + else Cop(Cadda, [ptr; Cconst_int(n * size_float, dbg)], dbg)], dbg)) | Pint_as_pointer -> - Cop(Caddi, [transl env arg; Cconst_int (-1)], dbg) + Cop(Caddi, [transl env arg; Cconst_int (-1, dbg)], dbg) (* always a pointer outside the heap *) (* Exceptions *) | Praise _ when not (!Clflags.debug) -> @@ -2105,28 +2403,14 @@ and transl_prim_1 env p arg dbg = raise_regular dbg (transl env arg) (* Integer operations *) | Pnegint -> - Cop(Csubi, [Cconst_int 2; transl env arg], dbg) - | Pctconst c -> - let const_of_bool b = int_const (if b then 1 else 0) in - begin - match c with - | Big_endian -> const_of_bool Arch.big_endian - | Word_size -> int_const (8*Arch.size_int) - | Int_size -> int_const (8*Arch.size_int - 1) - | Max_wosize -> int_const ((1 lsl ((8*Arch.size_int) - 10)) - 1) - | Ostype_unix -> const_of_bool (Sys.os_type = "Unix") - | Ostype_win32 -> const_of_bool (Sys.os_type = "Win32") - | Ostype_cygwin -> const_of_bool (Sys.os_type = "Cygwin") - | Backend_type -> int_const 0 (* tag 0 is the same as Native here *) - end + Cop(Csubi, [Cconst_int (2, dbg); transl env arg], dbg) | Poffsetint n -> if no_overflow_lsl n 1 then add_const (transl env arg) (n lsl 1) dbg else - transl_prim_2 env Paddint arg (Uconst (Uconst_int n)) - Debuginfo.none + transl_prim_2 env Paddint arg (Uconst (Uconst_int n)) dbg | Poffsetref n -> - return_unit + return_unit dbg (bind "ref" (transl env arg) (fun arg -> Cop(Cstore (Word_int, Assignment), [arg; @@ -2152,26 +2436,33 @@ and transl_prim_1 env p arg dbg = Pgenarray -> let len = if wordsize_shift = numfloat_shift then - Cop(Clsr, [hdr; Cconst_int wordsize_shift], dbg) + Cop(Clsr, [hdr; Cconst_int (wordsize_shift, dbg)], dbg) else bind "header" hdr (fun hdr -> Cifthenelse(is_addr_array_hdr hdr dbg, - Cop(Clsr, [hdr; Cconst_int wordsize_shift], dbg), - Cop(Clsr, [hdr; Cconst_int numfloat_shift], dbg))) + dbg, + Cop(Clsr, + [hdr; Cconst_int (wordsize_shift, dbg)], dbg), + dbg, + Cop(Clsr, + [hdr; Cconst_int (numfloat_shift, dbg)], dbg), + dbg)) in - Cop(Cor, [len; Cconst_int 1], dbg) + Cop(Cor, [len; Cconst_int (1, dbg)], dbg) | Paddrarray | Pintarray -> - Cop(Cor, [addr_array_length hdr dbg; Cconst_int 1], dbg) + Cop(Cor, [addr_array_length hdr dbg; Cconst_int (1, dbg)], dbg) | Pfloatarray -> - Cop(Cor, [float_array_length hdr dbg; Cconst_int 1], dbg) + Cop(Cor, [float_array_length hdr dbg; Cconst_int (1, dbg)], dbg) end (* Boolean operations *) | Pnot -> - transl_if env arg dbg Then_false_else_true - (Cconst_pointer 1) (Cconst_pointer 3) + transl_if env Then_false_else_true + dbg arg + dbg (Cconst_pointer (1, dbg)) + dbg (Cconst_pointer (3, dbg)) (* Test integer/block *) | Pisint -> - tag_int(Cop(Cand, [transl env arg; Cconst_int 1], dbg)) dbg + tag_int(Cop(Cand, [transl env arg; Cconst_int (1, dbg)], dbg)) dbg (* Boxed integers *) | Pbintofint bi -> box_int dbg bi (untag_int (transl env arg) dbg) @@ -2181,7 +2472,8 @@ and transl_prim_1 env p arg dbg = box_int dbg bi2 (transl_unbox_int dbg env bi1 arg) | Pnegbint bi -> box_int dbg bi - (Cop(Csubi, [Cconst_int 0; transl_unbox_int dbg env bi arg], dbg)) + (Cop(Csubi, [Cconst_int (0, dbg); transl_unbox_int dbg env bi arg], + dbg)) | Pbbswap bi -> let prim = match bi with | Pnativeint -> "nativeint" @@ -2196,8 +2488,25 @@ and transl_prim_1 env p arg dbg = [untag_int (transl env arg) dbg], dbg)) dbg - | prim -> - fatal_errorf "Cmmgen.transl_prim_1: %a" Printlambda.primitive prim + | (Pfield_computed | Psequand | Psequor + | Paddint | Psubint | Pmulint | Pandint + | Porint | Pxorint | Plslint | Plsrint | Pasrint + | Paddfloat | Psubfloat | Pmulfloat | Pdivfloat + | Pstringrefu | Pstringrefs | Pbytesrefu | Pbytessetu + | Pbytesrefs | Pbytessets | Pisout | Pread_symbol _ + | Pmakeblock (_, _, _) | Psetfield (_, _, _) | Psetfield_computed (_, _) + | Psetfloatfield (_, _) | Pduprecord (_, _) | Pccall _ | Pdivint _ + | Pmodint _ | Pintcomp _ | Pfloatcomp _ | Pmakearray (_, _) + | Pduparray (_, _) | Parrayrefu _ | Parraysetu _ + | Parrayrefs _ | Parraysets _ | Paddbint _ | Psubbint _ | Pmulbint _ + | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ | Pxorbint _ + | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) + | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) + | Pbigarraydim _ | Pstring_load _ | Pbytes_load _ | Pbytes_set _ + | Pbigstring_load _ | Pbigstring_set _) + -> + fatal_errorf "Cmmgen.transl_prim_1: %a" + Printclambda_primitives.primitive p and transl_prim_2 env p arg1 arg2 dbg = match p with @@ -2207,38 +2516,46 @@ and transl_prim_2 env p arg1 arg2 dbg = | Psetfield(n, ptr, init) -> begin match assignment_kind ptr init with | Caml_modify -> - return_unit(Cop(Cextcall("caml_modify", typ_void, false, None), + return_unit dbg (Cop(Cextcall("caml_modify", typ_void, false, None), [field_address (transl env arg1) n dbg; transl env arg2], dbg)) | Caml_initialize -> - return_unit(Cop(Cextcall("caml_initialize", typ_void, false, None), + return_unit dbg (Cop(Cextcall("caml_initialize", typ_void, false, None), [field_address (transl env arg1) n dbg; transl env arg2], dbg)) | Simple -> - return_unit(set_field (transl env arg1) n (transl env arg2) init dbg) + return_unit dbg + (set_field (transl env arg1) n (transl env arg2) init dbg) end | Psetfloatfield (n, init) -> let ptr = transl env arg1 in - return_unit( + return_unit dbg ( Cop(Cstore (Double_u, init), [if n = 0 then ptr - else Cop(Cadda, [ptr; Cconst_int(n * size_float)], dbg); - transl_unbox_float dbg env arg2], dbg)) + else + Cop(Cadda, [ptr; Cconst_int(n * size_float, dbg)], dbg); + transl_unbox_float dbg env arg2], dbg)) (* Boolean operations *) | Psequand -> let dbg' = Debuginfo.none in - transl_sequand env arg1 dbg arg2 dbg' Then_true_else_false - (Cconst_pointer 3) (Cconst_pointer 1) + transl_sequand env Then_true_else_false + dbg arg1 + dbg' arg2 + dbg (Cconst_pointer (3, dbg)) + dbg' (Cconst_pointer (1, dbg)) (* let id = V.create_local "res1" in Clet(id, transl env arg1, Cifthenelse(test_bool dbg (Cvar id), transl env arg2, Cvar id)) *) | Psequor -> let dbg' = Debuginfo.none in - transl_sequor env arg1 dbg arg2 dbg' Then_true_else_false - (Cconst_pointer 3) (Cconst_pointer 1) + transl_sequor env Then_true_else_false + dbg arg1 + dbg' arg2 + dbg (Cconst_pointer (3, dbg)) + dbg' (Cconst_pointer (1, dbg)) (* Integer operations *) | Paddint -> decr_int(add_int (transl env arg1) (transl env arg2) dbg) dbg @@ -2254,10 +2571,10 @@ and transl_prim_2 env p arg1 arg2 dbg = (+ ( * 200 (>>s a 1)) 15) *) match transl env arg1, transl env arg2 with - | Cconst_int _ as c1, c2 -> - incr_int (mul_int (untag_int c1 dbg) (decr_int c2 dbg) dbg) dbg - | c1, c2 -> - incr_int (mul_int (decr_int c1 dbg) (untag_int c2 dbg) dbg) dbg + | Cconst_int _ as c1, c2 -> + incr_int (mul_int (untag_int c1 dbg) (decr_int c2 dbg) dbg) dbg + | c1, c2 -> + incr_int (mul_int (decr_int c1 dbg) (untag_int c2 dbg) dbg) dbg end | Pdivint is_safe -> tag_int(div_int (untag_int(transl env arg1) dbg) @@ -2272,16 +2589,16 @@ and transl_prim_2 env p arg1 arg2 dbg = | Pxorint -> Cop(Cor, [Cop(Cxor, [ignore_low_bit_int(transl env arg1); ignore_low_bit_int(transl env arg2)], dbg); - Cconst_int 1], dbg) + Cconst_int (1, dbg)], dbg) | Plslint -> incr_int(lsl_int (decr_int(transl env arg1) dbg) (untag_int(transl env arg2) dbg) dbg) dbg | Plsrint -> Cop(Cor, [lsr_int (transl env arg1) (untag_int(transl env arg2) dbg) dbg; - Cconst_int 1], dbg) + Cconst_int (1, dbg)], dbg) | Pasrint -> Cop(Cor, [asr_int (transl env arg1) (untag_int(transl env arg2) dbg) dbg; - Cconst_int 1], dbg) + Cconst_int (1, dbg)], dbg) | Pintcomp cmp -> tag_int(Cop(Ccmpi(transl_int_comparison cmp), [transl env arg1; transl env arg2], dbg)) dbg @@ -2329,65 +2646,25 @@ and transl_prim_2 env p arg1 arg2 dbg = Cop(Cload (Byte_unsigned, Mutable), [add_int str idx dbg], dbg))))) dbg - | Pstring_load_16(unsafe) | Pbytes_load_16(unsafe) -> - tag_int + | Pstring_load(size, unsafe) | Pbytes_load(size, unsafe) -> + box_sized size dbg (bind "str" (transl env arg1) (fun str -> bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - check_bound unsafe dbg - (sub_int (string_length str dbg) (Cconst_int 1) dbg) - idx (unaligned_load_16 str idx dbg)))) dbg + check_bound unsafe size dbg + (string_length str dbg) + idx (unaligned_load size str idx dbg)))) - | Pbigstring_load_16(unsafe) -> - tag_int + | Pbigstring_load(size, unsafe) -> + box_sized size dbg (bind "ba" (transl env arg1) (fun ba -> bind "index" (untag_int (transl env arg2) dbg) (fun idx -> bind "ba_data" (Cop(Cload (Word_int, Mutable), [field_address ba 1 dbg], dbg)) (fun ba_data -> - check_bound unsafe dbg (sub_int (Cop(Cload (Word_int, Mutable), - [field_address ba 5 dbg], dbg)) - (Cconst_int 1) dbg) idx - (unaligned_load_16 ba_data idx dbg))))) dbg - - | Pstring_load_32(unsafe) | Pbytes_load_32(unsafe) -> - box_int dbg Pint32 - (bind "str" (transl env arg1) (fun str -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - check_bound unsafe dbg - (sub_int (string_length str dbg) (Cconst_int 3) dbg) - idx (unaligned_load_32 str idx dbg)))) - - | Pbigstring_load_32(unsafe) -> - box_int dbg Pint32 - (bind "ba" (transl env arg1) (fun ba -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "ba_data" - (Cop(Cload (Word_int, Mutable), [field_address ba 1 dbg], dbg)) - (fun ba_data -> - check_bound unsafe dbg (sub_int (Cop(Cload (Word_int, Mutable), - [field_address ba 5 dbg], dbg)) - (Cconst_int 3) dbg) idx - (unaligned_load_32 ba_data idx dbg))))) - - | Pstring_load_64(unsafe) | Pbytes_load_64(unsafe) -> - box_int dbg Pint64 - (bind "str" (transl env arg1) (fun str -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - check_bound unsafe dbg - (sub_int (string_length str dbg) (Cconst_int 7) dbg) - idx (unaligned_load_64 str idx dbg)))) - - | Pbigstring_load_64(unsafe) -> - box_int dbg Pint64 - (bind "ba" (transl env arg1) (fun ba -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "ba_data" - (Cop(Cload (Word_int, Mutable), [field_address ba 1 dbg], dbg)) - (fun ba_data -> - check_bound unsafe dbg (sub_int (Cop(Cload (Word_int, Mutable), - [field_address ba 5 dbg], dbg)) - (Cconst_int 7) dbg) idx - (unaligned_load_64 ba_data idx dbg))))) + check_bound unsafe size dbg + (bigstring_length ba dbg) + idx + (unaligned_load size ba_data idx dbg))))) (* Array operations *) | Parrayrefu kind -> @@ -2396,8 +2673,11 @@ and transl_prim_2 env p arg1 arg2 dbg = bind "arr" (transl env arg1) (fun arr -> bind "index" (transl env arg2) (fun idx -> Cifthenelse(is_addr_array_ptr arr dbg, + dbg, addr_array_ref arr idx dbg, - float_array_ref dbg arr idx))) + dbg, + float_array_ref dbg arr idx, + dbg))) | Paddrarray -> addr_array_ref (transl env arg1) (transl env arg2) dbg | Pintarray -> @@ -2415,14 +2695,20 @@ and transl_prim_2 env p arg1 arg2 dbg = if wordsize_shift = numfloat_shift then Csequence(make_checkbound dbg [addr_array_length hdr dbg; idx], Cifthenelse(is_addr_array_hdr hdr dbg, + dbg, addr_array_ref arr idx dbg, - float_array_ref dbg arr idx)) + dbg, + float_array_ref dbg arr idx, + dbg)) else Cifthenelse(is_addr_array_hdr hdr dbg, + dbg, Csequence(make_checkbound dbg [addr_array_length hdr dbg; idx], addr_array_ref arr idx dbg), + dbg, Csequence(make_checkbound dbg [float_array_length hdr dbg; idx], - float_array_ref dbg arr idx))))) + float_array_ref dbg arr idx), + dbg)))) | Paddrarray -> bind "index" (transl env arg2) (fun idx -> bind "arr" (transl env arg1) (fun arr -> @@ -2497,8 +2783,18 @@ and transl_prim_2 env p arg1 arg2 dbg = tag_int (Cop(Ccmpi(transl_int_comparison cmp), [transl_unbox_int dbg env bi arg1; transl_unbox_int dbg env bi arg2], dbg)) dbg - | prim -> - fatal_errorf "Cmmgen.transl_prim_2: %a" Printlambda.primitive prim + | Pnot | Pnegint | Pintoffloat | Pfloatofint | Pnegfloat + | Pabsfloat | Pstringlength | Pbyteslength | Pbytessetu | Pbytessets + | Pisint | Pbswap16 | Pint_as_pointer | Popaque | Pread_symbol _ + | Pmakeblock (_, _, _) | Pfield _ | Psetfield_computed (_, _) | Pfloatfield _ + | Pduprecord (_, _) | Pccall _ | Praise _ | Poffsetint _ | Poffsetref _ + | Pmakearray (_, _) | Pduparray (_, _) | Parraylength _ | Parraysetu _ + | Parraysets _ | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _) + | Pnegbint _ | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) + | Pbigarraydim _ | Pbytes_set _ | Pbigstring_set _ | Pbbswap _ + -> + fatal_errorf "Cmmgen.transl_prim_2: %a" + Printclambda_primitives.primitive p and transl_prim_3 env p arg1 arg2 arg3 dbg = match p with @@ -2506,27 +2802,27 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = | Psetfield_computed(ptr, init) -> begin match assignment_kind ptr init with | Caml_modify -> - return_unit ( + return_unit dbg ( addr_array_set (transl env arg1) (transl env arg2) (transl env arg3) dbg) | Caml_initialize -> - return_unit ( + return_unit dbg ( addr_array_initialize (transl env arg1) (transl env arg2) (transl env arg3) dbg) | Simple -> - return_unit ( + return_unit dbg ( int_array_set (transl env arg1) (transl env arg2) (transl env arg3) dbg) end (* String operations *) | Pbytessetu -> - return_unit(Cop(Cstore (Byte_unsigned, Assignment), + return_unit dbg (Cop(Cstore (Byte_unsigned, Assignment), [add_int (transl env arg1) (untag_int(transl env arg2) dbg) dbg; untag_int(transl env arg3) dbg], dbg)) | Pbytessets -> - return_unit + return_unit dbg (bind "str" (transl env arg1) (fun str -> bind "index" (untag_int (transl env arg2) dbg) (fun idx -> Csequence( @@ -2537,15 +2833,18 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = (* Array operations *) | Parraysetu kind -> - return_unit(begin match kind with + return_unit dbg (begin match kind with Pgenarray -> bind "newval" (transl env arg3) (fun newval -> bind "index" (transl env arg2) (fun index -> bind "arr" (transl env arg1) (fun arr -> Cifthenelse(is_addr_array_ptr arr dbg, + dbg, addr_array_set arr index newval dbg, + dbg, float_array_set arr index (unbox_float dbg newval) - dbg)))) + dbg, + dbg)))) | Paddrarray -> addr_array_set (transl env arg1) (transl env arg2) (transl env arg3) dbg @@ -2558,7 +2857,7 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = dbg end) | Parraysets kind -> - return_unit(begin match kind with + return_unit dbg (begin match kind with | Pgenarray -> bind "newval" (transl env arg3) (fun newval -> bind "index" (transl env arg2) (fun idx -> @@ -2567,17 +2866,23 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = if wordsize_shift = numfloat_shift then Csequence(make_checkbound dbg [addr_array_length hdr dbg; idx], Cifthenelse(is_addr_array_hdr hdr dbg, + dbg, addr_array_set arr idx newval dbg, + dbg, float_array_set arr idx (unbox_float dbg newval) - dbg)) + dbg, + dbg)) else Cifthenelse(is_addr_array_hdr hdr dbg, + dbg, Csequence(make_checkbound dbg [addr_array_length hdr dbg; idx], addr_array_set arr idx newval dbg), + dbg, Csequence(make_checkbound dbg [float_array_length hdr dbg; idx], float_array_set arr idx - (unbox_float dbg newval) dbg)))))) + (unbox_float dbg newval) dbg), + dbg))))) | Paddrarray -> bind "newval" (transl env arg3) (fun newval -> bind "index" (transl env arg2) (fun idx -> @@ -2601,98 +2906,66 @@ and transl_prim_3 env p arg1 arg2 arg3 dbg = float_array_set arr idx newval dbg)))) end) - | Pbytes_set_16(unsafe) -> - return_unit - (bind "str" (transl env arg1) (fun str -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "newval" (untag_int (transl env arg3) dbg) (fun newval -> - check_bound unsafe dbg - (sub_int (string_length str dbg) (Cconst_int 1) dbg) - idx (unaligned_set_16 str idx newval dbg))))) - - | Pbigstring_set_16(unsafe) -> - return_unit - (bind "ba" (transl env arg1) (fun ba -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "newval" (untag_int (transl env arg3) dbg) (fun newval -> - bind "ba_data" - (Cop(Cload (Word_int, Mutable), [field_address ba 1 dbg], dbg)) - (fun ba_data -> - check_bound unsafe dbg (sub_int (Cop(Cload (Word_int, Mutable), - [field_address ba 5 dbg], dbg)) - (Cconst_int 1) - dbg) - idx (unaligned_set_16 ba_data idx newval dbg)))))) - - | Pbytes_set_32(unsafe) -> - return_unit + | Pbytes_set(size, unsafe) -> + return_unit dbg (bind "str" (transl env arg1) (fun str -> bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "newval" (transl_unbox_int dbg env Pint32 arg3) (fun newval -> - check_bound unsafe dbg - (sub_int (string_length str dbg) (Cconst_int 3) dbg) - idx (unaligned_set_32 str idx newval dbg))))) + bind "newval" (transl_unbox_sized size dbg env arg3) (fun newval -> + check_bound unsafe size dbg (string_length str dbg) + idx (unaligned_set size str idx newval dbg))))) - | Pbigstring_set_32(unsafe) -> - return_unit + | Pbigstring_set(size, unsafe) -> + return_unit dbg (bind "ba" (transl env arg1) (fun ba -> bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "newval" (transl_unbox_int dbg env Pint32 arg3) (fun newval -> + bind "newval" (transl_unbox_sized size dbg env arg3) (fun newval -> bind "ba_data" (Cop(Cload (Word_int, Mutable), [field_address ba 1 dbg], dbg)) (fun ba_data -> - check_bound unsafe dbg (sub_int (Cop(Cload (Word_int, Mutable), - [field_address ba 5 dbg], dbg)) - (Cconst_int 3) - dbg) - idx (unaligned_set_32 ba_data idx newval dbg)))))) - - | Pbytes_set_64(unsafe) -> - return_unit - (bind "str" (transl env arg1) (fun str -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "newval" (transl_unbox_int dbg env Pint64 arg3) (fun newval -> - check_bound unsafe dbg - (sub_int (string_length str dbg) (Cconst_int 7) dbg) - idx (unaligned_set_64 str idx newval dbg))))) - - | Pbigstring_set_64(unsafe) -> - return_unit - (bind "ba" (transl env arg1) (fun ba -> - bind "index" (untag_int (transl env arg2) dbg) (fun idx -> - bind "newval" (transl_unbox_int dbg env Pint64 arg3) (fun newval -> - bind "ba_data" - (Cop(Cload (Word_int, Mutable), [field_address ba 1 dbg], dbg)) - (fun ba_data -> - check_bound unsafe dbg (sub_int (Cop(Cload (Word_int, Mutable), - [field_address ba 5 dbg], dbg)) - (Cconst_int 7) - dbg) idx - (unaligned_set_64 ba_data idx newval dbg)))))) - - | prim -> - fatal_errorf "Cmmgen.transl_prim_3: %a" Printlambda.primitive prim + check_bound unsafe size dbg (bigstring_length ba dbg) + idx (unaligned_set size ba_data idx newval dbg)))))) + + | Pfield_computed | Psequand | Psequor | Pnot | Pnegint | Paddint + | Psubint | Pmulint | Pandint | Porint | Pxorint | Plslint | Plsrint | Pasrint + | Pintoffloat | Pfloatofint | Pnegfloat | Pabsfloat | Paddfloat | Psubfloat + | Pmulfloat | Pdivfloat | Pstringlength | Pstringrefu | Pstringrefs + | Pbyteslength | Pbytesrefu | Pbytesrefs | Pisint | Pisout + | Pbswap16 | Pint_as_pointer | Popaque | Pread_symbol _ | Pmakeblock (_, _, _) + | Pfield _ | Psetfield (_, _, _) | Pfloatfield _ | Psetfloatfield (_, _) + | Pduprecord (_, _) | Pccall _ | Praise _ | Pdivint _ | Pmodint _ | Pintcomp _ + | Poffsetint _ | Poffsetref _ | Pfloatcomp _ | Pmakearray (_, _) + | Pduparray (_, _) | Parraylength _ | Parrayrefu _ | Parrayrefs _ + | Pbintofint _ | Pintofbint _ | Pcvtbint (_, _) | Pnegbint _ | Paddbint _ + | Psubbint _ | Pmulbint _ | Pdivbint _ | Pmodbint _ | Pandbint _ | Porbint _ + | Pxorbint _ | Plslbint _ | Plsrbint _ | Pasrbint _ | Pbintcomp (_, _) + | Pbigarrayref (_, _, _, _) | Pbigarrayset (_, _, _, _) | Pbigarraydim _ + | Pstring_load _ | Pbytes_load _ | Pbigstring_load _ | Pbbswap _ + -> + fatal_errorf "Cmmgen.transl_prim_3: %a" + Printclambda_primitives.primitive p and transl_unbox_float dbg env = function - Uconst(Uconst_ref(_, Some (Uconst_float f))) -> Cconst_float f + Uconst(Uconst_ref(_, Some (Uconst_float f))) -> Cconst_float (f, dbg) | exp -> unbox_float dbg (transl env exp) and transl_unbox_int dbg env bi = function Uconst(Uconst_ref(_, Some (Uconst_int32 n))) -> - Cconst_natint (Nativeint.of_int32 n) + Cconst_natint (Nativeint.of_int32 n, dbg) | Uconst(Uconst_ref(_, Some (Uconst_nativeint n))) -> - Cconst_natint n + Cconst_natint (n, dbg) | Uconst(Uconst_ref(_, Some (Uconst_int64 n))) -> if size_int = 8 then - Cconst_natint (Int64.to_nativeint n) + Cconst_natint (Int64.to_nativeint n, dbg) else begin let low = Int64.to_nativeint n in let high = Int64.to_nativeint (Int64.shift_right_logical n 32) in - if big_endian then Ctuple [Cconst_natint high; Cconst_natint low] - else Ctuple [Cconst_natint low; Cconst_natint high] + if big_endian then + Ctuple [Cconst_natint (high, dbg); Cconst_natint (low, dbg)] + else + Ctuple [Cconst_natint (low, dbg); Cconst_natint (high, dbg)] end | Uprim(Pbintofint bi',[Uconst(Uconst_int i)],_) when bi = bi' -> - Cconst_int i + Cconst_int (i, dbg) | exp -> unbox_int bi (transl env exp) dbg and transl_unbox_number dbg env bn arg = @@ -2700,6 +2973,12 @@ and transl_unbox_number dbg env bn arg = | Boxed_float _ -> transl_unbox_float dbg env arg | Boxed_integer (bi, _) -> transl_unbox_int dbg env bi arg +and transl_unbox_sized size dbg env exp = + match size with + | Sixteen -> untag_int (transl env exp) dbg + | Thirty_two -> transl_unbox_int dbg env Pint32 exp + | Sixty_four -> transl_unbox_int dbg env Pint64 exp + and transl_let env str kind id exp body = let dbg = Debuginfo.none in let unboxing = @@ -2738,16 +3017,16 @@ and transl_let env str kind id exp body = Clet(VP.create unboxed_id, transl_unbox_number dbg env boxed_number exp, transl (add_unboxed_id (VP.var id) unboxed_id boxed_number env) body) -and make_catch ncatch body handler = match body with +and make_catch ncatch body handler dbg = match body with | Cexit (nexit,[]) when nexit=ncatch -> handler -| _ -> ccatch (ncatch, [], body, handler) +| _ -> ccatch (ncatch, [], body, handler, dbg) and is_shareable_cont exp = match exp with | Cexit (_,[]) -> true | _ -> false -and make_shareable_cont mk exp = +and make_shareable_cont dbg mk exp = if is_shareable_cont exp then mk exp else begin let nfail = next_raise_count () in @@ -2755,39 +3034,80 @@ and make_shareable_cont mk exp = nfail (mk (Cexit (nfail,[]))) exp + dbg end -and transl_if env cond dbg approx then_ else_ = +and transl_if env (approx : then_else) + (dbg : Debuginfo.t) cond + (then_dbg : Debuginfo.t) then_ + (else_dbg : Debuginfo.t) else_ = match cond with | Uconst (Uconst_ptr 0) -> else_ | Uconst (Uconst_ptr 1) -> then_ | Uifthenelse (arg1, arg2, Uconst (Uconst_ptr 0)) -> - let dbg' = Debuginfo.none in - transl_sequand env arg1 dbg' arg2 dbg approx then_ else_ - | Uprim(Psequand, [arg1; arg2], dbg') -> - transl_sequand env arg1 dbg' arg2 dbg approx then_ else_ + (* CR mshinwell: These Debuginfos will flow through from Clambda *) + let inner_dbg = Debuginfo.none in + let ifso_dbg = Debuginfo.none in + transl_sequand env approx + inner_dbg arg1 + ifso_dbg arg2 + then_dbg then_ + else_dbg else_ + | Uprim (Psequand, [arg1; arg2], inner_dbg) -> + transl_sequand env approx + inner_dbg arg1 + inner_dbg arg2 + then_dbg then_ + else_dbg else_ | Uifthenelse (arg1, Uconst (Uconst_ptr 1), arg2) -> - let dbg' = Debuginfo.none in - transl_sequor env arg1 dbg' arg2 dbg approx then_ else_ - | Uprim(Psequor, [arg1; arg2], dbg') -> - transl_sequor env arg1 dbg' arg2 dbg approx then_ else_ - | Uprim(Pnot, [arg], _) -> - transl_if env arg dbg (invert_then_else approx) else_ then_ + let inner_dbg = Debuginfo.none in + let ifnot_dbg = Debuginfo.none in + transl_sequor env approx + inner_dbg arg1 + ifnot_dbg arg2 + then_dbg then_ + else_dbg else_ + | Uprim (Psequor, [arg1; arg2], inner_dbg) -> + transl_sequor env approx + inner_dbg arg1 + inner_dbg arg2 + then_dbg then_ + else_dbg else_ + | Uprim (Pnot, [arg], _dbg) -> + transl_if env (invert_then_else approx) + dbg arg + else_dbg else_ + then_dbg then_ | Uifthenelse (Uconst (Uconst_ptr 1), ifso, _) -> - transl_if env ifso dbg approx then_ else_ + let ifso_dbg = Debuginfo.none in + transl_if env approx + ifso_dbg ifso + then_dbg then_ + else_dbg else_ | Uifthenelse (Uconst (Uconst_ptr 0), _, ifnot) -> - transl_if env ifnot dbg approx then_ else_ + let ifnot_dbg = Debuginfo.none in + transl_if env approx + ifnot_dbg ifnot + then_dbg then_ + else_dbg else_ | Uifthenelse (cond, ifso, ifnot) -> - make_shareable_cont + let inner_dbg = Debuginfo.none in + let ifso_dbg = Debuginfo.none in + let ifnot_dbg = Debuginfo.none in + make_shareable_cont then_dbg (fun shareable_then -> - make_shareable_cont + make_shareable_cont else_dbg (fun shareable_else -> mk_if_then_else - (test_bool dbg (transl env cond)) - (transl_if env ifso dbg approx - shareable_then shareable_else) - (transl_if env ifnot dbg approx - shareable_then shareable_else)) + inner_dbg (test_bool inner_dbg (transl env cond)) + ifso_dbg (transl_if env approx + ifso_dbg ifso + then_dbg shareable_then + else_dbg shareable_else) + ifnot_dbg (transl_if env approx + ifnot_dbg ifnot + then_dbg shareable_then + else_dbg shareable_else)) else_) then_ | _ -> begin @@ -2797,23 +3117,42 @@ and transl_if env cond dbg approx then_ else_ = | Then_false_else_true -> mk_not dbg (transl env cond) | Unknown -> - mk_if_then_else (test_bool dbg (transl env cond)) then_ else_ + mk_if_then_else + dbg (test_bool dbg (transl env cond)) + then_dbg then_ + else_dbg else_ end -and transl_sequand env arg1 dbg1 arg2 dbg2 approx then_ else_ = - make_shareable_cont +and transl_sequand env (approx : then_else) + (arg1_dbg : Debuginfo.t) arg1 + (arg2_dbg : Debuginfo.t) arg2 + (then_dbg : Debuginfo.t) then_ + (else_dbg : Debuginfo.t) else_ = + make_shareable_cont else_dbg (fun shareable_else -> - transl_if env arg1 dbg1 Unknown - (transl_if env arg2 dbg2 approx then_ shareable_else) - shareable_else) + transl_if env Unknown + arg1_dbg arg1 + arg2_dbg (transl_if env approx + arg2_dbg arg2 + then_dbg then_ + else_dbg shareable_else) + else_dbg shareable_else) else_ -and transl_sequor env arg1 dbg1 arg2 dbg2 approx then_ else_ = - make_shareable_cont +and transl_sequor env (approx : then_else) + (arg1_dbg : Debuginfo.t) arg1 + (arg2_dbg : Debuginfo.t) arg2 + (then_dbg : Debuginfo.t) then_ + (else_dbg : Debuginfo.t) else_ = + make_shareable_cont then_dbg (fun shareable_then -> - transl_if env arg1 dbg1 Unknown - shareable_then - (transl_if env arg2 dbg2 approx shareable_then else_)) + transl_if env Unknown + arg1_dbg arg1 + then_dbg shareable_then + arg2_dbg (transl_if env approx + arg2_dbg arg2 + then_dbg shareable_then + else_dbg else_)) then_ (* This assumes that [arg] can be safely discarded if it is not used. *) @@ -2861,27 +3200,32 @@ and transl_letrec env bindings cont = List.map (fun (id, exp) -> (id, exp, expr_size V.empty exp)) bindings in - let op_alloc prim sz = - Cop(Cextcall(prim, typ_val, true, None), [int_const sz], dbg) in + let op_alloc prim args = + Cop(Cextcall(prim, typ_val, true, None), args, dbg) in let rec init_blocks = function | [] -> fill_nonrec bsz | (id, _exp, RHS_block sz) :: rem -> - Clet(id, op_alloc "caml_alloc_dummy" sz, + Clet(id, op_alloc "caml_alloc_dummy" [int_const dbg sz], init_blocks rem) + | (id, _exp, RHS_infix { blocksize; offset}) :: rem -> + Clet(id, op_alloc "caml_alloc_dummy_infix" + [int_const dbg blocksize; int_const dbg offset], + init_blocks rem) | (id, _exp, RHS_floatblock sz) :: rem -> - Clet(id, op_alloc "caml_alloc_dummy_float" sz, + Clet(id, op_alloc "caml_alloc_dummy_float" [int_const dbg sz], init_blocks rem) | (id, _exp, RHS_nonrec) :: rem -> - Clet (id, Cconst_int 0, init_blocks rem) + Clet (id, Cconst_int (0, dbg), init_blocks rem) and fill_nonrec = function | [] -> fill_blocks bsz - | (_id, _exp, (RHS_block _ | RHS_floatblock _)) :: rem -> + | (_id, _exp, + (RHS_block _ | RHS_infix _ | RHS_floatblock _)) :: rem -> fill_nonrec rem | (id, exp, RHS_nonrec) :: rem -> Clet(id, transl env exp, fill_nonrec rem) and fill_blocks = function | [] -> cont - | (id, exp, (RHS_block _ | RHS_floatblock _)) :: rem -> + | (id, exp, (RHS_block _ | RHS_infix _ | RHS_floatblock _)) :: rem -> let op = Cop(Cextcall("caml_update_dummy", typ_void, false, None), [Cvar (VP.var id); transl env exp], dbg) in @@ -2902,7 +3246,7 @@ let transl_function ~ppf_dump f = let cmm_body = let env = create_env ~environment_param:f.env in if !Clflags.afl_instrument then - Afl_instrument.instrument_function (transl env body) + Afl_instrument.instrument_function (transl env body) f.dbg else transl env body in let fun_codegen_options = @@ -2920,92 +3264,17 @@ let transl_function ~ppf_dump f = (* Translate all function definitions *) let rec transl_all_functions ~ppf_dump already_translated cont = - try - let f = Queue.take functions in - if String.Set.mem f.label already_translated then + match Cmmgen_state.next_function () with + | None -> cont, already_translated + | Some f -> + let sym = f.label in + if String.Set.mem sym already_translated then transl_all_functions ~ppf_dump already_translated cont else begin transl_all_functions ~ppf_dump - (String.Set.add f.label already_translated) + (String.Set.add sym already_translated) ((f.dbg, transl_function ~ppf_dump f) :: cont) end - with Queue.Empty -> - cont, already_translated - -let cdefine_symbol (symb, global) = - match global with - | Global -> [Cglobal_symbol symb; Cdefine_symbol symb] - | Not_global -> [Cdefine_symbol symb] - -(* Emit structured constants *) - -let rec emit_structured_constant symb cst cont = - let emit_block white_header symb cont = - (* Headers for structured constants must be marked black in case we - are in no-naked-pointers mode. See [caml_darken]. *) - let black_header = Nativeint.logor white_header caml_black in - Cint black_header :: cdefine_symbol symb @ cont - in - match cst with - | Uconst_float s-> - emit_block float_header symb (Cdouble s :: cont) - | Uconst_string s -> - emit_block (string_header (String.length s)) symb - (emit_string_constant s cont) - | Uconst_int32 n -> - emit_block boxedint32_header symb - (emit_boxed_int32_constant n cont) - | Uconst_int64 n -> - emit_block boxedint64_header symb - (emit_boxed_int64_constant n cont) - | Uconst_nativeint n -> - emit_block boxedintnat_header symb - (emit_boxed_nativeint_constant n cont) - | Uconst_block (tag, csts) -> - let cont = List.fold_right emit_constant csts cont in - emit_block (block_header tag (List.length csts)) symb cont - | Uconst_float_array fields -> - emit_block (floatarray_header (List.length fields)) symb - (Misc.map_end (fun f -> Cdouble f) fields cont) - | Uconst_closure(fundecls, lbl, fv) -> - assert(lbl = fst symb); - add_cmm_constant (Const_closure (symb, fundecls, fv)); - List.iter (fun f -> Queue.add f functions) fundecls; - cont - -and emit_constant cst cont = - match cst with - | Uconst_int n | Uconst_ptr n -> - cint_const n - :: cont - | Uconst_ref (label, _) -> - Csymbol_address label :: cont - -and emit_string_constant s cont = - let n = size_int - 1 - (String.length s) mod size_int in - Cstring s :: Cskip n :: Cint8 n :: cont - -and emit_boxed_int32_constant n cont = - let n = Nativeint.of_int32 n in - if size_int = 8 then - Csymbol_address("caml_int32_ops") :: Cint32 n :: Cint32 0n :: cont - else - Csymbol_address("caml_int32_ops") :: Cint n :: cont - -and emit_boxed_nativeint_constant n cont = - Csymbol_address("caml_nativeint_ops") :: Cint n :: cont - -and emit_boxed_int64_constant n cont = - let lo = Int64.to_nativeint n in - if size_int = 8 then - Csymbol_address("caml_int64_ops") :: Cint lo :: cont - else begin - let hi = Int64.to_nativeint (Int64.shift_right n 32) in - if big_endian then - Csymbol_address("caml_int64_ops") :: Cint hi :: Cint lo :: cont - else - Csymbol_address("caml_int64_ops") :: Cint lo :: Cint hi :: cont - end (* Emit constant closures *) @@ -3064,39 +3333,44 @@ let emit_constant_table symb elems = (* Emit all structured constants *) -let emit_constants cont (constants:Clambda.preallocated_constant list) = +let transl_clambda_constants (constants : Clambda.preallocated_constant list) + cont = let c = ref cont in + let emit_clambda_constant symbol global cst = + let cst = emit_structured_constant (symbol, global) cst [] in + c := (Cdata cst) :: !c + in List.iter - (fun { symbol = lbl; exported; definition = cst; provenance = _; } -> - let global = if exported then Global else Not_global in - let cst = emit_structured_constant (lbl, global) cst [] in - c:= Cdata(cst):: !c) + (fun { symbol; exported; definition = cst; provenance = _; } -> + let global : Cmmgen_state.is_global = + if exported then Global else Local + in + emit_clambda_constant symbol global cst) constants; - List.iter - (function - | Const_closure (symb, fundecls, clos_vars) -> - c := Cdata(emit_constant_closure symb fundecls clos_vars []) :: !c - | Const_table (symb, elems) -> - c := Cdata(emit_constant_table symb elems) :: !c) - !cmm_constants; - cmm_constants := []; !c -let emit_all_constants cont = - let constants = Compilenv.structured_constants () in - Compilenv.clear_structured_constants (); - emit_constants cont constants +let emit_cmm_data_items_for_constants cont = + let c = ref cont in + String.Map.iter (fun symbol (cst : Cmmgen_state.constant) -> + match cst with + | Const_closure (global, fundecls, clos_vars) -> + let cmm = + emit_constant_closure (symbol, global) fundecls clos_vars [] + in + c := (Cdata cmm) :: !c + | Const_table (global, elems) -> + c := (Cdata (emit_constant_table (symbol, global) elems)) :: !c) + (Cmmgen_state.constants ()); + Cdata (Cmmgen_state.data_items ()) :: !c -let transl_all_functions_and_emit_all_constants ~ppf_dump cont = +let transl_all_functions ~ppf_dump cont = let rec aux already_translated cont translated_functions = - if Compilenv.structured_constants () = [] && - Queue.is_empty functions + if Cmmgen_state.no_more_functions () then cont, translated_functions else let translated_functions, already_translated = transl_all_functions ~ppf_dump already_translated translated_functions in - let cont = emit_all_constants cont in aux already_translated cont translated_functions in let cont, translated_functions = @@ -3160,9 +3434,11 @@ let emit_preallocated_blocks preallocated_blocks cont = (* Translate a compilation unit *) let compunit ~ppf_dump (ulam, preallocated_blocks, constants) = + let dbg = Debuginfo.none in let init_code = if !Clflags.afl_instrument then Afl_instrument.instrument_initialiser (transl empty_env ulam) + (fun () -> dbg) else transl empty_env ulam in let c1 = [Cfunction {fun_name = Compilenv.make_symbol (Some "entry"); @@ -3178,9 +3454,10 @@ let compunit ~ppf_dump (ulam, preallocated_blocks, constants) = ] else [ Reduce_code_size ]; fun_dbg = Debuginfo.none }] in - let c2 = emit_constants c1 constants in - let c3 = transl_all_functions_and_emit_all_constants ~ppf_dump c2 in - emit_preallocated_blocks preallocated_blocks c3 + let c2 = transl_clambda_constants constants c1 in + let c3 = transl_all_functions ~ppf_dump c2 in + let c4 = emit_preallocated_blocks preallocated_blocks c3 in + emit_cmm_data_items_for_constants c4 (* CAMLprim value caml_cache_public_method (value meths, value tag, value *cache) @@ -3198,22 +3475,23 @@ CAMLprim value caml_cache_public_method (value meths, value tag, value *cache) let cache_public_method meths tag cache dbg = let raise_num = next_raise_count () in - let li = V.create_local "li" and hi = V.create_local "hi" - and mi = V.create_local "mi" and tagged = V.create_local "tagged" in + let cconst_int i = Cconst_int (i, dbg) in + let li = V.create_local "*li*" and hi = V.create_local "*hi*" + and mi = V.create_local "*mi*" and tagged = V.create_local "*tagged*" in Clet ( - VP.create li, Cconst_int 3, + VP.create li, cconst_int 3, Clet ( VP.create hi, Cop(Cload (Word_int, Mutable), [meths], dbg), Csequence( ccatch (raise_num, [], - Cloop + create_loop (Clet( VP.create mi, Cop(Cor, - [Cop(Clsr, [Cop(Caddi, [Cvar li; Cvar hi], dbg); Cconst_int 1], + [Cop(Clsr, [Cop(Caddi, [Cvar li; Cvar hi], dbg); cconst_int 1], dbg); - Cconst_int 1], + cconst_int 1], dbg), Csequence( Cifthenelse @@ -3224,19 +3502,28 @@ let cache_public_method meths tag cache dbg = [meths; lsl_const (Cvar mi) log2_size_addr dbg], dbg)], dbg)], dbg), - Cassign(hi, Cop(Csubi, [Cvar mi; Cconst_int 2], dbg)), - Cassign(li, Cvar mi)), + dbg, Cassign(hi, Cop(Csubi, [Cvar mi; cconst_int 2], dbg)), + dbg, Cassign(li, Cvar mi), + dbg), Cifthenelse - (Cop(Ccmpi Cge, [Cvar li; Cvar hi], dbg), Cexit (raise_num, []), - Ctuple [])))), - Ctuple []), + (Cop(Ccmpi Cge, [Cvar li; Cvar hi], dbg), + dbg, Cexit (raise_num, []), + dbg, Ctuple [], + dbg)))) + dbg, + Ctuple [], + dbg), Clet ( VP.create tagged, Cop(Cadda, [lsl_const (Cvar li) log2_size_addr dbg; - Cconst_int(1 - 3 * size_addr)], dbg), + cconst_int(1 - 3 * size_addr)], dbg), Csequence(Cop (Cstore (Word_int, Assignment), [cache; Cvar tagged], dbg), Cvar tagged))))) +(* CR mshinwell: These will be filled in by later pull requests. *) +let placeholder_dbg () = Debuginfo.none +let placeholder_fun_dbg ~human_name:_ = Debuginfo.none + (* Generate an application function: (defun caml_applyN (a1 ... aN clos) (if (= clos.arity N) @@ -3249,7 +3536,7 @@ let cache_public_method meths tag cache dbg = *) let apply_function_body arity = - let dbg = Debuginfo.none in + let dbg = placeholder_dbg in let arg = Array.make arity (V.create_local "arg") in for i = 1 to arity - 1 do arg.(i) <- V.create_local "arg" done; let clos = V.create_local "clos" in @@ -3257,12 +3544,14 @@ let apply_function_body arity = let rec app_fun clos n = if n = arity-1 then Cop(Capply typ_val, - [get_field env (Cvar clos) 0 dbg; Cvar arg.(n); Cvar clos], dbg) + [get_field env (Cvar clos) 0 (dbg ()); Cvar arg.(n); Cvar clos], + dbg ()) else begin let newclos = V.create_local "clos" in Clet(VP.create newclos, Cop(Capply typ_val, - [get_field env (Cvar clos) 0 dbg; Cvar arg.(n); Cvar clos], dbg), + [get_field env (Cvar clos) 0 (dbg ()); Cvar arg.(n); Cvar clos], + dbg ()), app_fun newclos (n+1)) end in let args = Array.to_list arg in @@ -3270,14 +3559,20 @@ let apply_function_body arity = (args, clos, if arity = 1 then app_fun clos 0 else Cifthenelse( - Cop(Ccmpi Ceq, [get_field env (Cvar clos) 1 dbg; int_const arity], dbg), + Cop(Ccmpi Ceq, + [get_field env (Cvar clos) 1 (dbg ()); int_const (dbg ()) arity], dbg ()), + dbg (), Cop(Capply typ_val, - get_field env (Cvar clos) 2 dbg :: List.map (fun s -> Cvar s) all_args, - dbg), - app_fun clos 0)) + get_field env (Cvar clos) 2 (dbg ()) + :: List.map (fun s -> Cvar s) all_args, + dbg ()), + dbg (), + app_fun clos 0, + dbg ())) let send_function arity = - let dbg = Debuginfo.none in + let dbg = placeholder_dbg in + let cconst_int i = Cconst_int (i, dbg ()) in let (args, clos', body) = apply_function_body (1+arity) in let cache = V.create_local "cache" and obj = List.hd args @@ -3287,49 +3582,56 @@ let send_function arity = let cache = Cvar cache and obj = Cvar obj and tag = Cvar tag in let meths = V.create_local "meths" and cached = V.create_local "cached" in let real = V.create_local "real" in - let mask = get_field env (Cvar meths) 1 dbg in + let mask = get_field env (Cvar meths) 1 (dbg ()) in let cached_pos = Cvar cached in - let tag_pos = Cop(Cadda, [Cop (Cadda, [cached_pos; Cvar meths], dbg); - Cconst_int(3*size_addr-1)], dbg) in - let tag' = Cop(Cload (Word_int, Mutable), [tag_pos], dbg) in + let tag_pos = Cop(Cadda, [Cop (Cadda, [cached_pos; Cvar meths], dbg ()); + cconst_int(3*size_addr-1)], dbg ()) in + let tag' = Cop(Cload (Word_int, Mutable), [tag_pos], dbg ()) in Clet ( - VP.create meths, Cop(Cload (Word_val, Mutable), [obj], dbg), + VP.create meths, Cop(Cload (Word_val, Mutable), [obj], dbg ()), Clet ( VP.create cached, - Cop(Cand, [Cop(Cload (Word_int, Mutable), [cache], dbg); mask], dbg), + Cop(Cand, [Cop(Cload (Word_int, Mutable), [cache], dbg ()); mask], + dbg ()), Clet ( VP.create real, - Cifthenelse(Cop(Ccmpa Cne, [tag'; tag], dbg), - cache_public_method (Cvar meths) tag cache dbg, - cached_pos), + Cifthenelse(Cop(Ccmpa Cne, [tag'; tag], dbg ()), + dbg (), + cache_public_method (Cvar meths) tag cache (dbg ()), + dbg (), + cached_pos, + dbg ()), Cop(Cload (Word_val, Mutable), - [Cop(Cadda, [Cop (Cadda, [Cvar real; Cvar meths], dbg); - Cconst_int(2*size_addr-1)], dbg)], dbg)))) + [Cop(Cadda, [Cop (Cadda, [Cvar real; Cvar meths], dbg ()); + cconst_int(2*size_addr-1)], dbg ())], dbg ())))) in let body = Clet(VP.create clos', clos, body) in let cache = cache in + let fun_name = "caml_send" ^ Int.to_string arity in let fun_args = [obj, typ_val; tag, typ_int; cache, typ_val] @ List.map (fun id -> (id, typ_val)) (List.tl args) in - let fun_name = "caml_send" ^ Int.to_string arity in + let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in Cfunction {fun_name; fun_args = List.map (fun (arg, ty) -> VP.create arg, ty) fun_args; fun_body = body; fun_codegen_options = []; - fun_dbg = Debuginfo.none } + fun_dbg; + } let apply_function arity = let (args, clos, body) = apply_function_body arity in let all_args = args @ [clos] in let fun_name = "caml_apply" ^ Int.to_string arity in + let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in Cfunction {fun_name; fun_args = List.map (fun arg -> (VP.create arg, typ_val)) all_args; fun_body = body; fun_codegen_options = []; - fun_dbg = Debuginfo.none; + fun_dbg; } (* Generate tuplifying functions: @@ -3337,24 +3639,26 @@ let apply_function arity = (app clos.direct #0(arg) ... #N-1(arg) clos)) *) let tuplify_function arity = - let dbg = Debuginfo.none in + let dbg = placeholder_dbg in let arg = V.create_local "arg" in let clos = V.create_local "clos" in let env = empty_env in let rec access_components i = if i >= arity then [] - else get_field env (Cvar arg) i dbg :: access_components(i+1) in + else get_field env (Cvar arg) i (dbg ()) :: access_components(i+1) in let fun_name = "caml_tuplify" ^ Int.to_string arity in + let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in Cfunction {fun_name; fun_args = [VP.create arg, typ_val; VP.create clos, typ_val]; fun_body = Cop(Capply typ_val, - get_field env (Cvar clos) 2 dbg :: access_components 0 @ [Cvar clos], - dbg); + get_field env (Cvar clos) 2 (dbg ()) + :: access_components 0 @ [Cvar clos], + dbg ()); fun_codegen_options = []; - fun_dbg = Debuginfo.none; + fun_dbg; } (* Generate currying functions: @@ -3387,41 +3691,46 @@ let tuplify_function arity = let max_arity_optimized = 15 let final_curry_function arity = - let dbg = Debuginfo.none in + let dbg = placeholder_dbg in let last_arg = V.create_local "arg" in let last_clos = V.create_local "clos" in let env = empty_env in let rec curry_fun args clos n = if n = 0 then Cop(Capply typ_val, - get_field env (Cvar clos) 2 dbg :: + get_field env (Cvar clos) 2 (dbg ()) :: args @ [Cvar last_arg; Cvar clos], - dbg) + dbg ()) else if n = arity - 1 || arity > max_arity_optimized then begin let newclos = V.create_local "clos" in Clet(VP.create newclos, - get_field env (Cvar clos) 3 dbg, - curry_fun (get_field env (Cvar clos) 2 dbg :: args) newclos (n-1)) + get_field env (Cvar clos) 3 (dbg ()), + curry_fun (get_field env (Cvar clos) 2 (dbg ()) :: args) + newclos (n-1)) end else begin let newclos = V.create_local "clos" in Clet(VP.create newclos, - get_field env (Cvar clos) 4 dbg, - curry_fun (get_field env (Cvar clos) 3 dbg :: args) + get_field env (Cvar clos) 4 (dbg ()), + curry_fun (get_field env (Cvar clos) 3 (dbg ()) :: args) newclos (n-1)) end in + let fun_name = + "caml_curry" ^ Int.to_string arity ^ "_" ^ Int.to_string (arity-1) + in + let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in Cfunction - {fun_name = "caml_curry" ^ Int.to_string arity ^ - "_" ^ Int.to_string (arity-1); + {fun_name; fun_args = [VP.create last_arg, typ_val; VP.create last_clos, typ_val]; fun_body = curry_fun [] last_clos (arity-1); fun_codegen_options = []; - fun_dbg = Debuginfo.none } + fun_dbg; + } let rec intermediate_curry_functions arity num = - let dbg = Debuginfo.none in + let dbg = placeholder_dbg in let env = empty_env in if num = arity - 1 then [final_curry_function arity] @@ -3429,6 +3738,7 @@ let rec intermediate_curry_functions arity num = let name1 = "caml_curry" ^ Int.to_string arity in let name2 = if num = 0 then name1 else name1 ^ "_" ^ Int.to_string num in let arg = V.create_local "arg" and clos = V.create_local "clos" in + let fun_dbg = placeholder_fun_dbg ~human_name:name2 in Cfunction {fun_name = name2; fun_args = [VP.create arg, typ_val; VP.create clos, typ_val]; @@ -3436,19 +3746,21 @@ let rec intermediate_curry_functions arity num = if arity - num > 2 && arity <= max_arity_optimized then Cop(Calloc, [alloc_closure_header 5 Debuginfo.none; - Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1)); - int_const (arity - num - 1); - Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1) ^ "_app"); + Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1), dbg ()); + int_const (dbg ()) (arity - num - 1); + Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1) ^ "_app", + dbg ()); Cvar arg; Cvar clos], - dbg) + dbg ()) else Cop(Calloc, - [alloc_closure_header 4 Debuginfo.none; - Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1)); - int_const 1; Cvar arg; Cvar clos], - dbg); + [alloc_closure_header 4 (dbg ()); + Cconst_symbol(name1 ^ "_" ^ Int.to_string (num+1), dbg ()); + int_const (dbg ()) 1; Cvar arg; Cvar clos], + dbg ()); fun_codegen_options = []; - fun_dbg = Debuginfo.none } + fun_dbg; + } :: (if arity <= max_arity_optimized && arity - num > 2 then let rec iter i = @@ -3461,26 +3773,30 @@ let rec intermediate_curry_functions arity num = let rec iter i args clos = if i = 0 then Cop(Capply typ_val, - (get_field env (Cvar clos) 2 dbg) :: args @ [Cvar clos], - dbg) + (get_field env (Cvar clos) 2 (dbg ())) :: args @ [Cvar clos], + dbg ()) else let newclos = V.create_local "clos" in Clet(VP.create newclos, - get_field env (Cvar clos) 4 dbg, - iter (i-1) (get_field env (Cvar clos) 3 dbg :: args) newclos) + get_field env (Cvar clos) 4 (dbg ()), + iter (i-1) (get_field env (Cvar clos) 3 (dbg ()) :: args) + newclos) in let fun_args = List.map (fun (arg, ty) -> VP.create arg, ty) (direct_args @ [clos, typ_val]) in + let fun_name = name1 ^ "_" ^ Int.to_string (num+1) ^ "_app" in + let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in let cf = Cfunction - {fun_name = name1 ^ "_" ^ Int.to_string (num+1) ^ "_app"; + {fun_name; fun_args; fun_body = iter (num+1) (List.map (fun (arg,_) -> Cvar arg) direct_args) clos; fun_codegen_options = []; - fun_dbg = Debuginfo.none } + fun_dbg; + } in cf :: intermediate_curry_functions arity (num+1) else @@ -3517,28 +3833,31 @@ let generic_functions shared units = (* Generate the entry point *) let entry_point namelist = - (* CR mshinwell: review all of these "None"s. We should be able to at - least have filenames for these. *) - let dbg = Debuginfo.none in - let incr_global_inited = + let dbg = placeholder_dbg in + let cconst_int i = Cconst_int (i, dbg ()) in + let cconst_symbol sym = Cconst_symbol (sym, dbg ()) in + let incr_global_inited () = Cop(Cstore (Word_int, Assignment), - [Cconst_symbol "caml_globals_inited"; + [cconst_symbol "caml_globals_inited"; Cop(Caddi, [Cop(Cload (Word_int, Mutable), - [Cconst_symbol "caml_globals_inited"], dbg); - Cconst_int 1], dbg)], dbg) in + [cconst_symbol "caml_globals_inited"], dbg ()); + cconst_int 1], dbg ())], dbg ()) in let body = List.fold_right (fun name next -> let entry_sym = Compilenv.make_symbol ~unitname:name (Some "entry") in Csequence(Cop(Capply typ_void, - [Cconst_symbol entry_sym], dbg), - Csequence(incr_global_inited, next))) - namelist (Cconst_int 1) in - Cfunction {fun_name = "caml_program"; + [cconst_symbol entry_sym], dbg ()), + Csequence(incr_global_inited (), next))) + namelist (cconst_int 1) in + let fun_name = "caml_program" in + let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in + Cfunction {fun_name; fun_args = []; fun_body = body; fun_codegen_options = [Reduce_code_size]; - fun_dbg = Debuginfo.none } + fun_dbg; + } (* Generate the table of globals *) @@ -3607,16 +3926,21 @@ let code_segment_table namelist = (* Initialize a predefined exception *) let predef_exception i name = - let symname = "caml_exn_" ^ name in - let cst = Uconst_string name in - let label = Compilenv.new_const_symbol () in - let cont = emit_structured_constant (label, Not_global) cst [] in - Cdata(emit_structured_constant (symname, Global) - (Uconst_block(Obj.object_tag, - [ - Uconst_ref(label, Some cst); - Uconst_int (-i-1); - ])) cont) + let name_sym = Compilenv.new_const_symbol () in + let data_items = + emit_block name_sym Local (string_header (String.length name)) + (emit_string_constant name []) + in + let exn_sym = "caml_exn_" ^ name in + let tag = Obj.object_tag in + let size = 2 in + let fields = + (Csymbol_address name_sym) + :: (cint_const (-i - 1)) + :: data_items + in + let data_items = emit_block exn_sym Global (block_header tag size) fields in + Cdata data_items (* Header for a plugin *) @@ -3630,3 +3954,6 @@ let plugin_header units = } in global_data "caml_plugin_header" { dynu_magic = Config.cmxs_magic_number; dynu_units = List.map mk units } + +let reset () = + Cmmgen_state.reset () diff --git a/asmcomp/cmmgen.mli b/asmcomp/cmmgen.mli index 6c33da95..b7388a3f 100644 --- a/asmcomp/cmmgen.mli +++ b/asmcomp/cmmgen.mli @@ -38,3 +38,5 @@ val code_segment_table: string list -> Cmm.phrase val predef_exception: int -> string -> Cmm.phrase val plugin_header: (Cmx_format.unit_infos * Digest.t) list -> Cmm.phrase val black_block_header: (*tag:*)int -> (*size:*)int -> nativeint + +val reset : unit -> unit diff --git a/asmcomp/cmmgen_state.ml b/asmcomp/cmmgen_state.ml new file mode 100644 index 00000000..b40375a6 --- /dev/null +++ b/asmcomp/cmmgen_state.ml @@ -0,0 +1,66 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2019 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +[@@@ocaml.warning "+a-4-30-40-41-42"] + +module S = Misc.Stdlib.String + +type is_global = Global | Local + +type constant = + | Const_closure of is_global * Clambda.ufunction list * Clambda.uconstant list + | Const_table of is_global * Cmm.data_item list + +type t = { + mutable constants : constant S.Map.t; + mutable data_items : Cmm.data_item list list; + functions : Clambda.ufunction Queue.t; +} + +let empty = { + constants = S.Map.empty; + data_items = []; + functions = Queue.create (); +} + +let state = empty + +let reset () = + state.constants <- S.Map.empty; + state.data_items <- []; + Queue.clear state.functions + +let add_constant sym cst = + state.constants <- S.Map.add sym cst state.constants + +let add_data_items items = + state.data_items <- items :: state.data_items + +let add_function func = + Queue.add func state.functions + +let constants () = state.constants + +let data_items () = List.concat (List.rev state.data_items) + +let next_function () = + match Queue.take state.functions with + | exception Queue.Empty -> None + | func -> Some func + +let no_more_functions () = + Queue.is_empty state.functions diff --git a/asmcomp/cmmgen_state.mli b/asmcomp/cmmgen_state.mli new file mode 100644 index 00000000..aa9de814 --- /dev/null +++ b/asmcomp/cmmgen_state.mli @@ -0,0 +1,42 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2019 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Mutable state used by [Cmmgen]. *) + +[@@@ocaml.warning "+a-4-30-40-41-42"] + +val reset : unit -> unit + +type is_global = Global | Local + +type constant = + | Const_closure of is_global * Clambda.ufunction list * Clambda.uconstant list + | Const_table of is_global * Cmm.data_item list + +val add_constant : Misc.Stdlib.String.t -> constant -> unit + +val add_data_items : Cmm.data_item list -> unit + +val add_function : Clambda.ufunction -> unit + +val constants : unit -> constant Misc.Stdlib.String.Map.t + +val data_items : unit -> Cmm.data_item list + +val next_function : unit -> Clambda.ufunction option + +val no_more_functions : unit -> bool diff --git a/asmcomp/comballoc.ml b/asmcomp/comballoc.ml index b10edd2a..29ee15b3 100644 --- a/asmcomp/comballoc.ml +++ b/asmcomp/comballoc.ml @@ -74,10 +74,6 @@ let rec combine i allocstate = let newnext = combine_restart i.next in (instr_cons (Iswitch(table, newcases)) i.arg i.res newnext, allocated_size allocstate) - | Iloop(body) -> - let newbody = combine_restart body in - (instr_cons (Iloop(newbody)) i.arg i.res i.next, - allocated_size allocstate) | Icatch(rec_flag, handlers, body) -> let (newbody, sz) = combine body allocstate in let newhandlers = diff --git a/asmcomp/deadcode.ml b/asmcomp/deadcode.ml index c713b64b..d803a008 100644 --- a/asmcomp/deadcode.ml +++ b/asmcomp/deadcode.ml @@ -54,10 +54,6 @@ let rec deadcode i = let (s, _) = deadcode i.next in ({i with desc = Iswitch(index, cases'); next = s}, Reg.add_set_array i.live arg) - | Iloop(body) -> - let (body', _) = deadcode body in - let (s, _) = deadcode i.next in - ({i with desc = Iloop body'; next = s}, i.live) | Icatch(rec_flag, handlers, body) -> let (body', _) = deadcode body in let handlers' = diff --git a/asmcomp/debug/available_regs.ml b/asmcomp/debug/available_regs.ml index 9886f772..6ca2544b 100644 --- a/asmcomp/debug/available_regs.ml +++ b/asmcomp/debug/available_regs.ml @@ -225,22 +225,6 @@ let rec available_regs (instr : M.instruction) Some (ok avail_across), ok avail_after | Iifthenelse (_, ifso, ifnot) -> join [ifso; ifnot] ~avail_before | Iswitch (_, cases) -> join (Array.to_list cases) ~avail_before - | Iloop body -> - let avail_after = ref (ok avail_before) in - begin try - while true do - let avail_after' = - RAS.inter !avail_after - (available_regs body ~avail_before:!avail_after) - in - if RAS.equal !avail_after avail_after' then begin - raise Exit - end; - avail_after := avail_after' - done - with Exit -> () - end; - None, unreachable | Icatch (recursive, handlers, body) -> List.iter (fun (nfail, _handler) -> (* In case there are nested [Icatch] expressions with the same diff --git a/asmcomp/debug/compute_ranges.ml b/asmcomp/debug/compute_ranges.ml new file mode 100644 index 00000000..734eca50 --- /dev/null +++ b/asmcomp/debug/compute_ranges.ml @@ -0,0 +1,514 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 2014--2019 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +[@@@ocaml.warning "+a-4-30-40-41-42"] + +open! Int_replace_polymorphic_compare + +module L = Linearize + +module Make (S : Compute_ranges_intf.S_functor) = struct + module Subrange_state = S.Subrange_state + module Subrange_info = S.Subrange_info + module Range_info = S.Range_info + + let rewrite_label env label = + match Numbers.Int.Map.find label env with + | exception Not_found -> label + | label -> label + + module Subrange = struct + (* CR-soon mshinwell: Check that function epilogues, including returns + in the middle of functions, work ok in the debugger. *) + type t = { + start_pos : L.label; + start_pos_offset : int; + end_pos : L.label; + end_pos_offset : int; + subrange_info : Subrange_info.t; + } + + let create ~(start_insn : Linearize.instruction) + ~start_pos ~start_pos_offset + ~end_pos ~end_pos_offset + ~subrange_info = + match start_insn.desc with + | Llabel _ -> + { start_pos; + start_pos_offset; + end_pos; + end_pos_offset; + subrange_info; + } + | _ -> + Misc.fatal_errorf "Subrange.create: bad [start_insn]: %a" + Printlinear.instr start_insn + + let start_pos t = t.start_pos + let start_pos_offset t = t.start_pos_offset + let end_pos t = t.end_pos + let end_pos_offset t = t.end_pos_offset + let info t = t.subrange_info + + let rewrite_labels t ~env = + let start_pos = rewrite_label env t.start_pos in + let end_pos = rewrite_label env t.end_pos in + if start_pos = end_pos + && t.start_pos_offset = 0 + && t.end_pos_offset = 0 + then None + else + Some { + t with + start_pos; + end_pos; + } + end + + module Range = struct + type t = { + mutable subranges : Subrange.t list; + mutable min_pos_and_offset : (L.label * int) option; + range_info : Range_info.t; + } + + let create range_info = + { subranges = []; + min_pos_and_offset = None; + range_info; + } + + let info t = t.range_info + + let add_subrange t ~subrange = + let start_pos = Subrange.start_pos subrange in + let start_pos_offset = Subrange.start_pos_offset subrange in + begin match t.min_pos_and_offset with + | None -> t.min_pos_and_offset <- Some (start_pos, start_pos_offset) + | Some (min_pos, min_pos_offset) -> + (* This may seem dubious, but is correct by virtue of the way label + counters are allocated sequentially and the fact that, below, + we go through the code from lowest (code) address to highest. As + such the label with the highest integer value should be the one with + the highest address, and vice-versa. (Note that we also exploit the + ordering when constructing DWARF-4 location lists, to ensure that + they are sorted in increasing program counter order by start + address.) *) + let c = compare start_pos min_pos in + if c < 0 + || (c = 0 && start_pos_offset < min_pos_offset) + then begin + t.min_pos_and_offset <- Some (start_pos, start_pos_offset) + end + end; + t.subranges <- subrange::t.subranges + + let estimate_lowest_address t = + (* See assumption described in compute_ranges_intf.ml. *) + t.min_pos_and_offset + + let fold t ~init ~f = + List.fold_left f init t.subranges + + let no_subranges t = + match t.subranges with + | [] -> true + | _ -> false + + let rewrite_labels_and_remove_empty_subranges t ~env = + let subranges = + List.filter_map (fun subrange -> + Subrange.rewrite_labels subrange ~env) + t.subranges + in + match subranges with + | [] -> + { t with + subranges; + min_pos_and_offset = None; + } + | subranges -> + let min_pos_and_offset = + Option.map + (fun (label, offset) -> rewrite_label env label, offset) + t.min_pos_and_offset + in + { t with + subranges; + min_pos_and_offset; + } + end + + type t = { + ranges : Range.t S.Index.Tbl.t; + } + + module KM = S.Key.Map + module KS = S.Key.Set + + (* Whilst this pass is not DWARF-specific, the output of this pass uses + the conventions of the DWARF specification (e.g. DWARF-4 spec. + section 2.6.2, page 30) in the sense that starting addresses of ranges + are treated as inclusive and ending addresses as exclusive. + + Imagine that, for a given [key], the program counter (PC) is exactly at the + start of [insn]; that instruction has not yet been executed. Assume + a immediately-previous instruction exists called [prev_insn]. Intuitively, + this function calculates which available subranges are to start and stop at + that point, but these notions are subtle. + + There are eight cases, referenced in the code below. + + 1. First four cases: [key] is currently unavailable, i.e. it is not a + member of (roughly speaking) [S.available_across prev_insn]. + + (a) [key] is not in [S.available_before insn] and neither is it in + [S.available_across insn]. There is nothing to do. + + (b) [key] is not in [S.available_before insn] but it is in + [S.available_across insn]. A new range is created with the starting + position being one byte after the first machine instruction of [insn] + and left open. + + It might seem like this case 1 (b) is impossible, likewise for 2 (b) + below, since "available across" should always be a subset of + "available before". However this does not hold in general: see the + comment in available_ranges_vars.ml. + + (c) [key] is in [S.available_before insn] but it is not in + [S.available_across insn]. A new range is created with the starting + position being the first machine instruction of [insn] and the ending + position being the next machine address after that. + + (d) [key] is in [S.available_before insn] and it is also in + [S.available_across insn]. A new range is created with the starting + position being the first machine instruction of [insn] and left open. + + 2. Second four cases: [key] is already available, i.e. a member of + [S.available_across prev_insn]. + + (a) [key] is not in [S.available_before insn] and neither is it in + [S.available_across insn]. The range endpoint is given as the address + of the first machine instruction of [insn]. Since endpoint bounds are + exclusive (see above) then [key] will not be shown as available when + the debugger is standing on [insn]. + + (b) [key] is not in [S.available_before insn] but it is in + [S.available_across insn]. The range endpoint is given as the address + of the first machine instruction of [insn]; and a new range is opened + in the same way as for case 1 (b), above. + + (c) [key] is in [S.available_before insn] but it is not in + [S.available_across insn]. This will only happen when calculating + variables' available ranges for operation (i.e. [Lop]) instructions + (for example calls or allocations). To give a good user experience it + is necessary to show availability when the debugger is standing on the + very first instruction of the operation but not thereafter. As such we + terminate the range one byte beyond the first machine instruction of + [insn]. + + (d) [key] is in [S.available_before insn] and it is also in + it is in [S.available_across insn]. The existing range remains open. + *) + + type action = + | Open_one_byte_subrange + | Open_subrange + | Open_subrange_one_byte_after + | Close_subrange + | Close_subrange_one_byte_after + + (* CR mshinwell: Move to [Clflags] *) + let check_invariants = ref true + + let actions_at_instruction ~(insn : L.instruction) + ~(prev_insn : L.instruction option) = + let available_before = S.available_before insn in + let available_across = S.available_across insn in + let opt_available_across_prev_insn = + match prev_insn with + | None -> KS.empty + | Some prev_insn -> S.available_across prev_insn + in + let case_1b = + KS.diff available_across + (KS.union opt_available_across_prev_insn available_before) + in + let case_1c = + KS.diff available_before + (KS.union opt_available_across_prev_insn available_across) + in + let case_1d = + KS.diff (KS.inter available_before available_across) + opt_available_across_prev_insn + in + let case_2a = + KS.diff opt_available_across_prev_insn + (KS.union available_before available_across) + in + let case_2b = + KS.inter opt_available_across_prev_insn + (KS.diff available_across available_before) + in + let case_2c = + KS.diff + (KS.inter opt_available_across_prev_insn available_before) + available_across + in + let handle case action result = + (* We use [K.all_parents] here to circumvent a potential performance + problem. In the case of lexical blocks, there may be long chains + of blocks and their parents, yet the innermost block determines the + rest of the chain. As such [S] (which comes from + lexical_block_ranges.ml) only needs to use the innermost blocks in + the "available before" sets, keeping things fast---but we still + populate ranges for all parent blocks, thus avoiding any + post-processing, by using [K.all_parents] here. *) + KS.fold (fun key result -> + List.fold_left (fun result key -> + (key, action) :: result) + result + (key :: (S.Key.all_parents key))) + case + result + in + let actions = + (* Ranges must be closed before they are opened---otherwise, when a + variable moves between registers at a range boundary, we might end up + with no open range for that variable. Note that the pipeline below + constructs the [actions] list in reverse order---later functions in + the pipeline produce actions nearer the head of the list. *) + [] + |> handle case_1b Open_subrange_one_byte_after + |> handle case_1c Open_one_byte_subrange + |> handle case_1d Open_subrange + |> handle case_2a Close_subrange + |> handle case_2b Open_subrange_one_byte_after + |> handle case_2b Close_subrange + |> handle case_2c Close_subrange_one_byte_after + in + let must_restart = + if S.must_restart_ranges_upon_any_change () + && match actions with + | [] -> false + | _::_ -> true + then + KS.inter opt_available_across_prev_insn available_before + else + KS.empty + in + actions, must_restart + + let rec process_instruction t (fundecl : L.fundecl) + ~(first_insn : L.instruction) ~(insn : L.instruction) + ~(prev_insn : L.instruction option) + ~currently_open_subranges ~subrange_state = + let used_label = ref None in + let get_label () = + match !used_label with + | Some label_and_insn -> label_and_insn + | None -> + (* Note that we can't reuse an existing label in the code since we rely + on the ordering of range-related labels. *) + let label = Cmm.new_label () in + let label_insn : L.instruction = + { desc = Llabel label; + next = insn; + arg = [| |]; + res = [| |]; + dbg = insn.dbg; + live = insn.live; + } + in + used_label := Some (label, label_insn); + label, label_insn + in + let open_subrange key ~start_pos_offset ~currently_open_subranges = + (* If the range is later discarded, the inserted label may actually be + useless, but this doesn't matter. It does not generate any code. *) + let label, label_insn = get_label () in + KM.add key (label, start_pos_offset, label_insn) currently_open_subranges + in + let close_subrange key ~end_pos_offset ~currently_open_subranges = + match KM.find key currently_open_subranges with + | exception Not_found -> + Misc.fatal_errorf "No subrange is open for key %a" + S.Key.print key + | start_pos, start_pos_offset, start_insn -> + let currently_open_subranges = KM.remove key currently_open_subranges in + match Range_info.create fundecl key ~start_insn with + | None -> currently_open_subranges + | Some (index, range_info) -> + let range = + match S.Index.Tbl.find t.ranges index with + | range -> range + | exception Not_found -> + let range = Range.create range_info in + S.Index.Tbl.add t.ranges index range; + range + in + let label, _label_insn = get_label () in + let subrange_info = Subrange_info.create key subrange_state in + let subrange = + Subrange.create ~start_insn + ~start_pos ~start_pos_offset + ~end_pos:label ~end_pos_offset + ~subrange_info + in + Range.add_subrange range ~subrange; + currently_open_subranges + in + let actions, must_restart = actions_at_instruction ~insn ~prev_insn in + (* Restart ranges if needed *) + let currently_open_subranges = + KS.fold (fun key currently_open_subranges -> + let currently_open_subranges = + close_subrange key ~end_pos_offset:0 ~currently_open_subranges + in + open_subrange key ~start_pos_offset:0 ~currently_open_subranges) + must_restart + currently_open_subranges + in + (* Apply actions *) + let currently_open_subranges = + List.fold_left (fun currently_open_subranges (key, (action : action)) -> + match action with + | Open_one_byte_subrange -> + let currently_open_subranges = + open_subrange key ~start_pos_offset:0 ~currently_open_subranges + in + close_subrange key ~end_pos_offset:1 ~currently_open_subranges + | Open_subrange -> + open_subrange key ~start_pos_offset:0 ~currently_open_subranges + | Open_subrange_one_byte_after -> + open_subrange key ~start_pos_offset:1 ~currently_open_subranges + | Close_subrange -> + close_subrange key ~end_pos_offset:0 ~currently_open_subranges + | Close_subrange_one_byte_after -> + close_subrange key ~end_pos_offset:1 ~currently_open_subranges) + currently_open_subranges + actions + in + (* Close all subranges if at last instruction *) + let currently_open_subranges = + match insn.desc with + | Lend -> + let currently_open_subranges = + KM.fold (fun key _ currently_open_subranges -> + close_subrange key ~end_pos_offset:0 ~currently_open_subranges) + currently_open_subranges + currently_open_subranges + in + assert (KM.is_empty currently_open_subranges); + currently_open_subranges + | _ -> currently_open_subranges + in + let first_insn = + match !used_label with + | None -> first_insn + | Some (_label, label_insn) -> + assert (label_insn.L.next == insn); + (* (Note that by virtue of [Lprologue], we can insert labels prior to + the first assembly instruction of the function.) *) + begin match prev_insn with + | None -> + (* The label becomes the new first instruction. *) + label_insn + | Some prev_insn -> + assert (prev_insn.L.next == insn); + prev_insn.next <- label_insn; + first_insn + end + in + if !check_invariants then begin + let currently_open_subranges = + KS.of_list ( + List.map (fun (key, _datum) -> key) + (KM.bindings currently_open_subranges)) + in + let should_be_open = S.available_across insn in + let not_open_but_should_be = + KS.diff should_be_open currently_open_subranges + in + if not (KS.is_empty not_open_but_should_be) then begin + Misc.fatal_errorf "%s: ranges for %a are not open across the following \ + instruction:\n%a\navailable_across:@ %a\n\ + currently_open_subranges: %a" + fundecl.fun_name + KS.print not_open_but_should_be + Printlinear.instr { insn with L.next = L.end_instr; } + KS.print should_be_open + KS.print currently_open_subranges + end + end; + match insn.desc with + | Lend -> first_insn + | Lprologue | Lop _ | Lreloadretaddr | Lreturn | Llabel _ + | Lbranch _ | Lcondbranch _ | Lcondbranch3 _ | Lswitch _ + | Lentertrap | Lpushtrap _ | Lpoptrap | Lraise _ -> + let subrange_state = + Subrange_state.advance_over_instruction subrange_state insn + in + process_instruction t fundecl ~first_insn ~insn:insn.next + ~prev_insn:(Some insn) ~currently_open_subranges ~subrange_state + + let process_instructions t fundecl ~first_insn = + let subrange_state = Subrange_state.create () in + process_instruction t fundecl ~first_insn ~insn:first_insn + ~prev_insn:None ~currently_open_subranges:KM.empty ~subrange_state + + let all_indexes t = + S.Index.Set.of_list (List.map fst (S.Index.Tbl.to_list t.ranges)) + + let empty = + { ranges = S.Index.Tbl.create 1; + } + + let create (fundecl : L.fundecl) = + let t = + { ranges = S.Index.Tbl.create 42; + } + in + let first_insn = + process_instructions t fundecl ~first_insn:fundecl.fun_body + in + let fundecl : L.fundecl = + { fundecl with fun_body = first_insn; } + in + t, fundecl + + let iter t ~f = + S.Index.Tbl.iter (fun index range -> f index range) + t.ranges + + let fold t ~init ~f = + S.Index.Tbl.fold (fun index range acc -> f acc index range) + t.ranges + init + + let find t index = S.Index.Tbl.find t.ranges index + + let rewrite_labels_and_remove_empty_subranges_and_ranges t ~env = + let ranges = S.Index.Tbl.create 42 in + S.Index.Tbl.iter (fun index range -> + let range = + Range.rewrite_labels_and_remove_empty_subranges range ~env + in + if not (Range.no_subranges range) then begin + S.Index.Tbl.add ranges index range + end) + t.ranges; + { ranges; + } +end diff --git a/asmcomp/debug/compute_ranges.mli b/asmcomp/debug/compute_ranges.mli new file mode 100644 index 00000000..695529f3 --- /dev/null +++ b/asmcomp/debug/compute_ranges.mli @@ -0,0 +1,28 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 2014--2018 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Coalescing of per-instruction information into possibly-discontiguous + regions of code delimited by labels. This is used for collating + register availability and lexical block scoping information into a + concise form. *) + +[@@@ocaml.warning "+a-4-30-40-41-42"] + +module Make (S : Compute_ranges_intf.S_functor) + : Compute_ranges_intf.S + with module Index := S.Index + with module Key := S.Key + with module Subrange_state := S.Subrange_state + with module Subrange_info := S.Subrange_info + with module Range_info := S.Range_info diff --git a/asmcomp/debug/compute_ranges_intf.ml b/asmcomp/debug/compute_ranges_intf.ml new file mode 100644 index 00000000..69d82069 --- /dev/null +++ b/asmcomp/debug/compute_ranges_intf.ml @@ -0,0 +1,274 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 2014--2019 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +[@@@ocaml.warning "+a-4-30-40-41-42"] + +(** This file defines types that are used to specify the interface of + [Compute_ranges]. The description of [Compute_ranges] is: + + "Coalescing of per-instruction information into possibly-discontiguous + regions of code delimited by labels. This is used for collating register + availability and lexical block scoping information into a concise form." + + [Compute_ranges] defines a functor, whose argument has type [S_functor], and + whose result has type [S]. Both [S_functor] and [S] are defined here. + + It is suggested that those unfamiliar with this module start by reading + the documentation on module type [S], below. +*) + +module L = Linearize + +(** The type of caller-defined contextual state associated with subranges. + This may be used to track information throughout the range-computing + process. *) +module type S_subrange_state = sig + type t + + val create : unit -> t + val advance_over_instruction : t -> L.instruction -> t +end + +(** The type of caller-defined information associated with subranges. *) +module type S_subrange_info = sig + type t + type key + type subrange_state + + val create : key -> subrange_state -> t +end + +(** The type of caller-defined information associated with ranges. *) +module type S_range_info = sig + type t + type key + type index + + val create + : L.fundecl + -> key + -> start_insn:L.instruction + -> (index * t) option +end + +(** This module type specifies what the caller has to provide in order to + instantiate a module to compute ranges. *) +module type S_functor = sig + (** The module [Index] is used to filter and group the generated subranges. + Inclusion of a computed subrange in the result is conditional upon the + existence of an index that can be associated to it. To give a concrete + example, the keys associated to ranges might be pseudoregisters, and the + indexes variable names (c.f. [Available_ranges_vars]). Every register that + is not known to hold the value of some variable is dropped from the + result. + + As the name suggests, values of type [Index.t] also serve as indices for + accessing ranges in the result. The result may actually contain no + reference to keys (only [Subrange_info.t] may reliably contain it), and + subranges with different keys will be coalesced into a single range if all + their keys are associated to the same index. *) + module Index : Identifiable.S + + (** The module [Key] corresponds to the identifiers that define the ranges in + [Linearize] instructions. Each instruction should have two sets of keys, + [available_before] and [available_across], with accessor functions of + these names being provided to retrieve them. The notion of "availability" + is not prescribed. The availability sets are used to compute subranges + associated to each key. *) + module Key : sig + (** The type of identifiers that define ranges. *) + type t + + module Set : sig + include Set.S with type elt = t + val print : Format.formatter -> t -> unit + end + + module Map : Map.S with type key = t + + (** Print a representation (typically sexp) of the given key to the given + formatter. *) + val print : Format.formatter -> t -> unit + + (** In some situations, for performance reasons, an "available" set may only + contain a subset of all keys that need to be tracked. For example, when + using a notion of availability that describes which lexical block a + given instruction lies in, using a standard notion of nested lexical + blocks, the innermost lexical block uniquely determines the chain of its + parents. (This is exploited in [Lexical_block_ranges].) The + [all_parents] function must return, given an "available" [key], all + those other keys that are also available and uniquely determined by + [key]. *) + val all_parents : t -> t list + end + + (** The module [Range_info] is used to store additional information on a range + that is associated to a range at its creation and can be retrieved from + the result. The association between keys and indices is also done here: + [Range_info.create] serves both as a map between keys and indices; and + also as the creator of the [Range_info.t] structure. When several + subranges are contained in a single range, the associated [Range_info.t] + will correspond to the first closed subrange. *) + module Range_info : S_range_info + with type key := Key.t + with type index := Index.t + + (** The module [Subrange_state] describes information that needs to be + propagated and passed to [Subrange_info.create]. The state that will be + used for subrange creation is the state at the end of the subrange, not at + the beginning. *) + module Subrange_state : S_subrange_state + + (** The module [Subrange_info] has a similar purpose to [Range_info], but for + subranges. Its distinguishing property is that it can store information + about its context using the additional [subrange_state] parameter of its + [create] function. *) + module Subrange_info : S_subrange_info + with type key := Key.t + with type subrange_state := Subrange_state.t + + (** How to retrieve from an instruction those keys that are available + immediately before the instruction starts executing. *) + val available_before : L.instruction -> Key.Set.t + + (** How to retrieve from an instruction those keys that are available + between the points at which the instruction reads its arguments and + writes its results. *) + val available_across : L.instruction -> Key.Set.t + + (** This [must_restart_ranges_upon_any_change] boolean exists because some + consumers of the range information may require that two subranges are + disjoint rather than including one in another. When this function returns + [true], whenever a subrange is opened or closed, all other overlapping + subranges will be split in two at the same point. *) + val must_restart_ranges_upon_any_change : unit -> bool +end + +(** This module type is the result type of the [Compute_ranges.Make] functor. + + The _ranges_ being computed are composed of contiguous _subranges_ delimited + by two labels (of type [Linearize.label]). These labels will be added by + this pass to the code being inspected, which is why the [create] function in + the result of the functor returns not only the ranges but also the updated + function with the labels added. The [start_pos_offset] and [end_pos_offset] + components of the subranges are there to allow a distinction between ranges + starting (or ending) right at the start of the corresponding instruction + (offset of zero), and ranges starting or ending one byte after the actual + instruction (offset of one). *) +module type S = sig + (** Corresponds to [Index] in the [S_functor] module type. *) + module Index : Identifiable.S + + (** Corresponds to [Key] in the [S_functor] module type. *) + module Key : sig + type t + module Set : Set.S with type elt = t + module Map : Map.S with type key = t + end + + (** Corresponds to [Subrange_state] in the [S_functor] module type. *) + module Subrange_state : S_subrange_state + + (** Corresponds to [Subrange_info] in the [S_functor] module type. *) + module Subrange_info : S_subrange_info + with type key := Key.t + with type subrange_state := Subrange_state.t + + (** Corresponds to [Range_info] in the [S_functor] module type. *) + module Range_info : S_range_info + with type key := Key.t + with type index := Index.t + + module Subrange : sig + (** The type of subranges. Each subrange is a contiguous region of + code delimited by labels. *) + type t + + (** The caller's information about the subrange. *) + val info : t -> Subrange_info.t + + (** The label at the start of the range. *) + val start_pos : t -> Linearize.label + + (** How many bytes from the label at [start_pos] the range actually + commences. If this value is zero, then the first byte of the range + has the address of the label given by [start_pos]. *) + val start_pos_offset : t -> int + + (** The label at the end of the range. *) + val end_pos : t -> Linearize.label + + (** Like [start_pos_offset], but analogously for the end of the range. (The + sense is not inverted; a positive [end_pos_offset] means the range ends + at an address higher than the address of the [end_pos], just like a + positive [start_pos_offset] means the range starts at an address higher + than the [start_pos]. *) + val end_pos_offset : t -> int + end + + module Range : sig + (** The type of ranges. Each range is a list of subranges, so a + possibly-discontiguous region of code. *) + type t + + (** The caller's information about the range. *) + val info : t -> Range_info.t + + (** Estimate the pair of ([start_pos], [start_pos_offset]) (c.f. [Subrange], + above) found amongst the given ranges that yields the lowest machine + address. The assumption is made that no [start_pos_offset] or + [end_pos_offset] will cause the corresponding extremity of a range to + cross an extremity of any other range. (This should be satisfied in + typical uses because the offsets are typically zero or one.) If there + are no ranges supplied then [None] is returned. *) + val estimate_lowest_address : t -> (Linearize.label * int) option + + (** Fold over all subranges within the given range. *) + val fold + : t + -> init:'a + -> f:('a -> Subrange.t -> 'a) + -> 'a + end + + (** The type holding information on computed ranges. *) + type t + + (** A value of type [t] that holds no range information. *) + val empty : t + + (** Compute ranges for the code in the given linearized function + declaration, returning the ranges as a value of type [t] and the + rewritten code that must go forward for emission. *) + val create : Linearize.fundecl -> t * Linearize.fundecl + + (** Iterate through ranges. Each range is associated with an index. *) + val iter : t -> f:(Index.t -> Range.t -> unit) -> unit + + (** Like [iter], but a fold. *) + val fold : t -> init:'a -> f:('a -> Index.t -> Range.t -> 'a) -> 'a + + (** Find the range for the given index, or raise an exception. *) + val find : t -> Index.t -> Range.t + + (** All indexes for which the given value of type [t] contains ranges. *) + val all_indexes : t -> Index.Set.t + + (** An internal function used by [Coalesce_labels]. + The [env] should come from [Coalesce_labels.fundecl]. *) + val rewrite_labels_and_remove_empty_subranges_and_ranges + : t + -> env:int Numbers.Int.Map.t + -> t +end diff --git a/asmcomp/i386/NOTES.md b/asmcomp/i386/NOTES.md index 6f1e1839..69567cbd 100644 --- a/asmcomp/i386/NOTES.md +++ b/asmcomp/i386/NOTES.md @@ -4,10 +4,13 @@ Intel and AMD x86 processors in 32-bit mode. The baseline is the 80486, also known as `i486`. (Debian's baseline is now the Pentium 1.) +In OCaml versions 3.09.2 to 4.08, MacOS was supported by this port. Support +was removed in OCaml 4.09. + Floating-point architecture: x87. (SSE2 not available in Debian's baseline.) -Operating systems: Linux, BSD, MacOS X, MS Windows. +Operating systems: Linux, BSD, MS Windows. Debian architecture name: `i386` @@ -18,5 +21,3 @@ Debian architecture name: `i386` * ELF application binary interface: _System V Application Binary Interface, Intel386 Architecture Processor Supplement_ -* MacOS X application binary interface: - _OS X ABI Function Call Guide: IA-32 Function Calling Conventions_ diff --git a/asmcomp/i386/arch.ml b/asmcomp/i386/arch.ml index 23f54232..ba76a825 100644 --- a/asmcomp/i386/arch.ml +++ b/asmcomp/i386/arch.ml @@ -163,5 +163,4 @@ let stack_alignment = match Config.system with | "win32" -> 4 (* MSVC *) | _ -> 16 -(* PR#6038: GCC and Clang seem to require 16-byte alignment nowadays, - even if only MacOS X's ABI formally requires it *) + (* PR#6038: GCC and Clang seem to require 16-byte alignment nowadays *) diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp index 654b5629..9f55cd29 100644 --- a/asmcomp/i386/emit.mlp +++ b/asmcomp/i386/emit.mlp @@ -467,41 +467,18 @@ let emit_global_label s = let function_name = ref "" (* Entry point for tail recursive calls *) let tailrec_entry_point = ref 0 -(* Record references to external C functions (for MacOSX) *) -let external_symbols_direct = ref String.Set.empty -let external_symbols_indirect = ref String.Set.empty - -(* Emission of the profiling prelude *) - -let call_mcount mcount = - I.push eax; - I.mov esp ebp; - I.push ecx; - I.push edx; - I.call (sym mcount); - I.pop edx; - I.pop ecx; - I.pop eax - -let emit_profile () = - match system with - | S_linux_elf | S_gnu -> call_mcount "mcount" - | S_bsd_elf -> call_mcount ".mcount" - | S_macosx -> call_mcount "Lmcount$stub" - | _ -> () (*unsupported yet*) let emit_instr fallthrough i = emit_debug_info i.dbg; match i.desc with | Lend -> () | Lprologue -> - if !Clflags.gprofile then emit_profile(); + assert (Proc.prologue_required ()); let n = frame_size() - 4 in if n > 0 then begin I.sub (int n) esp; cfi_adjust_cfa_offset n; end; - def_label !tailrec_entry_point | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in if src.loc <> dst.loc then begin @@ -564,24 +541,11 @@ let emit_instr fallthrough i = | Lop(Iextcall { func; alloc; label_after; }) -> add_used_symbol func; if alloc then begin - if system <> S_macosx then - I.mov (immsym func) eax - else begin - external_symbols_indirect := - String.Set.add func !external_symbols_indirect; - I.mov (mem_sym DWORD (Printf.sprintf "L%s$non_lazy_ptr" - (emit_symbol func))) eax - end; + I.mov (immsym func) eax; emit_call "caml_c_call"; record_frame i.live false i.dbg ~label:label_after end else begin - if system <> S_macosx then - emit_call func - else begin - external_symbols_direct := - String.Set.add func !external_symbols_direct; - I.call (sym (Printf.sprintf "L%s$stub" (emit_symbol func))) - end + emit_call func end | Lop(Istackoffset n) -> if n < 0 @@ -880,9 +844,10 @@ let emit_instr fallthrough i = D.long (ConstLabel (emit_label jumptbl.(i))) done; D.text () - | Lsetuptrap lbl -> - I.call (label lbl) - | Lpushtrap -> + | Lentertrap -> + () + | Lpushtrap { lbl_handler; } -> + I.push (label lbl_handler); if trap_frame_size > 8 then I.sub (int (trap_frame_size - 8)) esp; I.push (sym32 "caml_exception_pointer"); @@ -904,7 +869,8 @@ let emit_instr fallthrough i = I.pop (sym32 "caml_exception_pointer"); if trap_frame_size > 8 then I.add (int (trap_frame_size - 8)) esp; - I.ret () + I.pop ebx; + I.jmp ebx end let rec emit_all fallthrough i = @@ -916,38 +882,12 @@ let rec emit_all fallthrough i = (system = S_win32 || Linearize.has_fallthrough i.desc) i.next -(* Emission of external symbol references (for MacOSX) *) - -let emit_external_symbol_direct s = - _label (Printf.sprintf "L%s$stub" (emit_symbol s)); - D.indirect_symbol (emit_symbol s); - I.hlt (); I.hlt (); I.hlt (); I.hlt () ; I.hlt () - -let emit_external_symbol_indirect s = - _label (Printf.sprintf "L%s$non_lazy_ptr" (emit_symbol s)); - D.indirect_symbol (emit_symbol s); - D.long (const 0) - -let emit_external_symbols () = - D.section [ "__IMPORT"; "__pointers"] None ["non_lazy_symbol_pointers" ]; - String.Set.iter emit_external_symbol_indirect !external_symbols_indirect; - external_symbols_indirect := String.Set.empty; - D.section [ "__IMPORT"; "__jump_table"] None - [ "symbol_stubs"; "self_modifying_code+pure_instructions"; "5" ]; - String.Set.iter emit_external_symbol_direct !external_symbols_direct; - external_symbols_direct := String.Set.empty; - if !Clflags.gprofile then begin - _label "Lmcount$stub"; - D.indirect_symbol "mcount"; - I.hlt (); I.hlt (); I.hlt () ; I.hlt () ; I.hlt () - end - (* Emission of a function declaration *) let fundecl fundecl = function_name := fundecl.fun_name; fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := new_label(); + tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; stack_offset := 0; call_gc_sites := []; bound_error_sites := []; @@ -955,13 +895,7 @@ let fundecl fundecl = D.text (); add_def_symbol fundecl.fun_name; D.align (if system = S_win32 then 4 else 16); - if system = S_macosx - && not !Clflags.output_c_object - && is_generic_function fundecl.fun_name - then (* PR#4690 *) - D.private_extern (emit_symbol fundecl.fun_name) - else - D.global (emit_symbol fundecl.fun_name); + D.global (emit_symbol fundecl.fun_name); D.label (emit_symbol fundecl.fun_name); emit_debug_info fundecl.fun_dbg; cfi_startproc (); @@ -1027,9 +961,7 @@ let begin_assembly() = emit_global_label "data_begin"; D.text (); - emit_global_label "code_begin"; - if system = S_macosx then I.nop (); (* PR#4690 *) - () + emit_global_label "code_begin" let end_assembly() = if !float_constants <> [] then begin @@ -1038,8 +970,6 @@ let end_assembly() = end; D.text (); - if system = S_macosx then I.nop (); - (* suppress "ld warning: atom sorting error" *) emit_global_label "code_end"; @@ -1066,7 +996,6 @@ let end_assembly() = efa_string = (fun s -> D.bytes (s ^ "\000")) }; - if system = S_macosx then emit_external_symbols (); if system = S_linux_elf then (* Mark stack as non-executable, PR#4564 *) D.section [".note.GNU-stack"] (Some "") ["%progbits"]; diff --git a/asmcomp/i386/proc.ml b/asmcomp/i386/proc.ml index 29290d0d..0b333af4 100644 --- a/asmcomp/i386/proc.ml +++ b/asmcomp/i386/proc.ml @@ -241,6 +241,17 @@ let op_is_pure = function let num_stack_slots = [| 0; 0 |] let contains_calls = ref false +let frame_required () = + let frame_size_at_top_of_function = + (* cf. [frame_size] in emit.mlp. *) + Misc.align (4*num_stack_slots.(0) + 8*num_stack_slots.(1) + 4) + stack_alignment + in + frame_size_at_top_of_function > 4 + +let prologue_required () = + frame_required () + (* Calling the assembler *) let assemble_file infile outfile = diff --git a/asmcomp/i386/selection.ml b/asmcomp/i386/selection.ml index efde628d..9e4e949a 100644 --- a/asmcomp/i386/selection.ml +++ b/asmcomp/i386/selection.ml @@ -32,25 +32,25 @@ type addressing_expr = let rec select_addr exp = match exp with - Cconst_symbol s -> + Cconst_symbol (s, _) -> (Asymbol s, 0) - | Cop((Caddi | Caddv | Cadda), [arg; Cconst_int m], _) -> + | Cop((Caddi | Caddv | Cadda), [arg; Cconst_int (m, _)], _) -> let (a, n) = select_addr arg in (a, n + m) - | Cop(Csubi, [arg; Cconst_int m], _) -> + | Cop(Csubi, [arg; Cconst_int (m, _)], _) -> let (a, n) = select_addr arg in (a, n - m) - | Cop((Caddi | Caddv | Cadda), [Cconst_int m; arg], _) -> + | Cop((Caddi | Caddv | Cadda), [Cconst_int (m, _); arg], _) -> let (a, n) = select_addr arg in (a, n + m) - | Cop(Clsl, [arg; Cconst_int(1|2|3 as shift)], _) -> + | Cop(Clsl, [arg; Cconst_int ((1|2|3 as shift), _)], _) -> begin match select_addr arg with (Alinear e, n) -> (Ascale(e, 1 lsl shift), n lsl shift) | _ -> (Alinear exp, 0) end - | Cop(Cmuli, [arg; Cconst_int(2|4|8 as mult)], _) -> + | Cop(Cmuli, [arg; Cconst_int ((2|4|8 as mult), _)], _) -> begin match select_addr arg with (Alinear e, n) -> (Ascale(e, mult), n * mult) | _ -> (Alinear exp, 0) end - | Cop(Cmuli, [Cconst_int(2|4|8 as mult); arg], _) -> + | Cop(Cmuli, [Cconst_int ((2|4|8 as mult), _); arg], _) -> begin match select_addr arg with (Alinear e, n) -> (Ascale(e, mult), n * mult) | _ -> (Alinear exp, 0) @@ -192,15 +192,15 @@ method select_addressing _chunk exp = method! select_store is_assign addr exp = match exp with - Cconst_int n -> + Cconst_int (n, _) -> (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) - | (Cconst_natint n | Cblockheader (n, _)) -> + | (Cconst_natint (n, _) | Cblockheader (n, _)) -> (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) - | Cconst_pointer n -> + | Cconst_pointer (n, _) -> (Ispecific(Istore_int(Nativeint.of_int n, addr, is_assign)), Ctuple []) - | Cconst_natpointer n -> + | Cconst_natpointer (n, _) -> (Ispecific(Istore_int(n, addr, is_assign)), Ctuple []) - | Cconst_symbol s -> + | Cconst_symbol (s, _) -> (Ispecific(Istore_symbol(s, addr, is_assign)), Ctuple []) | _ -> super#select_store is_assign addr exp @@ -229,7 +229,7 @@ method! select_operation op args dbg = (* Recognize store instructions *) | Cstore ((Word_int | Word_val) as chunk, _) -> begin match args with - [loc; Cop(Caddi, [Cop(Cload _, [loc'], _); Cconst_int n], _)] + [loc; Cop(Caddi, [Cop(Cload _, [loc'], _); Cconst_int (n, _)], _)] when loc = loc' -> let (addr, arg) = self#select_addressing chunk loc in (Ispecific(Ioffset_loc(n, addr)), [arg]) @@ -270,28 +270,29 @@ method select_floatarith regular_op reversed_op mem_op mem_rev_op args = (* Deal with register constraints *) -method! insert_op_debug op dbg rs rd = +method! insert_op_debug env op dbg rs rd = try let (rsrc, rdst, move_res) = pseudoregs_for_operation op rs rd in - self#insert_moves rs rsrc; - self#insert_debug (Iop op) dbg rsrc rdst; + self#insert_moves env rs rsrc; + self#insert_debug env (Iop op) dbg rsrc rdst; if move_res then begin - self#insert_moves rdst rd; + self#insert_moves env rdst rd; rd end else rdst with Use_default -> - super#insert_op_debug op dbg rs rd + super#insert_op_debug env op dbg rs rd (* Selection of push instructions for external calls *) method select_push exp = match exp with - Cconst_int n -> (Ispecific(Ipush_int(Nativeint.of_int n)), Ctuple []) - | Cconst_natint n -> (Ispecific(Ipush_int n), Ctuple []) - | Cconst_pointer n -> (Ispecific(Ipush_int(Nativeint.of_int n)), Ctuple []) - | Cconst_natpointer n -> (Ispecific(Ipush_int n), Ctuple []) - | Cconst_symbol s -> (Ispecific(Ipush_symbol s), Ctuple []) + Cconst_int (n, _) -> (Ispecific(Ipush_int(Nativeint.of_int n)), Ctuple []) + | Cconst_natint (n, _) -> (Ispecific(Ipush_int n), Ctuple []) + | Cconst_pointer (n, _) -> + (Ispecific(Ipush_int(Nativeint.of_int n)), Ctuple []) + | Cconst_natpointer (n, _) -> (Ispecific(Ipush_int n), Ctuple []) + | Cconst_symbol (s, _) -> (Ispecific(Ipush_symbol s), Ctuple []) | Cop(Cload ((Word_int | Word_val as chunk), _), [loc], _) -> let (addr, arg) = self#select_addressing chunk loc in (Ispecific(Ipush_load addr), arg) @@ -312,13 +313,13 @@ method! emit_extcall_args env args = let rec emit_pushes = function | [] -> if sz2 > sz1 then - self#insert (Iop (Istackoffset (sz2 - sz1))) [||] [||] + self#insert env (Iop (Istackoffset (sz2 - sz1))) [||] [||] | e :: el -> emit_pushes el; let (op, arg) = self#select_push e in match self#emit_expr env arg with | None -> () - | Some r -> self#insert (Iop op) r [||] in + | Some r -> self#insert env (Iop op) r [||] in emit_pushes args; ([||], sz2) diff --git a/asmcomp/interf.ml b/asmcomp/interf.ml index 7d569c5b..a1cdb921 100644 --- a/asmcomp/interf.ml +++ b/asmcomp/interf.ml @@ -105,8 +105,6 @@ let build_graph fundecl = interf cases.(i) done; interf i.next - | Iloop body -> - interf body; interf i.next | Icatch(_rec_flag, handlers, body) -> interf body; List.iter (fun (_, handler) -> interf handler) handlers; @@ -177,10 +175,6 @@ let build_graph fundecl = prefer (weight / 2) cases.(i) done; prefer weight i.next - | Iloop body -> - (* Avoid overflow of weight and spill_cost *) - prefer (if weight < 1000 then 8 * weight else weight) body; - prefer weight i.next | Icatch(rec_flag, handlers, body) -> prefer weight body; List.iter (fun (_nfail, handler) -> diff --git a/asmcomp/interval.ml b/asmcomp/interval.ml index 01f49a30..956ac4f7 100644 --- a/asmcomp/interval.ml +++ b/asmcomp/interval.ml @@ -148,10 +148,6 @@ let build_intervals fd = insert_destroyed_at_oper intervals i !pos; Array.iter walk_instruction cases; walk_instruction i.next - | Iloop body -> - insert_destroyed_at_oper intervals i !pos; - walk_instruction body; - walk_instruction i.next | Icatch(_, handlers, body) -> insert_destroyed_at_oper intervals i !pos; List.iter (fun (_, i) -> walk_instruction i) handlers; diff --git a/asmcomp/linearize.ml b/asmcomp/linearize.ml index a5a39aa5..38d3d6ac 100644 --- a/asmcomp/linearize.ml +++ b/asmcomp/linearize.ml @@ -39,8 +39,8 @@ and instruction_desc = | Lcondbranch of test * label | Lcondbranch3 of label option * label option * label option | Lswitch of label array - | Lsetuptrap of label - | Lpushtrap + | Lentertrap + | Lpushtrap of { lbl_handler : label; } | Lpoptrap | Lraise of Cmm.raise_kind @@ -55,6 +55,7 @@ type fundecl = fun_fast: bool; fun_dbg : Debuginfo.t; fun_spacetime_shape : Mach.spacetime_shape option; + fun_tailrec_entry_point_label : label; } (* Invert a test *) @@ -130,7 +131,7 @@ let rec discard_dead_code n = | Llabel _ -> n (* Do not discard Lpoptrap/Lpushtrap or Istackoffset instructions, as this may cause a stack imbalance later during assembler generation. *) - | Lpoptrap | Lpushtrap -> n + | Lpoptrap | Lpushtrap _ -> n | Lop(Istackoffset _) -> n | _ -> discard_dead_code n.next @@ -249,11 +250,6 @@ let rec linear i n = i !n2 end else copy_instr (Lswitch(Array.map (fun n -> lbl_cases.(n)) index)) i !n2 - | Iloop body -> - let lbl_head = Cmm.new_label() in - let n1 = linear i.Mach.next n in - let n2 = linear body (cons_instr (Lbranch lbl_head) n1) in - cons_instr (Llabel lbl_head) n2 | Icatch(_rec_flag, handlers, body) -> let (lbl_end, n1) = get_label(linear i.Mach.next n) in (* CR mshinwell for pchambart: @@ -272,7 +268,8 @@ let rec linear i n = let n2 = List.fold_left2 (fun n (_nfail, handler) lbl_handler -> match handler.Mach.desc with | Iend -> n - | _ -> cons_instr (Llabel lbl_handler) (linear handler n)) + | _ -> cons_instr (Llabel lbl_handler) + (linear handler (add_branch lbl_end n))) n1 handlers labels_at_entry_to_handlers in let n3 = linear body (add_branch lbl_end n2) in @@ -286,9 +283,11 @@ let rec linear i n = only to inform the later pass about this stack offset (corresponding to N traps). *) + let lbl_dummy = lbl in let rec loop i tt = if t = tt then i - else loop (cons_instr Lpushtrap i) (tt - 1) + else + loop (cons_instr (Lpushtrap { lbl_handler = lbl_dummy; }) i) (tt - 1) in let n1 = loop (linear i.Mach.next n) !try_depth in let rec loop i tt = @@ -298,32 +297,89 @@ let rec linear i n = loop (add_branch lbl n1) !try_depth | Itrywith(body, handler) -> let (lbl_join, n1) = get_label (linear i.Mach.next n) in + let (lbl_handler, n2) = + get_label (cons_instr Lentertrap (linear handler n1)) + in incr try_depth; assert (i.Mach.arg = [| |] || Config.spacetime); - let (lbl_body, n2) = - get_label (instr_cons Lpushtrap i.Mach.arg [| |] - (linear body (cons_instr Lpoptrap n1))) in + let n3 = cons_instr (Lpushtrap { lbl_handler; }) + (linear body + (cons_instr + Lpoptrap + (add_branch lbl_join n2))) in decr try_depth; - instr_cons (Lsetuptrap lbl_body) i.Mach.arg [| |] - (linear handler (add_branch lbl_join n2)) + n3 + | Iraise k -> copy_instr (Lraise k) i (discard_dead_code n) let add_prologue first_insn = - let insn = first_insn in - { desc = Lprologue; - next = insn; - arg = [| |]; - res = [| |]; - dbg = insn.dbg; - live = insn.live; - } + (* The prologue needs to come after any [Iname_for_debugger] operations that + refer to parameters. (Such operations always come in a contiguous + block, cf. [Selectgen].) *) + let rec skip_naming_ops (insn : instruction) : label * instruction = + match insn.desc with + | Lop (Iname_for_debugger _) -> + let tailrec_entry_point_label, next = skip_naming_ops insn.next in + tailrec_entry_point_label, { insn with next; } + | _ -> + let tailrec_entry_point_label = Cmm.new_label () in + let tailrec_entry_point = + { desc = Llabel tailrec_entry_point_label; + next = insn; + arg = [| |]; + res = [| |]; + dbg = insn.dbg; + live = insn.live; + } + in + (* We expect [Lprologue] to expand to at least one instruction---as such, + if no prologue is required, we avoid adding the instruction here. + The reason is subtle: an empty expansion of [Lprologue] can cause + two labels, one either side of the [Lprologue], to point at the same + location. This means that we lose the property (cf. [Coalesce_labels]) + that we can check if two labels point at the same location by + comparing them for equality. This causes trouble when the function + whose prologue is in question lands at the top of the object file + and we are emitting DWARF debugging information: + foo_code_begin: + foo: + .L1: + ; empty prologue + .L2: + ... + If we were to emit a location list entry from L1...L2, not realising + that they point at the same location, then the beginning and ending + points of the range would be both equal to each other and (relative to + "foo_code_begin") equal to zero. This appears to confuse objdump, + which seemingly misinterprets the entry as an end-of-list entry + (which is encoded with two zero words), then complaining about a + "hole in location list" (as it ignores any remaining list entries + after the misinterpreted entry). *) + if Proc.prologue_required () then + let prologue = + { desc = Lprologue; + next = tailrec_entry_point; + arg = [| |]; + res = [| |]; + dbg = tailrec_entry_point.dbg; + live = Reg.Set.empty; (* will not be used *) + } + in + tailrec_entry_point_label, prologue + else + tailrec_entry_point_label, tailrec_entry_point + in + skip_naming_ops first_insn let fundecl f = - let fun_body = add_prologue (linear f.Mach.fun_body end_instr) in + let fun_tailrec_entry_point_label, fun_body = + add_prologue (linear f.Mach.fun_body end_instr) + in { fun_name = f.Mach.fun_name; fun_body; fun_fast = not (List.mem Cmm.Reduce_code_size f.Mach.fun_codegen_options); fun_dbg = f.Mach.fun_dbg; fun_spacetime_shape = f.Mach.fun_spacetime_shape; + fun_tailrec_entry_point_label; } diff --git a/asmcomp/linearize.mli b/asmcomp/linearize.mli index e30996fe..d1662295 100644 --- a/asmcomp/linearize.mli +++ b/asmcomp/linearize.mli @@ -36,8 +36,8 @@ and instruction_desc = | Lcondbranch of Mach.test * label | Lcondbranch3 of label option * label option * label option | Lswitch of label array - | Lsetuptrap of label - | Lpushtrap + | Lentertrap + | Lpushtrap of { lbl_handler : label; } | Lpoptrap | Lraise of Cmm.raise_kind @@ -53,6 +53,7 @@ type fundecl = fun_fast: bool; fun_dbg : Debuginfo.t; fun_spacetime_shape : Mach.spacetime_shape option; + fun_tailrec_entry_point_label : label; } val fundecl: Mach.fundecl -> fundecl diff --git a/asmcomp/liveness.ml b/asmcomp/liveness.ml index 28c5868c..2da5b160 100644 --- a/asmcomp/liveness.ml +++ b/asmcomp/liveness.ml @@ -89,20 +89,6 @@ let rec live i finally = done; i.live <- !at_fork; Reg.add_set_array !at_fork arg - | Iloop(body) -> - let at_top = ref Reg.Set.empty in - (* Yes, there are better algorithms, but we'll just iterate till - reaching a fixpoint. *) - begin try - while true do - let new_at_top = Reg.Set.union !at_top (live body !at_top) in - if Reg.Set.equal !at_top new_at_top then raise Exit; - at_top := new_at_top - done - with Exit -> () - end; - i.live <- !at_top; - !at_top | Icatch(rec_flag, handlers, body) -> let at_join = live i.next finally in let aux (nfail,handler) (nfail', before_handler) = diff --git a/asmcomp/mach.ml b/asmcomp/mach.ml index 17a5ba7e..bfed9f7e 100644 --- a/asmcomp/mach.ml +++ b/asmcomp/mach.ml @@ -81,7 +81,6 @@ and instruction_desc = | Ireturn | Iifthenelse of test * instruction * instruction | Iswitch of int array * instruction array - | Iloop of instruction | Icatch of Cmm.rec_flag * (int * instruction) list * instruction | Iexit of int | Itrywith of instruction * instruction @@ -153,8 +152,6 @@ let rec instr_iter f i = instr_iter f cases.(i) done; instr_iter f i.next - | Iloop(body) -> - instr_iter f body; instr_iter f i.next | Icatch(_, handlers, body) -> instr_iter f body; List.iter (fun (_n, handler) -> instr_iter f handler) handlers; @@ -197,7 +194,7 @@ let spacetime_node_hole_pointer_is_live_before insn = | Ifloatofint | Iintoffloat | Iname_for_debugger _ -> false end - | Iend | Ireturn | Iifthenelse _ | Iswitch _ | Iloop _ | Icatch _ + | Iend | Ireturn | Iifthenelse _ | Iswitch _ | Icatch _ | Iexit _ | Itrywith _ | Iraise _ -> false let operation_can_raise op = diff --git a/asmcomp/mach.mli b/asmcomp/mach.mli index f32d8604..6ad4cda4 100644 --- a/asmcomp/mach.mli +++ b/asmcomp/mach.mli @@ -97,7 +97,6 @@ and instruction_desc = | Ireturn | Iifthenelse of test * instruction * instruction | Iswitch of int array * instruction array - | Iloop of instruction | Icatch of Cmm.rec_flag * (int * instruction) list * instruction | Iexit of int | Itrywith of instruction * instruction diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index b489fa99..558d1a1e 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -198,8 +198,11 @@ let emit_toctable () = `{emit_label lbl}: .quad {emit_tocentry entry}\n`) tocref_entries -(* Emit a load from a TOC entry *) +(* Emit a load from a TOC entry. + The [dest] should not be r0, since [dest] is used as the index register for a + ld instruction, but r0 reads as zero when used as an index register. +*) let emit_tocload emit_dest dest entry = let lbl = label_for_tocref entry in if !big_toc || !Clflags.for_package <> None then begin @@ -502,8 +505,8 @@ module BR = Branch_relaxation.Make (struct + (if lbl1 = None then 0 else 1) + (if lbl2 = None then 0 else 1) | Lswitch _ -> size 7 (5 + tocload_size()) (5 + tocload_size()) - | Lsetuptrap _ -> size 1 2 2 - | Lpushtrap -> size 4 5 5 + | Lentertrap -> size 0 (tocload_size()) (tocload_size()) + | Lpushtrap _ -> size 5 (4 + tocload_size()) (4 + tocload_size()) | Lpoptrap -> 2 | Lraise _ -> 6 @@ -517,28 +520,6 @@ module BR = Branch_relaxation.Make (struct let relax_intop_imm_checkbound ~bound:_ ~label_after_error:_ = assert false end) -(* Emission of the profiling prelude *) - -let emit_profile () = - match abi with - | ELF32 -> - ` mflr 0\n`; - ` addi 1, 1, -16\n`; - ` stw 0, 4(1)\n`; - (* _mcount preserves the registers used for parameter passing *) - (* when it returns, lr contains the original return address *) - ` bl {emit_symbol "_mcount"}\n`; - ` addi 1, 1, 16\n` - | ELF64v1 | ELF64v2 -> - ` mflr 0\n`; - (* save the registers used for parameter passing *) - ` bl {emit_symbol "caml_before_mcount"}\n`; - ` bl {emit_symbol "_mcount"}\n`; - ` nop\n`; - (* restore the registers used for parameter passing *) - ` bl {emit_symbol "caml_after_mcount"}\n`; - ` mtlr 0\n` - (* Output the assembly code for an instruction *) let emit_instr i = @@ -546,7 +527,7 @@ let emit_instr i = match i.desc with | Lend -> () | Lprologue -> - if !Clflags.gprofile then emit_profile(); + assert (Proc.prologue_required ()); let n = frame_size() in if n > 0 then begin ` addi 1, 1, {emit_int(-n)}\n`; @@ -561,8 +542,7 @@ let emit_instr i = | ELF32 -> () | ELF64v1 | ELF64v2 -> ` std 2, {emit_int(toc_save_offset())}(1)\n` - end; - `{emit_label !tailrec_entry_point}:\n` + end | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in if src.loc <> dst.loc then begin @@ -975,26 +955,26 @@ let emit_instr i = done; emit_string code_space end - | Lsetuptrap lbl -> - ` bl {emit_label lbl}\n`; + | Lentertrap -> begin match abi with | ELF32 -> () | ELF64v1 | ELF64v2 -> emit_reload_toc() end - | Lpushtrap -> + | Lpushtrap { lbl_handler; } -> begin match abi with | ELF32 -> - ` mflr 0\n`; - ` stwu 0, -16(1)\n`; + ` addis 11, 0, {emit_upper emit_label lbl_handler}\n`; + ` addi 11, 11, {emit_lower emit_label lbl_handler}\n`; + ` stwu 11, -16(1)\n`; adjust_stack_offset 16; ` stw 29, 4(1)\n`; ` mr 29, 1\n` | ELF64v1 | ELF64v2 -> - ` mflr 0\n`; - ` addi 1, 1, -32\n`; - adjust_stack_offset 32; - ` std 0, {emit_int trap_handler_offset}(1)\n`; + ` addi 1, 1, {emit_int (-trap_size)}\n`; + adjust_stack_offset trap_size; ` std 29, {emit_int trap_previous_offset}(1)\n`; + emit_tocload emit_gpr 29 (TocLabel lbl_handler); + ` std 29, {emit_int trap_handler_offset}(1)\n`; ` mr 29, 1\n` end | Lpoptrap -> @@ -1027,7 +1007,7 @@ let rec emit_all i = let fundecl fundecl = function_name := fundecl.fun_name; - tailrec_entry_point := new_label(); + tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; stack_offset := 0; call_gc_label := 0; float_literals := []; @@ -1183,31 +1163,6 @@ let begin_assembly() = `{emit_symbol lbl_begin}:\n` let end_assembly() = - (* In profiling mode, for ELF64, emit the helper functions - for register saving and restoring. We put one copy of these - functions in every generated file, instead of defining - them once in runtime/power.S, so that we can call them - without risking to save r2 in the wrong place. *) - if ppc64 && !Clflags.gprofile then begin - let save_area = reserved_stack_space + (if abi = ELF64v1 then 8*8 else 0) in - let stacksize = save_area + 8*8 in - emit_string code_space; - ` .align 2\n`; - `{emit_symbol "caml_before_mcount"}:\n`; - ` stdu 1, {emit_int (-stacksize)}(1)\n`; - ` std 0, {emit_int (16 + stacksize)}(1)\n`; - for i = 3 to 10 do - ` std {emit_gpr i}, {emit_int (save_area + (i - 3) * 8)}(1)\n` - done; - ` blr\n`; - `{emit_symbol "caml_after_mcount"}:\n`; - ` ld 0, {emit_int (16 + stacksize)}(1)\n`; - for i = 3 to 10 do - ` ld {emit_gpr i}, {emit_int (save_area + (i - 3) * 8)}(1)\n` - done; - ` addi 1, 1, {emit_int stacksize}\n`; - ` blr\n` - end; (* Emit the end of the segments *) emit_string function_descr_space; let lbl_end = Compilenv.make_symbol (Some "code_end") in diff --git a/asmcomp/power/proc.ml b/asmcomp/power/proc.ml index 8560d0f9..86b4476c 100644 --- a/asmcomp/power/proc.ml +++ b/asmcomp/power/proc.ml @@ -341,6 +341,26 @@ let op_is_pure = function let num_stack_slots = [| 0; 0 |] let contains_calls = ref false +(* See [reserved_stack_space] in emit.mlp. *) +let reserved_stack_space_required () = + match abi with + | ELF32 -> false + | ELF64v1 | ELF64v2 -> true + +let frame_required () = + let is_elf32 = + match abi with + | ELF32 -> true + | ELF64v1 | ELF64v2 -> false + in + reserved_stack_space_required () + || num_stack_slots.(0) > 0 + || num_stack_slots.(1) > 0 + || (!contains_calls && is_elf32) + +let prologue_required () = + frame_required () + (* Calling the assembler *) let assemble_file infile outfile = diff --git a/asmcomp/power/selection.ml b/asmcomp/power/selection.ml index e62b0b89..6e97feba 100644 --- a/asmcomp/power/selection.ml +++ b/asmcomp/power/selection.ml @@ -27,11 +27,11 @@ type addressing_expr = | Aadd of expression * expression let rec select_addr = function - Cconst_symbol s -> + Cconst_symbol (s, _) -> (Asymbol s, 0, Debuginfo.none) - | Cop((Caddi | Caddv | Cadda), [arg; Cconst_int m], dbg) -> + | Cop((Caddi | Caddv | Cadda), [arg; Cconst_int (m, _)], dbg) -> let (a, n, _) = select_addr arg in (a, n + m, dbg) - | Cop((Caddi | Caddv | Cadda), [Cconst_int m; arg], dbg) -> + | Cop((Caddi | Caddv | Cadda), [Cconst_int (m, _); arg], dbg) -> let (a, n, _) = select_addr arg in (a, n + m, dbg) | Cop((Caddi | Caddv | Cadda), [arg1; arg2], dbg) -> begin match (select_addr arg1, select_addr arg2) with @@ -82,9 +82,9 @@ method! select_operation op args dbg = super#select_operation op args dbg method select_logical op = function - [arg; Cconst_int n] when n >= 0 && n <= 0xFFFF -> + [arg; Cconst_int (n, _)] when n >= 0 && n <= 0xFFFF -> (Iintop_imm(op, n), [arg]) - | [Cconst_int n; arg] when n >= 0 && n <= 0xFFFF -> + | [Cconst_int (n, _); arg] when n >= 0 && n <= 0xFFFF -> (Iintop_imm(op, n), [arg]) | args -> (Iintop op, args) diff --git a/asmcomp/printcmm.ml b/asmcomp/printcmm.ml index c485eec1..7be55c2f 100644 --- a/asmcomp/printcmm.ml +++ b/asmcomp/printcmm.ml @@ -143,16 +143,16 @@ let operation d = function | Ccheckbound -> "checkbound" ^ Debuginfo.to_string d let rec expr ppf = function - | Cconst_int n -> fprintf ppf "%i" n - | Cconst_natint n -> + | Cconst_int (n, _dbg) -> fprintf ppf "%i" n + | Cconst_natint (n, _dbg) -> fprintf ppf "%s" (Nativeint.to_string n) | Cblockheader(n, d) -> fprintf ppf "block-hdr(%s)%s" (Nativeint.to_string n) (Debuginfo.to_string d) - | Cconst_float n -> fprintf ppf "%F" n - | Cconst_symbol s -> fprintf ppf "\"%s\"" s - | Cconst_pointer n -> fprintf ppf "%ia" n - | Cconst_natpointer n -> fprintf ppf "%sa" (Nativeint.to_string n) + | Cconst_float (n, _dbg) -> fprintf ppf "%F" n + | Cconst_symbol (s, _dbg) -> fprintf ppf "\"%s\"" s + | Cconst_pointer (n, _dbg) -> fprintf ppf "%ia" n + | Cconst_natpointer (n, _dbg) -> fprintf ppf "%sa" (Nativeint.to_string n) | Cvar id -> V.print ppf id | Clet(id, def, (Clet(_, _, _) as body)) -> let print_binding id ppf def = @@ -211,7 +211,7 @@ let rec expr ppf = function fprintf ppf ")@]" | Csequence(e1, e2) -> fprintf ppf "@[<2>(seq@ %a@ %a)@]" sequence e1 sequence e2 - | Cifthenelse(e1, e2, e3) -> + | Cifthenelse(e1, _e2_dbg, e2, _e3_dbg, e3, _dbg) -> fprintf ppf "@[<2>(if@ %a@ %a@ %a)@]" expr e1 expr e2 expr e3 | Cswitch(e1, index, cases, _dbg) -> let print_case i ppf = @@ -220,13 +220,11 @@ let rec expr ppf = function done in let print_cases ppf = for i = 0 to Array.length cases - 1 do - fprintf ppf "@ @[<2>%t@ %a@]" (print_case i) sequence cases.(i) + fprintf ppf "@ @[<2>%t@ %a@]" (print_case i) sequence (fst cases.(i)) done in fprintf ppf "@[@[<2>(switch@ %a@ @]%t)@]" expr e1 print_cases - | Cloop e -> - fprintf ppf "@[<2>(loop@ %a)@]" sequence e | Ccatch(flag, handlers, e1) -> - let print_handler ppf (i, ids, e2) = + let print_handler ppf (i, ids, e2, _dbg) = fprintf ppf "(%d%a)@ %a" i (fun ppf ids -> @@ -249,7 +247,7 @@ let rec expr ppf = function fprintf ppf "@[<2>(exit %d" i; List.iter (fun e -> fprintf ppf "@ %a" expr e) el; fprintf ppf ")@]" - | Ctrywith(e1, id, e2) -> + | Ctrywith(e1, id, e2, _dbg) -> fprintf ppf "@[<2>(try@ %a@;<1 -2>with@ %a@ %a)@]" sequence e1 VP.print id sequence e2 diff --git a/asmcomp/printlinear.ml b/asmcomp/printlinear.ml index 69557687..4e62fc6f 100644 --- a/asmcomp/printlinear.ml +++ b/asmcomp/printlinear.ml @@ -59,10 +59,10 @@ let instr ppf i = fprintf ppf "case %i: goto %a" i label lblv.(i) done; fprintf ppf "@,endswitch" - | Lsetuptrap lbl -> - fprintf ppf "setup trap %a" label lbl - | Lpushtrap -> - fprintf ppf "push trap" + | Lentertrap -> + fprintf ppf "enter trap" + | Lpushtrap { lbl_handler; } -> + fprintf ppf "push trap %a" label lbl_handler | Lpoptrap -> fprintf ppf "pop trap" | Lraise k -> diff --git a/asmcomp/printmach.ml b/asmcomp/printmach.ml index 6ef11ce3..d90e302d 100644 --- a/asmcomp/printmach.ml +++ b/asmcomp/printmach.ml @@ -207,8 +207,6 @@ let rec instr ppf i = fprintf ppf "@]@,%a@]" instr cases.(i) done; fprintf ppf "@,endswitch" - | Iloop(body) -> - fprintf ppf "@[loop@,%a@;<0 -2>endloop@]" instr body | Icatch(flag, handlers, body) -> fprintf ppf "@[catch%a@,%a@;<0 -2>with" Printcmm.rec_flag flag instr body; diff --git a/asmcomp/proc.mli b/asmcomp/proc.mli index 2074d619..4e0e0364 100644 --- a/asmcomp/proc.mli +++ b/asmcomp/proc.mli @@ -67,6 +67,10 @@ val op_is_pure: Mach.operation -> bool (* Info for laying out the stack frame *) val num_stack_slots: int array val contains_calls: bool ref +val frame_required : unit -> bool + +(* Function prologues *) +val prologue_required : unit -> bool (** For a given register class, the DWARF register numbering for that class. Given an allocated register with location [Reg n] and class [reg_class], the diff --git a/asmcomp/reloadgen.ml b/asmcomp/reloadgen.ml index d2bf9150..b1f260c1 100644 --- a/asmcomp/reloadgen.ml +++ b/asmcomp/reloadgen.ml @@ -110,8 +110,6 @@ method private reload i = insert_moves i.arg newarg (instr_cons (Iswitch(index, Array.map (self#reload) cases)) newarg [||] (self#reload i.next)) - | Iloop body -> - instr_cons (Iloop(self#reload body)) [||] [||] (self#reload i.next) | Icatch(rec_flag, handlers, body) -> let new_handlers = List.map (fun (nfail, handler) -> nfail, self#reload handler) diff --git a/asmcomp/s390x/emit.mlp b/asmcomp/s390x/emit.mlp index f422ad29..619b454f 100644 --- a/asmcomp/s390x/emit.mlp +++ b/asmcomp/s390x/emit.mlp @@ -308,11 +308,11 @@ let emit_instr i = match i.desc with Lend -> () | Lprologue -> + assert (Proc.prologue_required ()); let n = frame_size() in emit_stack_adjust n; if !contains_calls then - ` stg %r14, {emit_int(n - size_addr)}(%r15)\n`; - `{emit_label !tailrec_entry_point}:\n`; + ` stg %r14, {emit_int(n - size_addr)}(%r15)\n` | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in if src.loc <> dst.loc then begin @@ -608,11 +608,12 @@ let emit_instr i = ` .long {emit_label jumptbl.(i)} - {emit_label lbl}\n` done; emit_string code_space - | Lsetuptrap lbl -> - ` brasl %r14, {emit_label lbl}\n`; - | Lpushtrap -> + | Lentertrap -> + () + | Lpushtrap { lbl_handler; } -> stack_offset := !stack_offset + 16; emit_stack_adjust 16; + ` larl %r14, {emit_label lbl_handler}\n`; ` stg %r14, 0(%r15)\n`; ` stg %r13, {emit_int size_addr}(%r15)\n`; ` lgr %r13, %r15\n` @@ -647,7 +648,7 @@ let rec emit_all i = let fundecl fundecl = function_name := fundecl.fun_name; - tailrec_entry_point := new_label(); + tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; stack_offset := 0; call_gc_sites := []; bound_error_sites := []; diff --git a/asmcomp/s390x/proc.ml b/asmcomp/s390x/proc.ml index 9b359b19..db2b0c04 100644 --- a/asmcomp/s390x/proc.ml +++ b/asmcomp/s390x/proc.ml @@ -228,6 +228,14 @@ let op_is_pure = function let num_stack_slots = [| 0; 0 |] let contains_calls = ref false +let frame_required () = + !contains_calls + || num_stack_slots.(0) > 0 + || num_stack_slots.(1) > 0 + +let prologue_required () = + frame_required () + (* Calling the assembler *) let assemble_file infile outfile = diff --git a/asmcomp/s390x/selection.ml b/asmcomp/s390x/selection.ml index 44ab1f9d..760719b5 100644 --- a/asmcomp/s390x/selection.ml +++ b/asmcomp/s390x/selection.ml @@ -30,9 +30,9 @@ type addressing_expr = | Aadd of expression * expression let rec select_addr = function - | Cop((Caddi | Cadda | Caddv), [arg; Cconst_int m], _) -> + | Cop((Caddi | Cadda | Caddv), [arg; Cconst_int (m, _)], _) -> let (a, n) = select_addr arg in (a, n + m) - | Cop((Caddi | Cadda | Caddv), [Cconst_int m; arg], _) -> + | Cop((Caddi | Cadda | Caddv), [Cconst_int (m, _); arg], _) -> let (a, n) = select_addr arg in (a, n + m) | Cop((Caddi | Cadda | Caddv), [arg1; arg2], _) -> begin match (select_addr arg1, select_addr arg2) with @@ -97,23 +97,23 @@ method! select_operation op args dbg = super#select_operation op args dbg method select_logical op lo hi = function - [arg; Cconst_int n] when n >= lo && n <= hi -> + [arg; Cconst_int (n, _)] when n >= lo && n <= hi -> (Iintop_imm(op, n), [arg]) - | [Cconst_int n; arg] when n >= lo && n <= hi -> + | [Cconst_int (n, _); arg] when n >= lo && n <= hi -> (Iintop_imm(op, n), [arg]) | args -> (Iintop op, args) -method! insert_op_debug op dbg rs rd = +method! insert_op_debug env op dbg rs rd = try let (rsrc, rdst) = pseudoregs_for_operation op rs rd in - self#insert_moves rs rsrc; - self#insert_debug (Iop op) dbg rsrc rdst; - self#insert_moves rdst rd; + self#insert_moves env rs rsrc; + self#insert_debug env (Iop op) dbg rsrc rdst; + self#insert_moves env rdst rd; rd with Use_default -> - super#insert_op_debug op dbg rs rd + super#insert_op_debug env op dbg rs rd end diff --git a/asmcomp/schedgen.ml b/asmcomp/schedgen.ml index c640f7f7..41484228 100644 --- a/asmcomp/schedgen.ml +++ b/asmcomp/schedgen.ml @@ -360,7 +360,8 @@ method schedule_fundecl f = let rec schedule i try_nesting = match i.desc with | Lend -> i - | Lpushtrap -> { i with next = schedule i.next (try_nesting + 1) } + | Lpushtrap { lbl_handler = _; } + -> { i with next = schedule i.next (try_nesting + 1) } | Lpoptrap -> { i with next = schedule i.next (try_nesting - 1) } | _ -> if self#instr_in_basic_block i try_nesting then begin @@ -383,7 +384,7 @@ method schedule_fundecl f = self#reschedule ready_queue 0 (schedule i try_nesting) end in - if f.fun_fast then begin + if f.fun_fast && !Clflags.insn_sched then begin let new_body = schedule f.fun_body 0 in clear_code_dag(); { fun_name = f.fun_name; @@ -391,6 +392,7 @@ method schedule_fundecl f = fun_fast = f.fun_fast; fun_dbg = f.fun_dbg; fun_spacetime_shape = f.fun_spacetime_shape; + fun_tailrec_entry_point_label = f.fun_tailrec_entry_point_label; } end else f diff --git a/asmcomp/selectgen.ml b/asmcomp/selectgen.ml index 302115c7..ea59ad22 100644 --- a/asmcomp/selectgen.ml +++ b/asmcomp/selectgen.ml @@ -138,7 +138,7 @@ let name_regs id rv = (* "Join" two instruction sequences, making sure they return their results in the same registers. *) -let join opt_r1 seq1 opt_r2 seq2 = +let join env opt_r1 seq1 opt_r2 seq2 = match (opt_r1, opt_r2) with (None, _) -> opt_r2 | (_, None) -> opt_r1 @@ -151,24 +151,24 @@ let join opt_r1 seq1 opt_r2 seq2 = && Cmm.ge_component r1.(i).typ r2.(i).typ then begin r.(i) <- r1.(i); - seq2#insert_move r2.(i) r1.(i) + seq2#insert_move env r2.(i) r1.(i) end else if Reg.anonymous r2.(i) && Cmm.ge_component r2.(i).typ r1.(i).typ then begin r.(i) <- r2.(i); - seq1#insert_move r1.(i) r2.(i) + seq1#insert_move env r1.(i) r2.(i) end else begin let typ = Cmm.lub_component r1.(i).typ r2.(i).typ in r.(i) <- Reg.create typ; - seq1#insert_move r1.(i) r.(i); - seq2#insert_move r2.(i) r.(i) + seq1#insert_move env r1.(i) r.(i); + seq2#insert_move env r2.(i) r.(i) end done; Some r (* Same, for N branches *) -let join_array rs = +let join_array env rs = let some_res = ref None in for i = 0 to Array.length rs - 1 do let (r, _) = rs.(i) in @@ -195,7 +195,7 @@ let join_array rs = let (r, s) = rs.(i) in match r with None -> () - | Some r -> s#insert_moves r res + | Some r -> s#insert_moves env r res done; Some res @@ -309,7 +309,7 @@ method is_simple_expr = function | Cabsf | Caddf | Csubf | Cmulf | Cdivf | Cfloatofint | Cintoffloat | Ccmpf _ | Ccheckbound -> List.for_all self#is_simple_expr args end - | Cassign _ | Cifthenelse _ | Cswitch _ | Cloop _ | Ccatch _ | Cexit _ + | Cassign _ | Cifthenelse _ | Cswitch _ | Ccatch _ | Cexit _ | Ctrywith _ -> false (* Analyses the effects and coeffects of an expression. This is used across @@ -336,7 +336,7 @@ method effects_of exp = | Cphantom_let (_var, _defining_expr, body) -> self#effects_of body | Csequence (e1, e2) -> EC.join (self#effects_of e1) (self#effects_of e2) - | Cifthenelse (cond, ifso, ifnot) -> + | Cifthenelse (cond, _ifso_dbg, ifso, _ifnot_dbg, ifnot, _dbg) -> EC.join (self#effects_of cond) (EC.join (self#effects_of ifso) (self#effects_of ifnot)) | Cop (op, args, _) -> @@ -354,7 +354,7 @@ method effects_of exp = EC.none in EC.join from_op (EC.join_list_map args self#effects_of) - | Cassign _ | Cswitch _ | Cloop _ | Ccatch _ | Cexit _ | Ctrywith _ -> + | Cassign _ | Cswitch _ | Ccatch _ | Cexit _ | Ctrywith _ -> EC.arbitrary (* Says whether an integer constant is a suitable immediate argument *) @@ -414,7 +414,7 @@ method select_checkbound_extra_args () = [] method select_operation op args _dbg = match (op, args) with - | (Capply _, Cconst_symbol func :: rem) -> + | (Capply _, Cconst_symbol (func, _dbg) :: rem) -> let label_after = Cmm.new_label () in (Icall_imm { func; label_after; }, rem) | (Capply _, _) -> @@ -477,39 +477,39 @@ method select_operation op args _dbg = | _ -> Misc.fatal_error "Selection.select_oper" method private select_arith_comm op = function - [arg; Cconst_int n] when self#is_immediate n -> + [arg; Cconst_int (n, _)] when self#is_immediate n -> (Iintop_imm(op, n), [arg]) - | [arg; Cconst_pointer n] when self#is_immediate n -> + | [arg; Cconst_pointer (n, _)] when self#is_immediate n -> (Iintop_imm(op, n), [arg]) - | [Cconst_int n; arg] when self#is_immediate n -> + | [Cconst_int (n, _); arg] when self#is_immediate n -> (Iintop_imm(op, n), [arg]) - | [Cconst_pointer n; arg] when self#is_immediate n -> + | [Cconst_pointer (n, _); arg] when self#is_immediate n -> (Iintop_imm(op, n), [arg]) | args -> (Iintop op, args) method private select_arith op = function - [arg; Cconst_int n] when self#is_immediate n -> + [arg; Cconst_int (n, _)] when self#is_immediate n -> (Iintop_imm(op, n), [arg]) - | [arg; Cconst_pointer n] when self#is_immediate n -> + | [arg; Cconst_pointer (n, _)] when self#is_immediate n -> (Iintop_imm(op, n), [arg]) | args -> (Iintop op, args) method private select_shift op = function - [arg; Cconst_int n] when n >= 0 && n < Arch.size_int * 8 -> + [arg; Cconst_int (n, _)] when n >= 0 && n < Arch.size_int * 8 -> (Iintop_imm(op, n), [arg]) | args -> (Iintop op, args) method private select_arith_comp cmp = function - [arg; Cconst_int n] when self#is_immediate n -> + [arg; Cconst_int (n, _)] when self#is_immediate n -> (Iintop_imm(Icomp cmp, n), [arg]) - | [arg; Cconst_pointer n] when self#is_immediate n -> + | [arg; Cconst_pointer (n, _)] when self#is_immediate n -> (Iintop_imm(Icomp cmp, n), [arg]) - | [Cconst_int n; arg] when self#is_immediate n -> + | [Cconst_int (n, _); arg] when self#is_immediate n -> (Iintop_imm(Icomp(swap_intcomp cmp), n), [arg]) - | [Cconst_pointer n; arg] when self#is_immediate n -> + | [Cconst_pointer (n, _); arg] when self#is_immediate n -> (Iintop_imm(Icomp(swap_intcomp cmp), n), [arg]) | args -> (Iintop(Icomp cmp), args) @@ -517,29 +517,29 @@ method private select_arith_comp cmp = function (* Instruction selection for conditionals *) method select_condition = function - Cop(Ccmpi cmp, [arg1; Cconst_int n], _) when self#is_immediate n -> + Cop(Ccmpi cmp, [arg1; Cconst_int (n, _)], _) when self#is_immediate n -> (Iinttest_imm(Isigned cmp, n), arg1) - | Cop(Ccmpi cmp, [Cconst_int n; arg2], _) when self#is_immediate n -> + | Cop(Ccmpi cmp, [Cconst_int (n, _); arg2], _) when self#is_immediate n -> (Iinttest_imm(Isigned(swap_integer_comparison cmp), n), arg2) - | Cop(Ccmpi cmp, [arg1; Cconst_pointer n], _) when self#is_immediate n -> + | Cop(Ccmpi cmp, [arg1; Cconst_pointer (n, _)], _) when self#is_immediate n -> (Iinttest_imm(Isigned cmp, n), arg1) - | Cop(Ccmpi cmp, [Cconst_pointer n; arg2], _) when self#is_immediate n -> + | Cop(Ccmpi cmp, [Cconst_pointer (n, _); arg2], _) when self#is_immediate n -> (Iinttest_imm(Isigned(swap_integer_comparison cmp), n), arg2) | Cop(Ccmpi cmp, args, _) -> (Iinttest(Isigned cmp), Ctuple args) - | Cop(Ccmpa cmp, [arg1; Cconst_pointer n], _) when self#is_immediate n -> + | Cop(Ccmpa cmp, [arg1; Cconst_pointer (n, _)], _) when self#is_immediate n -> (Iinttest_imm(Iunsigned cmp, n), arg1) - | Cop(Ccmpa cmp, [arg1; Cconst_int n], _) when self#is_immediate n -> + | Cop(Ccmpa cmp, [arg1; Cconst_int (n, _)], _) when self#is_immediate n -> (Iinttest_imm(Iunsigned cmp, n), arg1) - | Cop(Ccmpa cmp, [Cconst_pointer n; arg2], _) when self#is_immediate n -> + | Cop(Ccmpa cmp, [Cconst_pointer (n, _); arg2], _) when self#is_immediate n -> (Iinttest_imm(Iunsigned(swap_integer_comparison cmp), n), arg2) - | Cop(Ccmpa cmp, [Cconst_int n; arg2], _) when self#is_immediate n -> + | Cop(Ccmpa cmp, [Cconst_int (n, _); arg2], _) when self#is_immediate n -> (Iinttest_imm(Iunsigned(swap_integer_comparison cmp), n), arg2) | Cop(Ccmpa cmp, args, _) -> (Iinttest(Iunsigned cmp), Ctuple args) | Cop(Ccmpf cmp, args, _) -> (Ifloattest cmp, Ctuple args) - | Cop(Cand, [arg; Cconst_int 1], _) -> + | Cop(Cand, [arg; Cconst_int (1, _)], _) -> (Ioddtest, arg) | arg -> (Itruetest, arg) @@ -555,10 +555,10 @@ method regs_for tys = Reg.createv tys val mutable instr_seq = dummy_instr -method insert_debug desc dbg arg res = +method insert_debug _env desc dbg arg res = instr_seq <- instr_cons_debug desc arg res dbg instr_seq -method insert desc arg res = +method insert _env desc arg res = instr_seq <- instr_cons desc arg res instr_seq method extract_core ~end_instr = @@ -573,13 +573,13 @@ method extract = (* Insert a sequence of moves from one pseudoreg set to another. *) -method insert_move src dst = +method insert_move env src dst = if src.stamp <> dst.stamp then - self#insert (Iop Imove) [|src|] [|dst|] + self#insert env (Iop Imove) [|src|] [|dst|] -method insert_moves src dst = +method insert_moves env src dst = for i = 0 to min (Array.length src) (Array.length dst) - 1 do - self#insert_move src.(i) dst.(i) + self#insert_move env src.(i) dst.(i) done (* Adjust the types of destination pseudoregs for a [Cassign] assignment. @@ -602,37 +602,41 @@ method adjust_types src dst = (* Insert moves and stack offsets for function arguments and results *) -method insert_move_args arg loc stacksize = - if stacksize <> 0 then self#insert (Iop(Istackoffset stacksize)) [||] [||]; - self#insert_moves arg loc +method insert_move_args env arg loc stacksize = + if stacksize <> 0 then begin + self#insert env (Iop(Istackoffset stacksize)) [||] [||] + end; + self#insert_moves env arg loc -method insert_move_results loc res stacksize = - if stacksize <> 0 then self#insert(Iop(Istackoffset(-stacksize))) [||] [||]; - self#insert_moves loc res +method insert_move_results env loc res stacksize = + if stacksize <> 0 then begin + self#insert env (Iop(Istackoffset(-stacksize))) [||] [||] + end; + self#insert_moves env loc res (* Add an Iop opcode. Can be overridden by processor description to insert moves before and after the operation, i.e. for two-address instructions, or instructions using dedicated registers. *) -method insert_op_debug op dbg rs rd = - self#insert_debug (Iop op) dbg rs rd; +method insert_op_debug env op dbg rs rd = + self#insert_debug env (Iop op) dbg rs rd; rd -method insert_op op rs rd = - self#insert_op_debug op Debuginfo.none rs rd +method insert_op env op rs rd = + self#insert_op_debug env op Debuginfo.none rs rd -method emit_blockheader _env n _dbg = +method emit_blockheader env n _dbg = let r = self#regs_for typ_int in - Some(self#insert_op (Iconst_int n) [||] r) + Some(self#insert_op env (Iconst_int n) [||] r) -method about_to_emit_call _env _insn _arg = None +method about_to_emit_call _env _insn _arg _dbg = None (* Prior to a function call, update the Spacetime node hole pointer hard register. *) -method private maybe_emit_spacetime_move ~spacetime_reg = - Misc.Stdlib.Option.iter (fun reg -> - self#insert_moves reg [| Proc.loc_spacetime_node_hole |]) +method private maybe_emit_spacetime_move env ~spacetime_reg = + Option.iter (fun reg -> + self#insert_moves env reg [| Proc.loc_spacetime_node_hole |]) spacetime_reg (* Add the instructions for the given expression @@ -640,24 +644,24 @@ method private maybe_emit_spacetime_move ~spacetime_reg = method emit_expr (env:environment) exp = match exp with - Cconst_int n -> + Cconst_int (n, _dbg) -> let r = self#regs_for typ_int in - Some(self#insert_op (Iconst_int(Nativeint.of_int n)) [||] r) - | Cconst_natint n -> + Some(self#insert_op env (Iconst_int(Nativeint.of_int n)) [||] r) + | Cconst_natint (n, _dbg) -> let r = self#regs_for typ_int in - Some(self#insert_op (Iconst_int n) [||] r) - | Cconst_float n -> + Some(self#insert_op env (Iconst_int n) [||] r) + | Cconst_float (n, _dbg) -> let r = self#regs_for typ_float in - Some(self#insert_op (Iconst_float (Int64.bits_of_float n)) [||] r) - | Cconst_symbol n -> + Some(self#insert_op env (Iconst_float (Int64.bits_of_float n)) [||] r) + | Cconst_symbol (n, _dbg) -> let r = self#regs_for typ_val in - Some(self#insert_op (Iconst_symbol n) [||] r) - | Cconst_pointer n -> + Some(self#insert_op env (Iconst_symbol n) [||] r) + | Cconst_pointer (n, _dbg) -> let r = self#regs_for typ_val in (* integer as Caml value *) - Some(self#insert_op (Iconst_int(Nativeint.of_int n)) [||] r) - | Cconst_natpointer n -> + Some(self#insert_op env (Iconst_int(Nativeint.of_int n)) [||] r) + | Cconst_natpointer (n, _dbg) -> let r = self#regs_for typ_val in (* integer as Caml value *) - Some(self#insert_op (Iconst_int n) [||] r) + Some(self#insert_op env (Iconst_int n) [||] r) | Cblockheader(n, dbg) -> self#emit_blockheader env n dbg | Cvar v -> @@ -681,7 +685,8 @@ method emit_expr (env:environment) exp = Misc.fatal_error ("Selection.emit_expr: unbound var " ^ V.name v) in begin match self#emit_expr env e1 with None -> None - | Some r1 -> self#adjust_types r1 rv; self#insert_moves r1 rv; Some [||] + | Some r1 -> + self#adjust_types r1 rv; self#insert_moves env r1 rv; Some [||] end | Ctuple [] -> Some [||] @@ -696,12 +701,16 @@ method emit_expr (env:environment) exp = None -> None | Some r1 -> let rd = [|Proc.loc_exn_bucket|] in - self#insert (Iop Imove) r1 rd; - self#insert_debug (Iraise k) dbg rd [||]; + self#insert env (Iop Imove) r1 rd; + self#insert_debug env (Iraise k) dbg rd [||]; None end - | Cop(Ccmpf _, _, _) -> - self#emit_expr env (Cifthenelse(exp, Cconst_int 1, Cconst_int 0)) + | Cop(Ccmpf _, _, dbg) -> + self#emit_expr env + (Cifthenelse (exp, + dbg, Cconst_int (1, dbg), + dbg, Cconst_int (0, dbg), + dbg)) | Cop(op, args, dbg) -> begin match self#emit_parts_list env args with None -> None @@ -716,13 +725,13 @@ method emit_expr (env:environment) exp = let (loc_arg, stack_ofs) = Proc.loc_arguments rarg in let loc_res = Proc.loc_results rd in let spacetime_reg = - self#about_to_emit_call env (Iop new_op) [| r1.(0) |] + self#about_to_emit_call env (Iop new_op) [| r1.(0) |] dbg in - self#insert_move_args rarg loc_arg stack_ofs; - self#maybe_emit_spacetime_move ~spacetime_reg; - self#insert_debug (Iop new_op) dbg + self#insert_move_args env rarg loc_arg stack_ofs; + self#maybe_emit_spacetime_move env ~spacetime_reg; + self#insert_debug env (Iop new_op) dbg (Array.append [|r1.(0)|] loc_arg) loc_res; - self#insert_move_results loc_res rd stack_ofs; + self#insert_move_results env loc_res rd stack_ofs; Some rd | Icall_imm _ -> let r1 = self#emit_tuple env new_args in @@ -730,24 +739,24 @@ method emit_expr (env:environment) exp = let (loc_arg, stack_ofs) = Proc.loc_arguments r1 in let loc_res = Proc.loc_results rd in let spacetime_reg = - self#about_to_emit_call env (Iop new_op) [| |] + self#about_to_emit_call env (Iop new_op) [| |] dbg in - self#insert_move_args r1 loc_arg stack_ofs; - self#maybe_emit_spacetime_move ~spacetime_reg; - self#insert_debug (Iop new_op) dbg loc_arg loc_res; - self#insert_move_results loc_res rd stack_ofs; + self#insert_move_args env r1 loc_arg stack_ofs; + self#maybe_emit_spacetime_move env ~spacetime_reg; + self#insert_debug env (Iop new_op) dbg loc_arg loc_res; + self#insert_move_results env loc_res rd stack_ofs; Some rd | Iextcall _ -> let spacetime_reg = - self#about_to_emit_call env (Iop new_op) [| |] + self#about_to_emit_call env (Iop new_op) [| |] dbg in let (loc_arg, stack_ofs) = self#emit_extcall_args env new_args in - self#maybe_emit_spacetime_move ~spacetime_reg; + self#maybe_emit_spacetime_move env ~spacetime_reg; let rd = self#regs_for ty in let loc_res = - self#insert_op_debug new_op dbg + self#insert_op_debug env new_op dbg loc_arg (Proc.loc_external_results rd) in - self#insert_move_results loc_res rd stack_ofs; + self#insert_move_results env loc_res rd stack_ofs; Some rd | Ialloc { bytes = _; spacetime_index; label_after_call_gc; } -> let rd = self#regs_for typ_val in @@ -756,28 +765,28 @@ method emit_expr (env:environment) exp = Ialloc { bytes; spacetime_index; label_after_call_gc; } in let args = self#select_allocation_args env in - self#insert_debug (Iop op) dbg args rd; + self#insert_debug env (Iop op) dbg args rd; self#emit_stores env new_args rd; Some rd | op -> let r1 = self#emit_tuple env new_args in let rd = self#regs_for ty in - Some (self#insert_op_debug op dbg r1 rd) + Some (self#insert_op_debug env op dbg r1 rd) end | Csequence(e1, e2) -> begin match self#emit_expr env e1 with None -> None | Some _ -> self#emit_expr env e2 end - | Cifthenelse(econd, eif, eelse) -> + | Cifthenelse(econd, _ifso_dbg, eif, _ifnot_dbg, eelse, _dbg) -> let (cond, earg) = self#select_condition econd in begin match self#emit_expr env earg with None -> None | Some rarg -> let (rif, sif) = self#emit_sequence env eif in let (relse, selse) = self#emit_sequence env eelse in - let r = join rif sif relse selse in - self#insert (Iifthenelse(cond, sif#extract, selse#extract)) + let r = join env rif sif relse selse in + self#insert env (Iifthenelse(cond, sif#extract, selse#extract)) rarg [||]; r end @@ -785,40 +794,38 @@ method emit_expr (env:environment) exp = begin match self#emit_expr env esel with None -> None | Some rsel -> - let rscases = Array.map (self#emit_sequence env) ecases in - let r = join_array rscases in - self#insert (Iswitch(index, - Array.map (fun (_, s) -> s#extract) rscases)) + let rscases = + Array.map (fun (case, _dbg) -> self#emit_sequence env case) ecases + in + let r = join_array env rscases in + self#insert env (Iswitch(index, + Array.map (fun (_, s) -> s#extract) rscases)) rsel [||]; r end - | Cloop(ebody) -> - let (_rarg, sbody) = self#emit_sequence env ebody in - self#insert (Iloop(sbody#extract)) [||] [||]; - Some [||] | Ccatch(_, [], e1) -> self#emit_expr env e1 | Ccatch(rec_flag, handlers, body) -> let handlers = - List.map (fun (nfail, ids, e2) -> + List.map (fun (nfail, ids, e2, dbg) -> let rs = List.map (fun (id, typ) -> let r = self#regs_for typ in name_regs id r; r) ids in - (nfail, ids, rs, e2)) + (nfail, ids, rs, e2, dbg)) handlers in let env = (* Since the handlers may be recursive, and called from the body, the same environment is used for translating both the handlers and the body. *) - List.fold_left (fun env (nfail, _ids, rs, _e2) -> + List.fold_left (fun env (nfail, _ids, rs, _e2, _dbg) -> env_add_static_exception nfail rs env) env handlers in let (r_body, s_body) = self#emit_sequence env body in - let translate_one_handler (nfail, ids, rs, e2) = + let translate_one_handler (nfail, ids, rs, e2, _dbg) = assert(List.length ids = List.length rs); let new_env = List.fold_left (fun env ((id, _typ), r) -> env_add id r env) @@ -829,9 +836,10 @@ method emit_expr (env:environment) exp = in let l = List.map translate_one_handler handlers in let a = Array.of_list ((r_body, s_body) :: List.map snd l) in - let r = join_array a in + let r = join_array env a in let aux (nfail, (_r, s)) = (nfail, s#extract) in - self#insert (Icatch (rec_flag, List.map aux l, s_body#extract)) [||] [||]; + self#insert env (Icatch (rec_flag, List.map aux l, s_body#extract)) + [||] [||]; r | Cexit (nfail,args) -> begin match self#emit_parts_list env args with @@ -849,17 +857,17 @@ method emit_expr (env:environment) exp = let tmp_regs = Reg.createv_like src in (* Ccatch registers must not contain out of heap pointers *) Array.iter (fun reg -> assert(reg.typ <> Addr)) src; - self#insert_moves src tmp_regs ; - self#insert_moves tmp_regs (Array.concat dest_args) ; - self#insert (Iexit nfail) [||] [||]; + self#insert_moves env src tmp_regs ; + self#insert_moves env tmp_regs (Array.concat dest_args) ; + self#insert env (Iexit nfail) [||] [||]; None end - | Ctrywith(e1, v, e2) -> + | Ctrywith(e1, v, e2, _dbg) -> let (r1, s1) = self#emit_sequence env e1 in let rv = self#regs_for typ_val in let (r2, s2) = self#emit_sequence (env_add v rv env) e2 in - let r = join r1 s1 r2 s2 in - self#insert + let r = join env r1 s1 r2 s2 in + self#insert env (Itrywith(s1#extract, instr_cons (Iop Imove) [|Proc.loc_exn_bucket|] rv (s2#extract))) @@ -878,7 +886,7 @@ method private bind_let (env:environment) v r1 = end else begin let rv = Reg.createv_like r1 in name_regs v rv; - self#insert_moves r1 rv; + self#insert_moves env r1 rv; env_add v rv env end @@ -943,7 +951,7 @@ method private emit_parts (env:environment) ~effects_after exp = else begin (* Introduce a fresh temp to hold the result *) let tmp = Reg.createv_like r in - self#insert_moves r tmp; + self#insert_moves env r tmp; Some (Cvar id, env_add (VP.create id) tmp env) end end @@ -997,7 +1005,7 @@ method emit_extcall_args env args = required semantics of [loc_external_arguments] (see proc.mli). *) let args = Array.concat args in let arg_hard_regs = Array.concat (Array.to_list arg_hard_regs) in - self#insert_move_args args arg_hard_regs stack_ofs; + self#insert_move_args env args arg_hard_regs stack_ofs; arg_hard_regs, stack_ofs method emit_stores env data regs_addr = @@ -1014,12 +1022,13 @@ method emit_stores env data regs_addr = for i = 0 to Array.length regs - 1 do let r = regs.(i) in let kind = if r.typ = Float then Double_u else Word_val in - self#insert (Iop(Istore(kind, !a, false))) + self#insert env + (Iop(Istore(kind, !a, false))) (Array.append [|r|] regs_addr) [||]; a := Arch.offset_addressing !a (size_component r.typ) done | _ -> - self#insert (Iop op) (Array.append regs regs_addr) [||]; + self#insert env (Iop op) (Array.append regs regs_addr) [||]; a := Arch.offset_addressing !a (size_expr env e)) data @@ -1030,8 +1039,8 @@ method private emit_return (env:environment) exp = None -> () | Some r -> let loc = Proc.loc_results r in - self#insert_moves r loc; - self#insert Ireturn loc [||] + self#insert_moves env r loc; + self#insert env Ireturn loc [||] method emit_tail (env:environment) exp = match exp with @@ -1055,24 +1064,24 @@ method emit_tail (env:environment) exp = if stack_ofs = 0 then begin let call = Iop (Itailcall_ind { label_after; }) in let spacetime_reg = - self#about_to_emit_call env call [| r1.(0) |] + self#about_to_emit_call env call [| r1.(0) |] dbg in - self#insert_moves rarg loc_arg; - self#maybe_emit_spacetime_move ~spacetime_reg; - self#insert_debug call dbg + self#insert_moves env rarg loc_arg; + self#maybe_emit_spacetime_move env ~spacetime_reg; + self#insert_debug env call dbg (Array.append [|r1.(0)|] loc_arg) [||]; end else begin let rd = self#regs_for ty in let loc_res = Proc.loc_results rd in let spacetime_reg = - self#about_to_emit_call env (Iop new_op) [| r1.(0) |] + self#about_to_emit_call env (Iop new_op) [| r1.(0) |] dbg in - self#insert_move_args rarg loc_arg stack_ofs; - self#maybe_emit_spacetime_move ~spacetime_reg; - self#insert_debug (Iop new_op) dbg + self#insert_move_args env rarg loc_arg stack_ofs; + self#maybe_emit_spacetime_move env ~spacetime_reg; + self#insert_debug env (Iop new_op) dbg (Array.append [|r1.(0)|] loc_arg) loc_res; - self#insert(Iop(Istackoffset(-stack_ofs))) [||] [||]; - self#insert Ireturn loc_res [||] + self#insert env (Iop(Istackoffset(-stack_ofs))) [||] [||]; + self#insert env Ireturn loc_res [||] end | Icall_imm { func; label_after; } -> let r1 = self#emit_tuple env new_args in @@ -1080,31 +1089,31 @@ method emit_tail (env:environment) exp = if stack_ofs = 0 then begin let call = Iop (Itailcall_imm { func; label_after; }) in let spacetime_reg = - self#about_to_emit_call env call [| |] + self#about_to_emit_call env call [| |] dbg in - self#insert_moves r1 loc_arg; - self#maybe_emit_spacetime_move ~spacetime_reg; - self#insert_debug call dbg loc_arg [||]; + self#insert_moves env r1 loc_arg; + self#maybe_emit_spacetime_move env ~spacetime_reg; + self#insert_debug env call dbg loc_arg [||]; end else if func = !current_function_name then begin let call = Iop (Itailcall_imm { func; label_after; }) in let loc_arg' = Proc.loc_parameters r1 in let spacetime_reg = - self#about_to_emit_call env call [| |] + self#about_to_emit_call env call [| |] dbg in - self#insert_moves r1 loc_arg'; - self#maybe_emit_spacetime_move ~spacetime_reg; - self#insert_debug call dbg loc_arg' [||]; + self#insert_moves env r1 loc_arg'; + self#maybe_emit_spacetime_move env ~spacetime_reg; + self#insert_debug env call dbg loc_arg' [||]; end else begin let rd = self#regs_for ty in let loc_res = Proc.loc_results rd in let spacetime_reg = - self#about_to_emit_call env (Iop new_op) [| |] + self#about_to_emit_call env (Iop new_op) [| |] dbg in - self#insert_move_args r1 loc_arg stack_ofs; - self#maybe_emit_spacetime_move ~spacetime_reg; - self#insert_debug (Iop new_op) dbg loc_arg loc_res; - self#insert(Iop(Istackoffset(-stack_ofs))) [||] [||]; - self#insert Ireturn loc_res [||] + self#insert_move_args env r1 loc_arg stack_ofs; + self#maybe_emit_spacetime_move env ~spacetime_reg; + self#insert_debug env (Iop new_op) dbg loc_arg loc_res; + self#insert env (Iop(Istackoffset(-stack_ofs))) [||] [||]; + self#insert env Ireturn loc_res [||] end | _ -> Misc.fatal_error "Selection.emit_tail" end @@ -1113,12 +1122,13 @@ method emit_tail (env:environment) exp = None -> () | Some _ -> self#emit_tail env e2 end - | Cifthenelse(econd, eif, eelse) -> + | Cifthenelse(econd, _ifso_dbg, eif, _ifnot_dbg, eelse, _dbg) -> let (cond, earg) = self#select_condition econd in begin match self#emit_expr env earg with None -> () | Some rarg -> - self#insert (Iifthenelse(cond, self#emit_tail_sequence env eif, + self#insert env + (Iifthenelse(cond, self#emit_tail_sequence env eif, self#emit_tail_sequence env eelse)) rarg [||] end @@ -1126,28 +1136,30 @@ method emit_tail (env:environment) exp = begin match self#emit_expr env esel with None -> () | Some rsel -> - self#insert - (Iswitch(index, Array.map (self#emit_tail_sequence env) ecases)) - rsel [||] + let cases = + Array.map (fun (case, _dbg) -> self#emit_tail_sequence env case) + ecases + in + self#insert env (Iswitch (index, cases)) rsel [||] end | Ccatch(_, [], e1) -> self#emit_tail env e1 | Ccatch(rec_flag, handlers, e1) -> let handlers = - List.map (fun (nfail, ids, e2) -> + List.map (fun (nfail, ids, e2, dbg) -> let rs = List.map (fun (id, typ) -> let r = self#regs_for typ in name_regs id r; r) ids in - (nfail, ids, rs, e2)) + (nfail, ids, rs, e2, dbg)) handlers in let env = - List.fold_left (fun env (nfail, _ids, rs, _e2) -> + List.fold_left (fun env (nfail, _ids, rs, _e2, _dbg) -> env_add_static_exception nfail rs env) env handlers in let s_body = self#emit_tail_sequence env e1 in - let aux (nfail, ids, rs, e2) = + let aux (nfail, ids, rs, e2, _dbg) = assert(List.length ids = List.length rs); let new_env = List.fold_left @@ -1155,12 +1167,13 @@ method emit_tail (env:environment) exp = env (List.combine ids rs) in nfail, self#emit_tail_sequence new_env e2 in - self#insert (Icatch(rec_flag, List.map aux handlers, s_body)) [||] [||] - | Ctrywith(e1, v, e2) -> + self#insert env (Icatch(rec_flag, List.map aux handlers, s_body)) + [||] [||] + | Ctrywith(e1, v, e2, _dbg) -> let (opt_r1, s1) = self#emit_sequence env e1 in let rv = self#regs_for typ_val in let s2 = self#emit_tail_sequence (env_add v rv env) e2 in - self#insert + self#insert env (Itrywith(s1#extract, instr_cons (Iop Imove) [|Proc.loc_exn_bucket|] rv s2)) [||] [||]; @@ -1168,8 +1181,8 @@ method emit_tail (env:environment) exp = None -> () | Some r1 -> let loc = Proc.loc_results r1 in - self#insert_moves r1 loc; - self#insert Ireturn loc [||] + self#insert_moves env r1 loc; + self#insert env Ireturn loc [||] end | _ -> self#emit_return env exp @@ -1181,8 +1194,8 @@ method private emit_tail_sequence env exp = (* Insertion of the function prologue *) -method insert_prologue _f ~loc_arg ~rarg ~spacetime_node_hole:_ ~env:_ = - self#insert_moves loc_arg rarg; +method insert_prologue _f ~loc_arg ~rarg ~spacetime_node_hole:_ ~env = + self#insert_moves env loc_arg rarg; None (* Sequentialization of a function definition *) diff --git a/asmcomp/selectgen.mli b/asmcomp/selectgen.mli index 003d7067..87c35be7 100644 --- a/asmcomp/selectgen.mli +++ b/asmcomp/selectgen.mli @@ -88,11 +88,12 @@ class virtual selector_generic : object Can be overridden if float values are stored as pairs of integer registers. *) method insert_op : - Mach.operation -> Reg.t array -> Reg.t array -> Reg.t array + environment -> Mach.operation -> Reg.t array -> Reg.t array -> Reg.t array (* Can be overridden to deal with 2-address instructions or instructions with hardwired input/output registers *) method insert_op_debug : - Mach.operation -> Debuginfo.t -> Reg.t array -> Reg.t array -> Reg.t array + environment -> Mach.operation -> Debuginfo.t -> Reg.t array + -> Reg.t array -> Reg.t array (* Can be overridden to deal with 2-address instructions or instructions with hardwired input/output registers *) method emit_extcall_args : @@ -136,13 +137,17 @@ class virtual selector_generic : object are not always applied to "self", but ideally they should be private. *) method extract : Mach.instruction method extract_core : end_instr:Mach.instruction -> Mach.instruction - method insert : Mach.instruction_desc -> Reg.t array -> Reg.t array -> unit - method insert_debug : Mach.instruction_desc -> Debuginfo.t -> - Reg.t array -> Reg.t array -> unit - method insert_move : Reg.t -> Reg.t -> unit - method insert_move_args : Reg.t array -> Reg.t array -> int -> unit - method insert_move_results : Reg.t array -> Reg.t array -> int -> unit - method insert_moves : Reg.t array -> Reg.t array -> unit + method insert : + environment -> Mach.instruction_desc -> Reg.t array -> Reg.t array -> unit + method insert_debug : + environment -> Mach.instruction_desc -> Debuginfo.t -> + Reg.t array -> Reg.t array -> unit + method insert_move : environment -> Reg.t -> Reg.t -> unit + method insert_move_args : + environment -> Reg.t array -> Reg.t array -> int -> unit + method insert_move_results : + environment -> Reg.t array -> Reg.t array -> int -> unit + method insert_moves : environment -> Reg.t array -> Reg.t array -> unit method adjust_type : Reg.t -> Reg.t -> unit method adjust_types : Reg.t array -> Reg.t array -> unit method emit_expr : @@ -163,6 +168,7 @@ class virtual selector_generic : object : environment -> Mach.instruction_desc -> Reg.t array + -> Debuginfo.t -> Reg.t array option method initial_env : unit -> environment method insert_prologue diff --git a/asmcomp/spacetime_profiling.ml b/asmcomp/spacetime_profiling.ml index acabf7c0..a61cd1c4 100644 --- a/asmcomp/spacetime_profiling.ml +++ b/asmcomp/spacetime_profiling.ml @@ -4,7 +4,7 @@ (* *) (* Mark Shinwell and Leo White, Jane Street Europe *) (* *) -(* Copyright 2015--2017 Jane Street Group LLC *) +(* Copyright 2015--2018 Jane Street Group LLC *) (* *) (* All rights reserved. This file is distributed under the terms of *) (* the GNU Lesser General Public License version 2.1, with the *) @@ -12,6 +12,8 @@ (* *) (**************************************************************************) +[@@@ocaml.warning "+a-4-30-40-41-42"] + module V = Backend_var module VP = Backend_var.With_provenance @@ -23,11 +25,17 @@ let index_within_node = ref node_num_header_words arch.ml.) *) let spacetime_node = ref (lazy (Cmm.Cvar (V.create_local "dummy"))) let spacetime_node_ident = ref (lazy (V.create_local "dummy")) -let current_function_label = ref "" +let current_function_label = ref None let direct_tail_call_point_indexes = ref [] let reverse_shape = ref ([] : Mach.spacetime_shape) +(* CR-someday mshinwell: This code could be updated to use [placeholder_dbg] as + in [Cmmgen]. *) +let cconst_int i = Cmm.Cconst_int (i, Debuginfo.none) +let cconst_natint i = Cmm.Cconst_natint (i, Debuginfo.none) +let cconst_symbol s = Cmm.Cconst_symbol (s, Debuginfo.none) + let something_was_instrumented () = !index_within_node > node_num_header_words @@ -54,16 +62,15 @@ let reset ~spacetime_node_ident:ident ~function_label = spacetime_node := lazy (Cmm.Cvar ident); spacetime_node_ident := lazy ident; direct_tail_call_point_indexes := []; - current_function_label := function_label; + current_function_label := Some function_label; reverse_shape := [] -let code_for_function_prologue ~function_name ~node_hole = +let code_for_function_prologue ~function_name ~fun_dbg:dbg ~node_hole = let node = V.create_local "node" in let new_node = V.create_local "new_node" in let must_allocate_node = V.create_local "must_allocate_node" in let is_new_node = V.create_local "is_new_node" in let no_tail_calls = List.length !direct_tail_call_point_indexes < 1 in - let dbg = Debuginfo.none in let open Cmm in let initialize_direct_tail_call_points_and_return_node = let new_node_encoded = V.create_local "new_node_encoded" in @@ -77,7 +84,7 @@ let code_for_function_prologue ~function_name ~node_hole = let offset_in_bytes = index * Arch.size_addr in Csequence ( Cop (Cstore (Word_int, Lambda.Assignment), - [Cop (Caddi, [Cvar new_node; Cconst_int offset_in_bytes], dbg); + [Cop (Caddi, [Cvar new_node; cconst_int offset_in_bytes], dbg); Cvar new_node_encoded], dbg), init_code)) (Cvar new_node) @@ -88,22 +95,24 @@ let code_for_function_prologue ~function_name ~node_hole = | _ -> Clet (VP.create new_node_encoded, (* Cf. [Encode_tail_caller_node] in the runtime. *) - Cop (Cor, [Cvar new_node; Cconst_int 1], dbg), + Cop (Cor, [Cvar new_node; cconst_int 1], dbg), body) in let pc = V.create_local "pc" in Clet (VP.create node, Cop (Cload (Word_int, Asttypes.Mutable), [Cvar node_hole], dbg), Clet (VP.create must_allocate_node, - Cop (Cand, [Cvar node; Cconst_int 1], dbg), + Cop (Cand, [Cvar node; cconst_int 1], dbg), Cifthenelse ( - Cop (Ccmpi Cne, [Cvar must_allocate_node; Cconst_int 1], dbg), + Cop (Ccmpi Cne, [Cvar must_allocate_node; cconst_int 1], dbg), + dbg, Cvar node, + dbg, Clet (VP.create is_new_node, - Clet (VP.create pc, Cconst_symbol function_name, + Clet (VP.create pc, cconst_symbol function_name, Cop (Cextcall ("caml_spacetime_allocate_node", [| Int |], false, None), - [Cconst_int (1 (* header *) + !index_within_node); + [cconst_int (1 (* header *) + !index_within_node); Cvar pc; Cvar node_hole; ], @@ -113,9 +122,13 @@ let code_for_function_prologue ~function_name ~node_hole = if no_tail_calls then Cvar new_node else Cifthenelse ( - Cop (Ccmpi Ceq, [Cvar is_new_node; Cconst_int 0], dbg), + Cop (Ccmpi Ceq, [Cvar is_new_node; cconst_int 0], dbg), + dbg, Cvar new_node, - initialize_direct_tail_call_points_and_return_node)))))) + dbg, + initialize_direct_tail_call_points_and_return_node, + dbg))), + dbg))) let code_for_blockheader ~value's_header ~node ~dbg = let num_words = Nativeint.shift_right_logical value's_header 10 in @@ -141,7 +154,7 @@ let code_for_blockheader ~value's_header ~node ~dbg = Cop (Cextcall ("caml_spacetime_generate_profinfo", [| Int |], false, Some label), [Cvar address_of_profinfo; - Cconst_int (index_within_node + 1)], + cconst_int (index_within_node + 1)], dbg) in (* Check if we have already allocated a profinfo value for this allocation @@ -150,30 +163,33 @@ let code_for_blockheader ~value's_header ~node ~dbg = Clet (VP.create address_of_profinfo, Cop (Caddi, [ Cvar node; - Cconst_int offset_into_node; + cconst_int offset_into_node; ], dbg), Clet (VP.create existing_profinfo, Cop (Cload (Word_int, Asttypes.Mutable), [Cvar address_of_profinfo], dbg), Clet (VP.create profinfo, Cifthenelse ( - Cop (Ccmpi Cne, [Cvar existing_profinfo; Cconst_int 1 (* () *)], dbg), + Cop (Ccmpi Cne, [Cvar existing_profinfo; cconst_int 1 (* () *)], dbg), + dbg, Cvar existing_profinfo, - generate_new_profinfo), + dbg, + generate_new_profinfo, + dbg), Clet (VP.create existing_count, Cop (Cload (Word_int, Asttypes.Mutable), [ Cop (Caddi, - [Cvar address_of_profinfo; Cconst_int Arch.size_addr], dbg) + [Cvar address_of_profinfo; cconst_int Arch.size_addr], dbg) ], dbg), Csequence ( Cop (Cstore (Word_int, Lambda.Assignment), [Cop (Caddi, - [Cvar address_of_profinfo; Cconst_int Arch.size_addr], dbg); + [Cvar address_of_profinfo; cconst_int Arch.size_addr], dbg); Cop (Caddi, [ Cvar existing_count; (* N.B. "*2" since the count is an OCaml integer. The "1 +" is to count the value's header. *) - Cconst_int (2 * (1 + Nativeint.to_int num_words)); + cconst_int (2 * (1 + Nativeint.to_int num_words)); ], dbg); ], dbg), (* [profinfo] looks like a black [Infix_tag] header. Instead of @@ -188,18 +204,22 @@ let code_for_blockheader ~value's_header ~node ~dbg = (* The following is the [Infix_offset_val], in words. *) (Nativeint.of_int (index_within_node + 1)) 10)) in - Cop (Cxor, [Cvar profinfo; Cconst_natint value's_header], dbg)))))) + Cop (Cxor, [Cvar profinfo; cconst_natint value's_header], dbg)))))) type callee = | Direct of string | Indirect of Cmm.expression -let code_for_call ~node ~callee ~is_tail ~label = +let code_for_call ~node ~callee ~is_tail ~label dbg = (* We treat self recursive calls as tail calls to avoid blow-ups in the graph. *) let is_self_recursive_call = match callee with - | Direct callee -> callee = !current_function_label + | Direct callee -> + begin match !current_function_label with + | None -> Misc.fatal_error "[current_function_label] not set" + | Some label -> String.equal callee label + end | Indirect _ -> false in let is_tail = is_tail || is_self_recursive_call in @@ -221,10 +241,9 @@ let code_for_call ~node ~callee ~is_tail ~label = | Direct _ | Indirect _ -> () end; let place_within_node = V.create_local "place_within_node" in - let dbg = Debuginfo.none in let open Cmm in Clet (VP.create place_within_node, - Cop (Caddi, [node; Cconst_int (index_within_node * Arch.size_addr)], dbg), + Cop (Caddi, [node; cconst_int (index_within_node * Arch.size_addr)], dbg), (* The following code returns the address that is to be moved into the (hard) node hole pointer register immediately before the call. (That move is inserted in [Selectgen].) *) @@ -234,14 +253,14 @@ let code_for_call ~node ~callee ~is_tail ~label = let count_addr = V.create_local "call_count_addr" in let count = V.create_local "call_count" in Clet (VP.create count_addr, - Cop (Caddi, [Cvar place_within_node; Cconst_int Arch.size_addr], dbg), + Cop (Caddi, [Cvar place_within_node; cconst_int Arch.size_addr], dbg), Clet (VP.create count, Cop (Cload (Word_int, Asttypes.Mutable), [Cvar count_addr], dbg), Csequence ( Cop (Cstore (Word_int, Lambda.Assignment), (* Adding 2 really means adding 1; the count is encoded as an OCaml integer. *) - [Cvar count_addr; Cop (Caddi, [Cvar count; Cconst_int 2], dbg)], + [Cvar count_addr; Cop (Caddi, [Cvar count; cconst_int 2], dbg)], dbg), Cvar place_within_node))) end else begin @@ -250,7 +269,7 @@ let code_for_call ~node ~callee ~is_tail ~label = | Indirect callee -> let caller_node = if is_tail then node - else Cconst_int 1 (* [Val_unit] *) + else cconst_int 1 (* [Val_unit] *) in Cop (Cextcall ("caml_spacetime_indirect_node_hole_ptr", [| Int |], false, None), @@ -264,20 +283,21 @@ class virtual instruction_selection = object (self) instrumentation... *) val mutable disable_instrumentation = false - method private instrument_direct_call ~env ~func ~is_tail ~label_after = + method private instrument_direct_call ~env ~func ~is_tail ~label_after dbg = let instrumentation = code_for_call ~node:(Lazy.force !spacetime_node) ~callee:(Direct func) ~is_tail ~label:label_after + dbg in match self#emit_expr env instrumentation with | None -> assert false | Some reg -> Some reg method private instrument_indirect_call ~env ~callee ~is_tail - ~label_after = + ~label_after dbg = (* [callee] is a pseudoregister, so we have to bind it in the environment and reference the variable to which it is bound. *) let callee_ident = V.create_local "callee" in @@ -288,6 +308,7 @@ class virtual instruction_selection = object (self) ~callee:(Indirect (Cmm.Cvar callee_ident)) ~is_tail ~label:label_after + dbg in match self#emit_expr env instrumentation with | None -> assert false @@ -296,29 +317,29 @@ class virtual instruction_selection = object (self) method private can_instrument () = Config.spacetime && not disable_instrumentation - method! about_to_emit_call env desc arg = + method! about_to_emit_call env desc arg dbg = if not (self#can_instrument ()) then None else let module M = Mach in match desc with | M.Iop (M.Icall_imm { func; label_after; }) -> assert (Array.length arg = 0); - self#instrument_direct_call ~env ~func ~is_tail:false ~label_after + self#instrument_direct_call ~env ~func ~is_tail:false ~label_after dbg | M.Iop (M.Icall_ind { label_after; }) -> assert (Array.length arg = 1); self#instrument_indirect_call ~env ~callee:arg.(0) - ~is_tail:false ~label_after + ~is_tail:false ~label_after dbg | M.Iop (M.Itailcall_imm { func; label_after; }) -> assert (Array.length arg = 0); - self#instrument_direct_call ~env ~func ~is_tail:true ~label_after + self#instrument_direct_call ~env ~func ~is_tail:true ~label_after dbg | M.Iop (M.Itailcall_ind { label_after; }) -> assert (Array.length arg = 1); self#instrument_indirect_call ~env ~callee:arg.(0) - ~is_tail:true ~label_after + ~is_tail:true ~label_after dbg | M.Iop (M.Iextcall { func; alloc = true; label_after; }) -> (* N.B. No need to instrument "noalloc" external calls. *) assert (Array.length arg = 0); - self#instrument_direct_call ~env ~func ~is_tail:false ~label_after + self#instrument_direct_call ~env ~func ~is_tail:false ~label_after dbg | _ -> None method private instrument_blockheader ~env ~value's_header ~dbg = @@ -336,6 +357,7 @@ class virtual instruction_selection = object (self) if something_was_instrumented () then begin let prologue_cmm = code_for_function_prologue ~function_name:f.Cmm.fun_name ~node_hole + ~fun_dbg:f.Cmm.fun_dbg in disable_instrumentation <- true; let node_temp_reg = @@ -348,7 +370,7 @@ class virtual instruction_selection = object (self) disable_instrumentation <- false; let node = Lazy.force !spacetime_node_ident in let node_reg = Selectgen.env_find node env in - self#insert_moves node_temp_reg node_reg + self#insert_moves env node_temp_reg node_reg end method! emit_blockheader env n dbg = @@ -446,7 +468,7 @@ class virtual instruction_selection = object (self) | None -> assert false | Some (node_hole, reg) -> node_hole, reg in - self#insert_moves [| Proc.loc_spacetime_node_hole |] node_hole_reg; + self#insert_moves env [| Proc.loc_spacetime_node_hole |] node_hole_reg; self#emit_prologue f ~node_hole ~env; match !reverse_shape with | [] -> None diff --git a/asmcomp/spill.ml b/asmcomp/spill.ml index 7e3a3188..0aeee83c 100644 --- a/asmcomp/spill.ml +++ b/asmcomp/spill.ml @@ -198,28 +198,6 @@ let rec reload i before = (instr_cons (Iswitch(index, new_cases)) i.arg i.res new_next), finally) - | Iloop(body) -> - let date_start = !current_date in - let destroyed_at_fork_start = !destroyed_at_fork in - let at_head = ref before in - let final_body = ref body in - begin try - while true do - current_date := date_start; - destroyed_at_fork := destroyed_at_fork_start; - let (new_body, new_at_head) = reload body !at_head in - let merged_at_head = Reg.Set.union !at_head new_at_head in - if Reg.Set.equal merged_at_head !at_head then begin - final_body := new_body; - raise Exit - end; - at_head := merged_at_head - done - with Exit -> () - end; - let (new_next, finally) = reload i.next Reg.Set.empty in - (instr_cons (Iloop(!final_body)) i.arg i.res new_next, - finally) | Icatch(rec_flag, handlers, body) -> let new_sets = List.map (fun (nfail, _) -> nfail, ref Reg.Set.empty) handlers in @@ -375,26 +353,6 @@ let rec spill i finally = inside_arm := saved_inside_arm ; (instr_cons (Iswitch(index, new_cases)) i.arg i.res new_next, !before) - | Iloop(body) -> - let (new_next, _) = spill i.next finally in - let saved_inside_loop = !inside_loop in - inside_loop := true; - let at_head = ref Reg.Set.empty in - let final_body = ref body in - begin try - while true do - let (new_body, before_body) = spill body !at_head in - let new_at_head = Reg.Set.union !at_head before_body in - if Reg.Set.equal new_at_head !at_head then begin - final_body := new_body; raise Exit - end; - at_head := new_at_head - done - with Exit -> () - end; - inside_loop := saved_inside_loop; - (instr_cons (Iloop(!final_body)) i.arg i.res new_next, - !at_head) | Icatch(rec_flag, handlers, body) -> let (new_next, at_join) = spill i.next finally in let saved_inside_catch = !inside_catch in diff --git a/asmcomp/split.ml b/asmcomp/split.ml index 650c404e..cfe4b0d6 100644 --- a/asmcomp/split.ml +++ b/asmcomp/split.ml @@ -160,11 +160,6 @@ let rec rename i sub = (instr_cons (Iswitch(index, Array.map (fun (n, _s) -> n) new_sub_cases)) (subst_regs i.arg sub) [||] new_next, sub_next) - | Iloop(body) -> - let (new_body, sub_body) = rename body sub in - let (new_next, sub_next) = rename i.next (merge_substs sub sub_body i) in - (instr_cons (Iloop(new_body)) [||] [||] new_next, - sub_next) | Icatch(rec_flag, handlers, body) -> let new_subst = List.map (fun (nfail, _) -> nfail, ref None) handlers in diff --git a/asmcomp/strmatch.ml b/asmcomp/strmatch.ml index b1efbf8f..07d77ebf 100644 --- a/asmcomp/strmatch.ml +++ b/asmcomp/strmatch.ml @@ -77,7 +77,7 @@ module Make(I:I) = struct let dbg = Debuginfo.none in let cell = Cop(Cload (Word_int, Asttypes.Mutable), - [Cop(Cadda,[str;Cconst_int(Arch.size_int*ind)], dbg)], + [Cop(Cadda,[str;Cconst_int(Arch.size_int*ind, dbg)], dbg)], dbg) in Clet(id, cell, body) @@ -88,9 +88,9 @@ module Make(I:I) = struct let mk_cmp_gen cmp_op id nat ifso ifnot = let dbg = Debuginfo.none in let test = - Cop (Ccmpi cmp_op, [ Cvar id; Cconst_natpointer nat ], dbg) + Cop (Ccmpi cmp_op, [ Cvar id; Cconst_natpointer (nat, dbg) ], dbg) in - Cifthenelse (test, ifso, ifnot) + Cifthenelse (test, dbg, ifso, dbg, ifnot, dbg) let mk_lt = mk_cmp_gen Clt let mk_eq = mk_cmp_gen Ceq @@ -377,11 +377,11 @@ module Make(I:I) = struct (* Module entry point *) - let catch arg k = match arg with + let catch dbg arg k = match arg with | Cexit (_e,[]) -> k arg | _ -> let e = next_raise_count () in - ccatch (e,[],k (Cexit (e,[])),arg) + ccatch (e,[],k (Cexit (e,[])),arg,dbg) let compile dbg str default cases = (* We do not attempt to really optimise default=None *) @@ -393,6 +393,6 @@ module Make(I:I) = struct List.rev_map (fun (s,act) -> pat_of_string s,act) cases in - catch default (fun default -> top_compile dbg str default cases) + catch dbg default (fun default -> top_compile dbg str default cases) end diff --git a/asmcomp/x86_proc.ml b/asmcomp/x86_proc.ml index 31e16a4f..99ddd398 100644 --- a/asmcomp/x86_proc.ml +++ b/asmcomp/x86_proc.ml @@ -219,10 +219,6 @@ let string_of_rounding = function | RoundTruncate -> "roundsd.trunc" | RoundNearest -> "roundsd.near" -(* These hooks can be used to insert optimization passes on - the assembly code. *) -let assembler_passes = ref ([] : (asm_program -> asm_program) list) - let internal_assembler = ref None let register_internal_assembler f = internal_assembler := Some f @@ -268,9 +264,6 @@ let reset_asm_code () = asm_code := [] let generate_code asm = let instrs = List.rev !asm_code in - let instrs = - List.fold_left (fun instrs pass -> pass instrs) instrs !assembler_passes - in begin match asm with | Some f -> f instrs | None -> () diff --git a/asmcomp/x86_proc.mli b/asmcomp/x86_proc.mli index e8aed9c1..c7f20bc9 100644 --- a/asmcomp/x86_proc.mli +++ b/asmcomp/x86_proc.mli @@ -87,8 +87,3 @@ val use_plt : bool (** Support for plumbing a binary code emitter *) val register_internal_assembler: (asm_program -> string -> unit) -> unit - - -(** Hooks for rewriting the assembly code *) - -val assembler_passes: (asm_program -> asm_program) list ref diff --git a/autogen b/autogen index a4e15f94..40f47afa 100755 --- a/autogen +++ b/autogen @@ -1,2 +1,29 @@ #!/bin/sh -autoconf -W all,error +#************************************************************************** +#* * +#* OCaml * +#* * +#* David Allsopp, MetaStack Solutions Ltd. * +#* * +#* Copyright 2019 MetaStack Solutions Ltd. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** + +version=$(autoconf --version | sed -ne 's/^autoconf .* \([0-9][^ ]*\)$/\1/p') +if [ "$version" != '2.69' ] ; then + echo "autoconf 2.69 is required" >&2 + exit 1 +else + # Remove the autom4te.cache directory to make sure we start in a clean state + rm -rf autom4te.cache + autoconf -W all,error + # Some distros have this 2013 patch to autoconf, some don't... + sed -i -e '/^runstatedir/d' \ + -e '/-runstatedir /,+8d' \ + -e '/--runstatedir=DIR/d' \ + -e 's/ runstatedir//' configure +fi diff --git a/boot/ocamlc b/boot/ocamlc index 4938ace50addf8fb828e59a6ebedf9a4b6554cc3..9cc6a5bb55a75639363991cc556557204e3957d8 100755 GIT binary patch delta 287605 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