New upstream version 4.11.2
authorStephane Glondu <steph@glondu.net>
Tue, 21 Dec 2021 12:47:11 +0000 (13:47 +0100)
committerStéphane Glondu <glondu@debian.org>
Tue, 21 Dec 2021 12:47:11 +0000 (13:47 +0100)
46 files changed:
Changes
VERSION
asmcomp/amd64/emit.mlp
boot/ocamlc
boot/ocamllex
configure
configure.ac
lambda/translcore.ml
ocaml-variants.opam
runtime/.depend
runtime/Makefile
runtime/amd64.S
runtime/caml/codefrag.h [new file with mode: 0644]
runtime/caml/config.h
runtime/caml/misc.h
runtime/caml/skiplist.h [new file with mode: 0644]
runtime/codefrag.c [new file with mode: 0644]
runtime/debugger.c
runtime/dynlink_nat.c
runtime/extern.c
runtime/fix_code.c
runtime/gc_ctrl.c
runtime/globroots.c
runtime/intern.c
runtime/memprof.c
runtime/meta.c
runtime/minor_gc.c
runtime/misc.c
runtime/signals.c
runtime/skiplist.c [new file with mode: 0644]
runtime/startup_nat.c
testsuite/tests/lib-threads/bank.ml
testsuite/tests/lib-threads/sieve.ml
testsuite/tests/lib-threads/test-runtime-cleanup.sh [new file with mode: 0755]
testsuite/tests/regression/pr9326/gc_set.ml [new file with mode: 0644]
testsuite/tests/statmemprof/callstacks.flat-float-array.reference
testsuite/tests/statmemprof/callstacks.ml
testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference
testsuite/tests/statmemprof/comballoc.byte.reference
testsuite/tests/statmemprof/comballoc.ml
testsuite/tests/statmemprof/comballoc.opt.reference
testsuite/tests/typing-extensions/extensions.ml
tools/ci/inria/bootstrap
tools/ci/inria/extra-checks
tools/ci/inria/main
typing/typedecl.ml

diff --git a/Changes b/Changes
index 62e58bd58a5b0f2cda656078dea0412421b8a4c9..880c012542600d4ca544906efeff545c95766771 100644 (file)
--- a/Changes
+++ b/Changes
@@ -1,3 +1,58 @@
+OCaml 4.11 maintenance branch
+-----------------------------
+
+
+OCaml 4.11.2 (24 February 2021)
+-------------------------------
+
+### Build system:
+
+- #9938, #9939: Define __USE_MINGW_ANSI_STDIO=0 for the mingw-w64 ports to
+  prevent their C99-compliant snprintf conflicting with ours.
+  (David Allsopp, report by Michael Soegtrop, review by Xavier Leroy)
+
+### Runtime system:
+
+- #10056: Memprof: ensure young_trigger is within the bounds of the minor
+  heap in caml_memprof_renew_minor_sample (regression from #8684)
+  (David Allsopp, review by Guillaume Munch-Maccagnoni and
+  Jacques-Henri Jourdan)
+
+- #9654: More efficient management of code fragments.
+  (Xavier Leroy, review by Jacques-Henri Jourdan, Damien Doligez, and
+  Stephen Dolan)
+
+### Tools:
+
+- #9606, #9635, #9637: fix performance regression in the debugger
+  (behaviors quadratic in the size of the debugged program)
+  (Xavier Leroy, report by Jacques Garrigue and Virgile Prevosto,
+  review by David Allsopp and Jacques-Henri Jourdan)
+
+### Code generation and optimizations:
+
+- #9969, #9981: Added mergeable flag to ELF sections containing mergeable
+  constants.  Fixes compatibility with the integrated assembler in clang 11.0.0.
+  (Jacob Young, review by Nicolás Ojeda Bär)
+
+### Bug fixes:
+
+- #9970, #10010: fix the declaration scope of extensible-datatype constructors.
+  A regression that dates back to 4.08 makes extensible-datatype constructors
+  with inline records very fragile, for example:
+    type 'a t += X of {x : 'a}
+  (Gabriel Scherer, review by Thomas Refis and Leo White,
+   report by Nicolás Ojeda Bär)
+
+- #9096, #10096: fix a 4.11.0 performance regression in classes/objects
+  declared within a function
+  (Gabriel Scherer, review by Leo White, report by Sacha Ayoun)
+
+- #9326, #10125: Gc.set incorrectly handles the three `custom_*` fields,
+  causing a performance regression
+  (report by Emilio Jesús Gallego Arias, analysis and fix by Stephen Dolan,
+   code by Xavier Leroy, review by Hugo Heuzard and Gabriel Scherer)
+
 OCaml 4.11.1 (31 August 2020)
 -----------------------------
 
@@ -12,7 +67,7 @@ OCaml 4.11.1 (31 August 2020)
   (Florian Angeletti, review by Thomas Refis)
 
 OCaml 4.11.0 (19 August 2020)
----------------------------
+-----------------------------
 
 (Changes that can break existing programs are marked with a "*")
 
@@ -1449,6 +1504,16 @@ OCaml 4.09.0 (19 September 2019)
 - #8944: Fix "open struct .. end" on clambda backend
   (Thomas Refis, review by Leo White, report by Damon Wang and Mark Shinwell)
 
+OCaml 4.08 maintenance branch
+-----------------------------
+
+### Bug fixes:
+
+- #9326, #10125: Gc.set incorrectly handles the three `custom_*` fields,
+  causing a performance regression
+  (report by Emilio Jesús Gallego Arias, analysis and fix by Stephen Dolan,
+   code by Xavier Leroy, review by Hugo Heuzard and Gabriel Scherer)
+
 OCaml 4.08.1 (5 August 2019)
 ----------------------------
 
diff --git a/VERSION b/VERSION
index ec07a3e6a62cb6d88f963be072e8bb51ed7cfcb8..571b821642e3e4b97c53a91cab218235a919f8ad 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,4 +1,4 @@
-4.11.1
+4.11.2
 
 # The version string is the first line of this file.
 # It must be in the format described in stdlib/sys.mli
index d9c5eb6e68e0b70697d12f40dfb9441015ced59f..2ed417553b9041ef649bec676f04742e1d29e6b6 100644 (file)
@@ -1032,7 +1032,7 @@ let begin_assembly() =
     | S_macosx -> D.section ["__TEXT";"__literal16"] None ["16byte_literals"]
     | S_mingw64 | S_cygwin -> D.section [".rdata"] (Some "dr") []
     | S_win64 -> D.data ()
-    | _ -> D.section [".rodata.cst8"] (Some "a") ["@progbits"]
+    | _ -> D.section [".rodata.cst16"] (Some "aM") ["@progbits";"16"]
     end;
     D.align 16;
     _label (emit_symbol "caml_negf_mask");
@@ -1096,8 +1096,9 @@ let end_assembly() =
     | S_macosx -> D.section ["__TEXT";"__literal8"] None ["8byte_literals"]
     | S_mingw64 | S_cygwin -> D.section [".rdata"] (Some "dr") []
     | S_win64 -> D.data ()
-    | _ -> D.section [".rodata.cst8"] (Some "a") ["@progbits"]
+    | _ -> D.section [".rodata.cst8"] (Some "aM") ["@progbits";"8"]
     end;
+    D.align 8;
     List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants
   end;
 
index 8a4f068132adbf6c76a92709729a7d7e43b7694a..9ddff6a38d58d6d61fa904c2b4868707b0630e35 100755 (executable)
Binary files a/boot/ocamlc and b/boot/ocamlc differ
index 930676103aab5d3ff3010901d7d3041663c4f372..2c11b336a79d5c8e86d63c1ea34331fed06c992a 100755 (executable)
Binary files a/boot/ocamllex and b/boot/ocamllex differ
index 74657d2d9a58f6921fab4e7ccfe050cc474391a4..50a7bb226fef536116156d5651b49fa386b666f6 100755 (executable)
--- a/configure
+++ b/configure
@@ -56,7 +56,7 @@ if test -e '.git' ; then :
   fi
 fi
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for OCaml 4.11.1.
+# Generated by GNU Autoconf 2.69 for OCaml 4.11.2.
 #
 # Report bugs to <caml-list@inria.fr>.
 #
@@ -646,8 +646,8 @@ MAKEFLAGS=
 # Identity of this package.
 PACKAGE_NAME='OCaml'
 PACKAGE_TARNAME='ocaml'
-PACKAGE_VERSION='4.11.1'
-PACKAGE_STRING='OCaml 4.11.1'
+PACKAGE_VERSION='4.11.2'
+PACKAGE_STRING='OCaml 4.11.2'
 PACKAGE_BUGREPORT='caml-list@inria.fr'
 PACKAGE_URL='http://www.ocaml.org'
 
