+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)
-----------------------------
(Florian Angeletti, review by Thomas Refis)
OCaml 4.11.0 (19 August 2020)
----------------------------
+-----------------------------
(Changes that can break existing programs are marked with a "*")
- #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)
----------------------------
-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
| 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");
| 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;
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>.
#
# 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'
# 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]...
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
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.
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 $@
-{ $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
-VERSION=4.11.1
+VERSION=4.11.2
# Note: This is present for the flexdll bootstrap where it exposed as the old
*) :
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" ;; #(
*) :
-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)" ;; #(
*) :
ocamldoc=ocamldoc
fi
-case $enable_ocamltest,4.11.1 in #(
+case $enable_ocamltest,4.11.2 in #(
yes,*|,*+dev*) :
ocamltest='ocamltest' ;; #(
*) :
# 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
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\\"
-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])])],
| _ -> 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 *)
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)
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)
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
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}
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 \
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 \
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
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 \
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 \
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 \
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 \
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 \
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
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 \
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 \
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 \
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 \
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 \
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
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 \
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 \
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 \
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 \
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 \
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
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 \
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 \
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 \
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 \
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
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 \
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 \
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 \
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 \
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
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 \
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 \
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 \
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 \
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
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 \
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 \
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 \
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 \
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
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 \
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 \
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 \
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 \
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
#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
--- /dev/null
+/**************************************************************************/
+/* */
+/* 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
#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
# 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
--- /dev/null
+/**************************************************************************/
+/* */
+/* 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
--- /dev/null
+/**************************************************************************/
+/* */
+/* 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;
+}
#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;
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)
{
unsetenv("CAML_DEBUG_SOCKET");
#endif
- caml_ext_table_init(&breakpoints_table, 16);
-
#ifdef _WIN32
winsock_startup();
(void)atexit(winsock_cleanup);
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)
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]))
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. */
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 */
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);
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);
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;
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;
#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"
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;
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);
#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"
}
}
}
- 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)");
}
#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)
/* 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: %"
/* 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)
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);
}
#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"
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])
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();
#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"
{
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
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;
{
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);
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();
}
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;
-}
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 ?
--- /dev/null
+/**************************************************************************/
+/* */
+/* 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;
+}
#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"
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. */
{
extern struct segment caml_data_segments[], caml_code_segments[];
int i;
- struct code_fragment * cf;
caml_init_atom_table ();
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 */
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
(* 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
--- /dev/null
+#!/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
--- /dev/null
+(* 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)
-----------
-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
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
-----------
-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
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
(* 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
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
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 ]
. "$HOME/.profile"
. "$HOME/.msenv64"
;;
+ solaris)
+ echo OCaml 4.11 does not support Solaris. Exiting.
+ exit
+ ;;
*) arch_error;;
esac
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
. "$HOME/.profile"
. "$HOME/.msenv64"
;;
+ solaris)
+ echo OCaml 4.11 does not support Solaris. Exiting.
+ exit
+ ;;
*) arch_error;;
esac
(* 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
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 =
| 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 =
(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
(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();