From 9beaf662dd8adb2268726cb87ff405ce798ff0c5 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Tue, 21 Dec 2021 13:47:11 +0100 Subject: [PATCH] New upstream version 4.11.2 --- Changes | 67 ++- VERSION | 2 +- asmcomp/amd64/emit.mlp | 5 +- boot/ocamlc | Bin 2754789 -> 2754885 bytes boot/ocamllex | Bin 340174 -> 340174 bytes configure | 30 +- configure.ac | 2 +- lambda/translcore.ml | 32 +- ocaml-variants.opam | 6 +- runtime/.depend | 516 ++++++++++-------- runtime/Makefile | 5 +- runtime/amd64.S | 2 +- runtime/caml/codefrag.h | 80 +++ runtime/caml/config.h | 13 + runtime/caml/misc.h | 12 - runtime/caml/skiplist.h | 102 ++++ runtime/codefrag.c | 115 ++++ runtime/debugger.c | 110 ++-- runtime/dynlink_nat.c | 9 +- runtime/extern.c | 14 +- runtime/fix_code.c | 16 +- runtime/gc_ctrl.c | 6 +- runtime/globroots.c | 198 ++----- runtime/intern.c | 22 +- runtime/memprof.c | 3 +- runtime/meta.c | 30 +- runtime/minor_gc.c | 2 +- runtime/misc.c | 16 - runtime/signals.c | 5 + runtime/skiplist.c | 206 +++++++ runtime/startup_nat.c | 12 +- testsuite/tests/lib-threads/bank.ml | 28 +- testsuite/tests/lib-threads/sieve.ml | 16 +- .../tests/lib-threads/test-runtime-cleanup.sh | 7 + testsuite/tests/regression/pr9326/gc_set.ml | 35 ++ .../callstacks.flat-float-array.reference | 90 +-- testsuite/tests/statmemprof/callstacks.ml | 20 +- .../callstacks.no-flat-float-array.reference | 82 +-- .../statmemprof/comballoc.byte.reference | 60 +- testsuite/tests/statmemprof/comballoc.ml | 11 +- .../tests/statmemprof/comballoc.opt.reference | 60 +- .../tests/typing-extensions/extensions.ml | 24 + tools/ci/inria/bootstrap | 4 + tools/ci/inria/extra-checks | 4 + tools/ci/inria/main | 4 + typing/typedecl.ml | 15 +- 46 files changed, 1330 insertions(+), 768 deletions(-) create mode 100644 runtime/caml/codefrag.h create mode 100644 runtime/caml/skiplist.h create mode 100644 runtime/codefrag.c create mode 100644 runtime/skiplist.c create mode 100755 testsuite/tests/lib-threads/test-runtime-cleanup.sh create mode 100644 testsuite/tests/regression/pr9326/gc_set.ml diff --git a/Changes b/Changes index 62e58bd5..880c0125 100644 --- a/Changes +++ b/Changes @@ -1,3 +1,58 @@ +OCaml 4.11 maintenance branch +----------------------------- + + +OCaml 4.11.2 (24 February 2021) +------------------------------- + +### Build system: + +- #9938, #9939: Define __USE_MINGW_ANSI_STDIO=0 for the mingw-w64 ports to + prevent their C99-compliant snprintf conflicting with ours. + (David Allsopp, report by Michael Soegtrop, review by Xavier Leroy) + +### Runtime system: + +- #10056: Memprof: ensure young_trigger is within the bounds of the minor + heap in caml_memprof_renew_minor_sample (regression from #8684) + (David Allsopp, review by Guillaume Munch-Maccagnoni and + Jacques-Henri Jourdan) + +- #9654: More efficient management of code fragments. + (Xavier Leroy, review by Jacques-Henri Jourdan, Damien Doligez, and + Stephen Dolan) + +### Tools: + +- #9606, #9635, #9637: fix performance regression in the debugger + (behaviors quadratic in the size of the debugged program) + (Xavier Leroy, report by Jacques Garrigue and Virgile Prevosto, + review by David Allsopp and Jacques-Henri Jourdan) + +### Code generation and optimizations: + +- #9969, #9981: Added mergeable flag to ELF sections containing mergeable + constants. Fixes compatibility with the integrated assembler in clang 11.0.0. + (Jacob Young, review by Nicolás Ojeda Bär) + +### Bug fixes: + +- #9970, #10010: fix the declaration scope of extensible-datatype constructors. + A regression that dates back to 4.08 makes extensible-datatype constructors + with inline records very fragile, for example: + type 'a t += X of {x : 'a} + (Gabriel Scherer, review by Thomas Refis and Leo White, + report by Nicolás Ojeda Bär) + +- #9096, #10096: fix a 4.11.0 performance regression in classes/objects + declared within a function + (Gabriel Scherer, review by Leo White, report by Sacha Ayoun) + +- #9326, #10125: Gc.set incorrectly handles the three `custom_*` fields, + causing a performance regression + (report by Emilio Jesús Gallego Arias, analysis and fix by Stephen Dolan, + code by Xavier Leroy, review by Hugo Heuzard and Gabriel Scherer) + OCaml 4.11.1 (31 August 2020) ----------------------------- @@ -12,7 +67,7 @@ OCaml 4.11.1 (31 August 2020) (Florian Angeletti, review by Thomas Refis) OCaml 4.11.0 (19 August 2020) ---------------------------- +----------------------------- (Changes that can break existing programs are marked with a "*") @@ -1449,6 +1504,16 @@ OCaml 4.09.0 (19 September 2019) - #8944: Fix "open struct .. end" on clambda backend (Thomas Refis, review by Leo White, report by Damon Wang and Mark Shinwell) +OCaml 4.08 maintenance branch +----------------------------- + +### Bug fixes: + +- #9326, #10125: Gc.set incorrectly handles the three `custom_*` fields, + causing a performance regression + (report by Emilio Jesús Gallego Arias, analysis and fix by Stephen Dolan, + code by Xavier Leroy, review by Hugo Heuzard and Gabriel Scherer) + OCaml 4.08.1 (5 August 2019) ---------------------------- diff --git a/VERSION b/VERSION index ec07a3e6..571b8216 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.11.1 +4.11.2 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index d9c5eb6e..2ed41755 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -1032,7 +1032,7 @@ let begin_assembly() = | S_macosx -> D.section ["__TEXT";"__literal16"] None ["16byte_literals"] | S_mingw64 | S_cygwin -> D.section [".rdata"] (Some "dr") [] | S_win64 -> D.data () - | _ -> D.section [".rodata.cst8"] (Some "a") ["@progbits"] + | _ -> D.section [".rodata.cst16"] (Some "aM") ["@progbits";"16"] end; D.align 16; _label (emit_symbol "caml_negf_mask"); @@ -1096,8 +1096,9 @@ let end_assembly() = | S_macosx -> D.section ["__TEXT";"__literal8"] None ["8byte_literals"] | S_mingw64 | S_cygwin -> D.section [".rdata"] (Some "dr") [] | S_win64 -> D.data () - | _ -> D.section [".rodata.cst8"] (Some "a") ["@progbits"] + | _ -> D.section [".rodata.cst8"] (Some "aM") ["@progbits";"8"] end; + D.align 8; List.iter (fun (cst,lbl) -> emit_float_constant cst lbl) !float_constants end; diff --git a/boot/ocamlc b/boot/ocamlc index 8a4f068132adbf6c76a92709729a7d7e43b7694a..9ddff6a38d58d6d61fa904c2b4868707b0630e35 100755 GIT binary patch delta 4634 zcma)9e^is_z0Z?8N#4jCctZktA%W)&pg^TAD(l>tJ%*_rx7S)++tr@AE^IRK6e%d1 zcGC^c(y5!LgKG2T?%-+M@XY$7jf$pLxx#Ae?-^WYvDdrdY-`u*8dtlqdv)380coLs zE$4jl{Qf@A_xJaGr(*|u?b#iyHNqn1h$X@!)`%@)k0=pGWKtv}qDGvN%t%&5i?|}$ z5qHEB$%*7fyghn#g}JSarme}#r`BuvYNDw^fA~uje?V7RJuOl|#(pglYBs#vd%+Z%N~+U-}#KeJGyW32(5)->vV zhmL)U1pQZ|UdpCXf1~~=>CcGrZLF zr0%CB>q-;~o%V3*#L${C^3bX&elI1T)D1EwgR!LH;1mz)3fSrB&Bf9opA!A8&qKi` zy@c(g+NX6dH8erc>qq-K z+nJ57l+;%MEA@8U1(h}Hs#VUq@F{?~`dogz08KW`z$U2}G zyUxBlahr|4IH3C;*znH8>BljayiLACK~gkhZal@O-cF~bQslm}JNwLNduZE$E?6z~ zqj5g;W;!k3B!9E$I;LE|zdZ4>SE%5;{-w#=|2TT5ft_Pqyz_^NTMyH^^LlaBDol@m zO8#fI-TL2&$G(g4`29n4`MmC97P@_2_nNo9N&mEE=C2R_P6zS;+4li{pdbz zKQn2s%j~8da|=|qoEF_vi2hbXquo7r7)>dh=gi3hC6U}N)-Xy<#$ix14WSa<3N$cWcmT{EN~sD=1>)E`agg$up0O!V6x#EKrQfd;3BZXZZbUs zd;mmYlfA%6;09oI;KWj#%cMX5TFj*6`wWizaVEmS6EI_c5W%A6fKaL0Vjx)TKyQh| zj;M3h#z|XXRw$gKAu_lM{1lvrg|(_*VNR+&EZmgbAv6ka^COhW-ljRQe{}`^`lc{M zDhK1PuiOqqWoC1pzl1F9@B2YgO)$a;*e(+H=M5(omM2C&Dj?*^K2=?G2lk zdUj%PlWy!3KH9R{tdW10@Gy<0?-FyPf3R>;2Ysqb0|{xuK46~gQ&r3;r6apU33Jos zU1Bx!(Y7hBFHrk#5n_S{c8jmG66$|Z_*?}zPzX#1N&$l&+auOf)1rKEwnr>=m0%J| z8KsQYEsqPT-m9t39E>Fcw-5-5Xwjn%H^p8Q2Gd7qJ6%}%gf>mTAIru8;itYE5NneY z!MW@u2pzKXY;I>fx;Gcm{w1MXB}bLi+u`))NE)+%F5D%3xERQws(E%?b{5pGsO$BSFcDqVU>)KIt$b{*~!9*W1IAl(@#qgb#|p_aHPp=&)*U;Gr< zZ91B-L^mS1cR!;-w=H-wtht_D2^TRBiVNzUo0(()2&xVS%S9XkZ?^EtR{G!b9kFn z79E=bzBbH31>^4pk*>p1-}CH{5^NbVZu@1vo3fR?nZ0IW!! z>zZa)TqB+bImpy5W56W3aaed=GLL>D8uY6+cYM`N;jJ9D^P#2$#;>VZmkuXAH3*D) zShMPPQ{_E{p6E2IwmJ0}|2NNALm-h!RsX5EDfEa2uX4$9EDV2X|7i}VAuGhxbZ*+3k z*r6#PAO&I~$<(L`6;rU;iP!XsOVm^ar6wCRl})F%OE8&mh7YFyYmUd?jq0WS7l&tuEl*L`q?Q#d`;3XcvS6(JhVKnWRp8+l<(pQtCJPgKef1A~z< zpvmS|DfW5v%B1m!`f+yC`#B0V+=IX5UWAs^QE2~6GZGZs5V6b-H%#`45|`AIWXS+z zP_}Mvn~Ey-&Q&2=+K;PZM^H9*_ai)TI?ykEKuZRYq-)A#=5s;vE$0k_{g48AP8@v{ zrsU5+joSVjX^bjddx6DJDgG-sUi+{YmE>>W6*4qMyD@LLpvBaS2npJ&NKBKce@20u zTFxVKRStSIYCUHl?Qejfh8~1Xm*qJ zIHl3-V{k5BSD;0!a=23($tSv`y;p5MX^)PvsUmVclI^DIKO(8DJ&lmocNCgEc1#3m z=-vXn^)hPFU^r8a=Hl}qcrgbLDB>tuF6M+Oz5*WK^_r;8K>=YJOIS0}AF&$x$7^D$ zL)IQLk!RA~uOs!fsD6$3*HH3=t6|{b?QUgru#(e)o4P)E8TQHFkAbJ&y>jClBO{Y( zJ=(87w9qf}Eu-c>Q7lrQVi%nF`w8%@MDDaw&9a;sFZWSZJ5Gx^ z>IBwnPUE8YdabH?$=@imKR1^)okmI@`umt6Cr{(*4b{0?^o*$I!%`5*4+{OHzF>s| zoe?$cZ*=*Lc*uHlq(GYf94eFrXGJBunP@vJ<~Z4ViT<}lRtAMOTDfz~!SPj+E~UT) zuQ!o=7uAJz2oqDN>Yo93!gx=FE$mXF?E_)w?5)Jc55+39bo(Q*3{Bll6e@2euHO__ zY-}(w@c-hRg$>fSwD>t2JTTqZZ?;|lu|n#24h8%zv$2U?NNltihbOTCnxAPr=*q=6 zQpFuvp)rMMd#3TT`MKyyP0h#hLcor%u(}V^>2*LC5C<**DL_x9)As?ZfIs~;o!;GVZv&N7PgesX*C(?-VjGC&#xz5-0&r0Hu*+|*RyQUa4Pmg}X!SZb5|w(OMuD1 zl*H8QrMG{qxSojZ`eI9c9W^(X?q!xv)7&`MnWcMOd1Kw`m37~Ka^=!E&u5n73yZ&3+c0`V z0kaHM$9W;MTzEJ>a)ZIRdY{}7=S7Sc+*i_2_nnr>E0-^;Z;9=46g|?ovaa^q^|gt0 omF1yx+U6Onn$JI9bKmzDg+FfTe0^KutmUpZIom?pmAgX!0#BrwJOBUy delta 4672 zcmcIneRNdSwV#tYGr1u%$(_th<|dis+++fYF+6586|_Ny#Ygkr0y`=3l`fzL1q2Oo zf_ViiK0_T1T?SulY&Q1c>rh1_1epk7_-qp~f_ymvzn(_k(1KctI-$VBK5*XeB%t8x z>VLg!{qDWzo_)Ud-oL%~?fX>+JN6rb{(Og<5{6St!tA=Qafb5>o*ikViuYQ(Y{L z3O`AAQRD&5%|_9Y2ecBJyTPN-ws*}c%OGn|^N@ESl~ZL9`)TdaIkh}ltkAl>IIX%X zPa*%&JO_D?=W>d_tU0JPh&^^wZxCmg5OZ4CujG3P={FZC6s~8SVwcl7l`pU>>`r10 zS{@B<#)3UDBPV@~Lt*2|*MPyRH|emzBC}@7kXxp%9Mw+VLk?`9LDQ+HBg;bW`*PH_ zo?9UIiq%4O|H2ijblEGZwZ^THza2Y{)VRwj{9B7ciC1C0M5?2f&MnhclD8k~f1yru zm{d$Zh34;9?a`J8wV;t^TO97Fwpcfjy`?p?!Zn{JlcOMaBfx-L(N4S4#>0?9 z)A}`!?cI;B7t5rF`n9~7YfoSQxgPB-j2eAq203FEzFj-xFHa?t>GC^JdPOb;&)4Z> zzb04%v16LB-t%5EDfc9=DjJJVw$mrCU+f^wJEnbqboc*^tf@ot>M72jxL))S?LDS> zCO?MH*KVckJ7Sjav>*TIdiewu9@p}iohBaFTq&F1qp!^wxy`}j8ju6X_dLK2Nm*rs_&=x897y6#`3uOd8rC1huTSgRdn8Dp?NZE78gq#R^7E{bmQL|0NWPy(IXf zk`pt5MZhD#DH!Ae;DW-d0jJSmSPF!I6To|~bp|3%trM}Q^+l*8(TQ95aXW~3x6_g4!}f~+D>dvDcAEOKP}8uAp#mtN>aPtrK^(d4C87kRfp{rYl+Q_U8kQQduc%CLgvs&+a#Pc5NH zEkb$ZKb#7A1?;k83(Qn^)S|U_VU0LOnKB_ zBpH=`G;>_Oi(1W4y*@ufrC1#LuZxJ;q?g$6wi~L896=Ba?G~k^cHy=%D*ae?)NadB zXhB4{+Y(r4WtXU-z!o^q+g&0=u`Y{2Cb}uw6Jz z;4ysUq`N?nw+{=>jpEiJ_n^Ni6l*EEL2tu%#V&1!c_6{t0(G2yX99Q@dZ@~UdLk^K z%5_ok_HZ(~D!2>X0h7+#1_uWtWo0GvqD)dgIyo)hPEC8DtUYOP z(w-p>egB)1FQp{;WUTN4SGgv?`KWL@M)~`o-2k`}o~}CNpwWMK5C+QF>Tg?>h63zX z>F+kwbn#lZVj5xZ{6FN_>C#^8H|)*l-<&mrd|TmA2QpAJ9rof}i%(cJsy&N(MXfWB zc)U}3{1`xgo}Ksnp*iJj_PE$1Qe>^}@(n zuc(kgMWvt_8CjnRu5|Vwst)wZ81o@2y>q?jZS)mr*H1P1H8G3I&tzf`<5Ia*$1<|i zKvp!AQrBzZVbbG>5Ak$(aiElOb_Y$~ht*e7VU9JAn)YG-z~fF%>Kc@Y{*5|lybly| z?82dgX}YETbx~y-Si&PoA=bifnR}qkHWr*lkvzLWdKY`zd@HjB%;vrBt9@8B*SsqAhe#1_>^{|*k zO?P9Kk%P<7TicGc4}Y%!L2sQ&NqOo5W%OoeQ_o@K&&V2R817d=T8$f|!aoirN*yZA zI3fb=N3dG>h-hRN$$3=FGF?a}lSS0qs*Fu)P*S7z`?8{^-Vi znN0owSOokW2m`x-KLTnZnVbl8o=qly^p|AvuJg&{^VFZIdvcmDkNjO_VLDkcN+*{j zs->q_7TYP9Z&R$rXv=;XBdqlKQ@V?lfMXsz)vEBQ7y3;qMV`sFu+rvLstyzaMSv%| zN-gf##(dGTzT(ciLc99*!O-ILHcI5EqT@N z_eZ#y;qOya+%W0UvpBV&m z7d4Jvw&dQ$jp0pcMR(ROTR8uo#q*;dRovizOMRw#XyUSGTh!Y=3)RGD|73M^EH8VH LvkEe$mHGc4SF?jI diff --git a/boot/ocamllex b/boot/ocamllex index 930676103aab5d3ff3010901d7d3041663c4f372..2c11b336a79d5c8e86d63c1ea34331fed06c992a 100755 GIT binary patch delta 25 hcmX^2P~_Z0k%kt=7N!>FEi8xg8I86d$!Fm@2mq6;3U2@a delta 25 hcmX^2P~_Z0k%kt=7N!>FEi8xg84b4|$!Fm@2mq6%3T^-Z diff --git a/configure b/configure index 74657d2d..50a7bb22 100755 --- a/configure +++ b/configure @@ -56,7 +56,7 @@ if test -e '.git' ; then : fi fi # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for OCaml 4.11.1. +# Generated by GNU Autoconf 2.69 for OCaml 4.11.2. # # Report bugs to . # @@ -646,8 +646,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='OCaml' PACKAGE_TARNAME='ocaml' -PACKAGE_VERSION='4.11.1' -PACKAGE_STRING='OCaml 4.11.1' +PACKAGE_VERSION='4.11.2' +PACKAGE_STRING='OCaml 4.11.2' PACKAGE_BUGREPORT='caml-list@inria.fr' PACKAGE_URL='http://www.ocaml.org' @@ -1482,7 +1482,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures OCaml 4.11.1 to adapt to many kinds of systems. +\`configure' configures OCaml 4.11.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1548,7 +1548,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of OCaml 4.11.1:";; + short | recursive ) echo "Configuration of OCaml 4.11.2:";; esac cat <<\_ACEOF @@ -1711,7 +1711,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -OCaml configure 4.11.1 +OCaml configure 4.11.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2374,7 +2374,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by OCaml $as_me 4.11.1, which was +It was created by OCaml $as_me 4.11.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2723,8 +2723,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.11.1" >&5 -$as_echo "$as_me: Configuring OCaml version 4.11.1" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.11.2" >&5 +$as_echo "$as_me: Configuring OCaml version 4.11.2" >&6;} # Configuration variables @@ -2800,7 +2800,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -VERSION=4.11.1 +VERSION=4.11.2 # Note: This is present for the flexdll bootstrap where it exposed as the old @@ -12475,7 +12475,7 @@ case $ocaml_cv_cc_vendor in #( *) : outputobj='-o $(EMPTY)' gcc_warnings='-Wall -Wdeclaration-after-statement' - case 4.11.1 in #( + case 4.11.2 in #( *+dev*) : gcc_warnings="$gcc_warnings -Werror" ;; #( *) : @@ -12509,7 +12509,7 @@ case $host in #( -fexcess-precision=standard" # TODO: see whether the code can be fixed to avoid -Wno-unused common_cflags="-O2 -fno-strict-aliasing -fwrapv -mms-bitfields" - internal_cppflags='-DUNICODE -D_UNICODE' + internal_cppflags='-D__USE_MINGW_ANSI_STDIO=0 -DUNICODE -D_UNICODE' internal_cppflags="$internal_cppflags -DWINDOWS_UNICODE=" internal_cppflags="${internal_cppflags}\$(WINDOWS_UNICODE)" ;; #( *) : @@ -16893,7 +16893,7 @@ else ocamldoc=ocamldoc fi -case $enable_ocamltest,4.11.1 in #( +case $enable_ocamltest,4.11.2 in #( yes,*|,*+dev*) : ocamltest='ocamltest' ;; #( *) : @@ -17610,7 +17610,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by OCaml $as_me 4.11.1, which was +This file was extended by OCaml $as_me 4.11.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17677,7 +17677,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -OCaml config.status 4.11.1 +OCaml config.status 4.11.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index aa5f26f2..d7dee697 100644 --- a/configure.ac +++ b/configure.ac @@ -564,7 +564,7 @@ AS_CASE([$host], -fexcess-precision=standard" # TODO: see whether the code can be fixed to avoid -Wno-unused common_cflags="-O2 -fno-strict-aliasing -fwrapv -mms-bitfields" - internal_cppflags='-DUNICODE -D_UNICODE' + internal_cppflags='-D__USE_MINGW_ANSI_STDIO=0 -DUNICODE -D_UNICODE' internal_cppflags="$internal_cppflags -DWINDOWS_UNICODE=" internal_cppflags="${internal_cppflags}\$(WINDOWS_UNICODE)"], [AC_MSG_ERROR([Unsupported C compiler for a Mingw build])])], diff --git a/lambda/translcore.ml b/lambda/translcore.ml index 5d479f3f..a1697666 100644 --- a/lambda/translcore.ml +++ b/lambda/translcore.ml @@ -219,6 +219,14 @@ let transl_ident loc env ty path desc = | _ -> fatal_error "Translcore.transl_exp: bad Texp_ident" let rec transl_exp ~scopes e = + transl_exp1 ~scopes ~in_new_scope:false e + +(* ~in_new_scope tracks whether we just opened a new scope. + + We go to some trouble to avoid introducing many new anonymous function + scopes, as `let f a b = ...` is desugared to several Pexp_fun. +*) +and transl_exp1 ~scopes ~in_new_scope e = List.iter (Translattribute.check_attribute e) e.exp_attributes; let eval_once = (* Whether classes for immediate objects must be cached *) @@ -226,10 +234,10 @@ let rec transl_exp ~scopes e = Texp_function _ | Texp_for _ | Texp_while _ -> false | _ -> true in - if eval_once then transl_exp0 ~scopes e else - Translobj.oo_wrap e.exp_env true (transl_exp0 ~scopes) e + if eval_once then transl_exp0 ~scopes ~in_new_scope e else + Translobj.oo_wrap e.exp_env true (transl_exp0 ~scopes ~in_new_scope) e -and transl_exp0 ~scopes e = +and transl_exp0 ~in_new_scope ~scopes e = match e.exp_desc with | Texp_ident(path, _, desc) -> transl_ident (of_location ~scopes e.exp_loc) @@ -240,7 +248,10 @@ and transl_exp0 ~scopes e = transl_let ~scopes rec_flag pat_expr_list (event_before ~scopes body (transl_exp ~scopes body)) | Texp_function { arg_label = _; param; cases; partial; } -> - let scopes = enter_anonymous_function ~scopes in + let scopes = + if in_new_scope then scopes + else enter_anonymous_function ~scopes + in transl_function ~scopes e param cases partial | Texp_apply({ exp_desc = Texp_ident(path, _, {val_kind = Val_prim p}); exp_type = prim_type } as funct, oargs) @@ -808,18 +819,11 @@ and transl_function ~scopes e param cases partial = let lam = Lfunction{kind; params; return; body; attr; loc} in Translattribute.add_function_attributes lam e.exp_loc e.exp_attributes -(* Like transl_exp, but used when introducing a new scope. - Goes to some trouble to avoid introducing many new anonymous function - scopes, as `let f a b = ...` is desugared to several Pexp_fun *) +(* Like transl_exp, but used when a new scope was just introduced. *) and transl_scoped_exp ~scopes expr = - match expr.exp_desc with - | Texp_function { arg_label = _; param; cases; partial } -> - transl_function ~scopes expr param cases partial - | _ -> - transl_exp ~scopes expr + transl_exp1 ~scopes ~in_new_scope:true expr -(* Calls transl_scoped_exp or transl_exp, according to whether a pattern - binding should introduce a new scope *) +(* Decides whether a pattern binding should introduce a new scope. *) and transl_bound_exp ~scopes ~in_structure pat expr = let should_introduce_scope = match expr.exp_desc with diff --git a/ocaml-variants.opam b/ocaml-variants.opam index f6b0abc8..9e6e76ed 100644 --- a/ocaml-variants.opam +++ b/ocaml-variants.opam @@ -1,8 +1,8 @@ opam-version: "2.0" -version: "4.11.1" -synopsis: "OCaml 4.11.1, official release" +version: "4.11.2" +synopsis: "OCaml release 4.11.2" depends: [ - "ocaml" {= "4.11.1" & post} + "ocaml" {= "4.11.2" & post} "base-unix" {post} "base-bigarray" {post} "base-threads" {post} diff --git a/runtime/.depend b/runtime/.depend index 9f5d2fdf..b56ad7ab 100644 --- a/runtime/.depend +++ b/runtime/.depend @@ -16,12 +16,12 @@ stacks_b.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \ caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h -fix_code_b.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \ - caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ - caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \ - caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h +fix_code_b.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \ + caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \ + caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \ + caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h startup_aux_b.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \ @@ -80,11 +80,11 @@ roots_byt_b.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \ caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \ caml/eventlog.h -globroots_b.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_b.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h fail_byt_b.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \ @@ -160,14 +160,14 @@ io_b.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_b.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_b.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -184,12 +184,12 @@ sys_b.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/startup_aux.h meta_b.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h parsing_b.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \ caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ @@ -226,11 +226,11 @@ callback_b.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \ caml/stacks.h caml/memory.h debugger_b.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \ - caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \ - caml/stacks.h caml/sys.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/sys.h weak_b.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \ caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ @@ -296,6 +296,15 @@ domain_b.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_b.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_b.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_b.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ @@ -321,12 +330,12 @@ stacks_bd.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \ caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h -fix_code_bd.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \ - caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ - caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \ - caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h +fix_code_bd.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \ + caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \ + caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \ + caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h startup_aux_bd.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \ @@ -385,11 +394,11 @@ roots_byt_bd.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \ caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \ caml/eventlog.h -globroots_bd.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_bd.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h fail_byt_bd.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \ @@ -465,14 +474,14 @@ io_bd.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_bd.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_bd.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -489,12 +498,12 @@ sys_bd.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/startup_aux.h meta_bd.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h parsing_bd.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \ caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ @@ -531,11 +540,11 @@ callback_bd.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \ caml/stacks.h caml/memory.h debugger_bd.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \ - caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \ - caml/stacks.h caml/sys.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/sys.h weak_bd.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \ caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ @@ -601,6 +610,15 @@ domain_bd.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_bd.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_bd.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_bd.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ @@ -631,12 +649,12 @@ stacks_bi.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \ caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h -fix_code_bi.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \ - caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ - caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \ - caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h +fix_code_bi.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \ + caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \ + caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \ + caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h startup_aux_bi.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \ @@ -695,11 +713,11 @@ roots_byt_bi.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \ caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \ caml/eventlog.h -globroots_bi.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_bi.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h fail_byt_bi.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \ @@ -775,14 +793,14 @@ io_bi.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_bi.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_bi.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -799,12 +817,12 @@ sys_bi.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/startup_aux.h meta_bi.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h parsing_bi.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \ caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ @@ -841,11 +859,11 @@ callback_bi.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \ caml/stacks.h caml/memory.h debugger_bi.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \ - caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \ - caml/stacks.h caml/sys.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/sys.h weak_bi.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \ caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ @@ -911,6 +929,15 @@ domain_bi.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_bi.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_bi.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_bi.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ @@ -936,12 +963,12 @@ stacks_bpic.$(O): stacks.c caml/config.h caml/m.h caml/s.h caml/fail.h \ caml/domain_state.tbl caml/misc.h caml/mlvalues.h caml/stacks.h \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h -fix_code_bpic.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/debugger.h \ - caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ - caml/domain_state.tbl caml/fix_code.h caml/instruct.h caml/intext.h \ - caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h +fix_code_bpic.$(O): fix_code.c caml/config.h caml/m.h caml/s.h caml/codefrag.h \ + caml/debugger.h caml/misc.h caml/config.h caml/mlvalues.h \ + caml/domain_state.h caml/domain_state.tbl caml/fix_code.h \ + caml/instruct.h caml/intext.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h startup_aux_bpic.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/exec.h caml/memory.h caml/gc.h \ @@ -1000,11 +1027,11 @@ roots_byt_bpic.$(O): roots_byt.c caml/finalise.h caml/roots.h caml/misc.h \ caml/globroots.h caml/major_gc.h caml/memory.h caml/minor_gc.h \ caml/misc.h caml/mlvalues.h caml/roots.h caml/stacks.h caml/memprof.h \ caml/eventlog.h -globroots_bpic.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_bpic.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h fail_byt_bpic.$(O): fail_byt.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/callback.h caml/fail.h caml/gc.h caml/io.h caml/memory.h caml/gc.h \ @@ -1080,14 +1107,14 @@ io_bpic.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_bpic.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_bpic.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -1104,12 +1131,12 @@ sys_bpic.$(O): sys.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/startup_aux.h meta_bpic.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h parsing_bpic.$(O): parsing.c caml/config.h caml/m.h caml/s.h caml/mlvalues.h \ caml/config.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ @@ -1146,11 +1173,11 @@ callback_bpic.$(O): callback.c caml/callback.h caml/mlvalues.h caml/config.h \ caml/stacks.h caml/memory.h debugger_bpic.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/fail.h caml/fix_code.h \ - caml/instruct.h caml/intext.h caml/io.h caml/io.h caml/mlvalues.h \ - caml/stacks.h caml/sys.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h caml/fail.h \ + caml/fix_code.h caml/instruct.h caml/intext.h caml/io.h caml/io.h \ + caml/mlvalues.h caml/stacks.h caml/sys.h weak_bpic.$(O): weak.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl caml/fail.h \ caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h caml/major_gc.h \ @@ -1216,6 +1243,15 @@ domain_bpic.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m. caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_bpic.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_bpic.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_bpic.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ @@ -1232,11 +1268,11 @@ startup_aux_n.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ startup_nat_n.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \ - caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \ - caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ + caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \ + caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \ + caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \ + caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ caml/startup_aux.h caml/sys.h main_n.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ @@ -1340,14 +1376,14 @@ io_n.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_n.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_n.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -1434,11 +1470,11 @@ custom_n.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/mlvalues.h caml/signals.h -globroots_n.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_n.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h backtrace_nat_n.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \ caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \ @@ -1454,21 +1490,22 @@ dynlink_nat_n.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \ - caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h + caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \ + caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \ + caml/hooks.h debugger_n.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h meta_n.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h dynlink_n.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \ caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \ @@ -1519,6 +1556,15 @@ domain_n.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_n.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_n.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_n.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ @@ -1534,11 +1580,11 @@ startup_aux_nd.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ startup_nat_nd.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \ - caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \ - caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ + caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \ + caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \ + caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \ + caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ caml/startup_aux.h caml/sys.h main_nd.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ @@ -1642,14 +1688,14 @@ io_nd.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_nd.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_nd.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -1736,11 +1782,11 @@ custom_nd.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/mlvalues.h caml/signals.h -globroots_nd.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_nd.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h backtrace_nat_nd.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \ caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \ @@ -1756,21 +1802,22 @@ dynlink_nat_nd.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \ - caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h + caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \ + caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \ + caml/hooks.h debugger_nd.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h meta_nd.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h dynlink_nd.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \ caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \ @@ -1821,6 +1868,15 @@ domain_nd.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_nd.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_nd.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_nd.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ @@ -1836,11 +1892,11 @@ startup_aux_ni.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ startup_nat_ni.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \ - caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \ - caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ + caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \ + caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \ + caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \ + caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ caml/startup_aux.h caml/sys.h main_ni.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ @@ -1944,14 +2000,14 @@ io_ni.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_ni.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_ni.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -2038,11 +2094,11 @@ custom_ni.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/mlvalues.h caml/signals.h -globroots_ni.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_ni.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h backtrace_nat_ni.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \ caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \ @@ -2058,21 +2114,22 @@ dynlink_nat_ni.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \ - caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h + caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \ + caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \ + caml/hooks.h debugger_ni.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h meta_ni.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h dynlink_ni.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \ caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \ @@ -2123,6 +2180,15 @@ domain_ni.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_ni.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_ni.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_ni.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ @@ -2138,11 +2204,11 @@ startup_aux_npic.$(O): startup_aux.c caml/backtrace.h caml/mlvalues.h \ startup_nat_npic.$(O): startup_nat.c caml/callback.h caml/mlvalues.h \ caml/config.h caml/m.h caml/s.h caml/misc.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/custom.h \ - caml/debugger.h caml/domain.h caml/eventlog.h caml/fail.h \ - caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h caml/io.h \ - caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ + caml/codefrag.h caml/debugger.h caml/domain.h caml/eventlog.h \ + caml/fail.h caml/freelist.h caml/gc.h caml/gc_ctrl.h caml/intext.h \ + caml/io.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/misc.h \ + caml/mlvalues.h caml/osdeps.h caml/memory.h caml/printexc.h caml/stack.h \ caml/startup_aux.h caml/sys.h main_npic.$(O): main.c caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ @@ -2246,14 +2312,14 @@ io_npic.$(O): io.c caml/config.h caml/m.h caml/s.h caml/alloc.h caml/misc.h \ caml/signals.h caml/sys.h extern_npic.$(O): extern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/custom.h caml/fail.h caml/gc.h caml/intext.h \ - caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h caml/major_gc.h \ - caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/misc.h caml/mlvalues.h caml/reverse.h + caml/codefrag.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ + caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ + caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/misc.h caml/mlvalues.h caml/reverse.h intern_npic.$(O): intern.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/callback.h caml/config.h caml/custom.h caml/fail.h caml/gc.h \ - caml/intext.h caml/io.h caml/io.h caml/md5.h caml/memory.h caml/gc.h \ + caml/callback.h caml/codefrag.h caml/config.h caml/custom.h caml/fail.h \ + caml/gc.h caml/intext.h caml/io.h caml/io.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/memprof.h caml/roots.h caml/memory.h caml/mlvalues.h \ caml/misc.h caml/reverse.h caml/signals.h @@ -2340,11 +2406,11 @@ custom_npic.$(O): custom.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/custom.h caml/fail.h caml/gc_ctrl.h caml/memory.h caml/gc.h \ caml/major_gc.h caml/freelist.h caml/minor_gc.h caml/address_class.h \ caml/domain.h caml/mlvalues.h caml/signals.h -globroots_npic.$(O): globroots.c caml/memory.h caml/config.h caml/m.h caml/s.h \ - caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ - caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h caml/misc.h caml/mlvalues.h \ - caml/roots.h caml/memory.h caml/globroots.h caml/roots.h +globroots_npic.$(O): globroots.c caml/mlvalues.h caml/config.h caml/m.h caml/s.h \ + caml/misc.h caml/domain_state.h caml/mlvalues.h caml/domain_state.tbl \ + caml/roots.h caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h \ + caml/minor_gc.h caml/address_class.h caml/domain.h caml/globroots.h \ + caml/roots.h caml/skiplist.h backtrace_nat_npic.$(O): backtrace_nat.c caml/alloc.h caml/misc.h caml/config.h \ caml/m.h caml/s.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/backtrace.h caml/exec.h caml/backtrace_prim.h \ @@ -2360,21 +2426,22 @@ dynlink_nat_npic.$(O): dynlink_nat.c caml/misc.h caml/config.h caml/m.h caml/s.h caml/mlvalues.h caml/misc.h caml/domain_state.h caml/mlvalues.h \ caml/domain_state.tbl caml/memory.h caml/gc.h caml/major_gc.h \ caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/stack.h caml/callback.h caml/alloc.h caml/intext.h caml/io.h \ - caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h caml/hooks.h + caml/stack.h caml/callback.h caml/codefrag.h caml/alloc.h caml/intext.h \ + caml/io.h caml/osdeps.h caml/memory.h caml/fail.h caml/signals.h \ + caml/hooks.h debugger_npic.$(O): debugger.c caml/alloc.h caml/misc.h caml/config.h caml/m.h \ caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h caml/memory.h \ - caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ - caml/address_class.h caml/domain.h + caml/codefrag.h caml/config.h caml/debugger.h caml/misc.h caml/osdeps.h \ + caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/skiplist.h meta_npic.$(O): meta.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ - caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/config.h \ - caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h caml/intext.h \ - caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h caml/gc.h \ - caml/major_gc.h caml/minor_gc.h caml/address_class.h caml/domain.h \ - caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h caml/signals.h \ - caml/stacks.h caml/memory.h + caml/backtrace_prim.h caml/backtrace.h caml/exec.h caml/codefrag.h \ + caml/config.h caml/debugger.h caml/fail.h caml/fix_code.h caml/interp.h \ + caml/intext.h caml/io.h caml/major_gc.h caml/freelist.h caml/memory.h \ + caml/gc.h caml/major_gc.h caml/minor_gc.h caml/address_class.h \ + caml/domain.h caml/minor_gc.h caml/misc.h caml/mlvalues.h caml/prims.h \ + caml/signals.h caml/stacks.h caml/memory.h dynlink_npic.$(O): dynlink.c caml/config.h caml/m.h caml/s.h caml/alloc.h \ caml/misc.h caml/config.h caml/mlvalues.h caml/domain_state.h \ caml/domain_state.tbl caml/dynlink.h caml/fail.h caml/mlvalues.h \ @@ -2425,6 +2492,15 @@ domain_npic.$(O): domain.c caml/domain_state.h caml/misc.h caml/config.h caml/m. caml/s.h caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/memory.h caml/gc.h caml/major_gc.h caml/freelist.h caml/minor_gc.h \ caml/address_class.h caml/domain.h +skiplist_npic.$(O): skiplist.c caml/config.h caml/m.h caml/s.h caml/memory.h \ + caml/config.h caml/gc.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/major_gc.h caml/freelist.h caml/minor_gc.h \ + caml/address_class.h caml/domain.h caml/misc.h caml/skiplist.h +codefrag_npic.$(O): codefrag.c caml/codefrag.h caml/misc.h caml/config.h caml/m.h \ + caml/s.h caml/md5.h caml/mlvalues.h caml/misc.h caml/domain_state.h \ + caml/domain_state.tbl caml/io.h caml/memory.h caml/gc.h caml/major_gc.h \ + caml/freelist.h caml/minor_gc.h caml/address_class.h caml/domain.h \ + caml/skiplist.h win32_npic.$(O): win32.c caml/alloc.h caml/misc.h caml/config.h caml/m.h caml/s.h \ caml/mlvalues.h caml/domain_state.h caml/domain_state.tbl \ caml/address_class.h caml/fail.h caml/io.h caml/memory.h caml/gc.h \ diff --git a/runtime/Makefile b/runtime/Makefile index 744955c0..bab27854 100644 --- a/runtime/Makefile +++ b/runtime/Makefile @@ -26,7 +26,8 @@ BYTECODE_C_SOURCES := $(addsuffix .c, \ signals_byt printexc backtrace_byt backtrace compare ints eventlog \ floats str array io extern intern hash sys meta parsing gc_ctrl md5 obj \ lexing callback debugger weak compact finalise custom dynlink \ - spacetime_byt afl $(UNIX_OR_WIN32) bigarray main memprof domain) + spacetime_byt afl $(UNIX_OR_WIN32) bigarray main memprof domain \ + skiplist codefrag) NATIVE_C_SOURCES := $(addsuffix .c, \ startup_aux startup_nat main fail_nat roots_nat signals \ @@ -35,7 +36,7 @@ NATIVE_C_SOURCES := $(addsuffix .c, \ lexing $(UNIX_OR_WIN32) printexc callback weak compact finalise custom \ globroots backtrace_nat backtrace dynlink_nat debugger meta \ dynlink clambda_checks spacetime_nat spacetime_snapshot afl bigarray \ - memprof domain) + memprof domain skiplist codefrag) # The other_files variable stores the list of files whose dependencies # should be computed by `make depend` although they do not need to be diff --git a/runtime/amd64.S b/runtime/amd64.S index 056b39cd..2950f1ae 100644 --- a/runtime/amd64.S +++ b/runtime/amd64.S @@ -726,7 +726,7 @@ G(caml_system__spacetime_shapes): #elif defined(SYS_mingw64) || defined(SYS_cygwin) .section .rdata,"dr" #else - .section .rodata.cst8,"a",@progbits + .section .rodata.cst16,"aM",@progbits,16 #endif .globl G(caml_negf_mask) .align SIXTEEN_ALIGN diff --git a/runtime/caml/codefrag.h b/runtime/caml/codefrag.h new file mode 100644 index 00000000..ff623c01 --- /dev/null +++ b/runtime/caml/codefrag.h @@ -0,0 +1,80 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cambium, INRIA Paris */ +/* */ +/* Copyright 2020 Institut National de Recherche en Informatique et */ +/* en Automatique. */ +/* */ +/* All rights reserved. This file is distributed under the terms of */ +/* the GNU Lesser General Public License version 2.1, with the */ +/* special exception on linking described in the file LICENSE. */ +/* */ +/**************************************************************************/ + +/* A table of all code fragments (main program and dynlinked modules) */ + +#ifndef CAML_CODEFRAG_H +#define CAML_CODEFRAG_H + +#ifdef CAML_INTERNALS + +enum digest_status { + DIGEST_LATER, /* computed on demand */ + DIGEST_NOW, /* computed by caml_register_code_fragment */ + DIGEST_PROVIDED, /* passed by caller of caml_register_code_fragment */ + DIGEST_IGNORE /* this code fragment is private and cannot be + identified by its digest */ +}; + +struct code_fragment { + char *code_start; + char *code_end; + int fragnum; + unsigned char digest[16]; + enum digest_status digest_status; +}; + +/* Register a code fragment for addresses [start] (included) + to [end] (excluded). This range of addresses is assumed + disjoint from all currently-registered code fragments. + + [digest_kind] explains what digest is to be associated to the code + fragment. If [digest_kind == DIGEST_PROVIDED], the [opt_digest] + parameter points to the 16-byte digest of the code. + For all other values of [digest_kind], [opt_digest] is ignored + and should be [NULL]. + + The returned integer is the fragment number (fragnum) associated + with the new code fragment. */ +extern int caml_register_code_fragment(char * start, char * end, + enum digest_status digest_kind, + unsigned char * opt_digest); + +/* Un-register a code fragment. */ +extern void caml_remove_code_fragment(struct code_fragment * cf); + +/* Find the code fragment whose range of addresses contains [pc]. + Returns NULL if none exists. */ +extern struct code_fragment * caml_find_code_fragment_by_pc(char *pc); + +/* Find the code fragment whose fragment number is [fragnum]. + Returns NULL if none exists. */ +extern struct code_fragment * caml_find_code_fragment_by_num(int fragnum); + +/* Find the code fragment whose digest is equal to the given digest. + Returns NULL if none exists. */ +extern struct code_fragment * + caml_find_code_fragment_by_digest(unsigned char digest[16]); + +/* Return the digest of the given code fragment. + If the code fragment was registered in [DIGEST_LATER] mode + and if the digest was not computed yet, it is obtained by hashing + the bytes between [code_start] and [code_end]. + Returns NULL if the code fragment was registered with [DIGEST_IGNORE]. */ +extern unsigned char * caml_digest_of_code_fragment(struct code_fragment *); + +#endif + +#endif diff --git a/runtime/caml/config.h b/runtime/caml/config.h index b119bc34..d42a9205 100644 --- a/runtime/caml/config.h +++ b/runtime/caml/config.h @@ -61,6 +61,19 @@ #include #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 + /* must either be #include'd before this header or + __USE_MINGW_ANSI_STDIO needs to be 0 when 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 diff --git a/runtime/caml/misc.h b/runtime/caml/misc.h index fcc06660..4d9ac010 100644 --- a/runtime/caml/misc.h +++ b/runtime/caml/misc.h @@ -432,18 +432,6 @@ extern int caml_snwprintf(wchar_t * buf, # endif #endif -/* A table of all code fragments (main program and dynlinked modules) */ -struct code_fragment { - char *code_start; - char *code_end; - unsigned char digest[16]; - char digest_computed; -}; - -extern struct ext_table caml_code_fragments_table; - -int caml_find_code_fragment(char *pc, int *index, struct code_fragment **cf); - #endif /* CAML_INTERNALS */ /* The [backtrace_slot] type represents values stored in diff --git a/runtime/caml/skiplist.h b/runtime/caml/skiplist.h new file mode 100644 index 00000000..1e8284dd --- /dev/null +++ b/runtime/caml/skiplist.h @@ -0,0 +1,102 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cambium, INRIA Paris */ +/* */ +/* Copyright 2020 Institut National de Recherche en Informatique et */ +/* en Automatique. */ +/* */ +/* All rights reserved. This file is distributed under the terms of */ +/* the GNU Lesser General Public License version 2.1, with the */ +/* special exception on linking described in the file LICENSE. */ +/* */ +/**************************************************************************/ + +/* A dictionary data structure implemented as skip lists */ + +/* Keys and associated data are natural-width integers (type [uintnat]). + Pointers can be used too, modulo conversion to [uintnat]. */ + +#ifndef CAML_SKIPLIST_H +#define CAML_SKIPLIST_H + +#ifdef CAML_INTERNALS + +#include "config.h" + +#define NUM_LEVELS 17 + +/* The head of a skip list */ + +struct skiplist { + struct skipcell * forward[NUM_LEVELS]; /* forward chaining */ + int level; /* max level used */ +}; + +/* The cells of a skip list */ + +struct skipcell { + uintnat key; + uintnat data; +#if (__STDC_VERSION__ >= 199901L) + struct skipcell * forward[]; /* variable-length array */ +#else + struct skipcell * forward[1]; /* variable-length array */ +#endif +}; + +/* Initialize a skip list, statically */ +#define SKIPLIST_STATIC_INITIALIZER { {0, }, 0 } + +/* Initialize a skip list, dynamically */ +extern void caml_skiplist_init(struct skiplist * sk); + +/* Search a skip list. + If [key] is found, store associated data in [*data] and return 1. + If [key] is not found, return 0 and leave [*data] unchanged. */ +extern int caml_skiplist_find(struct skiplist * sk, uintnat key, + /*out*/ uintnat * data); + +/* Search the entry of the skip list that has the largest key less than + or equal to [k]. + If such an entry exists, store its key in [*key], the associated data in + [*data], and return 1. + If no such entry exists (all keys in the skip list are strictly greater + than [k]), return 0 and leave [*key] and [*data] unchanged. */ +extern int caml_skiplist_find_below(struct skiplist * sk, uintnat k, + /*out*/ uintnat * key, + /*out*/ uintnat * data); + +/* Insertion in a skip list. + If [key] was already there, change the associated data and return 1. + If [key] was not there, insert new [key, data] binding and return 0. */ +extern int caml_skiplist_insert(struct skiplist * sk, + uintnat key, uintnat data); + +/* Deletion in a skip list. + If [key] was there, remove it and return 1. + If [key] was not there, leave the skip list unchanged and return 0. */ +extern int caml_skiplist_remove(struct skiplist * sk, uintnat key); + +/* Empty an already initialized skip list. */ +extern void caml_skiplist_empty(struct skiplist * sk); + +/* Iterate over a skip list, in increasing order of keys. + [var] designates the current element. + [action] can refer to [var->key] and [var->data]. + [action] can safely remove the current element, i.e. call + [caml_skiplist_remove] on [var->key]. The traversal will + continue with the skiplist element following the removed element. + Other operations performed over the skiplist during its traversal have + unspecified effects on the traversal. */ + +#define FOREACH_SKIPLIST_ELEMENT(var,sk,action) \ + { struct skipcell * var, * caml__next; \ + for (var = (sk)->forward[0]; var != NULL; var = caml__next) \ + { caml__next = (var)->forward[0]; action; } \ + } + +#endif + +#endif diff --git a/runtime/codefrag.c b/runtime/codefrag.c new file mode 100644 index 00000000..2ab95716 --- /dev/null +++ b/runtime/codefrag.c @@ -0,0 +1,115 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cambium, INRIA Paris */ +/* */ +/* Copyright 2020 Institut National de Recherche en Informatique et */ +/* en Automatique. */ +/* */ +/* All rights reserved. This file is distributed under the terms of */ +/* the GNU Lesser General Public License version 2.1, with the */ +/* special exception on linking described in the file LICENSE. */ +/* */ +/**************************************************************************/ + +#define CAML_INTERNALS + +/* A table of all code fragments (main program and dynlinked modules) */ + +#include +#include +#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; +} diff --git a/runtime/debugger.c b/runtime/debugger.c index 21a93737..050389e2 100644 --- a/runtime/debugger.c +++ b/runtime/debugger.c @@ -24,10 +24,12 @@ #include #include "caml/alloc.h" +#include "caml/codefrag.h" #include "caml/config.h" #include "caml/debugger.h" #include "caml/misc.h" #include "caml/osdeps.h" +#include "caml/skiplist.h" int caml_debugger_in_use = 0; uintnat caml_event_count; @@ -96,7 +98,7 @@ static struct channel * dbg_out;/* Output channel on the socket */ static char *dbg_addr = NULL; -static struct ext_table breakpoints_table; +static struct skiplist event_points_table = SKIPLIST_STATIC_INITIALIZER; static void open_connection(void) { @@ -198,8 +200,6 @@ void caml_debugger_init(void) unsetenv("CAML_DEBUG_SOCKET"); #endif - caml_ext_table_init(&breakpoints_table, 16); - #ifdef _WIN32 winsock_startup(); (void)atexit(winsock_cleanup); @@ -281,38 +281,14 @@ static void safe_output_value(struct channel *chan, value val) Caml_state->external_raise = saved_external_raise; } -struct breakpoint { - code_t pc; - opcode_t saved; -}; - -static struct breakpoint *find_breakpoint(code_t pc) -{ - struct breakpoint *bpti; - int i; - - for (i = 0; i < breakpoints_table.size; i++) { - bpti = (struct breakpoint *) breakpoints_table.contents[i]; - if (bpti->pc == pc) - return bpti; - } - - return NULL; -} - static void save_instruction(code_t pc) { - struct breakpoint *bpt; - - if (find_breakpoint(pc) != NULL) { + uintnat saved; + if (caml_skiplist_find(&event_points_table, (uintnat) pc, &saved)) { /* Already saved. Nothing to do. */ return; } - - bpt = caml_stat_alloc(sizeof(struct breakpoint)); - bpt->pc = pc; - bpt->saved = *pc; - caml_ext_table_add(&breakpoints_table, bpt); + caml_skiplist_insert(&event_points_table, (uintnat) pc, *pc); } static void set_instruction(code_t pc, opcode_t opcode) @@ -323,56 +299,49 @@ static void set_instruction(code_t pc, opcode_t opcode) static void restore_instruction(code_t pc) { - struct breakpoint *bpt = find_breakpoint(pc); - CAMLassert (bpt != NULL); - - *pc = bpt->saved; - caml_ext_table_remove(&breakpoints_table, bpt); + CAMLunused_start int found; CAMLunused_end + uintnat saved; + found = caml_skiplist_find(&event_points_table, (uintnat) pc, &saved); + CAMLassert(found); + *pc = saved; + caml_skiplist_remove(&event_points_table, (uintnat) pc); } static code_t pc_from_pos(int frag, intnat pos) { - struct code_fragment *cf; - CAMLassert (frag >= 0); - CAMLassert (frag < caml_code_fragments_table.size); - CAMLassert (pos >= 0); - CAMLassert (pos < caml_code_size); - - cf = (struct code_fragment *) caml_code_fragments_table.contents[frag]; + struct code_fragment *cf = caml_find_code_fragment_by_num(frag); + CAMLassert(cf != NULL); return (code_t) (cf->code_start + pos); } opcode_t caml_debugger_saved_instruction(code_t pc) { - struct breakpoint *bpt = find_breakpoint(pc); - CAMLassert (bpt != NULL); - - return bpt->saved; + CAMLunused_start int found; CAMLunused_end + uintnat saved; + found = caml_skiplist_find(&event_points_table, (uintnat) pc, &saved); + CAMLassert(found); + return saved; } void caml_debugger_code_unloaded(int index) { struct code_fragment *cf; - struct breakpoint *bpti; - int i; + char * pc; if (!caml_debugger_in_use) return; caml_putch(dbg_out, REP_CODE_UNLOADED); caml_putword(dbg_out, index); - cf = (struct code_fragment *) caml_code_fragments_table.contents[index]; + cf = caml_find_code_fragment_by_num(index); + CAMLassert(cf != NULL); - for (i = 0; i < breakpoints_table.size; i++) { - bpti = (struct breakpoint *) breakpoints_table.contents[i]; - if ((char*) bpti->pc >= cf->code_start && (char*) bpti->pc < cf->code_end) { - caml_ext_table_remove(&breakpoints_table, bpti); - /* caml_ext_table_remove has shifted the next element in place - of the one we just removed. Decrement i for the next - iteration. */ - i--; + FOREACH_SKIPLIST_ELEMENT(elt, &event_points_table, { + pc = (char *) elt->key; + if (pc >= cf->code_start && pc < cf->code_end) { + caml_skiplist_remove(&event_points_table, (uintnat) pc); } - } + }) } #define Pc(sp) ((code_t)((sp)[0])) @@ -385,9 +354,8 @@ void caml_debugger(enum event_kind event, value param) value *frame, *newframe; intnat i, pos; value val; - int frag, found = 0; + int frag; struct code_fragment *cf; - (void) found; /* Silence unused variable warning. */ if (dbg_socket == -1) return; /* Not connected to a debugger. */ @@ -435,9 +403,9 @@ void caml_debugger(enum event_kind event, value param) caml_putword(dbg_out, caml_event_count); if (event == EVENT_COUNT || event == BREAKPOINT) { caml_putword(dbg_out, Caml_state->stack_high - frame); - found = caml_find_code_fragment((char*) Pc(frame), &frag, &cf); - CAMLassert(found); - caml_putword(dbg_out, frag); + cf = caml_find_code_fragment_by_pc((char*) Pc(frame)); + CAMLassert(cf != NULL); + caml_putword(dbg_out, cf->fragnum); caml_putword(dbg_out, (char*) Pc(frame) - cf->code_start); } else { /* No PC and no stack frame associated with other events */ @@ -500,8 +468,8 @@ void caml_debugger(enum event_kind event, value param) case REQ_GET_FRAME: caml_putword(dbg_out, Caml_state->stack_high - frame); if (frame < Caml_state->stack_high && - caml_find_code_fragment((char*) Pc(frame), &frag, &cf)) { - caml_putword(dbg_out, frag); + (cf = caml_find_code_fragment_by_pc((char*) Pc(frame))) != NULL) { + caml_putword(dbg_out, cf->fragnum); caml_putword(dbg_out, (char*) Pc(frame) - cf->code_start); } else { caml_putword(dbg_out, 0); @@ -517,12 +485,12 @@ void caml_debugger(enum event_kind event, value param) i = caml_getword(dbg_in); newframe = frame + Extra_args(frame) + i + 3; if (newframe >= Caml_state->stack_high || - !caml_find_code_fragment((char*) Pc(newframe), &frag, &cf)) { + (cf = caml_find_code_fragment_by_pc((char *) Pc(newframe))) == NULL) { caml_putword(dbg_out, -1); } else { frame = newframe; caml_putword(dbg_out, Caml_state->stack_high - frame); - caml_putword(dbg_out, frag); + caml_putword(dbg_out, cf->fragnum); caml_putword(dbg_out, (char*) Pc(frame) - cf->code_start); } caml_flush(dbg_out); @@ -575,9 +543,9 @@ void caml_debugger(enum event_kind event, value param) break; case REQ_GET_CLOSURE_CODE: val = getval(dbg_in); - found = caml_find_code_fragment((char*) Code_val(val), &frag, &cf); - CAMLassert(found); - caml_putword(dbg_out, frag); + cf = caml_find_code_fragment_by_pc((char*) Code_val(val)); + CAMLassert(cf != NULL); + caml_putword(dbg_out, cf->fragnum); caml_putword(dbg_out, (char*) Code_val(val) - cf->code_start); caml_flush(dbg_out); break; @@ -590,7 +558,7 @@ void caml_debugger(enum event_kind event, value param) void caml_debugger_cleanup_fork(void) { - /* We could remove all of the breakpoints, but closing the connection + /* We could remove all of the event points, but closing the connection * means that they'll just be skipped anyway. */ close_connection(); caml_debugger_in_use = 0; diff --git a/runtime/dynlink_nat.c b/runtime/dynlink_nat.c index 95626109..0bd2319b 100644 --- a/runtime/dynlink_nat.c +++ b/runtime/dynlink_nat.c @@ -20,6 +20,7 @@ #include "caml/memory.h" #include "caml/stack.h" #include "caml/callback.h" +#include "caml/codefrag.h" #include "caml/alloc.h" #include "caml/intext.h" #include "caml/osdeps.h" @@ -100,7 +101,6 @@ CAMLprim value caml_natdynlink_run(value handle_v, value symbol) { CAMLlocal1 (result); void *sym,*sym2; void* handle = Handle_val(handle_v); - struct code_fragment * cf; #define optsym(n) getsym(handle,unit,n) const char *unit; @@ -128,11 +128,8 @@ CAMLprim value caml_natdynlink_run(value handle_v, value symbol) { sym2 = optsym("__code_end"); if (NULL != sym && NULL != sym2) { caml_page_table_add(In_code_area, sym, sym2); - cf = caml_stat_alloc(sizeof(struct code_fragment)); - cf->code_start = (char *) sym; - cf->code_end = (char *) sym2; - cf->digest_computed = 0; - caml_ext_table_add(&caml_code_fragments_table, cf); + caml_register_code_fragment((char *) sym, (char *) sym2, + DIGEST_LATER, NULL); } if( caml_natdynlink_hook != NULL ) caml_natdynlink_hook(handle,unit); diff --git a/runtime/extern.c b/runtime/extern.c index 7613e280..440753a2 100644 --- a/runtime/extern.c +++ b/runtime/extern.c @@ -21,13 +21,13 @@ #include #include "caml/alloc.h" +#include "caml/codefrag.h" #include "caml/config.h" #include "caml/custom.h" #include "caml/fail.h" #include "caml/gc.h" #include "caml/intext.h" #include "caml/io.h" -#include "caml/md5.h" #include "caml/memory.h" #include "caml/misc.h" #include "caml/mlvalues.h" @@ -713,15 +713,15 @@ static void extern_rec(value v) } } } - else if (caml_find_code_fragment((char*) v, NULL, &cf)) { + else if ((cf = caml_find_code_fragment_by_pc((char*) v)) != NULL) { + const char * digest; if ((extern_flags & CLOSURES) == 0) extern_invalid_argument("output_value: functional value"); - if (! cf->digest_computed) { - caml_md5_block(cf->digest, cf->code_start, cf->code_end - cf->code_start); - cf->digest_computed = 1; - } + digest = (const char *) caml_digest_of_code_fragment(cf); + if (digest == NULL) + extern_invalid_argument("output_value: private function"); writecode32(CODE_CODEPOINTER, (char *) v - cf->code_start); - writeblock((const char *)cf->digest, 16); + writeblock(digest, 16); } else { extern_invalid_argument("output_value: abstract value (outside heap)"); } diff --git a/runtime/fix_code.c b/runtime/fix_code.c index 3cfcac49..aa059be5 100644 --- a/runtime/fix_code.c +++ b/runtime/fix_code.c @@ -25,11 +25,11 @@ #include #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" @@ -37,20 +37,14 @@ 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) diff --git a/runtime/gc_ctrl.c b/runtime/gc_ctrl.c index 956cbcbb..539d6176 100644 --- a/runtime/gc_ctrl.c +++ b/runtime/gc_ctrl.c @@ -471,21 +471,21 @@ CAMLprim value caml_gc_set(value v) /* These fields were added in 4.08.0. */ if (Wosize_val (v) >= 11){ - new_custom_maj = norm_custom_maj (Field (v, 8)); + new_custom_maj = norm_custom_maj (Long_val (Field (v, 8))); if (new_custom_maj != caml_custom_major_ratio){ caml_custom_major_ratio = new_custom_maj; caml_gc_message (0x20, "New custom major ratio: %" ARCH_INTNAT_PRINTF_FORMAT "u%%\n", caml_custom_major_ratio); } - new_custom_min = norm_custom_min (Field (v, 9)); + new_custom_min = norm_custom_min (Long_val (Field (v, 9))); if (new_custom_min != caml_custom_minor_ratio){ caml_custom_minor_ratio = new_custom_min; caml_gc_message (0x20, "New custom minor ratio: %" ARCH_INTNAT_PRINTF_FORMAT "u%%\n", caml_custom_minor_ratio); } - new_custom_sz = Field (v, 10); + new_custom_sz = Long_val (Field (v, 10)); if (new_custom_sz != caml_custom_minor_max_bsz){ caml_custom_minor_max_bsz = new_custom_sz; caml_gc_message (0x20, "New custom minor size limit: %" diff --git a/runtime/globroots.c b/runtime/globroots.c index 54fc8b8f..a55b069b 100644 --- a/runtime/globroots.c +++ b/runtime/globroots.c @@ -17,182 +17,55 @@ /* Registration of global memory roots */ -#include "caml/memory.h" -#include "caml/misc.h" #include "caml/mlvalues.h" #include "caml/roots.h" #include "caml/globroots.h" +#include "caml/skiplist.h" -/* The sets of global memory roots are represented as skip lists - (see William Pugh, "Skip lists: a probabilistic alternative to - balanced binary trees", Comm. ACM 33(6), 1990). */ +/* The three global root lists. + Each is represented by a skip list with the key being the address + of the root. (The associated data field is unused.) */ -struct global_root { - value * root; /* the address of the root */ - struct global_root * forward[1]; /* variable-length array */ -}; - -#define NUM_LEVELS 17 - -struct global_root_list { - value * root; /* dummy value for layout compatibility */ - struct global_root * forward[NUM_LEVELS]; /* forward chaining */ - int level; /* max used level */ -}; - -/* Generate a random level for a new node: 0 with probability 3/4, - 1 with probability 3/16, 2 with probability 3/64, etc. - We use a simple linear congruential PRNG (see Knuth vol 2) instead - of random(), because we need exactly 32 bits of pseudo-random data - (i.e. 2 * (NUM_LEVELS - 1)). Moreover, the congruential PRNG - is faster and guaranteed to be deterministic (to reproduce bugs). */ - -static uint32_t random_seed = 0; +struct skiplist caml_global_roots = SKIPLIST_STATIC_INITIALIZER; + /* mutable roots, don't know whether old or young */ +struct skiplist caml_global_roots_young = SKIPLIST_STATIC_INITIALIZER; + /* generational roots pointing to minor or major heap */ +struct skiplist caml_global_roots_old = SKIPLIST_STATIC_INITIALIZER; + /* generational roots pointing to major heap */ -static int random_level(void) -{ - uint32_t r; - int level = 0; - - /* Linear congruence with modulus = 2^32, multiplier = 69069 - (Knuth vol 2 p. 106, line 15 of table 1), additive = 25173. */ - r = random_seed = random_seed * 69069 + 25173; - /* Knuth (vol 2 p. 13) shows that the least significant bits are - "less random" than the most significant bits with a modulus of 2^m, - so consume most significant bits first */ - while ((r & 0xC0000000U) == 0xC0000000U) { level++; r = r << 2; } - CAMLassert(level < NUM_LEVELS); - return level; -} +/* The invariant of the generational roots is the following: + - If the global root contains a pointer to the minor heap, then the root is + in [caml_global_roots_young]; + - If the global root contains a pointer to the major heap, then the root is + in [caml_global_roots_old] or in [caml_global_roots_young]; + - Otherwise (the root contains a pointer outside of the heap or an integer), + then neither [caml_global_roots_young] nor [caml_global_roots_old] contain + it. +*/ -/* Insertion in a global root list */ +/* Insertion and deletion */ -static void caml_insert_global_root(struct global_root_list * rootlist, - value * r) +Caml_inline void caml_insert_global_root(struct skiplist * list, value * r) { - struct global_root * update[NUM_LEVELS]; - struct global_root * e, * f; - int i, new_level; - - CAMLassert(0 <= rootlist->level && rootlist->level < NUM_LEVELS); - - /* Init "cursor" to list head */ - e = (struct global_root *) rootlist; - /* Find place to insert new node */ - for (i = rootlist->level; i >= 0; i--) { - while (1) { - f = e->forward[i]; - if (f == NULL || f->root >= r) break; - e = f; - } - update[i] = e; - } - e = e->forward[0]; - /* If already present, don't do anything */ - if (e != NULL && e->root == r) return; - /* Insert additional element, updating list level if necessary */ - new_level = random_level(); - if (new_level > rootlist->level) { - for (i = rootlist->level + 1; i <= new_level; i++) - update[i] = (struct global_root *) rootlist; - rootlist->level = new_level; - } - e = caml_stat_alloc(sizeof(struct global_root) + - new_level * sizeof(struct global_root *)); - e->root = r; - for (i = 0; i <= new_level; i++) { - e->forward[i] = update[i]->forward[i]; - update[i]->forward[i] = e; - } + caml_skiplist_insert(list, (uintnat) r, 0); } -/* Deletion in a global root list */ - -static void caml_delete_global_root(struct global_root_list * rootlist, - value * r) +Caml_inline void caml_delete_global_root(struct skiplist * list, value * r) { - struct global_root * update[NUM_LEVELS]; - struct global_root * e, * f; - int i; - - CAMLassert(0 <= rootlist->level && rootlist->level < NUM_LEVELS); - - /* Init "cursor" to list head */ - e = (struct global_root *) rootlist; - /* Find element in list */ - for (i = rootlist->level; i >= 0; i--) { - while (1) { - f = e->forward[i]; - if (f == NULL || f->root >= r) break; - e = f; - } - update[i] = e; - } - e = e->forward[0]; - /* If not found, nothing to do */ - if (e == NULL || e->root != r) return; - /* Rebuild list without node */ - for (i = 0; i <= rootlist->level; i++) { - if (update[i]->forward[i] == e) - update[i]->forward[i] = e->forward[i]; - } - /* Reclaim list element */ - caml_stat_free(e); - /* Down-correct list level */ - while (rootlist->level > 0 && - rootlist->forward[rootlist->level] == NULL) - rootlist->level--; + caml_skiplist_remove(list, (uintnat) r); } -/* Iterate over a global root list */ +/* Iterate a GC scanning action over a global root list */ static void caml_iterate_global_roots(scanning_action f, - struct global_root_list * rootlist) + struct skiplist * rootlist) { - struct global_root * gr; - - for (gr = rootlist->forward[0]; gr != NULL; gr = gr->forward[0]) { - f(*(gr->root), gr->root); - } -} - -/* Empty a global root list */ - -static void caml_empty_global_roots(struct global_root_list * rootlist) -{ - struct global_root * gr, * next; - int i; - - CAMLassert(0 <= rootlist->level && rootlist->level < NUM_LEVELS); - - for (gr = rootlist->forward[0]; gr != NULL; /**/) { - next = gr->forward[0]; - caml_stat_free(gr); - gr = next; - } - for (i = 0; i <= rootlist->level; i++) rootlist->forward[i] = NULL; - rootlist->level = 0; + FOREACH_SKIPLIST_ELEMENT(e, rootlist, { + value * r = (value *) (e->key); + f(*r, r); + }) } -/* The three global root lists */ - -struct global_root_list caml_global_roots = { NULL, { NULL, }, 0 }; - /* mutable roots, don't know whether old or young */ -struct global_root_list caml_global_roots_young = { NULL, { NULL, }, 0 }; - /* generational roots pointing to minor or major heap */ -struct global_root_list caml_global_roots_old = { NULL, { NULL, }, 0 }; - /* generational roots pointing to major heap */ - -/* The invariant of the generational roots is the following: - - If the global root contains a pointer to the minor heap, then the root is - in [caml_global_roots_young]; - - If the global root contains a pointer to the major heap, then the root is - in [caml_global_roots_old] or in [caml_global_roots_young]; - - Otherwise (the root contains a pointer outside of the heap or an integer), - then neither [caml_global_roots_young] nor [caml_global_roots_old] contain - it. - */ - /* Register a global C root of the mutable kind */ CAMLexport void caml_register_global_root(value *r) @@ -300,14 +173,13 @@ void caml_scan_global_roots(scanning_action f) void caml_scan_global_young_roots(scanning_action f) { - struct global_root * gr; caml_iterate_global_roots(f, &caml_global_roots); caml_iterate_global_roots(f, &caml_global_roots_young); /* Move young roots to old roots */ - for (gr = caml_global_roots_young.forward[0]; - gr != NULL; gr = gr->forward[0]) { - caml_insert_global_root(&caml_global_roots_old, gr->root); - } - caml_empty_global_roots(&caml_global_roots_young); + FOREACH_SKIPLIST_ELEMENT(e, &caml_global_roots_young, { + value * r = (value *) (e->key); + caml_insert_global_root(&caml_global_roots_old, r); + }); + caml_skiplist_empty(&caml_global_roots_young); } diff --git a/runtime/intern.c b/runtime/intern.c index 5d7d3817..5f189bac 100644 --- a/runtime/intern.c +++ b/runtime/intern.c @@ -23,13 +23,13 @@ #include #include "caml/alloc.h" #include "caml/callback.h" +#include "caml/codefrag.h" #include "caml/config.h" #include "caml/custom.h" #include "caml/fail.h" #include "caml/gc.h" #include "caml/intext.h" #include "caml/io.h" -#include "caml/md5.h" #include "caml/memory.h" #include "caml/memprof.h" #include "caml/mlvalues.h" @@ -953,21 +953,11 @@ CAMLprim value caml_marshal_data_size(value buff, value ofs) static char * intern_resolve_code_pointer(unsigned char digest[16], asize_t offset) { - int i; - for (i = caml_code_fragments_table.size - 1; i >= 0; i--) { - struct code_fragment * cf = caml_code_fragments_table.contents[i]; - if (! cf->digest_computed) { - caml_md5_block(cf->digest, cf->code_start, cf->code_end - cf->code_start); - cf->digest_computed = 1; - } - if (memcmp(digest, cf->digest, 16) == 0) { - if (cf->code_start + offset < cf->code_end) - return cf->code_start + offset; - else - return NULL; - } - } - return NULL; + struct code_fragment * cf = caml_find_code_fragment_by_digest(digest); + if (cf != NULL && cf->code_start + offset < cf->code_end) + return cf->code_start + offset; + else + return NULL; } static void intern_bad_code_pointer(unsigned char digest[16]) diff --git a/runtime/memprof.c b/runtime/memprof.c index aead07a0..63ac685f 100644 --- a/runtime/memprof.c +++ b/runtime/memprof.c @@ -621,7 +621,8 @@ void caml_memprof_renew_minor_sample(void) if (Caml_state->young_ptr - Caml_state->young_alloc_start < geom) /* No trigger in the current minor heap. */ caml_memprof_young_trigger = Caml_state->young_alloc_start; - caml_memprof_young_trigger = Caml_state->young_ptr - (geom - 1); + else + caml_memprof_young_trigger = Caml_state->young_ptr - (geom - 1); } caml_update_young_limit(); diff --git a/runtime/meta.c b/runtime/meta.c index 28283328..3cf1222b 100644 --- a/runtime/meta.c +++ b/runtime/meta.c @@ -20,6 +20,7 @@ #include #include "caml/alloc.h" #include "caml/backtrace_prim.h" +#include "caml/codefrag.h" #include "caml/config.h" #include "caml/debugger.h" #include "caml/fail.h" @@ -93,25 +94,26 @@ CAMLprim value caml_reify_bytecode(value ls_prog, { CAMLparam3(ls_prog, debuginfo, digest_opt); CAMLlocal3(clos, bytecode, retval); - struct code_fragment * cf = caml_stat_alloc(sizeof(struct code_fragment)); code_t prog; asize_t len; + enum digest_status digest_kind; + unsigned char * digest; + int fragnum; prog = (code_t)buffer_of_bytes_array(ls_prog, &len); caml_add_debug_info(prog, Val_long(len), debuginfo); - cf->code_start = (char *) prog; - cf->code_end = (char *) prog + len; /* match (digest_opt : string option) with */ if (Is_block(digest_opt)) { /* | Some digest -> */ - memcpy(cf->digest, String_val(Field(digest_opt, 0)), 16); - cf->digest_computed = 1; + digest_kind = DIGEST_PROVIDED; + digest = (unsigned char *) String_val(Field(digest_opt, 0)); } else { /* | None -> */ - cf->digest_computed = 0; + digest_kind = DIGEST_LATER; + digest = NULL; } - caml_ext_table_add(&caml_code_fragments_table, cf); - + fragnum = caml_register_code_fragment((char *) prog, (char *) prog + len, + digest_kind, digest); #ifdef ARCH_BIG_ENDIAN caml_fixup_endianness((code_t) prog, len); #endif @@ -121,7 +123,7 @@ CAMLprim value caml_reify_bytecode(value ls_prog, caml_prepare_bytecode((code_t) prog, len); /* Notify debugger after fragment gets added and reified. */ - caml_debugger(CODE_LOADED, Val_long(caml_code_fragments_table.size - 1)); + caml_debugger(CODE_LOADED, Val_long(fragnum)); clos = caml_alloc_small (1, Closure_tag); Code_val(clos) = (code_t) prog; @@ -142,21 +144,19 @@ CAMLprim value caml_static_release_bytecode(value bc) { code_t prog; asize_t len; - int found, index; struct code_fragment *cf; prog = Bytecode_val(bc)->prog; len = Bytecode_val(bc)->len; caml_remove_debug_info(prog); - found = caml_find_code_fragment((char*) prog, &index, &cf); - /* Not matched with a caml_reify_bytecode call; impossible. */ - CAMLassert(found); (void) found; /* Silence unused variable warning. */ + cf = caml_find_code_fragment_by_pc((char *) prog); + CAMLassert(cf != NULL); /* Notify debugger before the fragment gets destroyed. */ - caml_debugger(CODE_UNLOADED, Val_long(index)); + caml_debugger(CODE_UNLOADED, Val_long(cf->fragnum)); - caml_ext_table_remove(&caml_code_fragments_table, cf); + caml_remove_code_fragment(cf); #ifndef NATIVE_CODE caml_release_bytecode(prog, len); diff --git a/runtime/minor_gc.c b/runtime/minor_gc.c index b8661bc7..a3aeec4a 100644 --- a/runtime/minor_gc.c +++ b/runtime/minor_gc.c @@ -173,8 +173,8 @@ void caml_set_minor_heap_size (asize_t bsz) Caml_state->young_alloc_mid = Caml_state->young_alloc_start + Wsize_bsize (bsz) / 2; Caml_state->young_alloc_end = Caml_state->young_end; + /* caml_update_young_limit called by caml_memprof_renew_minor_sample */ Caml_state->young_trigger = Caml_state->young_alloc_start; - caml_update_young_limit(); Caml_state->young_ptr = Caml_state->young_alloc_end; Caml_state->minor_heap_wsz = Wsize_bsize (bsz); caml_memprof_renew_minor_sample(); diff --git a/runtime/misc.c b/runtime/misc.c index 8aa0d090..397bd7cf 100644 --- a/runtime/misc.c +++ b/runtime/misc.c @@ -205,19 +205,3 @@ int caml_runtime_warnings_active(void) } return 1; } - -int caml_find_code_fragment(char *pc, int *index, struct code_fragment **cf) -{ - struct code_fragment *cfi; - int i; - - for (i = 0; i < caml_code_fragments_table.size; i++) { - cfi = (struct code_fragment *) caml_code_fragments_table.contents[i]; - if ((char*) pc >= cfi->code_start && (char*) pc < cfi->code_end) { - if (index != NULL) *index = i; - if (cf != NULL) *cf = cfi; - return 1; - } - } - return 0; -} diff --git a/runtime/signals.c b/runtime/signals.c index 57bb3fc7..8f60e5a5 100644 --- a/runtime/signals.c +++ b/runtime/signals.c @@ -267,6 +267,11 @@ value caml_execute_signal_exn(int signal_number, int in_signal_handler) void caml_update_young_limit (void) { + CAMLassert(Caml_state->young_alloc_start <= caml_memprof_young_trigger && + caml_memprof_young_trigger <= Caml_state->young_alloc_end); + CAMLassert(Caml_state->young_alloc_start <= Caml_state->young_trigger && + Caml_state->young_trigger < Caml_state->young_alloc_end); + /* The minor heap grows downwards. The first trigger is the largest one. */ Caml_state->young_limit = caml_memprof_young_trigger < Caml_state->young_trigger ? diff --git a/runtime/skiplist.c b/runtime/skiplist.c new file mode 100644 index 00000000..f81d520b --- /dev/null +++ b/runtime/skiplist.c @@ -0,0 +1,206 @@ +/**************************************************************************/ +/* */ +/* OCaml */ +/* */ +/* Xavier Leroy, projet Cambium, INRIA Paris */ +/* */ +/* Copyright 2020 Institut National de Recherche en Informatique et */ +/* en Automatique. */ +/* */ +/* All rights reserved. This file is distributed under the terms of */ +/* the GNU Lesser General Public License version 2.1, with the */ +/* special exception on linking described in the file LICENSE. */ +/* */ +/**************************************************************************/ + +#define CAML_INTERNALS + +/* A dictionary data structure implemented as skip lists + (see William Pugh, "Skip lists: a probabilistic alternative to + balanced binary trees", Comm. ACM 33(6), 1990). */ + +#include +#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; +} diff --git a/runtime/startup_nat.c b/runtime/startup_nat.c index 725598f6..444264bf 100644 --- a/runtime/startup_nat.c +++ b/runtime/startup_nat.c @@ -22,6 +22,7 @@ #include "caml/callback.h" #include "caml/backtrace.h" #include "caml/custom.h" +#include "caml/codefrag.h" #include "caml/debugger.h" #include "caml/domain.h" #include "caml/eventlog.h" @@ -47,7 +48,6 @@ extern int caml_parser_trace; char * caml_code_area_start, * caml_code_area_end; -struct ext_table caml_code_fragments_table; /* Initialize the atom table and the static data and code area limits. */ @@ -57,7 +57,6 @@ static void init_static(void) { extern struct segment caml_data_segments[], caml_code_segments[]; int i; - struct code_fragment * cf; caml_init_atom_table (); @@ -79,12 +78,9 @@ static void init_static(void) caml_code_area_end = caml_code_segments[i].end; } /* Register the code in the table of code fragments */ - cf = caml_stat_alloc(sizeof(struct code_fragment)); - cf->code_start = caml_code_area_start; - cf->code_end = caml_code_area_end; - cf->digest_computed = 0; - caml_ext_table_init(&caml_code_fragments_table, 8); - caml_ext_table_add(&caml_code_fragments_table, cf); + caml_register_code_fragment(caml_code_area_start, + caml_code_area_end, + DIGEST_LATER, NULL); } /* These are termination hooks used by the systhreads library */ diff --git a/testsuite/tests/lib-threads/bank.ml b/testsuite/tests/lib-threads/bank.ml index c06736ea..0f080ad3 100644 --- a/testsuite/tests/lib-threads/bank.ml +++ b/testsuite/tests/lib-threads/bank.ml @@ -12,25 +12,33 @@ include systhreads open Printf open Event -type account = int channel * int channel +type account = { + get: int channel; + put: int channel; + stop: unit channel + } -let account (put_ch, get_ch) = +let account a = let rec acc balance = select [ - wrap (send get_ch balance) (fun () -> acc balance); - wrap (receive put_ch) (fun amount -> + wrap (send a.get balance) (fun () -> acc balance); + wrap (receive a.put) (fun amount -> if balance + amount < 0 then failwith "negative balance"; - acc (balance + amount)) + acc (balance + amount)); + wrap (receive a.stop) (fun _ -> ()) ] in acc 0 -let get ((put_ch, get_ch): account) = sync (receive get_ch) -let put ((put_ch, get_ch): account) amount = sync (send put_ch amount) +let get a = sync (receive a.get) +let put a amount = sync (send a.put amount) +let stop a = sync (send a.stop ()) let _ = - let a : account = (new_channel(), new_channel()) in - ignore (Thread.create account a); + let a = { get = new_channel(); put = new_channel(); stop = new_channel() } in + let th = Thread.create account a in put a 100; printf "Current balance: %d\n" (get a); for i = 1 to 99 do put a (-2); put a 1 done; - printf "Final balance: %d\n" (get a) + printf "Final balance: %d\n" (get a); + stop a; + Thread.join th diff --git a/testsuite/tests/lib-threads/sieve.ml b/testsuite/tests/lib-threads/sieve.ml index 71d7f62e..d4cdd447 100644 --- a/testsuite/tests/lib-threads/sieve.ml +++ b/testsuite/tests/lib-threads/sieve.ml @@ -1,12 +1,24 @@ (* TEST +script = "sh ${test_source_directory}/test-runtime-cleanup.sh" + * hassysthreads include systhreads -** bytecode -** native +** script +*** bytecode +output = "${test_build_directory}/program-output" +stdout = "${output}" +*** native +output = "${test_build_directory}/program-output" +stdout = "${output}" *) +(* This test is skipped in "runtime cleanup at exit" mode + (OCAMLRUNPARAM contains c=1) because the cleanup in the main thread + destroys condition variables that are waited for by other threads, + causing a deadlock on some systems. *) + let sieve primes = Event.sync (Event.send primes 2); let integers = Event.new_channel () in diff --git a/testsuite/tests/lib-threads/test-runtime-cleanup.sh b/testsuite/tests/lib-threads/test-runtime-cleanup.sh new file mode 100755 index 00000000..bdfe2219 --- /dev/null +++ b/testsuite/tests/lib-threads/test-runtime-cleanup.sh @@ -0,0 +1,7 @@ +#!/bin/sh +case "$OCAMLRUNPARAM" in + c=1|c=1,*|*,c=1|*,c=1,*) + echo "runtime cleans up at exit" > ${ocamltest_response}; + exit ${TEST_SKIP};; + *) exit ${TEST_PASS};; +esac diff --git a/testsuite/tests/regression/pr9326/gc_set.ml b/testsuite/tests/regression/pr9326/gc_set.ml new file mode 100644 index 00000000..e9d7dbcd --- /dev/null +++ b/testsuite/tests/regression/pr9326/gc_set.ml @@ -0,0 +1,35 @@ +(* TEST +*) + +open Gc + +let min_heap_sz = 524288 (* 512k *) +let maj_heap_inc = 4194304 (* 4M *) + +let _ = + let g1 = Gc.get() in + (* Do not use { g1 with ... }, so that the code will break if more fields + are added to the Gc.control record type *) + Gc.set { minor_heap_size = min_heap_sz; + major_heap_increment = maj_heap_inc; + space_overhead = g1.space_overhead; + verbose = g1.verbose; + max_overhead = g1.max_overhead; + stack_limit = g1.stack_limit; + allocation_policy = g1.allocation_policy; + window_size = g1.window_size; + custom_major_ratio = g1.custom_major_ratio; + custom_minor_ratio = g1.custom_minor_ratio; + custom_minor_max_size = g1.custom_minor_max_size }; + let g2 = Gc.get() in + assert (g2.minor_heap_size = min_heap_sz); + assert (g2.major_heap_increment = maj_heap_inc); + assert (g2.space_overhead = g1.space_overhead); + assert (g2.verbose = g1.verbose); + assert (g2.max_overhead = g1.max_overhead); + assert (g2.stack_limit = g1.stack_limit); + assert (g2.allocation_policy = g1.allocation_policy); + assert (g2.window_size = g1.window_size); + assert (g2.custom_major_ratio = g1.custom_major_ratio); + assert (g2.custom_minor_ratio = g1.custom_minor_ratio); + assert (g2.custom_minor_max_size = g1.custom_minor_max_size) diff --git a/testsuite/tests/statmemprof/callstacks.flat-float-array.reference b/testsuite/tests/statmemprof/callstacks.flat-float-array.reference index 7efb00ae..3a1c8c91 100644 --- a/testsuite/tests/statmemprof/callstacks.flat-float-array.reference +++ b/testsuite/tests/statmemprof/callstacks.flat-float-array.reference @@ -1,74 +1,74 @@ ----------- -Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 19, characters 30-53 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 21, characters 30-53 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 22, characters 30-76 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 24, characters 30-76 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 27, characters 12-66 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 29, characters 12-66 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 30, characters 30-60 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 32, characters 30-60 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 33, characters 30-55 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 35, characters 30-55 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 37, characters 12-62 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 39, characters 12-62 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 40, characters 22-27 -Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 30-65 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 22-27 +Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 44, characters 30-65 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 45, characters 30-69 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 47, characters 30-69 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 48, characters 30-73 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 50, characters 30-73 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 52, characters 30-43 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 54, characters 30-43 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.get0 in file "callstacks.ml", line 55, characters 28-33 -Called from Callstacks.getfloatfield in file "callstacks.ml", line 57, characters 30-47 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.get0 in file "callstacks.ml", line 57, characters 28-33 +Called from Callstacks.getfloatfield in file "callstacks.ml", line 59, characters 30-47 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- Raised by primitive operation at Stdlib__marshal.from_bytes in file "marshal.ml", line 61, characters 9-35 -Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 63, characters 12-87 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 65, characters 12-87 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 66, characters 30-59 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 68, characters 30-59 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 69, characters 37-43 -Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 71, characters 30-49 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 71, characters 37-43 +Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 73, characters 30-49 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 diff --git a/testsuite/tests/statmemprof/callstacks.ml b/testsuite/tests/statmemprof/callstacks.ml index 758d01dc..e7c29cea 100644 --- a/testsuite/tests/statmemprof/callstacks.ml +++ b/testsuite/tests/statmemprof/callstacks.ml @@ -2,15 +2,17 @@ flags = "-g -w -5" compare_programs = "false" - * flat-float-array - reference = "${test_source_directory}/callstacks.flat-float-array.reference" - ** native - ** bytecode - - * no-flat-float-array - reference = "${test_source_directory}/callstacks.no-flat-float-array.reference" - ** native - ** bytecode + * no-spacetime + + ** flat-float-array + reference = "${test_source_directory}/callstacks.flat-float-array.reference" + *** native + *** bytecode + + ** no-flat-float-array + reference = "${test_source_directory}/callstacks.no-flat-float-array.reference" + *** native + *** bytecode *) open Gc.Memprof diff --git a/testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference b/testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference index 789f5341..bd7bd193 100644 --- a/testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference +++ b/testsuite/tests/statmemprof/callstacks.no-flat-float-array.reference @@ -1,70 +1,70 @@ ----------- -Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 19, characters 30-53 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_list_literal in file "callstacks.ml", line 21, characters 30-53 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 22, characters 30-76 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_pair in file "callstacks.ml", line 24, characters 30-76 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 27, characters 12-66 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_record in file "callstacks.ml", line 29, characters 12-66 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 30, characters 30-60 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_some in file "callstacks.ml", line 32, characters 30-60 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 33, characters 30-55 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_array_literal in file "callstacks.ml", line 35, characters 30-55 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 37, characters 12-62 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_float_array_literal in file "callstacks.ml", line 39, characters 12-62 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 40, characters 22-27 -Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 30-65 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.do_alloc_unknown_array_literal in file "callstacks.ml", line 42, characters 22-27 +Called from Callstacks.alloc_unknown_array_literal in file "callstacks.ml", line 44, characters 30-65 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 45, characters 30-69 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_small_array in file "callstacks.ml", line 47, characters 30-69 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 48, characters 30-73 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_large_array in file "callstacks.ml", line 50, characters 30-73 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 52, characters 30-43 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_closure.(fun) in file "callstacks.ml", line 54, characters 30-43 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- No callstack ----------- Raised by primitive operation at Stdlib__marshal.from_bytes in file "marshal.ml", line 61, characters 9-35 -Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 63, characters 12-87 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Called from Callstacks.alloc_unmarshal in file "callstacks.ml", line 65, characters 12-87 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 66, characters 30-59 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.alloc_ref in file "callstacks.ml", line 68, characters 30-59 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 ----------- -Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 69, characters 37-43 -Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 71, characters 30-49 -Called from Callstacks.test in file "callstacks.ml", line 93, characters 2-10 +Raised by primitive operation at Callstacks.prod_floats in file "callstacks.ml", line 71, characters 37-43 +Called from Callstacks.alloc_boxedfloat in file "callstacks.ml", line 73, characters 30-49 +Called from Callstacks.test in file "callstacks.ml", line 95, characters 2-10 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Callstacks in file "callstacks.ml", line 100, characters 2-27 +Called from Callstacks in file "callstacks.ml", line 102, characters 2-27 diff --git a/testsuite/tests/statmemprof/comballoc.byte.reference b/testsuite/tests/statmemprof/comballoc.byte.reference index 31dce2d0..aa6736ef 100644 --- a/testsuite/tests/statmemprof/comballoc.byte.reference +++ b/testsuite/tests/statmemprof/comballoc.byte.reference @@ -1,49 +1,49 @@ 2: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 3: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 4: 0.42 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 12, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 13, characters 11-20 +Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 2: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 3: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 4: 0.01 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 12, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 13, characters 11-20 +Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 2: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 3: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 4: 0.83 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 12, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f4 in file "comballoc.ml", line 13, characters 11-20 +Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 OK diff --git a/testsuite/tests/statmemprof/comballoc.ml b/testsuite/tests/statmemprof/comballoc.ml index 716883d8..f3c712f4 100644 --- a/testsuite/tests/statmemprof/comballoc.ml +++ b/testsuite/tests/statmemprof/comballoc.ml @@ -1,10 +1,11 @@ (* TEST flags = "-g" - * bytecode - reference = "${test_source_directory}/comballoc.byte.reference" - * native - reference = "${test_source_directory}/comballoc.opt.reference" - compare_programs = "false" + * no-spacetime + ** bytecode + reference = "${test_source_directory}/comballoc.byte.reference" + ** native + reference = "${test_source_directory}/comballoc.opt.reference" + compare_programs = "false" *) open Gc.Memprof diff --git a/testsuite/tests/statmemprof/comballoc.opt.reference b/testsuite/tests/statmemprof/comballoc.opt.reference index 9fbeb6a7..ffe09c66 100644 --- a/testsuite/tests/statmemprof/comballoc.opt.reference +++ b/testsuite/tests/statmemprof/comballoc.opt.reference @@ -1,49 +1,49 @@ 2: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 3: 0.42 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 4: 0.42 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 12, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 13, characters 11-20 +Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 2: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 3: 0.01 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 4: 0.01 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 12, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 13, characters 11-20 +Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 2: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 2-19 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 2-19 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 3: 0.83 false -Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 15, characters 6-18 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f in file "comballoc.ml", line 16, characters 6-18 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 4: 0.83 true -Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 12, characters 11-20 -Called from Comballoc.f in file "comballoc.ml", line 15, characters 13-17 -Called from Comballoc.test in file "comballoc.ml", line 40, characters 25-48 +Raised by primitive operation at Comballoc.f4 in file "comballoc.ml" (inlined), line 13, characters 11-20 +Called from Comballoc.f in file "comballoc.ml", line 16, characters 13-17 +Called from Comballoc.test in file "comballoc.ml", line 41, characters 25-48 Called from Stdlib__list.iter in file "list.ml", line 110, characters 12-15 -Called from Comballoc in file "comballoc.ml", line 70, characters 2-35 +Called from Comballoc in file "comballoc.ml", line 71, characters 2-35 OK diff --git a/testsuite/tests/typing-extensions/extensions.ml b/testsuite/tests/typing-extensions/extensions.ml index 0c5dbf55..da85b9ec 100644 --- a/testsuite/tests/typing-extensions/extensions.ml +++ b/testsuite/tests/typing-extensions/extensions.ml @@ -187,6 +187,30 @@ let get_num : type a. a foo -> a -> a option = fun f i1 -> val get_num : 'a foo -> 'a -> 'a option = |}] +(* 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 = } +|}] + +let must_be_polymorphic = fun x -> X {x};; +[%%expect {| +val must_be_polymorphic : 'a -> 'a inline = +|}] + +let must_be_polymorphic : 'a . 'a -> 'a inline = fun x -> X {x};; +[%%expect {| +val must_be_polymorphic : 'a -> 'a inline = +|}] + (* Extensions must obey constraints *) type 'a foo = .. constraint 'a = [> `Var ] diff --git a/tools/ci/inria/bootstrap b/tools/ci/inria/bootstrap index 6e993a14..95476e7b 100755 --- a/tools/ci/inria/bootstrap +++ b/tools/ci/inria/bootstrap @@ -106,6 +106,10 @@ case "${OCAML_ARCH}" in . "$HOME/.profile" . "$HOME/.msenv64" ;; + solaris) + echo OCaml 4.11 does not support Solaris. Exiting. + exit + ;; *) arch_error;; esac diff --git a/tools/ci/inria/extra-checks b/tools/ci/inria/extra-checks index 3e686478..a33e3d3b 100755 --- a/tools/ci/inria/extra-checks +++ b/tools/ci/inria/extra-checks @@ -78,6 +78,10 @@ case "${OCAML_ARCH}" in linux) ;; cygwin|cygwin64|mingw|mingw64|msvc|msvc64) error "Don't run this test under Windows";; + solaris) + echo OCaml 4.11 does not support Solaris. Exiting. + exit + ;; *) arch_error;; esac diff --git a/tools/ci/inria/main b/tools/ci/inria/main index 99fb4667..3404c99c 100755 --- a/tools/ci/inria/main +++ b/tools/ci/inria/main @@ -86,6 +86,10 @@ case "${OCAML_ARCH}" in . "$HOME/.profile" . "$HOME/.msenv64" ;; + solaris) + echo OCaml 4.11 does not support Solaris. Exiting. + exit + ;; *) arch_error;; esac diff --git a/typing/typedecl.ml b/typing/typedecl.ml index d38a1423..e9e0cfa6 100644 --- a/typing/typedecl.ml +++ b/typing/typedecl.ml @@ -945,9 +945,8 @@ let transl_type_decl env rec_flag sdecl_list = (* Translating type extensions *) -let transl_extension_constructor env type_path type_params +let transl_extension_constructor ~scope env type_path type_params typext_params priv sext = - let scope = Ctype.create_scope () in let id = Ident.create_scoped ~scope sext.pext_name.txt in let args, ret_type, kind = match sext.pext_kind with @@ -1060,10 +1059,10 @@ let transl_extension_constructor env type_path type_params Typedtree.ext_loc = sext.pext_loc; Typedtree.ext_attributes = sext.pext_attributes; } -let transl_extension_constructor env type_path type_params +let transl_extension_constructor ~scope env type_path type_params typext_params priv sext = Builtin_attributes.warning_scope sext.pext_attributes - (fun () -> transl_extension_constructor env type_path type_params + (fun () -> transl_extension_constructor ~scope env type_path type_params typext_params priv sext) let is_rebind ext = @@ -1072,6 +1071,9 @@ let is_rebind ext = | Text_decl _ -> false let transl_type_extension extend env loc styext = + (* Note: it would be incorrect to call [create_scope] *after* + [reset_type_variables] or after [begin_def] (see #10010). *) + let scope = Ctype.create_scope () in reset_type_variables(); Ctype.begin_def(); let type_path, type_decl = @@ -1124,7 +1126,7 @@ let transl_type_extension extend env loc styext = (Ctype.instance_list type_decl.type_params) type_params; let constructors = - List.map (transl_extension_constructor env type_path + List.map (transl_extension_constructor ~scope env type_path type_decl.type_params type_params styext.ptyext_private) styext.ptyext_constructors in @@ -1180,10 +1182,11 @@ let transl_type_extension extend env loc styext = (fun () -> transl_type_extension extend env loc styext) let transl_exception env sext = + let scope = Ctype.create_scope () in reset_type_variables(); Ctype.begin_def(); let ext = - transl_extension_constructor env + transl_extension_constructor ~scope env Predef.path_exn [] [] Asttypes.Public sext in Ctype.end_def(); -- 2.30.2