@@ -1482,7 +1482,7 @@ if test "$ac_init_help" = "long"; then
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures OCaml 4.11.1 to adapt to many kinds of systems.
+\`configure' configures OCaml 4.11.2 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -1548,7 +1548,7 @@ fi
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of OCaml 4.11.1:";;
+     short | recursive ) echo "Configuration of OCaml 4.11.2:";;
    esac
   cat <<\_ACEOF
 
@@ -1711,7 +1711,7 @@ fi
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-OCaml configure 4.11.1
+OCaml configure 4.11.2
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2374,7 +2374,7 @@ cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by OCaml $as_me 4.11.1, which was
+It was created by OCaml $as_me 4.11.2, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -2723,8 +2723,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
 
 
 
-{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.11.1" >&5
-$as_echo "$as_me: Configuring OCaml version 4.11.1" >&6;}
+{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.11.2" >&5
+$as_echo "$as_me: Configuring OCaml version 4.11.2" >&6;}
 
 # Configuration variables
 
@@ -2800,7 +2800,7 @@ ac_configure="$SHELL $ac_aux_dir/configure"  # Please don't use this var.
 
 
 
-VERSION=4.11.1
+VERSION=4.11.2
 
 
 # Note: This is present for the flexdll bootstrap where it exposed as the old
@@ -12475,7 +12475,7 @@ case $ocaml_cv_cc_vendor in #(
   *) :
     outputobj='-o $(EMPTY)'
   gcc_warnings='-Wall -Wdeclaration-after-statement'
-  case 4.11.1 in #(
+  case 4.11.2 in #(
   *+dev*) :
     gcc_warnings="$gcc_warnings -Werror" ;; #(
   *) :
@@ -12509,7 +12509,7 @@ case $host in #(
 -fexcess-precision=standard"
         # TODO: see whether the code can be fixed to avoid -Wno-unused
         common_cflags="-O2 -fno-strict-aliasing -fwrapv -mms-bitfields"
-        internal_cppflags='-DUNICODE -D_UNICODE'
+        internal_cppflags='-D__USE_MINGW_ANSI_STDIO=0 -DUNICODE -D_UNICODE'
         internal_cppflags="$internal_cppflags -DWINDOWS_UNICODE="
         internal_cppflags="${internal_cppflags}\$(WINDOWS_UNICODE)" ;; #(
   *) :
@@ -16893,7 +16893,7 @@ else
   ocamldoc=ocamldoc
 fi
 
-case $enable_ocamltest,4.11.1 in #(
+case $enable_ocamltest,4.11.2 in #(
   yes,*|,*+dev*) :
     ocamltest='ocamltest' ;; #(
   *) :
@@ -17610,7 +17610,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by OCaml $as_me 4.11.1, which was
+This file was extended by OCaml $as_me 4.11.2, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -17677,7 +17677,7 @@ _ACEOF
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-OCaml config.status 4.11.1
+OCaml config.status 4.11.2
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
index aa5f26f28001bdb4d0d3f46c8aa65d0dd330d13a..d7dee6977e1a65ea0fc776efc14efa2761c3ed73 100644 (file)
@@ -564,7 +564,7 @@ AS_CASE([$host],
 -fexcess-precision=standard"
         # TODO: see whether the code can be fixed to avoid -Wno-unused
         common_cflags="-O2 -fno-strict-aliasing -fwrapv -mms-bitfields"
-        internal_cppflags='-DUNICODE -D_UNICODE'
+        internal_cppflags='-D__USE_MINGW_ANSI_STDIO=0 -DUNICODE -D_UNICODE'
         internal_cppflags="$internal_cppflags -DWINDOWS_UNICODE="
         internal_cppflags="${internal_cppflags}\$(WINDOWS_UNICODE)"],
       [AC_MSG_ERROR([Unsupported C compiler for a Mingw build])])],
index 5d479f3f7df1da7bc37c21fd1f7e6487dab5fd6d..a1697666d067cee014c84383c510b6761f09021d 100644 (file)
@@ -219,6 +219,14 @@ let transl_ident loc env ty path desc =
   |  _ -> fatal_error "Translcore.transl_exp: bad Texp_ident"
 
 let rec transl_exp ~scopes e =
+  transl_exp1 ~scopes ~in_new_scope:false e
+
+(* ~in_new_scope tracks whether we just opened a new scope.
+
+   We go to some trouble to avoid introducing many new anonymous function
+   scopes, as `let f a b = ...` is desugared to several Pexp_fun.
+*)
+and transl_exp1 ~scopes ~in_new_scope e =
   List.iter (Translattribute.check_attribute e) e.exp_attributes;
   let eval_once =
     (* Whether classes for immediate objects must be cached *)
@@ -226,10 +234,10 @@ let rec transl_exp ~scopes e =
       Texp_function _ | Texp_for _ | Texp_while _ -> false
     | _ -> true
   in
-  if eval_once then transl_exp0 ~scopes e else
-  Translobj.oo_wrap e.exp_env true (transl_exp0 ~scopes) e
+  if eval_once then transl_exp0 ~scopes ~in_new_scope  e else
+  Translobj.oo_wrap e.exp_env true (transl_exp0 ~scopes ~in_new_scope) e
 
-and transl_exp0 ~scopes e =
+and transl_exp0 ~in_new_scope ~scopes e =
   match e.exp_desc with
   | Texp_ident(path, _, desc) ->
       transl_ident (of_location ~scopes e.exp_loc)
@@ -240,7 +248,10 @@ and transl_exp0 ~scopes e =
       transl_let ~scopes rec_flag pat_expr_list
         (event_before ~scopes body (transl_exp ~scopes body))
   | Texp_function { arg_label = _; param; cases; partial; } ->
-      let scopes = enter_anonymous_function ~scopes in
+      let scopes =
+        if in_new_scope then scopes
+        else enter_anonymous_function ~scopes
+      in
       transl_function ~scopes e param cases partial
   | Texp_apply({ exp_desc = Texp_ident(path, _, {val_kind = Val_prim p});
                 exp_type = prim_type } as funct, oargs)
@@ -808,18 +819,11 @@ and transl_function ~scopes e param cases partial =
   let lam = Lfunction{kind; params; return; body; attr; loc} in
   Translattribute.add_function_attributes lam e.exp_loc e.exp_attributes
 
-(* Like transl_exp, but used when introducing a new scope.
-   Goes to some trouble to avoid introducing many new anonymous function
-   scopes, as `let f a b = ...` is desugared to several Pexp_fun *)
+(* Like transl_exp, but used when a new scope was just introduced. *)
 and transl_scoped_exp ~scopes expr =
-  match expr.exp_desc with
-  | Texp_function { arg_label = _; param; cases; partial } ->
-     transl_function ~scopes expr param cases partial
-  | _ ->
-     transl_exp ~scopes expr
+  transl_exp1 ~scopes ~in_new_scope:true expr
 
-(* Calls transl_scoped_exp or transl_exp, according to whether a pattern
-   binding should introduce a new scope *)
+(* Decides whether a pattern binding should introduce a new scope. *)
 and transl_bound_exp ~scopes ~in_structure pat expr =
   let should_introduce_scope =
     match expr.exp_desc with
index f6b0abc80f953c18d744e3b1bd64d1f3f599cd6a..9e6e76ed2a46011e194fa56368d523c26da7e8ed 100644 (file)
@@ -1,8 +1,8 @@
 opam-version: "2.0"
-version: "4.11.1"
-synopsis: "OCaml 4.11.1, official release"
+version: "4.11.2"
+synopsis: "OCaml release 4.11.2"
 depends: [
-  "ocaml" {= "4.11.1" & post}
+  "ocaml" {= "4.11.2" & post}
   "base-unix" {post}
   "base-bigarray" {post}
   "base-threads" {post}
index 9f5d2fdf63e61e01a91ab93de9c25daa6a57294e..b56ad7ab15025c0827cddd0699d826a8f4d20329 100644 (file)
@@ -16,12 +16,12 @@ stacks_b.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \
  caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
-fix_code_b.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \
- caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
- caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \
- caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+fix_code_b.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \
+ caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \
+ caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \
+ caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 startup_aux_b.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \
@@ -80,11 +80,11 @@ roots_byt_b.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \
  caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \
  caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \
  caml/eventlog.h
-globroots_b.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_b.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 fail_byt_b.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \
@@ -160,14 +160,14 @@ io_b.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_b.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_b.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -184,12 +184,12 @@ sys_b.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/startup_aux.h
 meta_b.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 parsing_b.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \
  caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
@@ -226,11 +226,11 @@ callback_b.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \
  caml/stacks.h caml/memory.h
 debugger_b.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \
- caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \
- caml/stacks.h caml/sys.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \
+ caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \
+ caml/mlvalues.h caml/stacks.h caml/sys.h
 weak_b.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \
  caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \
@@ -296,6 +296,15 @@ domain_b.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_b.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_b.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_b.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
@@ -321,12 +330,12 @@ stacks_bd.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \
  caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
-fix_code_bd.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \
- caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
- caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \
- caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+fix_code_bd.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \
+ caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \
+ caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \
+ caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 startup_aux_bd.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \
@@ -385,11 +394,11 @@ roots_byt_bd.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \
  caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \
  caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \
  caml/eventlog.h
-globroots_bd.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_bd.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 fail_byt_bd.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \
@@ -465,14 +474,14 @@ io_bd.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_bd.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_bd.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -489,12 +498,12 @@ sys_bd.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/startup_aux.h
 meta_bd.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 parsing_bd.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \
  caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
@@ -531,11 +540,11 @@ callback_bd.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \
  caml/stacks.h caml/memory.h
 debugger_bd.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \
- caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \
- caml/stacks.h caml/sys.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \
+ caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \
+ caml/mlvalues.h caml/stacks.h caml/sys.h
 weak_bd.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \
  caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \
@@ -601,6 +610,15 @@ domain_bd.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_bd.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_bd.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_bd.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
@@ -631,12 +649,12 @@ stacks_bi.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \
  caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
-fix_code_bi.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \
- caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
- caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \
- caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+fix_code_bi.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \
+ caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \
+ caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \
+ caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 startup_aux_bi.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \
@@ -695,11 +713,11 @@ roots_byt_bi.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \
  caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \
  caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \
  caml/eventlog.h
-globroots_bi.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_bi.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 fail_byt_bi.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \
@@ -775,14 +793,14 @@ io_bi.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_bi.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_bi.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -799,12 +817,12 @@ sys_bi.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/startup_aux.h
 meta_bi.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 parsing_bi.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \
  caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
@@ -841,11 +859,11 @@ callback_bi.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \
  caml/stacks.h caml/memory.h
 debugger_bi.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \
- caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \
- caml/stacks.h caml/sys.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \
+ caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \
+ caml/mlvalues.h caml/stacks.h caml/sys.h
 weak_bi.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \
  caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \
@@ -911,6 +929,15 @@ domain_bi.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_bi.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_bi.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_bi.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
@@ -936,12 +963,12 @@ stacks_bpic.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \
  caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
-fix_code_bpic.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \
- caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
- caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \
- caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+fix_code_bpic.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \
+ caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \
+ caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \
+ caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 startup_aux_bpic.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \
@@ -1000,11 +1027,11 @@ roots_byt_bpic.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \
  caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \
  caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \
  caml/eventlog.h
-globroots_bpic.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_bpic.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 fail_byt_bpic.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \
@@ -1080,14 +1107,14 @@ io_bpic.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_bpic.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_bpic.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -1104,12 +1131,12 @@ sys_bpic.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/startup_aux.h
 meta_bpic.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 parsing_bpic.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \
  caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
@@ -1146,11 +1173,11 @@ callback_bpic.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \
  caml/stacks.h caml/memory.h
 debugger_bpic.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \
- caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \
- caml/stacks.h caml/sys.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \
+ caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \
+ caml/mlvalues.h caml/stacks.h caml/sys.h
 weak_bpic.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \
  caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \
@@ -1216,6 +1243,15 @@ domain_bpic.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_bpic.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_bpic.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_bpic.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
@@ -1232,11 +1268,11 @@ startup_aux_n.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
 startup_nat_n.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \
- caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \
- caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \
- caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
+ caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \
+ caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \
+ caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \
+ caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
  caml/startup_aux.h caml/sys.h
 main_n.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
@@ -1340,14 +1376,14 @@ io_n.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_n.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_n.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -1434,11 +1470,11 @@ custom_n.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/mlvalues.h caml/signals.h
-globroots_n.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_n.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 backtrace_nat_n.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \
  caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \
@@ -1454,21 +1490,22 @@ dynlink_nat_n.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
  caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \
- caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h
+ caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \
+ caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \
+ caml/hooks.h
 debugger_n.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h
 meta_n.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 dynlink_n.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \
  caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \
@@ -1519,6 +1556,15 @@ domain_n.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_n.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_n.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_n.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
@@ -1534,11 +1580,11 @@ startup_aux_nd.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
 startup_nat_nd.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \
- caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \
- caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \
- caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
+ caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \
+ caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \
+ caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \
+ caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
  caml/startup_aux.h caml/sys.h
 main_nd.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
@@ -1642,14 +1688,14 @@ io_nd.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_nd.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_nd.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -1736,11 +1782,11 @@ custom_nd.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/mlvalues.h caml/signals.h
-globroots_nd.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_nd.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 backtrace_nat_nd.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \
  caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \
@@ -1756,21 +1802,22 @@ dynlink_nat_nd.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
  caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \
- caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h
+ caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \
+ caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \
+ caml/hooks.h
 debugger_nd.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h
 meta_nd.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 dynlink_nd.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \
  caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \
@@ -1821,6 +1868,15 @@ domain_nd.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_nd.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_nd.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_nd.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
@@ -1836,11 +1892,11 @@ startup_aux_ni.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
 startup_nat_ni.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \
- caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \
- caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \
- caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
+ caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \
+ caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \
+ caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \
+ caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
  caml/startup_aux.h caml/sys.h
 main_ni.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
@@ -1944,14 +2000,14 @@ io_ni.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_ni.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_ni.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -2038,11 +2094,11 @@ custom_ni.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/mlvalues.h caml/signals.h
-globroots_ni.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_ni.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 backtrace_nat_ni.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \
  caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \
@@ -2058,21 +2114,22 @@ dynlink_nat_ni.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
  caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \
- caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h
+ caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \
+ caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \
+ caml/hooks.h
 debugger_ni.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h
 meta_ni.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 dynlink_ni.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \
  caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \
@@ -2123,6 +2180,15 @@ domain_ni.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_ni.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_ni.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_ni.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
@@ -2138,11 +2204,11 @@ startup_aux_npic.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \
 startup_nat_npic.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \
  caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \
- caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \
- caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \
- caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
+ caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \
+ caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \
+ caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \
+ caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \
  caml/startup_aux.h caml/sys.h
 main_npic.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
@@ -2246,14 +2312,14 @@ io_npic.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \
  caml/signals.h caml/sys.h
 extern_npic.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \
- caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \
- caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/misc.h caml/mlvalues.h caml/reverse.h
+ caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
+ caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
+ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h
 intern_npic.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \
- caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \
+ caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \
+ caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \
  caml/misc.h caml/reverse.h caml/signals.h
@@ -2340,11 +2406,11 @@ custom_npic.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \
  caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \
  caml/domain.h caml/mlvalues.h caml/signals.h
-globroots_npic.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \
- caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
- caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \
- caml/roots.h caml/memory.h caml/globroots.h caml/roots.h
+globroots_npic.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \
+ caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \
+ caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \
+ caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \
+ caml/roots.h caml/skiplist.h
 backtrace_nat_npic.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \
  caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \
@@ -2360,21 +2426,22 @@ dynlink_nat_npic.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h
  caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \
  caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \
  caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \
- caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h
+ caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \
+ caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \
+ caml/hooks.h
 debugger_npic.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \
- caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
- caml/address_class.h caml/domain.h
+ caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \
+ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/skiplist.h
 meta_npic.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
- caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \
- caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \
- caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \
- caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \
- caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \
- caml/stacks.h caml/memory.h
+ caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \
+ caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \
+ caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \
+ caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \
+ caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \
+ caml/signals.h caml/stacks.h caml/memory.h
 dynlink_npic.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \
  caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \
  caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \
@@ -2425,6 +2492,15 @@ domain_npic.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.
  caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \
  caml/address_class.h caml/domain.h
+skiplist_npic.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \
+ caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \
+ caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h
+codefrag_npic.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \
+ caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \
+ caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \
+ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \
+ caml/skiplist.h
 win32_npic.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \
  caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \
  caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \
index 744955c0d726da651b35578b5dff5ef8b4e46b99..bab27854ce9aa5d4ac26b6e92cf495aba3f03070 100644 (file)
@@ -26,7 +26,8 @@ BYTECODE_C_SOURCES := $(addsuffix .c, \
   signals_byt printexc backtrace_byt backtrace compare ints eventlog \
   floats str array io extern intern hash sys meta parsing gc_ctrl md5 obj \
   lexing callback debugger weak compact finalise custom dynlink \
-  spacetime_byt afl $(UNIX_OR_WIN32) bigarray main memprof domain)
+  spacetime_byt afl $(UNIX_OR_WIN32) bigarray main memprof domain \
+  skiplist codefrag)
 
 NATIVE_C_SOURCES := $(addsuffix .c, \
   startup_aux startup_nat main fail_nat roots_nat signals \
@@ -35,7 +36,7 @@ NATIVE_C_SOURCES := $(addsuffix .c, \
   lexing $(UNIX_OR_WIN32) printexc callback weak compact finalise custom \
   globroots backtrace_nat backtrace dynlink_nat debugger meta \
   dynlink clambda_checks spacetime_nat spacetime_snapshot afl bigarray \
-  memprof domain)
+  memprof domain skiplist codefrag)
 
 # The other_files variable stores the list of files whose dependencies
 # should be computed by `make depend` although they do not need to be
index 056b39cd44fea0be76fd0fd120261d86a450e631..2950f1ae3873b1ba869cc0716ad01a121d57ce84 100644 (file)
@@ -726,7 +726,7 @@ G(caml_system__spacetime_shapes):
 #elif defined(SYS_mingw64) || defined(SYS_cygwin)
         .section .rdata,"dr"
 #else
-        .section    .rodata.cst8,"a",@progbits
+        .section    .rodata.cst16,"aM",@progbits,16
 #endif
         .globl  G(caml_negf_mask)
         .align  SIXTEEN_ALIGN
diff --git a/runtime/caml/codefrag.h b/runtime/caml/codefrag.h
new file mode 100644 (file)
index 0000000..ff623c0
--- /dev/null
@@ -0,0 +1,80 @@
+/**************************************************************************/
+/*                                                                        */
+/*                                 OCaml                                  */
+/*                                                                        */
+/*             Xavier Leroy, projet Cambium, INRIA Paris                  */
+/*                                                                        */
+/*   Copyright 2020 Institut National de Recherche en Informatique et     */
+/*     en Automatique.                                                    */
+/*                                                                        */
+/*   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.          */
+/*                                                                        */
+/**************************************************************************/
+
+/* A table of all code fragments (main program and dynlinked modules) */
+
+#ifndef CAML_CODEFRAG_H
+#define CAML_CODEFRAG_H
+
+#ifdef CAML_INTERNALS
+
+enum digest_status {
+  DIGEST_LATER,    /* computed on demand */
+  DIGEST_NOW,      /* computed by caml_register_code_fragment */
+  DIGEST_PROVIDED, /* passed by caller of caml_register_code_fragment */
+  DIGEST_IGNORE    /* this code fragment is private and cannot be
+                      identified by its digest */
+};
+
+struct code_fragment {
+  char *code_start;
+  char *code_end;
+  int fragnum;
+  unsigned char digest[16];
+  enum digest_status digest_status;
+};
+
+/* Register a code fragment for addresses [start] (included)
+   to [end] (excluded).  This range of addresses is assumed
+   disjoint from all currently-registered code fragments.
+
+   [digest_kind] explains what digest is to be associated to the code
+   fragment.  If [digest_kind == DIGEST_PROVIDED], the [opt_digest]
+   parameter points to the 16-byte digest of the code.
+   For all other values of [digest_kind], [opt_digest] is ignored
+   and should be [NULL].
+
+   The returned integer is the fragment number (fragnum) associated
+   with the new code fragment. */
+extern int caml_register_code_fragment(char * start, char * end,
+                                       enum digest_status digest_kind,
+                                       unsigned char * opt_digest);
+
+/* Un-register a code fragment. */
+extern void caml_remove_code_fragment(struct code_fragment * cf);
+
+/* Find the code fragment whose range of addresses contains [pc].
+   Returns NULL if none exists. */
+extern struct code_fragment * caml_find_code_fragment_by_pc(char *pc);
+
+/* Find the code fragment whose fragment number is [fragnum].
+   Returns NULL if none exists. */
+extern struct code_fragment * caml_find_code_fragment_by_num(int fragnum);
+
+/* Find the code fragment whose digest is equal to the given digest.
+   Returns NULL if none exists. */
+extern struct code_fragment *
+   caml_find_code_fragment_by_digest(unsigned char digest[16]);
+
+/* Return the digest of the given code fragment.
+   If the code fragment was registered in [DIGEST_LATER] mode
+   and if the digest was not computed yet, it is obtained by hashing
+   the bytes between [code_start] and [code_end].
+   Returns NULL if the code fragment was registered with [DIGEST_IGNORE]. */
+extern unsigned char * caml_digest_of_code_fragment(struct code_fragment *);
+
+#endif
+
+#endif
index b119bc3410c030d84cef634992eecd140a6de4c2..d42a9205a2926190a7c38478092fb682e59727f4 100644 (file)
 #include <stdint.h>
 #endif
 
+/* Disable the mingw-w64 *printf shims */
+#if defined(CAML_INTERNALS) && defined(__MINGW32__)
+  /* Headers may have already included <_mingw.h>, so #undef if necessary. */
+  #ifdef __USE_MINGW_ANSI_STDIO
+    #undef __USE_MINGW_ANSI_STDIO
+  #endif
+  /* <stdio.h> must either be #include'd before this header or
+     __USE_MINGW_ANSI_STDIO needs to be 0 when <stdio.h> is processed. The final
+     effect will be the same - stdio.h will define snprintf and misc.h will make
+     snprintf a macro (referring to caml_snprintf). */
+  #define __USE_MINGW_ANSI_STDIO 0
+#endif
+
 #if defined(__MINGW32__) || (defined(_MSC_VER) && _MSC_VER < 1800)
 #define ARCH_SIZET_PRINTF_FORMAT "I"
 #else
index fcc066605974f963813539bd84bba499c29bfbab..4d9ac010a014bc555b6826d48257592e48b99ff0 100644 (file)
@@ -432,18 +432,6 @@ extern int caml_snwprintf(wchar_t * buf,
 #  endif
 #endif
 
-/* A table of all code fragments (main program and dynlinked modules) */
-struct code_fragment {
-  char *code_start;
-  char *code_end;
-  unsigned char digest[16];
-  char digest_computed;
-};
-
-extern struct ext_table caml_code_fragments_table;
-
-int caml_find_code_fragment(char *pc, int *index, struct code_fragment **cf);
-
 #endif /* CAML_INTERNALS */
 
 /* The [backtrace_slot] type represents values stored in
diff --git a/runtime/caml/skiplist.h b/runtime/caml/skiplist.h
new file mode 100644 (file)
index 0000000..1e8284d
--- /dev/null
@@ -0,0 +1,102 @@
+/**************************************************************************/
+/*                                                                        */
+/*                                 OCaml                                  */
+/*                                                                        */
+/*             Xavier Leroy, projet Cambium, INRIA Paris                  */
+/*                                                                        */
+/*   Copyright 2020 Institut National de Recherche en Informatique et     */
+/*     en Automatique.                                                    */
+/*                                                                        */
+/*   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.          */
+/*                                                                        */
+/**************************************************************************/
+
+/* A dictionary data structure implemented as skip lists */
+
+/* Keys and associated data are natural-width integers (type [uintnat]).
+   Pointers can be used too, modulo conversion to [uintnat]. */
+
+#ifndef CAML_SKIPLIST_H
+#define CAML_SKIPLIST_H
+
+#ifdef CAML_INTERNALS
+
+#include "config.h"
+
+#define NUM_LEVELS 17
+
+/* The head of a skip list */
+
+struct skiplist {
+  struct skipcell * forward[NUM_LEVELS]; /* forward chaining */
+  int level;                    /* max level used */
+};
+
+/* The cells of a skip list */
+
+struct skipcell {
+  uintnat key;
+  uintnat data;
+#if (__STDC_VERSION__ >= 199901L)
+  struct skipcell * forward[];  /* variable-length array */
+#else
+  struct skipcell * forward[1]; /* variable-length array */
+#endif
+};
+
+/* Initialize a skip list, statically */
+#define SKIPLIST_STATIC_INITIALIZER { {0, }, 0 }
+
+/* Initialize a skip list, dynamically */
+extern void caml_skiplist_init(struct skiplist * sk);
+
+/* Search a skip list.
+   If [key] is found, store associated data in [*data] and return 1.
+   If [key] is not found, return 0 and leave [*data] unchanged. */
+extern int caml_skiplist_find(struct skiplist * sk, uintnat key,
+                              /*out*/ uintnat * data);
+
+/* Search the entry of the skip list that has the largest key less than
+   or equal to [k].
+   If such an entry exists, store its key in [*key], the associated data in
+   [*data], and return 1.
+   If no such entry exists (all keys in the skip list are strictly greater
+   than [k]), return 0 and leave [*key] and [*data] unchanged. */
+extern int caml_skiplist_find_below(struct skiplist * sk, uintnat k,
+                                    /*out*/ uintnat * key,
+                                    /*out*/ uintnat * data);
+
+/* Insertion in a skip list.
+   If [key] was already there, change the associated data and return 1.
+   If [key] was not there, insert new [key, data] binding and return 0. */
+extern int caml_skiplist_insert(struct skiplist * sk,
+                                uintnat key, uintnat data);
+
+/* Deletion in a skip list.
+   If [key] was there, remove it and return 1.
+   If [key] was not there, leave the skip list unchanged and return 0. */
+extern int caml_skiplist_remove(struct skiplist * sk, uintnat key);
+
+/* Empty an already initialized skip list. */
+extern void caml_skiplist_empty(struct skiplist * sk);
+
+/* Iterate over a skip list, in increasing order of keys.
+   [var] designates the current element.
+   [action] can refer to [var->key] and [var->data].
+   [action] can safely remove the current element, i.e. call
+   [caml_skiplist_remove] on [var->key].  The traversal will
+   continue with the skiplist element following the removed element.
+   Other operations performed over the skiplist during its traversal have
+   unspecified effects on the traversal. */
+
+#define FOREACH_SKIPLIST_ELEMENT(var,sk,action) \
+  { struct skipcell * var, * caml__next; \
+    for (var = (sk)->forward[0]; var != NULL; var = caml__next) \
+    { caml__next = (var)->forward[0]; action; } \
+  }
+
+#endif
+
+#endif
diff --git a/runtime/codefrag.c b/runtime/codefrag.c
new file mode 100644 (file)
index 0000000..2ab9571
--- /dev/null
@@ -0,0 +1,115 @@
+/**************************************************************************/
+/*                                                                        */
+/*                                 OCaml                                  */
+/*                                                                        */
+/*             Xavier Leroy, projet Cambium, INRIA Paris                  */
+/*                                                                        */
+/*   Copyright 2020 Institut National de Recherche en Informatique et     */
+/*     en Automatique.                                                    */
+/*                                                                        */
+/*   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.          */
+/*                                                                        */
+/**************************************************************************/
+
+#define CAML_INTERNALS
+
+/* A table of all code fragments (main program and dynlinked modules) */
+
+#include <string.h>
+#include <stddef.h>
+#include "caml/codefrag.h"
+#include "caml/misc.h"
+#include "caml/md5.h"
+#include "caml/memory.h"
+#include "caml/skiplist.h"
+
+static struct skiplist code_fragments_by_pc = SKIPLIST_STATIC_INITIALIZER;
+
+static struct skiplist code_fragments_by_num = SKIPLIST_STATIC_INITIALIZER;
+
+static int code_fragments_counter = 0;
+
+int caml_register_code_fragment(char * start, char * end,
+                                enum digest_status digest_kind,
+                                unsigned char * opt_digest)
+{
+  struct code_fragment * cf = caml_stat_alloc(sizeof(struct code_fragment));
+
+  cf->code_start = start;
+  cf->code_end = end;
+  switch (digest_kind) {
+  case DIGEST_LATER:
+    break;
+  case DIGEST_NOW:
+    caml_md5_block(cf->digest, cf->code_start, cf->code_end - cf->code_start);
+    digest_kind = DIGEST_PROVIDED;
+    break;
+  case DIGEST_PROVIDED:
+    memcpy(cf->digest, opt_digest, 16);
+    break;
+  case DIGEST_IGNORE:
+    break;
+  }
+  cf->digest_status = digest_kind;
+  cf->fragnum = code_fragments_counter++;
+  caml_skiplist_insert(&code_fragments_by_pc,
+                       (uintnat) start, (uintnat) cf);
+  caml_skiplist_insert(&code_fragments_by_num,
+                       (uintnat) cf->fragnum, (uintnat) cf);
+  return cf->fragnum;
+}
+
+void caml_remove_code_fragment(struct code_fragment * cf)
+{
+  caml_skiplist_remove(&code_fragments_by_pc, (uintnat) cf->code_start);
+  caml_skiplist_remove(&code_fragments_by_num, cf->fragnum);
+  caml_stat_free(cf);
+}
+
+struct code_fragment * caml_find_code_fragment_by_pc(char *pc)
+{
+  struct code_fragment * cf;
+  uintnat key, data;
+
+  if (caml_skiplist_find_below(&code_fragments_by_pc,
+                               (uintnat) pc, &key, &data)) {
+    cf = (struct code_fragment *) data;
+    CAMLassert(cf->code_start <= pc);
+    if (pc < cf->code_end) return cf;
+  }
+  return NULL;
+}
+
+struct code_fragment * caml_find_code_fragment_by_num(int fragnum)
+{
+  uintnat data;
+  if (caml_skiplist_find(&code_fragments_by_num, fragnum, &data)) {
+    return (struct code_fragment *) data;
+  } else {
+    return NULL;
+  }
+}
+
+unsigned char * caml_digest_of_code_fragment(struct code_fragment * cf)
+{
+  if (cf->digest_status == DIGEST_IGNORE)
+    return NULL;
+  if (cf->digest_status == DIGEST_LATER) {
+    caml_md5_block(cf->digest, cf->code_start, cf->code_end - cf->code_start);
+    cf->digest_status = DIGEST_PROVIDED;
+  }
+  return cf->digest;
+}
+
+struct code_fragment *
+   caml_find_code_fragment_by_digest(unsigned char digest[16])
+{
+  FOREACH_SKIPLIST_ELEMENT(e, &code_fragments_by_pc, {
+    struct code_fragment * cf = (struct code_fragment *) e->data;
+    unsigned char * d = caml_digest_of_code_fragment(cf);
+    if (d != NULL && memcmp(digest, d, 16) == 0) return cf;
+  })
+  return NULL;
+}
index 21a93737cdd30a7136cde2c995b137fd5d6de267..050389e21d524ce6ea18e00c5eb2408493cdfb14 100644 (file)
 #include <string.h>
 
 #include "caml/alloc.h"
+#include "caml/codefrag.h"
 #include "caml/config.h"
 #include "caml/debugger.h"
 #include "caml/misc.h"
 #include "caml/osdeps.h"
+#include "caml/skiplist.h"
 
 int caml_debugger_in_use = 0;
 uintnat caml_event_count;
@@ -96,7 +98,7 @@ static struct channel * dbg_out;/* Output channel on the socket */
 
 static char *dbg_addr = NULL;
 
-static struct ext_table breakpoints_table;
+static struct skiplist event_points_table = SKIPLIST_STATIC_INITIALIZER;
 
 static void open_connection(void)
 {
@@ -198,8 +200,6 @@ void caml_debugger_init(void)
   unsetenv("CAML_DEBUG_SOCKET");
 #endif
 
-  caml_ext_table_init(&breakpoints_table, 16);
-
 #ifdef _WIN32
   winsock_startup();
   (void)atexit(winsock_cleanup);
@@ -281,38 +281,14 @@ static void safe_output_value(struct channel *chan, value val)
   Caml_state->external_raise = saved_external_raise;
 }
 
-struct breakpoint {
-  code_t pc;
-  opcode_t saved;
-};
-
-static struct breakpoint *find_breakpoint(code_t pc)
-{
-  struct breakpoint *bpti;
-  int i;
-
-  for (i = 0; i < breakpoints_table.size; i++) {
-    bpti = (struct breakpoint *) breakpoints_table.contents[i];
-    if (bpti->pc == pc)
-      return bpti;
-  }
-
-  return NULL;
-}
-
 static void save_instruction(code_t pc)
 {
-  struct breakpoint *bpt;
-
-  if (find_breakpoint(pc) != NULL) {
+  uintnat saved;
+  if (caml_skiplist_find(&event_points_table, (uintnat) pc, &saved)) {
     /* Already saved. Nothing to do. */
     return;
   }
-
-  bpt = caml_stat_alloc(sizeof(struct breakpoint));
-  bpt->pc = pc;
-  bpt->saved = *pc;
-  caml_ext_table_add(&breakpoints_table, bpt);
+  caml_skiplist_insert(&event_points_table, (uintnat) pc, *pc);
 }
 
 static void set_instruction(code_t pc, opcode_t opcode)
@@ -323,56 +299,49 @@ static void set_instruction(code_t pc, opcode_t opcode)
 
 static void restore_instruction(code_t pc)
 {
-  struct breakpoint *bpt = find_breakpoint(pc);
-  CAMLassert (bpt != NULL);
-
-  *pc = bpt->saved;
-  caml_ext_table_remove(&breakpoints_table, bpt);
+  CAMLunused_start int found; CAMLunused_end
+  uintnat saved;
+  found = caml_skiplist_find(&event_points_table, (uintnat) pc, &saved);
+  CAMLassert(found);
+  *pc = saved;
+  caml_skiplist_remove(&event_points_table, (uintnat) pc);
 }
 
 static code_t pc_from_pos(int frag, intnat pos)
 {
-  struct code_fragment *cf;
-  CAMLassert (frag >= 0);
-  CAMLassert (frag < caml_code_fragments_table.size);
-  CAMLassert (pos >= 0);
-  CAMLassert (pos < caml_code_size);
-
-  cf = (struct code_fragment *) caml_code_fragments_table.contents[frag];
+  struct code_fragment *cf = caml_find_code_fragment_by_num(frag);
+  CAMLassert(cf != NULL);
   return (code_t) (cf->code_start + pos);
 }
 
 opcode_t caml_debugger_saved_instruction(code_t pc)
 {
-  struct breakpoint *bpt = find_breakpoint(pc);
-  CAMLassert (bpt != NULL);
-
-  return bpt->saved;
+  CAMLunused_start int found; CAMLunused_end
+  uintnat saved;
+  found = caml_skiplist_find(&event_points_table, (uintnat) pc, &saved);
+  CAMLassert(found);
+  return saved;
 }
 
 void caml_debugger_code_unloaded(int index)
 {
   struct code_fragment *cf;
-  struct breakpoint *bpti;
-  int i;
+  char * pc;
 
   if (!caml_debugger_in_use) return;
 
   caml_putch(dbg_out, REP_CODE_UNLOADED);
   caml_putword(dbg_out, index);
 
-  cf = (struct code_fragment *) caml_code_fragments_table.contents[index];
+  cf = caml_find_code_fragment_by_num(index);
+  CAMLassert(cf != NULL);
 
-  for (i = 0; i < breakpoints_table.size; i++) {
-    bpti = (struct breakpoint *) breakpoints_table.contents[i];
-    if ((char*) bpti->pc >= cf->code_start && (char*) bpti->pc < cf->code_end) {
-      caml_ext_table_remove(&breakpoints_table, bpti);
-      /* caml_ext_table_remove has shifted the next element in place
-         of the one we just removed. Decrement i for the next
-         iteration. */
-      i--;
+  FOREACH_SKIPLIST_ELEMENT(elt, &event_points_table, {
+    pc = (char *) elt->key;
+    if (pc >= cf->code_start && pc < cf->code_end) {
+      caml_skiplist_remove(&event_points_table, (uintnat) pc);
     }
-  }
+  })
 }
 
 #define Pc(sp) ((code_t)((sp)[0]))
@@ -385,9 +354,8 @@ void caml_debugger(enum event_kind event, value param)
   value *frame, *newframe;
   intnat i, pos;
   value val;
-  int frag, found = 0;
+  int frag;
   struct code_fragment *cf;
-  (void) found; /* Silence unused variable warning. */
 
   if (dbg_socket == -1) return;  /* Not connected to a debugger. */
 
@@ -435,9 +403,9 @@ void caml_debugger(enum event_kind event, value param)
   caml_putword(dbg_out, caml_event_count);
   if (event == EVENT_COUNT || event == BREAKPOINT) {
     caml_putword(dbg_out, Caml_state->stack_high - frame);
-    found = caml_find_code_fragment((char*) Pc(frame), &frag, &cf);
-    CAMLassert(found);
-    caml_putword(dbg_out, frag);
+    cf = caml_find_code_fragment_by_pc((char*) Pc(frame));
+    CAMLassert(cf != NULL);
+    caml_putword(dbg_out, cf->fragnum);
     caml_putword(dbg_out, (char*) Pc(frame) - cf->code_start);
   } else {
     /* No PC and no stack frame associated with other events */
@@ -500,8 +468,8 @@ void caml_debugger(enum event_kind event, value param)
     case REQ_GET_FRAME:
       caml_putword(dbg_out, Caml_state->stack_high - frame);
       if (frame < Caml_state->stack_high &&
-          caml_find_code_fragment((char*) Pc(frame), &frag, &cf)) {
-        caml_putword(dbg_out, frag);
+          (cf = caml_find_code_fragment_by_pc((char*) Pc(frame))) != NULL) {
+        caml_putword(dbg_out, cf->fragnum);
         caml_putword(dbg_out, (char*) Pc(frame) - cf->code_start);
       } else {
         caml_putword(dbg_out, 0);
@@ -517,12 +485,12 @@ void caml_debugger(enum event_kind event, value param)
       i = caml_getword(dbg_in);
       newframe = frame + Extra_args(frame) + i + 3;
       if (newframe >= Caml_state->stack_high ||
-          !caml_find_code_fragment((char*) Pc(newframe), &frag, &cf)) {
+          (cf = caml_find_code_fragment_by_pc((char *) Pc(newframe))) == NULL) {
         caml_putword(dbg_out, -1);
       } else {
         frame = newframe;
         caml_putword(dbg_out, Caml_state->stack_high - frame);
-        caml_putword(dbg_out, frag);
+        caml_putword(dbg_out, cf->fragnum);
         caml_putword(dbg_out, (char*) Pc(frame) - cf->code_start);
       }
       caml_flush(dbg_out);
@@ -575,9 +543,9 @@ void caml_debugger(enum event_kind event, value param)
       break;
     case REQ_GET_CLOSURE_CODE:
       val = getval(dbg_in);
-      found = caml_find_code_fragment((char*) Code_val(val), &frag, &cf);
-      CAMLassert(found);
-      caml_putword(dbg_out, frag);
+      cf = caml_find_code_fragment_by_pc((char*) Code_val(val));
+      CAMLassert(cf != NULL);
+      caml_putword(dbg_out, cf->fragnum);
       caml_putword(dbg_out, (char*) Code_val(val) - cf->code_start);
       caml_flush(dbg_out);
       break;
@@ -590,7 +558,7 @@ void caml_debugger(enum event_kind event, value param)
 
 void caml_debugger_cleanup_fork(void)
 {
-  /* We could remove all of the breakpoints, but closing the connection
+  /* We could remove all of the event points, but closing the connection
    * means that they'll just be skipped anyway. */
   close_connection();
   caml_debugger_in_use = 0;
index 95626109eee974b4dbf54510cbc3bfb4c7f8425c..0bd2319b0a8eafa576fdfdbf3cd97f71bc266890 100644 (file)
@@ -20,6 +20,7 @@
 #include "caml/memory.h"
 #include "caml/stack.h"
 #include "caml/callback.h"
+#include "caml/codefrag.h"
 #include "caml/alloc.h"
 #include "caml/intext.h"
 #include "caml/osdeps.h"
@@ -100,7 +101,6 @@ CAMLprim value caml_natdynlink_run(value handle_v, value symbol) {
   CAMLlocal1 (result);
   void *sym,*sym2;
   void* handle = Handle_val(handle_v);
-  struct code_fragment * cf;
 
 #define optsym(n) getsym(handle,unit,n)
   const char *unit;
@@ -128,11 +128,8 @@ CAMLprim value caml_natdynlink_run(value handle_v, value symbol) {
   sym2 = optsym("__code_end");
   if (NULL != sym && NULL != sym2) {
     caml_page_table_add(In_code_area, sym, sym2);
-    cf = caml_stat_alloc(sizeof(struct code_fragment));
-    cf->code_start = (char *) sym;
-    cf->code_end = (char *) sym2;
-    cf->digest_computed = 0;
-    caml_ext_table_add(&caml_code_fragments_table, cf);
+    caml_register_code_fragment((char *) sym, (char *) sym2,
+                                DIGEST_LATER, NULL);
   }
 
   if( caml_natdynlink_hook != NULL ) caml_natdynlink_hook(handle,unit);
index 7613e280fcc1093e1706e85a27a9600e2b9c4ec3..440753a263afdfa610c0d1d7b13e7d859e50a98f 100644 (file)
 
 #include <string.h>
 #include "caml/alloc.h"
+#include "caml/codefrag.h"
 #include "caml/config.h"
 #include "caml/custom.h"
 #include "caml/fail.h"
 #include "caml/gc.h"
 #include "caml/intext.h"
 #include "caml/io.h"
-#include "caml/md5.h"
 #include "caml/memory.h"
 #include "caml/misc.h"
 #include "caml/mlvalues.h"
@@ -713,15 +713,15 @@ static void extern_rec(value v)
     }
     }
   }
-  else if (caml_find_code_fragment((char*) v, NULL, &cf)) {
+  else if ((cf = caml_find_code_fragment_by_pc((char*) v)) != NULL) {
+    const char * digest;
     if ((extern_flags & CLOSURES) == 0)
       extern_invalid_argument("output_value: functional value");
-    if (! cf->digest_computed) {
-      caml_md5_block(cf->digest, cf->code_start, cf->code_end - cf->code_start);
-      cf->digest_computed = 1;
-    }
+    digest = (const char *) caml_digest_of_code_fragment(cf);
+    if (digest == NULL)
+      extern_invalid_argument("output_value: private function");
     writecode32(CODE_CODEPOINTER, (char *) v - cf->code_start);
-    writeblock((const char *)cf->digest, 16);
+    writeblock(digest, 16);
   } else {
     extern_invalid_argument("output_value: abstract value (outside heap)");
   }
index 3cfcac49747c3a7658e8e4fc19fa7347d0f43f37..aa059be5dfd769a731d9ddcbc0580f304e695a39 100644 (file)
 #include <io.h>
 #endif
 
+#include "caml/codefrag.h"
 #include "caml/debugger.h"
 #include "caml/fix_code.h"
 #include "caml/instruct.h"
 #include "caml/intext.h"
-#include "caml/md5.h"
 #include "caml/memory.h"
 #include "caml/misc.h"
 #include "caml/mlvalues.h"
 
 code_t caml_start_code;
 asize_t caml_code_size;
-struct ext_table caml_code_fragments_table;
 
 /* Read the main bytecode block from a file */
 
 void caml_init_code_fragments(void) {
-  struct code_fragment * cf;
-  /* Register the code in the table of code fragments */
-  cf = caml_stat_alloc(sizeof(struct code_fragment));
-  cf->code_start = (char *) caml_start_code;
-  cf->code_end = (char *) caml_start_code + caml_code_size;
-  caml_md5_block(cf->digest, caml_start_code, caml_code_size);
-  cf->digest_computed = 1;
-  caml_ext_table_init(&caml_code_fragments_table, 8);
-  caml_ext_table_add(&caml_code_fragments_table, cf);
+  /* Register the main bytecode block in the table of code fragments */
+  caml_register_code_fragment((char *) caml_start_code,
+                              (char *) caml_start_code + caml_code_size,
+                              DIGEST_NOW, NULL);
 }
 
 void caml_load_code(int fd, asize_t len)
index 956cbcbb249d8a43e84c2edd0ad3a12bbbdcbbea..539d6176bc6c3801aa6ef3869078912f4f323fc3 100644 (file)
@@ -471,21 +471,21 @@ CAMLprim value caml_gc_set(value v)
 
   /* These fields were added in 4.08.0. */
   if (Wosize_val (v) >= 11){
-    new_custom_maj = norm_custom_maj (Field (v, 8));
+    new_custom_maj = norm_custom_maj (Long_val (Field (v, 8)));
     if (new_custom_maj != caml_custom_major_ratio){
       caml_custom_major_ratio = new_custom_maj;
       caml_gc_message (0x20, "New custom major ratio: %"
                        ARCH_INTNAT_PRINTF_FORMAT "u%%\n",
                        caml_custom_major_ratio);
     }
-    new_custom_min = norm_custom_min (Field (v, 9));
+    new_custom_min = norm_custom_min (Long_val (Field (v, 9)));
     if (new_custom_min != caml_custom_minor_ratio){
       caml_custom_minor_ratio = new_custom_min;
       caml_gc_message (0x20, "New custom minor ratio: %"
                        ARCH_INTNAT_PRINTF_FORMAT "u%%\n",
                        caml_custom_minor_ratio);
     }
-    new_custom_sz = Field (v, 10);
+    new_custom_sz = Long_val (Field (v, 10));
     if (new_custom_sz != caml_custom_minor_max_bsz){
       caml_custom_minor_max_bsz = new_custom_sz;
       caml_gc_message (0x20, "New custom minor size limit: %"
index 54fc8b8f6735d48e47975dc3e07cf5667c221f37..a55b069bb86d9216e2fa22048885f760a510c943 100644 (file)
 
 /* Registration of global memory roots */
 
-#include "caml/memory.h"
-#include "caml/misc.h"
 #include "caml/mlvalues.h"
 #include "caml/roots.h"
 #include "caml/globroots.h"
+#include "caml/skiplist.h"
 
-/* The sets of global memory roots are represented as skip lists
-   (see William Pugh, "Skip lists: a probabilistic alternative to
-   balanced binary trees", Comm. ACM 33(6), 1990). */
+/* The three global root lists.
+   Each is represented by a skip list with the key being the address
+   of the root.  (The associated data field is unused.) */
 
-struct global_root {
-  value * root;                    /* the address of the root */
-  struct global_root * forward[1]; /* variable-length array */
-};
-
-#define NUM_LEVELS 17
-
-struct global_root_list {
-  value * root;                 /* dummy value for layout compatibility */
-  struct global_root * forward[NUM_LEVELS]; /* forward chaining */
-  int level;                    /* max used level */
-};
-
-/* Generate a random level for a new node: 0 with probability 3/4,
-   1 with probability 3/16, 2 with probability 3/64, etc.
-   We use a simple linear congruential PRNG (see Knuth vol 2) instead
-   of random(), because we need exactly 32 bits of pseudo-random data
-   (i.e. 2 * (NUM_LEVELS - 1)).  Moreover, the congruential PRNG
-   is faster and guaranteed to be deterministic (to reproduce bugs). */
-
-static uint32_t random_seed = 0;
+struct skiplist caml_global_roots = SKIPLIST_STATIC_INITIALIZER;
+                  /* mutable roots, don't know whether old or young */
+struct skiplist caml_global_roots_young = SKIPLIST_STATIC_INITIALIZER;
+                  /* generational roots pointing to minor or major heap */
+struct skiplist caml_global_roots_old = SKIPLIST_STATIC_INITIALIZER;
+                  /* generational roots pointing to major heap */
 
-static int random_level(void)
-{
-  uint32_t r;
-  int level = 0;
-
-  /* Linear congruence with modulus = 2^32, multiplier = 69069
-     (Knuth vol 2 p. 106, line 15 of table 1), additive = 25173. */
-  r = random_seed = random_seed * 69069 + 25173;
-  /* Knuth (vol 2 p. 13) shows that the least significant bits are
-     "less random" than the most significant bits with a modulus of 2^m,
-     so consume most significant bits first */
-  while ((r & 0xC0000000U) == 0xC0000000U) { level++; r = r << 2; }
-  CAMLassert(level < NUM_LEVELS);
-  return level;
-}
+/* The invariant of the generational roots is the following:
+   - If the global root contains a pointer to the minor heap, then the root is
+     in [caml_global_roots_young];
+   - If the global root contains a pointer to the major heap, then the root is
+     in [caml_global_roots_old] or in [caml_global_roots_young];
+   - Otherwise (the root contains a pointer outside of the heap or an integer),
+     then neither [caml_global_roots_young] nor [caml_global_roots_old] contain
+     it.
+*/
 
-/* Insertion in a global root list */
+/* Insertion and deletion */
 
-static void caml_insert_global_root(struct global_root_list * rootlist,
-                                    value * r)
+Caml_inline void caml_insert_global_root(struct skiplist * list, value * r)
 {
-  struct global_root * update[NUM_LEVELS];
-  struct global_root * e, * f;
-  int i, new_level;
-
-  CAMLassert(0 <= rootlist->level && rootlist->level < NUM_LEVELS);
-
-  /* Init "cursor" to list head */
-  e = (struct global_root *) rootlist;
-  /* Find place to insert new node */
-  for (i = rootlist->level; i >= 0; i--) {
-    while (1) {
-      f = e->forward[i];
-      if (f == NULL || f->root >= r) break;
-      e = f;
-    }
-    update[i] = e;
-  }
-  e = e->forward[0];
-  /* If already present, don't do anything */
-  if (e != NULL && e->root == r) return;
-  /* Insert additional element, updating list level if necessary */
-  new_level = random_level();
-  if (new_level > rootlist->level) {
-    for (i = rootlist->level + 1; i <= new_level; i++)
-      update[i] = (struct global_root *) rootlist;
-    rootlist->level = new_level;
-  }
-  e = caml_stat_alloc(sizeof(struct global_root) +
-                      new_level * sizeof(struct global_root *));
-  e->root = r;
-  for (i = 0; i <= new_level; i++) {
-    e->forward[i] = update[i]->forward[i];
-    update[i]->forward[i] = e;
-  }
+  caml_skiplist_insert(list, (uintnat) r, 0);
 }
 
-/* Deletion in a global root list */
-
-static void caml_delete_global_root(struct global_root_list * rootlist,
-                                    value * r)
+Caml_inline void caml_delete_global_root(struct skiplist * list, value * r)
 {
-  struct global_root * update[NUM_LEVELS];
-  struct global_root * e, * f;
-  int i;
-
-  CAMLassert(0 <= rootlist->level && rootlist->level < NUM_LEVELS);
-
-  /* Init "cursor" to list head */
-  e = (struct global_root *) rootlist;
-  /* Find element in list */
-  for (i = rootlist->level; i >= 0; i--) {
-    while (1) {
-      f = e->forward[i];
-      if (f == NULL || f->root >= r) break;
-      e = f;
-    }
-    update[i] = e;
-  }
-  e = e->forward[0];
-  /* If not found, nothing to do */
-  if (e == NULL || e->root != r) return;
-  /* Rebuild list without node */
-  for (i = 0; i <= rootlist->level; i++) {
-    if (update[i]->forward[i] == e)
-      update[i]->forward[i] = e->forward[i];
-  }
-  /* Reclaim list element */
-  caml_stat_free(e);
-  /* Down-correct list level */
-  while (rootlist->level > 0 &&
-         rootlist->forward[rootlist->level] == NULL)
-    rootlist->level--;
+  caml_skiplist_remove(list, (uintnat) r);
 }
 
-/* Iterate over a global root list */
+/* Iterate a GC scanning action over a global root list */
 
 static void caml_iterate_global_roots(scanning_action f,
-                                      struct global_root_list * rootlist)
+                                      struct skiplist * rootlist)
 {
-  struct global_root * gr;
-
-  for (gr = rootlist->forward[0]; gr != NULL; gr = gr->forward[0]) {
-    f(*(gr->root), gr->root);
-  }
-}
-
-/* Empty a global root list */
-
-static void caml_empty_global_roots(struct global_root_list * rootlist)
-{
-  struct global_root * gr, * next;
-  int i;
-
-  CAMLassert(0 <= rootlist->level && rootlist->level < NUM_LEVELS);
-
-  for (gr = rootlist->forward[0]; gr != NULL; /**/) {
-    next = gr->forward[0];
-    caml_stat_free(gr);
-    gr = next;
-  }
-  for (i = 0; i <= rootlist->level; i++) rootlist->forward[i] = NULL;
-  rootlist->level = 0;
+  FOREACH_SKIPLIST_ELEMENT(e, rootlist, {
+      value * r = (value *) (e->key);
+      f(*r, r);
+    })
 }
 
-/* The three global root lists */
-
-struct global_root_list caml_global_roots = { NULL, { NULL, }, 0 };
-                  /* mutable roots, don't know whether old or young */
-struct global_root_list caml_global_roots_young = { NULL, { NULL, }, 0 };
-                 /* generational roots pointing to minor or major heap */
-struct global_root_list caml_global_roots_old = { NULL, { NULL, }, 0 };
-                  /* generational roots pointing to major heap */
-
-/* The invariant of the generational roots is the following:
-   - If the global root contains a pointer to the minor heap, then the root is
-     in [caml_global_roots_young];
-   - If the global root contains a pointer to the major heap, then the root is
-     in [caml_global_roots_old] or in [caml_global_roots_young];
-   - Otherwise (the root contains a pointer outside of the heap or an integer),
-     then neither [caml_global_roots_young] nor [caml_global_roots_old] contain
-     it.
- */
-
 /* Register a global C root of the mutable kind */
 
 CAMLexport void caml_register_global_root(value *r)
@@ -300,14 +173,13 @@ void caml_scan_global_roots(scanning_action f)
 
 void caml_scan_global_young_roots(scanning_action f)
 {
-  struct global_root * gr;
 
   caml_iterate_global_roots(f, &caml_global_roots);
   caml_iterate_global_roots(f, &caml_global_roots_young);
   /* Move young roots to old roots */
-  for (gr = caml_global_roots_young.forward[0];
-       gr != NULL; gr = gr->forward[0]) {
-    caml_insert_global_root(&caml_global_roots_old, gr->root);
-  }
-  caml_empty_global_roots(&caml_global_roots_young);
+  FOREACH_SKIPLIST_ELEMENT(e, &caml_global_roots_young, {
+      value * r = (value *) (e->key);
+      caml_insert_global_root(&caml_global_roots_old, r);
+    });
+  caml_skiplist_empty(&caml_global_roots_young);
 }
index 5d7d3817c017942ab8fbf546c28b46fb93da6513..5f189bacf26d3992cc35451c29fbaf0f2a1abbbe 100644 (file)
 #include <stdio.h>
 #include "caml/alloc.h"
 #include "caml/callback.h"
+#include "caml/codefrag.h"
 #include "caml/config.h"
 #include "caml/custom.h"
 #include "caml/fail.h"
 #include "caml/gc.h"
 #include "caml/intext.h"
 #include "caml/io.h"
-#include "caml/md5.h"
 #include "caml/memory.h"
 #include "caml/memprof.h"
 #include "caml/mlvalues.h"
@@ -953,21 +953,11 @@ CAMLprim value caml_marshal_data_size(value buff, value ofs)
 static char * intern_resolve_code_pointer(unsigned char digest[16],
                                           asize_t offset)
 {
-  int i;
-  for (i = caml_code_fragments_table.size - 1; i >= 0; i--) {
-    struct code_fragment * cf = caml_code_fragments_table.contents[i];
-    if (! cf->digest_computed) {
-      caml_md5_block(cf->digest, cf->code_start, cf->code_end - cf->code_start);
-      cf->digest_computed = 1;
-    }
-    if (memcmp(digest, cf->digest, 16) == 0) {
-      if (cf->code_start + offset < cf->code_end)
-        return cf->code_start + offset;
-      else
-        return NULL;
-    }
-  }
-  return NULL;
+  struct code_fragment * cf = caml_find_code_fragment_by_digest(digest);
+  if (cf != NULL && cf->code_start + offset < cf->code_end)
+    return cf->code_start + offset;
+  else
+    return NULL;
 }
 
 static void intern_bad_code_pointer(unsigned char digest[16])
index aead07a0826af5440c6d4496ef00c0ce0a576739..63ac685fc46e6fc794abd68c59daa4b08e024acc 100644 (file)
@@ -621,7 +621,8 @@ void caml_memprof_renew_minor_sample(void)
     if (Caml_state->young_ptr - Caml_state->young_alloc_start < geom)
       /* No trigger in the current minor heap. */
       caml_memprof_young_trigger = Caml_state->young_alloc_start;
-    caml_memprof_young_trigger = Caml_state->young_ptr - (geom - 1);
+    else
+      caml_memprof_young_trigger = Caml_state->young_ptr - (geom - 1);
   }
 
   caml_update_young_limit();
index 282833287c770971f86c74ae98afb4401962f44c..3cf1222bd0cd577a85e254d7f249dc8b8861571a 100644 (file)
@@ -20,6 +20,7 @@
 #include <string.h>
 #include "caml/alloc.h"
 #include "caml/backtrace_prim.h"
+#include "caml/codefrag.h"
 #include "caml/config.h"
 #include "caml/debugger.h"
 #include "caml/fail.h"
@@ -93,25 +94,26 @@ CAMLprim value caml_reify_bytecode(value ls_prog,
 {
   CAMLparam3(ls_prog, debuginfo, digest_opt);
   CAMLlocal3(clos, bytecode, retval);
-  struct code_fragment * cf = caml_stat_alloc(sizeof(struct code_fragment));
   code_t prog;
   asize_t len;
+  enum digest_status digest_kind;
+  unsigned char * digest;
+  int fragnum;
 
   prog = (code_t)buffer_of_bytes_array(ls_prog, &len);
   caml_add_debug_info(prog, Val_long(len), debuginfo);
-  cf->code_start = (char *) prog;
-  cf->code_end = (char *) prog + len;
   /* match (digest_opt : string option) with */
   if (Is_block(digest_opt)) {
     /* | Some digest -> */
-    memcpy(cf->digest, String_val(Field(digest_opt, 0)), 16);
-    cf->digest_computed = 1;
+    digest_kind = DIGEST_PROVIDED;
+    digest = (unsigned char *) String_val(Field(digest_opt, 0));
   } else {
     /* | None -> */
-    cf->digest_computed = 0;
+    digest_kind = DIGEST_LATER;
+    digest = NULL;
   }
-  caml_ext_table_add(&caml_code_fragments_table, cf);
-
+  fragnum = caml_register_code_fragment((char *) prog, (char *) prog + len,
+                                        digest_kind, digest);
 #ifdef ARCH_BIG_ENDIAN
   caml_fixup_endianness((code_t) prog, len);
 #endif
@@ -121,7 +123,7 @@ CAMLprim value caml_reify_bytecode(value ls_prog,
   caml_prepare_bytecode((code_t) prog, len);
 
   /* Notify debugger after fragment gets added and reified. */
-  caml_debugger(CODE_LOADED, Val_long(caml_code_fragments_table.size - 1));
+  caml_debugger(CODE_LOADED, Val_long(fragnum));
 
   clos = caml_alloc_small (1, Closure_tag);
   Code_val(clos) = (code_t) prog;
@@ -142,21 +144,19 @@ CAMLprim value caml_static_release_bytecode(value bc)
 {
   code_t prog;
   asize_t len;
-  int found, index;
   struct code_fragment *cf;
 
   prog = Bytecode_val(bc)->prog;
   len = Bytecode_val(bc)->len;
   caml_remove_debug_info(prog);
 
-  found = caml_find_code_fragment((char*) prog, &index, &cf);
-  /* Not matched with a caml_reify_bytecode call; impossible. */
-  CAMLassert(found); (void) found; /* Silence unused variable warning. */
+  cf = caml_find_code_fragment_by_pc((char *) prog);
+  CAMLassert(cf != NULL);
 
   /* Notify debugger before the fragment gets destroyed. */
-  caml_debugger(CODE_UNLOADED, Val_long(index));
+  caml_debugger(CODE_UNLOADED, Val_long(cf->fragnum));
 
-  caml_ext_table_remove(&caml_code_fragments_table, cf);
+  caml_remove_code_fragment(cf);
 
 #ifndef NATIVE_CODE
   caml_release_bytecode(prog, len);
index b8661bc7e290f7dab747066cf41d67a2e2578910..a3aeec4a95724359d84abc3a5297161acb12801a 100644 (file)
@@ -173,8 +173,8 @@ void caml_set_minor_heap_size (asize_t bsz)
   Caml_state->young_alloc_mid =
     Caml_state->young_alloc_start + Wsize_bsize (bsz) / 2;
   Caml_state->young_alloc_end = Caml_state->young_end;
+  /* caml_update_young_limit called by caml_memprof_renew_minor_sample */
   Caml_state->young_trigger = Caml_state->young_alloc_start;
-  caml_update_young_limit();
   Caml_state->young_ptr = Caml_state->young_alloc_end;
   Caml_state->minor_heap_wsz = Wsize_bsize (bsz);
   caml_memprof_renew_minor_sample();
index 8aa0d090383f3798720af50c4eb96eada4f12cbe..397bd7cff3833360f1f108faf3cdb2f4beccf448 100644 (file)
@@ -205,19 +205,3 @@ int caml_runtime_warnings_active(void)
   }
   return 1;
 }
-
-int caml_find_code_fragment(char *pc, int *index, struct code_fragment **cf)
-{
-  struct code_fragment *cfi;
-  int i;
-
-  for (i = 0; i < caml_code_fragments_table.size; i++) {
-    cfi = (struct code_fragment *) caml_code_fragments_table.contents[i];
-    if ((char*) pc >= cfi->code_start && (char*) pc < cfi->code_end) {
-      if (index != NULL) *index = i;
-      if (cf != NULL) *cf = cfi;
-      return 1;
-    }
-  }
-  return 0;
-}
index 57bb3fc7122f57cbb8779b32841cd951f09ade74..8f60e5a5b4b15c23cf885f3b33bc2a445a6c834b 100644 (file)
@@ -267,6 +267,11 @@ value caml_execute_signal_exn(int signal_number, int in_signal_handler)
 
 void caml_update_young_limit (void)
 {
+  CAMLassert(Caml_state->young_alloc_start <= caml_memprof_young_trigger &&
+             caml_memprof_young_trigger <= Caml_state->young_alloc_end);
+  CAMLassert(Caml_state->young_alloc_start <= Caml_state->young_trigger &&
+             Caml_state->young_trigger < Caml_state->young_alloc_end);
+
   /* The minor heap grows downwards. The first trigger is the largest one. */
   Caml_state->young_limit =
     caml_memprof_young_trigger < Caml_state->young_trigger ?
diff --git a/runtime/skiplist.c b/runtime/skiplist.c
new file mode 100644 (file)
index 0000000..f81d520
--- /dev/null
@@ -0,0 +1,206 @@
+/**************************************************************************/
+/*                                                                        */
+/*                                 OCaml                                  */
+/*                                                                        */
+/*             Xavier Leroy, projet Cambium, INRIA Paris                  */
+/*                                                                        */
+/*   Copyright 2020 Institut National de Recherche en Informatique et     */
+/*     en Automatique.                                                    */
+/*                                                                        */
+/*   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.          */
+/*                                                                        */
+/**************************************************************************/
+
+#define CAML_INTERNALS
+
+/* A dictionary data structure implemented as skip lists
+   (see William Pugh, "Skip lists: a probabilistic alternative to
+   balanced binary trees", Comm. ACM 33(6), 1990). */
+
+#include <stddef.h>
+#include "caml/config.h"
+#include "caml/memory.h"
+#include "caml/misc.h"
+#include "caml/skiplist.h"
+
+/* Size of struct skipcell, in bytes, without the forward array */
+#if (__STDC_VERSION__ >= 199901L)
+#define SIZEOF_SKIPCELL sizeof(struct skipcell)
+#else
+#define SIZEOF_SKIPCELL (sizeof(struct skipcell) - sizeof(struct skipcell *))
+#endif
+
+/* Generate a random level for a new node: 0 with probability 3/4,
+   1 with probability 3/16, 2 with probability 3/64, etc.
+   We use a simple linear congruential PRNG (see Knuth vol 2) instead
+   of random(), because we need exactly 32 bits of pseudo-random data
+   (i.e. 2 * (NUM_LEVELS - 1)).  Moreover, the congruential PRNG
+   is faster and guaranteed to be deterministic (to reproduce bugs). */
+
+static uint32_t random_seed = 0;
+
+static int random_level(void)
+{
+  uint32_t r;
+  int level = 0;
+
+  /* Linear congruence with modulus = 2^32, multiplier = 69069
+     (Knuth vol 2 p. 106, line 15 of table 1), additive = 25173. */
+  r = random_seed = random_seed * 69069 + 25173;
+  /* Knuth (vol 2 p. 13) shows that the least significant bits are
+     "less random" than the most significant bits with a modulus of 2^m,
+     so consume most significant bits first */
+  while ((r & 0xC0000000U) == 0xC0000000U) { level++; r = r << 2; }
+  CAMLassert(level < NUM_LEVELS);
+  return level;
+}
+
+/* Initialize a skip list */
+
+void caml_skiplist_init(struct skiplist * sk)
+{
+  int i;
+  for (i = 0; i < NUM_LEVELS; i++) sk->forward[i] = NULL;
+  sk->level = 0;
+}
+
+/* Search a skip list */
+
+int caml_skiplist_find(struct skiplist * sk, uintnat key, uintnat * data)
+{
+  int i;
+  struct skipcell ** e, * f;
+
+  e = sk->forward;
+  for (i = sk->level; i >= 0; i--) {
+    while (1) {
+      f = e[i];
+      if (f == NULL || f->key > key) break;
+      if (f->key == key) {
+        *data = f->data;
+        return 1;
+      }
+      e = f->forward;
+    }
+  }
+  return 0;
+}
+
+int caml_skiplist_find_below(struct skiplist * sk, uintnat k,
+                             uintnat * key, uintnat * data)
+{
+  int i;
+  struct skipcell ** e, * f, * last = NULL;
+
+  e = sk->forward;
+  for (i = sk->level; i >= 0; i--) {
+    while (1) {
+      f = e[i];
+      if (f == NULL || f->key > k) break;
+      last = f;
+      e = f->forward;
+    }
+  }
+  if (!last) {
+    return 0;
+  } else {
+    *key = last-> key; *data = last->data; return 1;
+  }
+}
+
+/* Insertion in a skip list */
+
+int caml_skiplist_insert(struct skiplist * sk,
+                         uintnat key, uintnat data)
+{
+  struct skipcell ** update[NUM_LEVELS];
+  struct skipcell ** e, * f;
+  int i, new_level;
+
+  /* Init "cursor" to list head */
+  e = sk->forward;
+  /* Find place to insert new node */
+  for (i = sk->level; i >= 0; i--) {
+    while (1) {
+      f = e[i];
+      if (f == NULL || f->key >= key) break;
+      e = f->forward;
+    }
+    update[i] = &e[i];
+  }
+  f = e[0];
+  /* If already present, update data */
+  if (f != NULL && f->key == key) {
+    f->data = data;
+    return 1;
+  }
+  /* Insert additional element, updating list level if necessary */
+  new_level = random_level();
+  if (new_level > sk->level) {
+    for (i = sk->level + 1; i <= new_level; i++)
+      update[i] = &sk->forward[i];
+    sk->level = new_level;
+  }
+  f = caml_stat_alloc(SIZEOF_SKIPCELL +
+                      (new_level + 1) * sizeof(struct skipcell *));
+  f->key = key;
+  f->data = data;
+  for (i = 0; i <= new_level; i++) {
+    f->forward[i] = *update[i];
+    *update[i] = f;
+  }
+  return 0;
+}
+
+/* Deletion in a skip list */
+
+int caml_skiplist_remove(struct skiplist * sk, uintnat key)
+{
+  struct skipcell ** update[NUM_LEVELS];
+  struct skipcell ** e, * f;
+  int i;
+
+  /* Init "cursor" to list head */
+  e = sk->forward;
+  /* Find element in list */
+  for (i = sk->level; i >= 0; i--) {
+    while (1) {
+      f = e[i];
+      if (f == NULL || f->key >= key) break;
+      e = f->forward;
+    }
+    update[i] = &e[i];
+  }
+  f = e[0];
+  /* If not found, nothing to do */
+  if (f == NULL || f->key != key) return 0;
+  /* Rebuild list without node */
+  for (i = 0; i <= sk->level; i++) {
+    if (*update[i] == f)
+      *update[i] = f->forward[i];
+  }
+  /* Reclaim list element */
+  caml_stat_free(f);
+  /* Down-correct list level */
+  while (sk->level > 0 &&
+         sk->forward[sk->level] == NULL)
+    sk->level--;
+  return 1;
+}
+
+/* Empty a skip list */
+
+void caml_skiplist_empty(struct skiplist * sk)
+{
+  struct skipcell * e, * next;
+  int i;
+
+  for (e = sk->forward[0]; e != NULL; e = next) {
+    next = e->forward[0];
+    caml_stat_free(e);
+  }
+  for (i = 0; i <= sk->level; i++) sk->forward[i] = NULL;
+  sk->level = 0;
+}
index 725598f6029e41707879c83e87128353fbac388c..444264bf810dbe6ff8a4d0b680f7bcc5e53a748c 100644 (file)
@@ -22,6 +22,7 @@
 #include "caml/callback.h"
 #include "caml/backtrace.h"
 #include "caml/custom.h"
+#include "caml/codefrag.h"
 #include "caml/debugger.h"
 #include "caml/domain.h"
 #include "caml/eventlog.h"
@@ -47,7 +48,6 @@
 
 extern int caml_parser_trace;
 char * caml_code_area_start, * caml_code_area_end;
-struct ext_table caml_code_fragments_table;
 
 /* Initialize the atom table and the static data and code area limits. */
 
@@ -57,7 +57,6 @@ static void init_static(void)
 {
   extern struct segment caml_data_segments[], caml_code_segments[];
   int i;
-  struct code_fragment * cf;
 
   caml_init_atom_table ();
 
@@ -79,12 +78,9 @@ static void init_static(void)
       caml_code_area_end = caml_code_segments[i].end;
   }
   /* Register the code in the table of code fragments */
-  cf = caml_stat_alloc(sizeof(struct code_fragment));
-  cf->code_start = caml_code_area_start;
-  cf->code_end = caml_code_area_end;
-  cf->digest_computed = 0;
-  caml_ext_table_init(&caml_code_fragments_table, 8);
-  caml_ext_table_add(&caml_code_fragments_table, cf);
+  caml_register_code_fragment(caml_code_area_start,
+                              caml_code_area_end,
+                              DIGEST_LATER, NULL);
 }
 
 /* These are termination hooks used by the systhreads library */
index c06736ea3359834da089f7e8f8cc56b5b6a16b40..0f080ad3e19afed8cfd9269ebffb9b4cf54823d0 100644 (file)
@@ -12,25 +12,33 @@ include systhreads
 open Printf
 open Event
 
-type account = int channel * int channel
+type account = {
+  get: int channel;
+  put: int channel;
+  stop: unit channel
+  }
 
-let account (put_ch, get_ch) =
+let account a =
   let rec acc balance =
     select [
-      wrap (send get_ch balance) (fun () -> acc balance);
-      wrap (receive put_ch) (fun amount ->
+      wrap (send a.get balance) (fun () -> acc balance);
+      wrap (receive a.put) (fun amount ->
         if balance + amount < 0 then failwith "negative balance";
-        acc (balance + amount))
+        acc (balance + amount));
+      wrap (receive a.stop) (fun _ -> ())
     ]
   in acc 0
 
-let get ((put_ch, get_ch): account) = sync (receive get_ch)
-let put ((put_ch, get_ch): account) amount = sync (send put_ch amount)
+let get a = sync (receive a.get)
+let put a amount = sync (send a.put amount)
+let stop a = sync (send a.stop ())
 
 let _ =
-  let a : account = (new_channel(), new_channel()) in
-  ignore (Thread.create account a);
+  let a = { get = new_channel(); put = new_channel(); stop = new_channel() } in
+  let th = Thread.create account a in
   put a 100;
   printf "Current balance: %d\n" (get a);
   for i = 1 to 99 do put a (-2); put a 1 done;
-  printf "Final balance: %d\n" (get a)
+  printf "Final balance: %d\n" (get a);
+  stop a;
+  Thread.join th
index 71d7f62ece5af1e452702bc4bba96b318c620be8..d4cdd447e1e26c4f9a30fc9f42e7de727982d50d 100644 (file)
@@ -1,12 +1,24 @@
 (* TEST
 
+script = "sh ${test_source_directory}/test-runtime-cleanup.sh"
+
 * hassysthreads
 include systhreads
-** bytecode
-** native
+** script
+*** bytecode
+output = "${test_build_directory}/program-output"
+stdout = "${output}"
+*** native
+output = "${test_build_directory}/program-output"
+stdout = "${output}"
 
 *)
 
+(* This test is skipped in "runtime cleanup at exit" mode
+   (OCAMLRUNPARAM contains c=1) because the cleanup in the main thread
+   destroys condition variables that are waited for by other threads,
+   causing a deadlock on some systems. *)
+
 let sieve primes =
   Event.sync (Event.send primes 2);
   let integers = Event.new_channel () in
diff --git a/testsuite/tests/lib-threads/test-runtime-cleanup.sh b/testsuite/tests/lib-threads/test-runtime-cleanup.sh
new file mode 100755 (executable)
index 0000000..bdfe221
--- /dev/null
@@ -0,0 +1,7 @@
+#!/bin/sh
+case "$OCAMLRUNPARAM" in
+  c=1|c=1,*|*,c=1|*,c=1,*)
+    echo "runtime cleans up at exit" > ${ocamltest_response};
+    exit ${TEST_SKIP};;
+  *) exit ${TEST_PASS};;
+esac
diff --git a/testsuite/tests/regression/pr9326/gc_set.ml b/testsuite/tests/regression/pr9326/gc_set.ml
new file mode 100644 (file)
index 0000000..e9d7dbc
--- /dev/null
@@ -0,0 +1,35 @@
+(* TEST
+*)
+
+open Gc
+
+let min_heap_sz = 524288 (* 512k *)
+let maj_heap_inc = 4194304 (* 4M *)
+
+let _ =
+  let g1 = Gc.get() in
+  (* Do not use { g1 with ... }, so that the code will break if more fields
+     are added to the Gc.control record type *)
+  Gc.set { minor_heap_size = min_heap_sz;
+           major_heap_increment = maj_heap_inc;
+           space_overhead = g1.space_overhead;
+           verbose = g1.verbose;
+           max_overhead = g1.max_overhead;
+           stack_limit = g1.stack_limit;
+           allocation_policy = g1.allocation_policy;
+           window_size = g1.window_size;
+           custom_major_ratio = g1.custom_major_ratio;
+           custom_minor_ratio = g1.custom_minor_ratio;
+           custom_minor_max_size = g1.custom_minor_max_size };
+  let g2 = Gc.get() in
+  assert (g2.minor_heap_size = min_heap_sz);
+  assert (g2.major_heap_increment = maj_heap_inc);
+  assert (g2.space_overhead = g1.space_overhead);
+  assert (g2.verbose = g1.verbose);
+  assert (g2.max_overhead = g1.max_overhead);
+  assert (g2.stack_limit = g1.stack_limit);
+  assert (g2.allocation_policy = g1.allocation_policy);
+  assert (g2.window_size = g1.window_size);
+  assert (g2.custom_major_ratio = g1.custom_major_ratio);
+  assert (g2.custom_minor_ratio = g1.custom_minor_ratio);
+  assert (g2.custom_minor_max_size = g1.custom_minor_max_size)
index 7efb00ae82d0217153d4bad47b61a49cec8d0881..3a1c8c9198204b33bf0d3a22e6b13ea555905c55 100644 (file)
@@ -1,74 +1,74 @@
 -----------
-Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 19, characters 30-53
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 21, characters 30-53
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 22, characters 30-76
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 24, characters 30-76
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 27, characters 12-66
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 29, characters 12-66
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 30, characters 30-60
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 32, characters 30-60
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 33, characters 30-55
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 35, characters 30-55
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 37, characters 12-62
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 39, characters 12-62
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 40, characters 22-27
-Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 30-65
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 22-27
+Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 44, characters 30-65
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 45, characters 30-69
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 47, characters 30-69
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 48, characters 30-73
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 50, characters 30-73
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 52, characters 30-43
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 54, characters 30-43
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.get0 in file "callstacks.ml", line 55, characters 28-33
-Called from Callstacks.getfloatfield in file "callstacks.ml", line 57, characters 30-47
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.get0 in file "callstacks.ml", line 57, characters 28-33
+Called from Callstacks.getfloatfield in file "callstacks.ml", line 59, characters 30-47
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
 Raised by primitive operation at Stdlib__marshal.from_bytes in file "marshal.ml", line 61, characters 9-35
-Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 63, characters 12-87
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 65, characters 12-87
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 66, characters 30-59
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 68, characters 30-59
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 69, characters 37-43
-Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 71, characters 30-49
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 71, characters 37-43
+Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 73, characters 30-49
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
index 758d01dc0588a3f7fc2f62fc0e00d93c1cdbe322..e7c29ceaaaa7b66898405cc9abd7cd1770c851f6 100644 (file)
@@ -2,15 +2,17 @@
    flags = "-g -w -5"
    compare_programs = "false"
 
-   * flat-float-array
-     reference = "${test_source_directory}/callstacks.flat-float-array.reference"
-   ** native
-   ** bytecode
-
-   * no-flat-float-array
-     reference = "${test_source_directory}/callstacks.no-flat-float-array.reference"
-   ** native
-   ** bytecode
+   * no-spacetime
+
+   ** flat-float-array
+      reference = "${test_source_directory}/callstacks.flat-float-array.reference"
+   *** native
+   *** bytecode
+
+   ** no-flat-float-array
+      reference = "${test_source_directory}/callstacks.no-flat-float-array.reference"
+   *** native
+   *** bytecode
 *)
 
 open Gc.Memprof
index 789f534182751e7cf892b82863f4216b89d0fcb2..bd7bd19305198e00c1d5c6f0a94c8bd5ab3b69c5 100644 (file)
@@ -1,70 +1,70 @@
 -----------
-Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 19, characters 30-53
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 21, characters 30-53
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 22, characters 30-76
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 24, characters 30-76
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 27, characters 12-66
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 29, characters 12-66
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 30, characters 30-60
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 32, characters 30-60
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 33, characters 30-55
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 35, characters 30-55
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 37, characters 12-62
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 39, characters 12-62
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 40, characters 22-27
-Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 30-65
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 22-27
+Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 44, characters 30-65
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 45, characters 30-69
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 47, characters 30-69
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 48, characters 30-73
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 50, characters 30-73
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 52, characters 30-43
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 54, characters 30-43
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
 No callstack
 -----------
 Raised by primitive operation at Stdlib__marshal.from_bytes in file "marshal.ml", line 61, characters 9-35
-Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 63, characters 12-87
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 65, characters 12-87
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 66, characters 30-59
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 68, characters 30-59
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
 -----------
-Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 69, characters 37-43
-Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 71, characters 30-49
-Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10
+Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 71, characters 37-43
+Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 73, characters 30-49
+Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Callstacks in file "callstacks.ml", line 100, characters 2-27
+Called from Callstacks in file "callstacks.ml", line 102, characters 2-27
index 31dce2d0cffe690f253f4da8eb714e2dcaa568c1..aa6736eff1374f5e01768855adfaaecbfecdb07d 100644 (file)
@@ -1,49 +1,49 @@
 2: 0.42 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 3: 0.42 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 4: 0.42 true
-Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 12, characters 11-20
-Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 13, characters 11-20
+Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 2: 0.01 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 3: 0.01 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 4: 0.01 true
-Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 12, characters 11-20
-Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 13, characters 11-20
+Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 2: 0.83 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 3: 0.83 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 4: 0.83 true
-Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 12, characters 11-20
-Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 13, characters 11-20
+Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 OK
index 716883d8a529fbc651dffed96b8e888fea7d7b90..f3c712f49fa4401eb5cbde545791b0c978652572 100644 (file)
@@ -1,10 +1,11 @@
 (* TEST
    flags = "-g"
-   * bytecode
-     reference = "${test_source_directory}/comballoc.byte.reference"
-   * native
-     reference = "${test_source_directory}/comballoc.opt.reference"
-     compare_programs = "false"
+   * no-spacetime
+   ** bytecode
+      reference = "${test_source_directory}/comballoc.byte.reference"
+   ** native
+      reference = "${test_source_directory}/comballoc.opt.reference"
+      compare_programs = "false"
 *)
 
 open Gc.Memprof
index 9fbeb6a7874fe55172b70d304a95ca83e0478361..ffe09c663eb59e9816252f20894ae1437ff1845a 100644 (file)
@@ -1,49 +1,49 @@
 2: 0.42 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 3: 0.42 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 4: 0.42 true
-Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 12, characters 11-20
-Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 13, characters 11-20
+Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 2: 0.01 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 3: 0.01 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 4: 0.01 true
-Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 12, characters 11-20
-Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 13, characters 11-20
+Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 2: 0.83 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 3: 0.83 false
-Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 4: 0.83 true
-Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 12, characters 11-20
-Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17
-Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48
+Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 13, characters 11-20
+Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17
+Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48
 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15
-Called from Comballoc in file "comballoc.ml", line 70, characters 2-35
+Called from Comballoc in file "comballoc.ml", line 71, characters 2-35
 OK
index 0c5dbf551678bbd52aa970aaa5eb8ff2f770e78f..da85b9ec1291a14e570af2d3f9e9d618583c9f03 100644 (file)
@@ -187,6 +187,30 @@ let get_num : type a. a foo -> a -> a option = fun f i1 ->
 val get_num : 'a foo -> 'a -> 'a option = <fun>
 |}]
 
+(* Extensions can have inline records (regression test for #9970) *)
+type _ inline = ..
+type 'a inline += X of {x : 'a}
+;;
+[%%expect {|
+type _ inline = ..
+type 'a inline += X of { x : 'a; }
+|}]
+
+let _ = X {x = 1};;
+[%%expect {|
+- : int inline = X {x = <poly>}
+|}]
+
+let must_be_polymorphic = fun x -> X {x};;
+[%%expect {|
+val must_be_polymorphic : 'a -> 'a inline = <fun>
+|}]
+
+let must_be_polymorphic : 'a . 'a -> 'a inline = fun x -> X {x};;
+[%%expect {|
+val must_be_polymorphic : 'a -> 'a inline = <fun>
+|}]
+
 (* Extensions must obey constraints *)
 
 type 'a foo = .. constraint 'a = [> `Var ]
index 6e993a1453e0a66d76ff48eafabc501fc96ef152..95476e7bb22b8d425a8597f64804b4ac501e7a41 100755 (executable)
@@ -106,6 +106,10 @@ case "${OCAML_ARCH}" in
     . "$HOME/.profile"
     . "$HOME/.msenv64"
   ;;
+  solaris)
+    echo OCaml 4.11 does not support Solaris. Exiting.
+    exit
+  ;;
   *) arch_error;;
 esac
 
index 3e6864780fd7c77dce35d977b7bc8e66fde6ee77..a33e3d3b661aad009a8851cdb69fbd5b9822f0d0 100755 (executable)
@@ -78,6 +78,10 @@ case "${OCAML_ARCH}" in
   linux) ;;
   cygwin|cygwin64|mingw|mingw64|msvc|msvc64)
     error "Don't run this test under Windows";;
+  solaris)
+    echo OCaml 4.11 does not support Solaris. Exiting.
+    exit
+  ;;
   *) arch_error;;
 esac
 
index 99fb466761bbebb5284bc9c09f997cbee8f27697..3404c99c9a42b936b9778b81bc5f57492138b751 100755 (executable)
@@ -86,6 +86,10 @@ case "${OCAML_ARCH}" in
     . "$HOME/.profile"
     . "$HOME/.msenv64"
   ;;
+  solaris)
+    echo OCaml 4.11 does not support Solaris. Exiting.
+    exit
+  ;;
   *) arch_error;;
 esac
 
index d38a14230406ff98ddc39a9ab3da1c1e4c48b631..e9e0cfa62cd518c583675f9a3aa807b2e338365d 100644 (file)
@@ -945,9 +945,8 @@ let transl_type_decl env rec_flag sdecl_list =
 
 (* Translating type extensions *)
 
-let transl_extension_constructor env type_path type_params
+let transl_extension_constructor ~scope env type_path type_params
                                  typext_params priv sext =
-  let scope = Ctype.create_scope () in
   let id = Ident.create_scoped ~scope sext.pext_name.txt in
   let args, ret_type, kind =
     match sext.pext_kind with
@@ -1060,10 +1059,10 @@ let transl_extension_constructor env type_path type_params
       Typedtree.ext_loc = sext.pext_loc;
       Typedtree.ext_attributes = sext.pext_attributes; }
 
-let transl_extension_constructor env type_path type_params
+let transl_extension_constructor ~scope env type_path type_params
     typext_params priv sext =
   Builtin_attributes.warning_scope sext.pext_attributes
-    (fun () -> transl_extension_constructor env type_path type_params
+    (fun () -> transl_extension_constructor ~scope env type_path type_params
         typext_params priv sext)
 
 let is_rebind ext =
@@ -1072,6 +1071,9 @@ let is_rebind ext =
   | Text_decl _ -> false
 
 let transl_type_extension extend env loc styext =
+  (* Note: it would be incorrect to call [create_scope] *after*
+     [reset_type_variables] or after [begin_def] (see #10010). *)
+  let scope = Ctype.create_scope () in
   reset_type_variables();
   Ctype.begin_def();
   let type_path, type_decl =
@@ -1124,7 +1126,7 @@ let transl_type_extension extend env loc styext =
     (Ctype.instance_list type_decl.type_params)
     type_params;
   let constructors =
-    List.map (transl_extension_constructor env type_path
+    List.map (transl_extension_constructor ~scope env type_path
                type_decl.type_params type_params styext.ptyext_private)
       styext.ptyext_constructors
   in
@@ -1180,10 +1182,11 @@ let transl_type_extension extend env loc styext =
     (fun () -> transl_type_extension extend env loc styext)
 
 let transl_exception env sext =
+  let scope = Ctype.create_scope () in
   reset_type_variables();
   Ctype.begin_def();
   let ext =
-    transl_extension_constructor env
+    transl_extension_constructor ~scope env
       Predef.path_exn [] [] Asttypes.Public sext
   in
   Ctype.end_def();