From a296066e3938ed8657163e9acdfcec4b4e028203 Mon Sep 17 00:00:00 2001 From: Stephane Glondu Date: Sat, 29 Nov 2008 11:16:28 +0100 Subject: [PATCH] Imported Upstream version 3.11.0~rc1 --- Changes | 30 +- INSTALL | 17 +- Makefile | 20 +- Makefile.nt | 18 +- VERSION | 4 +- _tags | 2 +- asmcomp/amd64/emit.mlp | 63 +++- asmcomp/amd64/selection.ml | 28 +- asmcomp/i386/emit.mlp | 22 +- asmrun/.depend | 30 +- asmrun/amd64.S | 191 +++++----- asmrun/signals_osdep.h | 29 +- asmrun/startup.c | 7 +- boot/myocamlbuild.boot | Bin 385296 -> 394071 bytes boot/ocamlc | Bin 1040469 -> 1040645 bytes boot/ocamldep | Bin 288269 -> 288207 bytes boot/ocamllex | Bin 164537 -> 164496 bytes build/.cvsignore | 1 + build/buildbot | 2 +- build/camlp4-byte-only.sh | 6 +- build/camlp4-native-only.sh | 6 +- build/distclean.sh | 3 +- build/fastworld.sh | 7 +- build/{partial-boot.sh => mixed-boot.sh} | 5 +- build/ocamlbuild-byte-only.sh | 6 +- build/ocamlbuild-native-only.sh | 6 +- build/ocamlbuildlib-native-only.sh | 6 +- build/world.sh | 9 +- byterun/.depend | 12 +- byterun/Makefile | 4 +- byterun/config.h | 4 +- byterun/freelist.c | 325 ++++++++++++------ byterun/freelist.h | 3 +- byterun/gc_ctrl.c | 28 +- byterun/major_gc.c | 34 +- byterun/memory.c | 39 ++- byterun/memory.h | 25 +- byterun/startup.c | 6 +- camlp4/Camlp4/PreCast.ml | 2 +- camlp4/Camlp4/Printers/DumpCamlp4Ast.ml | 2 +- camlp4/Camlp4/Printers/DumpOCamlAst.ml | 2 +- camlp4/Camlp4/Printers/Null.ml | 2 +- camlp4/Camlp4/Printers/OCaml.ml | 2 +- camlp4/Camlp4/Printers/OCamlr.ml | 2 +- camlp4/Camlp4/Sig.ml | 4 +- camlp4/Camlp4/Struct/AstFilters.ml | 3 + camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml | 2 +- camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli | 2 +- camlp4/Camlp4/Struct/DynLoader.ml | 2 +- camlp4/Camlp4/Struct/Grammar/Fold.ml | 2 +- camlp4/Camlp4/Struct/Grammar/Fold.mli | 2 +- camlp4/Camlp4/Struct/Grammar/Parser.mli | 2 +- camlp4/Camlp4/Struct/Lexer.mll | 2 +- camlp4/Camlp4/Struct/Quotation.ml | 2 +- camlp4/Camlp4Bin.ml | 2 +- camlp4/Camlp4Filters/Camlp4AstLifter.ml | 2 +- camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml | 2 +- camlp4/Camlp4Filters/Camlp4FoldGenerator.ml | 2 +- .../Camlp4Filters/Camlp4LocationStripper.ml | 2 +- camlp4/Camlp4Filters/Camlp4MapGenerator.ml | 2 +- camlp4/Camlp4Filters/Camlp4Profiler.ml | 2 +- camlp4/Camlp4Filters/Camlp4TrashRemover.ml | 2 +- camlp4/Camlp4Parsers/Camlp4AstLoader.ml | 2 +- camlp4/Camlp4Parsers/Camlp4DebugParser.ml | 2 +- camlp4/Camlp4Parsers/Camlp4GrammarParser.ml | 2 +- .../Camlp4Parsers/Camlp4ListComprehension.ml | 2 +- camlp4/Camlp4Parsers/Camlp4MacroParser.ml | 2 +- camlp4/Camlp4Parsers/Camlp4OCamlParser.ml | 2 +- .../Camlp4Parsers/Camlp4OCamlParserParser.ml | 2 +- .../Camlp4OCamlReloadedParser.ml | 2 +- .../Camlp4Parsers/Camlp4OCamlRevisedParser.ml | 2 +- .../Camlp4OCamlRevisedParserParser.ml | 2 +- camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml | 2 +- .../Camlp4Parsers/Camlp4QuotationExpander.ml | 2 +- camlp4/Camlp4Top/Rprint.ml | 2 +- camlp4/Camlp4Top/Top.ml | 11 +- camlp4/Makefile | 2 +- camlp4/boot/Camlp4.ml | 14 +- camlp4/boot/Makefile | 2 +- camlp4/boot/camlp4boot.ml | 18 +- camlp4/man/Makefile | 2 +- camlp4/mkcamlp4.ml | 2 +- config/Makefile.mingw | 5 +- config/Makefile.msvc | 9 +- configure | 58 ++-- driver/optcompile.ml | 6 +- emacs/caml.el | 8 +- man/ocamlc.m | 8 +- man/ocamlopt.m | 8 +- man/ocamlrun.m | 12 +- myocamlbuild.ml | 49 +-- ocamlbuild/display.ml | 7 +- ocamlbuild/main.ml | 3 +- ocamlbuild/ocaml_specific.ml | 3 +- ocamlbuild/plugin.ml | 3 +- ocamldoc/odoc_html.ml | 4 +- ocamldoc/odoc_man.ml | 12 +- ocamldoc/odoc_ocamlhtml.mll | 39 ++- otherlibs/bigarray/bigarray.h | 3 +- otherlibs/bigarray/bigarray_stubs.c | 4 +- otherlibs/labltk/browser/Makefile.nt | 11 +- otherlibs/labltk/browser/Makefile.shared | 5 +- otherlibs/labltk/browser/winmain.c | 16 +- otherlibs/win32unix/select.c | 20 +- stdlib/filename.ml | 19 +- stdlib/gc.ml | 3 +- stdlib/gc.mli | 10 +- stdlib/string.ml | 16 +- stdlib/weak.mli | 9 +- tools/make-package-macosx | 5 +- toplevel/opttopdirs.ml | 5 +- toplevel/topdirs.ml | 5 +- typing/ctype.mli | 3 +- typing/includecore.ml | 13 +- utils/ccomp.ml | 4 +- 115 files changed, 943 insertions(+), 568 deletions(-) create mode 100644 build/.cvsignore rename build/{partial-boot.sh => mixed-boot.sh} (89%) diff --git a/Changes b/Changes index 64cfa97b..85ea1217 100644 --- a/Changes +++ b/Changes @@ -8,6 +8,8 @@ Language features: after forcing, match the pattern . - Introduction of private abbreviation types "type t = private ", for abstracting the actual manifest type in type abbreviations. +- Subtyping is now allowed between a private abbreviation and its definition, + and between a polymorphic method and its monomorphic instance. Compilers: - The file name for a compilation unit should correspond to a valid @@ -34,6 +36,7 @@ Compilers: float fields). Native-code compiler: +- New port: Mac OS X / Intel in 64-bit mode (configure with -cc "gcc -m64"). - A new option "-shared" to produce a plugin that can be dynamically loaded with the native version of Dynlink. - A new option "-nodynlink" to enable optimizations valid only for code @@ -42,9 +45,8 @@ Native-code compiler: - Can select which assembler and asm options to use at configuration time. Run-time system: -- Changes in freelist management to reduce fragmentation. -- New implementation of the page table describing the heap (a sparse - hashtable replaces a dense bitvector), fixes issues with address +- New implementation of the page table describing the heap (two-level + array in 32 bits, sparse hashtable in 64 bits), fixes issues with address space randomization on 64-bit OS (PR#4448). - New "generational" API for registering global memory roots with the GC, enables faster scanning of global roots. @@ -54,6 +56,9 @@ Run-time system: - Changes in implementation of dynamic linking of C code: under Win32, use Alain Frisch's flexdll implementation of the dlopen API; under MacOSX, use dlopen API instead of MacOSX bundle API. +- Programs may now choose a first-fit allocation policy instead of + the default next-fit. First-fit reduces fragmentation but is + slightly slower in some cases. Standard library: - Parsing library: new function "set_trace" to programmatically turn @@ -86,8 +91,8 @@ Other libraries: Tools: - ocamldebug now supported under Windows (MSVC and Mingw ports), - but without the replay feature. (Contributed by Sylvain Le Gall - at OCamlCore with support from Lexifi.) + but without the replay feature. (Contributed by Dmitry Bely + and Sylvain Le Gall at OCamlCore with support from Lexifi.) - ocamldoc: new option -no-module-constraint-filter to include functions hidden by signature constraint in documentation. - ocamlmklib and ocamldep.opt now available under Windows ports. @@ -112,11 +117,12 @@ Bug fixes: - PR#4564: add note "stack is not executable" to object files generated by ocamlopt (Linux/x86, Linux/AMD64). - PR#4566: bug in Ratio.approx_ratio_fix and Num.approx_num_fix. -- PR#4582: weird behaviour of String.index_from and String.rindex_from. +- PR#4582: clarified the documentation of functions in the String module. - PR#4583: stack overflow in "ocamlopt -g" during closure conversion pass. - PR#4585: ocamldoc and "val virtual" declarations. - PR#4587: ocamldoc and escaped @ characters. -- PR#4605: Buffer.add_substitute was sometime wrong when target string had backslashes. +- PR#4605: Buffer.add_substitute was sometime wrong when target string had + backslashes. - PR#4614: Inconsistent declaration of CamlCBCmd in LablTk library. @@ -2378,12 +2384,4 @@ Caml Special Light 1.06: * First public release. -<<<<<<< Changes -<<<<<<< Changes -$Id: Changes,v 1.183.2.1 2008/10/15 13:12:58 doligez Exp $ -======= -$Id: Changes,v 1.183.2.1 2008/10/15 13:12:58 doligez Exp $ ->>>>>>> 1.168.2.7 -======= -$Id: Changes,v 1.183.2.1 2008/10/15 13:12:58 doligez Exp $ ->>>>>>> 1.168.2.13 +$Id: Changes,v 1.183.2.7 2008/11/18 10:24:31 doligez Exp $ diff --git a/INSTALL b/INSTALL index c1d84570..cdb3436f 100644 --- a/INSTALL +++ b/INSTALL @@ -5,11 +5,13 @@ PREREQUISITES * The GNU C compiler gcc is recommended, as the bytecode interpreter takes advantage of gcc-specific features to enhance - performance. + performance. gcc is the standard compiler under Linux, MacOS X, + and many other systems. -* Under HP/UX, the GNU C compiler gcc, the GNU assembler gas, and GNU make - are all *required*. The vendor-provided compiler, assembler and make - have major problems. +* Under MacOS X 10.5, you need version 3.1 or later of the XCode + development tools. The version of XCode found on MacOS X 10.5 + installation media causes linking problems. XCode updates + are available free of charge at http://developer.apple.com/tools/xcode/ * Under MacOS X up to version 10.2.8, you must raise the limit on the stack size with one of the following commands: @@ -20,6 +22,10 @@ PREREQUISITES * If you do not have write access to /tmp, you should set the environment variable TMPDIR to the name of some other temporary directory. +* Under HP/UX, the GNU C compiler gcc, the GNU assembler gas, and GNU make + are all *required*. The vendor-provided compiler, assembler and make + have major problems. + INSTALLATION INSTRUCTIONS @@ -120,7 +126,8 @@ Examples: Installation in /usr, man pages in section "l": ./configure -bindir /usr/bin -libdir /usr/lib/ocaml -mandir /usr/man/manl - On a MacOSX/PowerPC host, to build a 64-bit version of OCaml: + On a MacOSX/Intel Core 2 or MacOSX/PowerPC host, to build a 64-bit version + of OCaml: ./configure -cc "gcc -m64" On a Linux x86/64 bits host, to build a 32-bit version of OCaml: diff --git a/Makefile b/Makefile index 8199776e..5a015ee3 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile,v 1.222 2008/07/14 12:59:21 weis Exp $ +# $Id: Makefile,v 1.222.2.2 2008/10/23 15:29:11 ertai Exp $ # The main Makefile @@ -289,7 +289,7 @@ install: cp toplevel/toploop.cmi toplevel/topdirs.cmi toplevel/topmain.cmi \ $(LIBDIR) cd tools; $(MAKE) install - -cd man; $(MAKE) install + -$(MAKE) -C man install for i in $(OTHERLIBRARIES); do \ (cd otherlibs/$$i; $(MAKE) install) || exit $$?; \ done @@ -680,24 +680,24 @@ alldepend:: # Camlp4 -camlp4out: ocamlc otherlibraries ocamlbuild-partial-boot ocamlbuild.byte +camlp4out: ocamlc otherlibraries ocamlbuild-mixed-boot ocamlbuild.byte ./build/camlp4-byte-only.sh -camlp4opt: ocamlopt otherlibrariesopt ocamlbuild-partial-boot ocamlbuild.native +camlp4opt: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ocamlbuild.native ./build/camlp4-native-only.sh # Ocamlbuild -ocamlbuild.byte: ocamlc otherlibraries ocamlbuild-partial-boot +ocamlbuild.byte: ocamlc otherlibraries ocamlbuild-mixed-boot ./build/ocamlbuild-byte-only.sh -ocamlbuild.native: ocamlopt otherlibrariesopt ocamlbuild-partial-boot +ocamlbuild.native: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ./build/ocamlbuild-native-only.sh -ocamlbuildlib.native: ocamlopt otherlibrariesopt ocamlbuild-partial-boot +ocamlbuildlib.native: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ./build/ocamlbuildlib-native-only.sh -ocamlbuild-partial-boot: ocamlc otherlibraries - ./build/partial-boot.sh +ocamlbuild-mixed-boot: ocamlc otherlibraries + ./build/mixed-boot.sh partialclean:: rm -rf _build @@ -763,7 +763,7 @@ distclean: .PHONY: partialclean beforedepend alldepend cleanboot coldstart .PHONY: compare core coreall .PHONY: coreboot defaultentry depend distclean install installopt -.PHONY: library library-cross libraryopt ocamlbuild-partial-boot +.PHONY: library library-cross libraryopt ocamlbuild-mixed-boot .PHONY: ocamlbuild.byte ocamlbuild.native ocamldebugger ocamldoc .PHONY: ocamldoc.opt ocamllex ocamllex.opt ocamltools ocamltools.opt .PHONY: ocamlyacc opt-core opt opt.opt otherlibraries diff --git a/Makefile.nt b/Makefile.nt index 81c97085..4a605139 100644 --- a/Makefile.nt +++ b/Makefile.nt @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile.nt,v 1.113 2008/07/29 08:31:41 xleroy Exp $ +# $Id: Makefile.nt,v 1.113.2.1 2008/11/10 16:13:20 ertai Exp $ # The main Makefile @@ -594,24 +594,24 @@ alldepend:: # Camlp4 -camlp4out: ocamlc otherlibraries ocamlbuild-partial-boot ocamlbuild.byte +camlp4out: ocamlc otherlibraries ocamlbuild-mixed-boot ocamlbuild.byte ./build/camlp4-byte-only.sh -camlp4opt: ocamlopt otherlibrariesopt ocamlbuild-partial-boot ocamlbuild.native +camlp4opt: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ocamlbuild.native ./build/camlp4-native-only.sh # Ocamlbuild -ocamlbuild.byte: ocamlc otherlibraries ocamlbuild-partial-boot +ocamlbuild.byte: ocamlc otherlibraries ocamlbuild-mixed-boot ./build/ocamlbuild-byte-only.sh -ocamlbuild.native: ocamlopt otherlibrariesopt ocamlbuild-partial-boot +ocamlbuild.native: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ./build/ocamlbuild-native-only.sh -ocamlbuildlib.native: ocamlopt otherlibrariesopt ocamlbuild-partial-boot +ocamlbuildlib.native: ocamlopt otherlibrariesopt ocamlbuild-mixed-boot ./build/ocamlbuildlib-native-only.sh -.PHONY: ocamlbuild-partial-boot -ocamlbuild-partial-boot: - ./build/partial-boot.sh +.PHONY: ocamlbuild-mixed-boot +ocamlbuild-mixed-boot: + ./build/mixed-boot.sh partialclean:: rm -rf _build diff --git a/VERSION b/VERSION index f9d9a820..8e10f978 100644 --- a/VERSION +++ b/VERSION @@ -1,6 +1,6 @@ -3.11.0+beta1 +3.11.0+rc1 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli -# $Id: VERSION,v 1.26.2.2 2008/10/15 13:12:58 doligez Exp $ +# $Id: VERSION,v 1.26.2.6 2008/11/24 16:30:40 doligez Exp $ diff --git a/_tags b/_tags index 111c3bf0..47121f86 100644 --- a/_tags +++ b/_tags @@ -33,7 +33,7 @@ true: use_stdlib : -camlp4boot "camlp4/Camlp4_import.ml": -warn_Ale or or "camlp4/Camlp4/Struct/Lexer.ml": -camlp4boot, -warn_Ale, warn_a - or "camlp4/camlp4lib.cma" or : use_dynlink + or : use_dynlink "camlp4/Camlp4/Printers/OCaml.ml" or "camlp4/Camlp4/Printers/OCamlr.ml": warn_Alezv : include_unix "camlp4/Camlp4/Struct/DynLoader.ml" or "camlp4/boot/Camlp4.ml": include_dynlink diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index f3115517..4516178a 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp,v 1.16 2008/08/01 08:04:57 xleroy Exp $ *) +(* $Id: emit.mlp,v 1.16.2.2 2008/11/08 16:08:09 xleroy Exp $ *) (* Emission of x86-64 (AMD 64) assembly code *) @@ -23,6 +23,12 @@ open Mach open Linearize open Emitaux +let macosx = + match Config.system with + | "macosx" -> true + | _ -> false + + (* Tradeoff between code size and code speed *) let fastcode_flag = ref true @@ -54,15 +60,16 @@ let slot_offset loc cl = (* Symbols *) let emit_symbol s = - Emitaux.emit_symbol '$' s + if macosx then emit_string "_"; + Emitaux.emit_symbol '$' s let emit_call s = - if !Clflags.dlcode + if !Clflags.dlcode && not macosx then `call {emit_symbol s}@PLT` else `call {emit_symbol s}` let emit_jump s = - if !Clflags.dlcode + if !Clflags.dlcode && not macosx then `jmp {emit_symbol s}@PLT` else `jmp {emit_symbol s}` @@ -82,6 +89,7 @@ let emit_label lbl = (* Output a .align directive. *) let emit_align n = + let n = if macosx then Misc.log2 n else n in ` .align {emit_int n}\n` let emit_Llabel fallthrough lbl = @@ -588,7 +596,9 @@ let emit_instr fallthrough i = end else begin ` jmp *{emit_label lbl}(, {emit_reg i.arg.(0)}, 8)\n` end; - ` .section .rodata\n`; + if macosx + then ` .const\n` + else ` .section .rodata\n`; emit_align 8; `{emit_label lbl}:`; for i = 0 to Array.length jumptbl - 1 do @@ -670,9 +680,16 @@ let fundecl fundecl = List.iter emit_call_gc !call_gc_sites; emit_call_bound_errors (); if !float_constants <> [] then begin - ` .section .rodata.cst8,\"a\",@progbits\n`; + if macosx + then ` .literal8\n` + else ` .section .rodata.cst8,\"a\",@progbits\n`; List.iter emit_float_constant !float_constants - end + end; + match Config.system with + "linux" | "gnu" -> + ` .type {emit_symbol fundecl.fun_name},@function\n`; + ` .size {emit_symbol fundecl.fun_name},.-{emit_symbol fundecl.fun_name}\n` + | _ -> () (* Emission of data *) @@ -715,11 +732,19 @@ let data l = let begin_assembly() = if !Clflags.dlcode then begin (* from amd64.S; could emit these constants on demand *) - ` .section .rodata.cst8,\"a\",@progbits\n`; - ` .align 16\n`; - `caml_negf_mask: .quad 0x8000000000000000, 0\n`; - ` .align 16\n`; - `caml_absf_mask: .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\n`; + if macosx then begin + ` .literal16\n`; + ` .align 4\n`; + `caml_negf_mask: .quad 0x8000000000000000, 0\n`; + ` .align 4\n`; + `caml_absf_mask: .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\n`; + end else begin + ` .section .rodata.cst8,\"a\",@progbits\n`; + ` .align 16\n`; + `caml_negf_mask: .quad 0x8000000000000000, 0\n`; + ` .align 16\n`; + `caml_absf_mask: .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF\n`; + end; end; let lbl_begin = Compilenv.make_symbol (Some "data_begin") in ` .data\n`; @@ -733,6 +758,7 @@ let begin_assembly() = let end_assembly() = let lbl_end = Compilenv.make_symbol (Some "code_end") in ` .text\n`; + if macosx then ` NOP\n`; (* suppress "ld warning: atom sorting error" *) ` .globl {emit_symbol lbl_end}\n`; `{emit_symbol lbl_end}:\n`; ` .data\n`; @@ -749,8 +775,17 @@ let end_assembly() = efa_32 = (fun n -> ` .long {emit_int32 n}\n`); efa_word = (fun n -> ` .quad {emit_int n}\n`); efa_align = emit_align; - efa_label_rel = (fun lbl ofs -> - ` .long ({emit_label lbl} - .) + {emit_int32 ofs}\n`); + efa_label_rel = + if macosx then begin + let setcnt = ref 0 in + fun lbl ofs -> + incr setcnt; + ` .set L$set${emit_int !setcnt}, ({emit_label lbl} - .) + {emit_int32 ofs}\n`; + ` .long L$set${emit_int !setcnt}\n` + end else begin + fun lbl ofs -> + ` .long ({emit_label lbl} - .) + {emit_int32 ofs}\n` + end; efa_def_label = (fun l -> `{emit_label l}:\n`); efa_string = (fun s -> emit_string_directive " .asciz " s) }; if Config.system = "linux" then diff --git a/asmcomp/amd64/selection.ml b/asmcomp/amd64/selection.ml index 58bb8450..0d5acf84 100644 --- a/asmcomp/amd64/selection.ml +++ b/asmcomp/amd64/selection.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: selection.ml,v 1.7 2007/11/06 15:16:55 frisch Exp $ *) +(* $Id: selection.ml,v 1.7.4.1 2008/10/29 14:32:01 xleroy Exp $ *) (* Instruction selection for the AMD64 *) @@ -122,17 +122,21 @@ method is_immediate n = n <= 0x7FFFFFFF && n >= -0x80000000 method is_immediate_natint n = n <= 0x7FFFFFFFn && n >= -0x80000000n method select_addressing exp = - match select_addr exp with - (Asymbol s, d) -> - (Ibased(s, d), Ctuple []) - | (Alinear e, d) -> - (Iindexed d, e) - | (Aadd(e1, e2), d) -> - (Iindexed2 d, Ctuple[e1; e2]) - | (Ascale(e, scale), d) -> - (Iscaled(scale, d), e) - | (Ascaledadd(e1, e2, scale), d) -> - (Iindexed2scaled(scale, d), Ctuple[e1; e2]) + let (a, d) = select_addr exp in + (* PR#4625: displacement must be a signed 32-bit immediate *) + if d < -0x8000_0000 || d > 0x7FFF_FFFF + then (Iindexed 0, exp) + else match a with + | Asymbol s -> + (Ibased(s, d), Ctuple []) + | Alinear e -> + (Iindexed d, e) + | Aadd(e1, e2) -> + (Iindexed2 d, Ctuple[e1; e2]) + | Ascale(e, scale) -> + (Iscaled(scale, d), e) + | Ascaledadd(e1, e2, scale) -> + (Iindexed2scaled(scale, d), Ctuple[e1; e2]) method select_store addr exp = match exp with diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp index 2ce4edca..13af9815 100644 --- a/asmcomp/i386/emit.mlp +++ b/asmcomp/i386/emit.mlp @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: emit.mlp,v 1.41 2008/08/01 08:04:57 xleroy Exp $ *) +(* $Id: emit.mlp,v 1.41.2.2 2008/11/08 16:08:09 xleroy Exp $ *) (* Emission of Intel 386 assembly code *) @@ -875,15 +875,6 @@ let emit_profile () = ` popl %eax\n` | _ -> () (*unsupported yet*) -(* Declare a global function symbol *) - -let declare_function_symbol name = - ` .globl {emit_symbol name}\n`; - match Config.system with - "linux_elf" | "bsd_elf" | "gnu" -> - ` .type {emit_symbol name},@function\n` - | _ -> () - (* Emission of a function declaration *) let fundecl fundecl = @@ -897,7 +888,7 @@ let fundecl fundecl = bound_error_call := 0; ` .text\n`; emit_align 16; - declare_function_symbol fundecl.fun_name; + ` .globl {emit_symbol fundecl.fun_name}\n`; `{emit_symbol fundecl.fun_name}:\n`; if !Clflags.gprofile then emit_profile(); let n = frame_size() - 4 in @@ -907,7 +898,13 @@ let fundecl fundecl = emit_all true fundecl.fun_body; List.iter emit_call_gc !call_gc_sites; emit_call_bound_errors (); - List.iter emit_float_constant !float_constants + List.iter emit_float_constant !float_constants; + match Config.system with + "linux_elf" | "bsd_elf" | "gnu" -> + ` .type {emit_symbol fundecl.fun_name},@function\n`; + ` .size {emit_symbol fundecl.fun_name},.-{emit_symbol fundecl.fun_name}\n` + | _ -> () + (* Emission of data *) @@ -962,6 +959,7 @@ let begin_assembly() = let end_assembly() = let lbl_end = Compilenv.make_symbol (Some "code_end") in ` .text\n`; + if macosx then ` NOP\n`; (* suppress "ld warning: atom sorting error" *) ` .globl {emit_symbol lbl_end}\n`; `{emit_symbol lbl_end}:\n`; ` .data\n`; diff --git a/asmrun/.depend b/asmrun/.depend index 25c67763..6b66a0c3 100644 --- a/asmrun/.depend +++ b/asmrun/.depend @@ -337,14 +337,14 @@ startup.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/misc.h ../byterun/config.h ../byterun/backtrace.h \ ../byterun/mlvalues.h ../byterun/custom.h ../byterun/mlvalues.h \ ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.h \ - ../byterun/printexc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/sys.h ../byterun/misc.h natdynlink.h + ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ + ../byterun/misc.h ../byterun/printexc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.h natdynlink.h str.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ ../byterun/config.h ../byterun/misc.h ../byterun/fail.h \ @@ -725,14 +725,14 @@ startup.d.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/misc.h ../byterun/config.h ../byterun/backtrace.h \ ../byterun/mlvalues.h ../byterun/custom.h ../byterun/mlvalues.h \ ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.h \ - ../byterun/printexc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/sys.h ../byterun/misc.h natdynlink.h + ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ + ../byterun/misc.h ../byterun/printexc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.h natdynlink.h str.d.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ ../byterun/config.h ../byterun/misc.h ../byterun/fail.h \ @@ -1113,14 +1113,14 @@ startup.p.o: startup.c ../byterun/callback.h ../byterun/mlvalues.h \ ../byterun/misc.h ../byterun/config.h ../byterun/backtrace.h \ ../byterun/mlvalues.h ../byterun/custom.h ../byterun/mlvalues.h \ ../byterun/fail.h ../byterun/misc.h ../byterun/mlvalues.h \ + ../byterun/freelist.h ../byterun/misc.h ../byterun/mlvalues.h \ ../byterun/gc.h ../byterun/mlvalues.h ../byterun/gc_ctrl.h \ ../byterun/misc.h ../byterun/memory.h ../byterun/config.h \ ../byterun/gc.h ../byterun/major_gc.h ../byterun/freelist.h \ - ../byterun/misc.h ../byterun/mlvalues.h ../byterun/misc.h \ - ../byterun/minor_gc.h ../byterun/misc.h ../byterun/misc.h \ - ../byterun/mlvalues.h ../byterun/osdeps.h ../byterun/misc.h \ - ../byterun/printexc.h ../byterun/misc.h ../byterun/mlvalues.h \ - ../byterun/sys.h ../byterun/misc.h natdynlink.h + ../byterun/misc.h ../byterun/minor_gc.h ../byterun/misc.h \ + ../byterun/misc.h ../byterun/mlvalues.h ../byterun/osdeps.h \ + ../byterun/misc.h ../byterun/printexc.h ../byterun/misc.h \ + ../byterun/mlvalues.h ../byterun/sys.h ../byterun/misc.h natdynlink.h str.p.o: str.c ../byterun/alloc.h ../byterun/misc.h ../byterun/config.h \ ../byterun/../config/m.h ../byterun/../config/s.h ../byterun/mlvalues.h \ ../byterun/config.h ../byterun/misc.h ../byterun/fail.h \ diff --git a/asmrun/amd64.S b/asmrun/amd64.S index 6af0c54c..c9ce59d0 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -11,33 +11,51 @@ /* */ /***********************************************************************/ -/* $Id: amd64.S,v 1.12 2008/08/01 08:04:57 xleroy Exp $ */ +/* $Id: amd64.S,v 1.12.2.1 2008/11/07 10:34:16 xleroy Exp $ */ /* Asm part of the runtime system, AMD64 processor */ /* Must be preprocessed by cpp */ -#define FUNCTION_ALIGN 4 +#ifdef SYS_macosx + +#define G(r) _##r +#define FUNCTION_ALIGN 2 +#define EIGHT_ALIGN 3 +#define SIXTEEN_ALIGN 4 +#define FUNCTION(name) \ + .globl name; \ + .align FUNCTION_ALIGN; \ + name: +#else + +#define G(r) r +#define FUNCTION_ALIGN 4 +#define EIGHT_ALIGN 8 +#define SIXTEEN_ALIGN 16 #define FUNCTION(name) \ .globl name; \ - .type name,@function; \ + .type name,@function; \ .align FUNCTION_ALIGN; \ name: +#endif + + .text /* Allocation */ -FUNCTION(caml_call_gc) +FUNCTION(G(caml_call_gc)) /* Record lowest stack address and return address */ movq 0(%rsp), %rax - movq %rax, caml_last_return_address(%rip) + movq %rax, G(caml_last_return_address)(%rip) leaq 8(%rsp), %rax - movq %rax, caml_bottom_of_stack(%rip) + movq %rax, G(caml_bottom_of_stack)(%rip) .L105: /* Save caml_young_ptr, caml_exception_pointer */ - movq %r15, caml_young_ptr(%rip) - movq %r14, caml_exception_pointer(%rip) + movq %r15, G(caml_young_ptr)(%rip) + movq %r14, G(caml_exception_pointer)(%rip) /* Build array of registers, save it into caml_gc_regs */ pushq %r13 pushq %r12 @@ -52,7 +70,7 @@ FUNCTION(caml_call_gc) pushq %rdi pushq %rbx pushq %rax - movq %rsp, caml_gc_regs(%rip) + movq %rsp, G(caml_gc_regs)(%rip) /* Save floating-point registers */ subq $(16*8), %rsp movlpd %xmm0, 0*8(%rsp) @@ -72,7 +90,7 @@ FUNCTION(caml_call_gc) movlpd %xmm14, 14*8(%rsp) movlpd %xmm15, 15*8(%rsp) /* Call the garbage collector */ - call caml_garbage_collection + call G(caml_garbage_collection) /* Restore all regs used by the code generator */ movlpd 0*8(%rsp), %xmm0 movlpd 1*8(%rsp), %xmm1 @@ -105,92 +123,92 @@ FUNCTION(caml_call_gc) popq %r12 popq %r13 /* Restore caml_young_ptr, caml_exception_pointer */ - movq caml_young_ptr(%rip), %r15 - movq caml_exception_pointer(%rip), %r14 + movq G(caml_young_ptr)(%rip), %r15 + movq G(caml_exception_pointer)(%rip), %r14 /* Return to caller */ ret -FUNCTION(caml_alloc1) +FUNCTION(G(caml_alloc1)) subq $16, %r15 - cmpq caml_young_limit(%rip), %r15 + cmpq G(caml_young_limit)(%rip), %r15 jb .L100 ret .L100: movq 0(%rsp), %rax - movq %rax, caml_last_return_address(%rip) + movq %rax, G(caml_last_return_address)(%rip) leaq 8(%rsp), %rax - movq %rax, caml_bottom_of_stack(%rip) + movq %rax, G(caml_bottom_of_stack)(%rip) subq $8, %rsp call .L105 addq $8, %rsp - jmp caml_alloc1 + jmp G(caml_alloc1) -FUNCTION(caml_alloc2) +FUNCTION(G(caml_alloc2)) subq $24, %r15 - cmpq caml_young_limit(%rip), %r15 + cmpq G(caml_young_limit)(%rip), %r15 jb .L101 ret .L101: movq 0(%rsp), %rax - movq %rax, caml_last_return_address(%rip) + movq %rax, G(caml_last_return_address)(%rip) leaq 8(%rsp), %rax - movq %rax, caml_bottom_of_stack(%rip) + movq %rax, G(caml_bottom_of_stack)(%rip) subq $8, %rsp call .L105 addq $8, %rsp - jmp caml_alloc2 + jmp G(caml_alloc2) -FUNCTION(caml_alloc3) +FUNCTION(G(caml_alloc3)) subq $32, %r15 - cmpq caml_young_limit(%rip), %r15 + cmpq G(caml_young_limit)(%rip), %r15 jb .L102 ret .L102: movq 0(%rsp), %rax - movq %rax, caml_last_return_address(%rip) + movq %rax, G(caml_last_return_address)(%rip) leaq 8(%rsp), %rax - movq %rax, caml_bottom_of_stack(%rip) + movq %rax, G(caml_bottom_of_stack)(%rip) subq $8, %rsp call .L105 addq $8, %rsp - jmp caml_alloc3 + jmp G(caml_alloc3) -FUNCTION(caml_allocN) +FUNCTION(G(caml_allocN)) subq %rax, %r15 - cmpq caml_young_limit(%rip), %r15 + cmpq G(caml_young_limit)(%rip), %r15 jb .L103 ret .L103: pushq %rax /* save desired size */ movq 8(%rsp), %rax - movq %rax, caml_last_return_address(%rip) + movq %rax, G(caml_last_return_address)(%rip) leaq 16(%rsp), %rax - movq %rax, caml_bottom_of_stack(%rip) + movq %rax, G(caml_bottom_of_stack)(%rip) call .L105 popq %rax /* recover desired size */ - jmp caml_allocN + jmp G(caml_allocN) /* Call a C function from Caml */ -FUNCTION(caml_c_call) +FUNCTION(G(caml_c_call)) /* Record lowest stack address and return address */ popq %r12 - movq %r12, caml_last_return_address(%rip) - movq %rsp, caml_bottom_of_stack(%rip) + movq %r12, G(caml_last_return_address)(%rip) + movq %rsp, G(caml_bottom_of_stack)(%rip) /* Make the exception handler and alloc ptr available to the C code */ - movq %r15, caml_young_ptr(%rip) - movq %r14, caml_exception_pointer(%rip) + movq %r15, G(caml_young_ptr)(%rip) + movq %r14, G(caml_exception_pointer)(%rip) /* Call the function (address in %rax) */ call *%rax /* Reload alloc ptr */ - movq caml_young_ptr(%rip), %r15 + movq G(caml_young_ptr)(%rip), %r15 /* Return to caller */ pushq %r12 ret /* Start the Caml program */ -FUNCTION(caml_start_program) +FUNCTION(G(caml_start_program)) /* Save callee-save registers */ pushq %rbx pushq %rbp @@ -199,18 +217,18 @@ FUNCTION(caml_start_program) pushq %r14 pushq %r15 subq $8, %rsp /* stack 16-aligned */ - /* Initial entry point is caml_program */ - leaq caml_program(%rip), %r12 + /* Initial entry point is G(caml_program) */ + leaq G(caml_program)(%rip), %r12 /* Common code for caml_start_program and caml_callback* */ .L106: /* Build a callback link */ subq $8, %rsp /* stack 16-aligned */ - pushq caml_gc_regs(%rip) - pushq caml_last_return_address(%rip) - pushq caml_bottom_of_stack(%rip) + pushq G(caml_gc_regs)(%rip) + pushq G(caml_last_return_address)(%rip) + pushq G(caml_bottom_of_stack)(%rip) /* Setup alloc ptr and exception ptr */ - movq caml_young_ptr(%rip), %r15 - movq caml_exception_pointer(%rip), %r14 + movq G(caml_young_ptr)(%rip), %r15 + movq G(caml_exception_pointer)(%rip), %r14 /* Build an exception handler */ lea .L108(%rip), %r13 pushq %r13 @@ -224,12 +242,12 @@ FUNCTION(caml_start_program) popq %r12 /* dummy register */ .L109: /* Update alloc ptr and exception ptr */ - movq %r15, caml_young_ptr(%rip) - movq %r14, caml_exception_pointer(%rip) + movq %r15, G(caml_young_ptr)(%rip) + movq %r14, G(caml_exception_pointer)(%rip) /* Pop the callback link, restoring the global variables */ - popq caml_bottom_of_stack(%rip) - popq caml_last_return_address(%rip) - popq caml_gc_regs(%rip) + popq G(caml_bottom_of_stack)(%rip) + popq G(caml_last_return_address)(%rip) + popq G(caml_gc_regs)(%rip) addq $8, %rsp /* Restore callee-save registers. */ addq $8, %rsp @@ -249,8 +267,8 @@ FUNCTION(caml_start_program) /* Raise an exception from Caml */ -FUNCTION(caml_raise_exn) - testl $1, caml_backtrace_active(%rip) +FUNCTION(G(caml_raise_exn)) + testl $1, G(caml_backtrace_active)(%rip) jne .L110 movq %r14, %rsp popq %r14 @@ -261,7 +279,7 @@ FUNCTION(caml_raise_exn) movq 0(%rsp), %rsi /* arg 2: pc of raise */ leaq 8(%rsp), %rdx /* arg 3: sp of raise */ movq %r14, %rcx /* arg 4: sp of handler */ - call caml_stash_backtrace + call G(caml_stash_backtrace) movq %r12, %rax /* Recover exception bucket */ movq %r14, %rsp popq %r14 @@ -269,30 +287,30 @@ FUNCTION(caml_raise_exn) /* Raise an exception from C */ -FUNCTION(caml_raise_exception) - testl $1, caml_backtrace_active(%rip) +FUNCTION(G(caml_raise_exception)) + testl $1, G(caml_backtrace_active)(%rip) jne .L111 movq %rdi, %rax - movq caml_exception_pointer(%rip), %rsp + movq G(caml_exception_pointer)(%rip), %rsp popq %r14 /* Recover previous exception handler */ - movq caml_young_ptr(%rip), %r15 /* Reload alloc ptr */ + movq G(caml_young_ptr)(%rip), %r15 /* Reload alloc ptr */ ret .L111: movq %rdi, %r12 /* Save exception bucket */ /* arg 1: exception bucket */ - movq caml_last_return_address(%rip), %rsi /* arg 2: pc of raise */ - movq caml_bottom_of_stack(%rip), %rdx /* arg 3: sp of raise */ - movq caml_exception_pointer(%rip), %rcx /* arg 4: sp of handler */ - call caml_stash_backtrace + movq G(caml_last_return_address)(%rip), %rsi /* arg 2: pc of raise */ + movq G(caml_bottom_of_stack)(%rip), %rdx /* arg 3: sp of raise */ + movq G(caml_exception_pointer)(%rip), %rcx /* arg 4: sp of handler */ + call G(caml_stash_backtrace) movq %r12, %rax /* Recover exception bucket */ - movq caml_exception_pointer(%rip), %rsp + movq G(caml_exception_pointer)(%rip), %rsp popq %r14 /* Recover previous exception handler */ - movq caml_young_ptr(%rip), %r15 /* Reload alloc ptr */ + movq G(caml_young_ptr)(%rip), %r15 /* Reload alloc ptr */ ret /* Callback from C to Caml */ -FUNCTION(caml_callback_exn) +FUNCTION(G(caml_callback_exn)) /* Save callee-save registers */ pushq %rbx pushq %rbp @@ -307,7 +325,7 @@ FUNCTION(caml_callback_exn) movq 0(%rbx), %r12 /* code pointer */ jmp .L106 -FUNCTION(caml_callback2_exn) +FUNCTION(G(caml_callback2_exn)) /* Save callee-save registers */ pushq %rbx pushq %rbp @@ -320,10 +338,10 @@ FUNCTION(caml_callback2_exn) /* closure stays in %rdi */ movq %rsi, %rax /* first argument */ movq %rdx, %rbx /* second argument */ - leaq caml_apply2(%rip), %r12 /* code pointer */ + leaq G(caml_apply2)(%rip), %r12 /* code pointer */ jmp .L106 -FUNCTION(caml_callback3_exn) +FUNCTION(G(caml_callback3_exn)) /* Save callee-save registers */ pushq %rbx pushq %rbp @@ -337,34 +355,35 @@ FUNCTION(caml_callback3_exn) movq %rdx, %rbx /* second argument */ movq %rdi, %rsi /* closure */ movq %rcx, %rdi /* third argument */ - leaq caml_apply3(%rip), %r12 /* code pointer */ + leaq G(caml_apply3)(%rip), %r12 /* code pointer */ jmp .L106 -FUNCTION(caml_ml_array_bound_error) - leaq caml_array_bound_error(%rip), %rax - jmp caml_c_call +FUNCTION(G(caml_ml_array_bound_error)) + leaq G(caml_array_bound_error)(%rip), %rax + jmp G(caml_c_call) .data - .globl caml_system__frametable - .type caml_system__frametable,@object - .align 8 -caml_system__frametable: + .globl G(caml_system__frametable) + .align EIGHT_ALIGN +G(caml_system__frametable): .quad 1 /* one descriptor */ .quad .L107 /* return address into callback */ .value -1 /* negative frame size => use callback link */ .value 0 /* no roots here */ - .align 8 + .align EIGHT_ALIGN - .section .rodata.cst8,"a",@progbits - .globl caml_negf_mask - .type caml_negf_mask,@object - .align 16 -caml_negf_mask: +#ifdef SYS_macosx + .literal16 +#else + .section .rodata.cst8,"a",@progbits +#endif + .globl G(caml_negf_mask) + .align SIXTEEN_ALIGN +G(caml_negf_mask): .quad 0x8000000000000000, 0 - .globl caml_absf_mask - .type caml_absf_mask,@object - .align 16 -caml_absf_mask: + .globl G(caml_absf_mask) + .align SIXTEEN_ALIGN +G(caml_absf_mask): .quad 0x7FFFFFFFFFFFFFFF, 0xFFFFFFFFFFFFFFFF #if defined(SYS_linux) diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index 7f32583c..919ff452 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: signals_osdep.h,v 1.11 2008/01/11 16:13:11 doligez Exp $ */ +/* $Id: signals_osdep.h,v 1.11.4.1 2008/11/07 10:34:16 xleroy Exp $ */ /* Processor- and OS-dependent signal interface */ @@ -49,6 +49,33 @@ #define CONTEXT_YOUNG_PTR (context->uc_mcontext.gregs[REG_R15]) #define CONTEXT_FAULTING_ADDRESS ((char *) context->uc_mcontext.gregs[REG_CR2]) +/****************** AMD64, MacOSX */ + +#elif defined(TARGET_amd64) && defined (SYS_macosx) + + #define DECLARE_SIGNAL_HANDLER(name) \ + static void name(int sig, siginfo_t * info, void * context) + + #define SET_SIGACT(sigact,name) \ + sigact.sa_sigaction = (name); \ + sigact.sa_flags = SA_SIGINFO | SA_64REGSET + + #include + #include + +#if !defined(MAC_OS_X_VERSION_10_5) || MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_5 + #define CONTEXT_REG(r) r + #else + #define CONTEXT_REG(r) __##r + #endif + + #define CONTEXT_STATE (((ucontext_t *)context)->uc_mcontext->CONTEXT_REG(ss)) + #define CONTEXT_PC (CONTEXT_STATE.CONTEXT_REG(rip)) + #define CONTEXT_EXCEPTION_POINTER (CONTEXT_STATE.CONTEXT_REG(r14)) + #define CONTEXT_YOUNG_PTR (CONTEXT_STATE.CONTEXT_REG(r15)) + #define CONTEXT_SP (CONTEXT_STATE.CONTEXT_REG(rsp)) + #define CONTEXT_FAULTING_ADDRESS ((char *) info->si_addr) + /****************** I386, Linux */ #elif defined(TARGET_i386) && defined(SYS_linux_elf) diff --git a/asmrun/startup.c b/asmrun/startup.c index 19eda78f..b708c1e3 100644 --- a/asmrun/startup.c +++ b/asmrun/startup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: startup.c,v 1.36 2008/03/14 13:47:13 xleroy Exp $ */ +/* $Id: startup.c,v 1.36.2.1 2008/11/18 10:24:31 doligez Exp $ */ /* Start-up code */ @@ -21,6 +21,7 @@ #include "backtrace.h" #include "custom.h" #include "fail.h" +#include "freelist.h" #include "gc.h" #include "gc_ctrl.h" #include "memory.h" @@ -55,7 +56,7 @@ static void init_atoms(void) caml_fatal_error("Fatal error: not enough memory for the initial page table"); for (i = 0; caml_data_segments[i].begin != 0; i++) { - if (caml_page_table_add(In_static_data, + if (caml_page_table_add(In_static_data, caml_data_segments[i].begin, caml_data_segments[i].end) != 0) caml_fatal_error("Fatal error: not enough memory for the initial page table"); @@ -106,6 +107,7 @@ static void scanmult (char *opt, uintnat *var) static void parse_camlrunparam(void) { char *opt = getenv ("OCAMLRUNPARAM"); + uintnat p; if (opt == NULL) opt = getenv ("CAMLRUNPARAM"); @@ -121,6 +123,7 @@ static void parse_camlrunparam(void) case 'v': scanmult (opt, &caml_verb_gc); break; case 'b': caml_record_backtrace(Val_true); break; case 'p': caml_parser_trace = 1; break; + case 'a': scanmult (opt, &p); caml_set_allocation_policy (p); break; } } } diff --git a/boot/myocamlbuild.boot b/boot/myocamlbuild.boot index c97932a1dbf505ef59f7fbed91d9aab0f74ba79d..2ee22ef5dfbd950ec21c3f782b463785fb9229ea 100755 GIT binary patch delta 94780 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 N8(LagMgSME0RW!B>g)gj delta 81087 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 Pb#Bj|Juk?~>GA&nCIcAb diff --git a/boot/ocamlc b/boot/ocamlc index 9246af41de7ff52ed817a21a868a2d5adfef388d..eb8e6485b249c782f0954a685a3e977820a7470e 100755 GIT binary patch delta 3225 zcmZWs30PFu752`|yUXx~C4vL842X!JEJg$b0S#8-62RaF#t|dp23n1E$F)T$GLAQu1F z*r-BkmWxpKY9U9XY;7S2qwLv2{x{kahK$teOO&Dhnc07FX^AW?A$Nw8LizS-GKU5$ zGh-3$5FrSLNJf09o?%`h35O@2lC{JJv7eK0(n@~t8QDnu24k+v5a$u9NH#>6EWSXl zTOpv<2NEEd%*^AAF~WxX!R>N@hDDAE33d6b|EcQ?9Jh zO>;Tfvb2w%31LQ9WFJ2*YcENb<2A%;gV!2d3HKlAc8GYa$Aj&<#>0*p zFHRbK%HSG4SwC=1cMWi(=m+UvQ3?4k0L`M)=FoP38i=*k^QHJOk3NYSZ=&;a(c9zd#=`Ai3x^A75A7|q7!KK~!XX1j z(Y3@>qCtk!+y-h)x-KugOXr$MADKOdMiSBorWe!UNaa~32Rs`?{o!V*SqHzdv@qZY zG-O7o3!tWkx<^A04`umSwRsyH97n@@<)I4e*!0RDS@oe4q2`4`AA~wUhmmD&kPA0v!y)q&rUXdTaGKp$m88I6qok@p(AX3mlB!WTtCsv1C z=E-J8i40UUH3Ed}&;n&dGCRRA!EZBIDn#TlZ^*yO+spi(?2jgr3it2uI4G^N=rS#n z6|tyP+&u`PdLap+YOLHSovK8$E)~x7V;e|!_)`v>3>6zRUDowyy&0PPI7p<*QF$zZ zGz%97u^twZDn0X=StluAUB@$E;23s@q)2Nq`>P+!+RVJ=W=aJM%G!@En>-D zWSDHbhIMu8<%kd20hc9j@V({_p5cdG1OPB+_KTaS9nO`F+o zDMk>zgWdKbeWmANmSskH$Psp%khdYFiaC%9s#q3z6E-VKfp4qW9?}=qA7zhGS$>RV zx`V4b#s=Vcjy=vUnn+J+I>8(!(G!akiqK%URoLN08RO8mngx*_P+ZL-A&PPx)>X5P zO;7TCHS0-8n)E!);z&~(vTqH$#N6@6Twq0>n9`ar*(o2=Ll)GtNDt&iKe81@ioq|L z&Q(T~+cA6iM}M9n7l!b25pEMBdh?kKO`twp$8%~J$|dP7|2&MRQj#I>J2@CfF&cvB zTXp$lBELjP9;8p@k+Qy&0HIiNj}Vn^n`}fP2n}v@a^ty*>#3@#zoi8@b@r+?6Z8krZrt8sM@HFg{^nE zx14f8)glf0T;vWQnamevUF7Ei(u^}!7eS4;<{^|KotH2ccXz1k1u=UWm-{aB5(2h- zrpu@+{HY49-PPt`aoJiAWjh|auS1tHcX>w}enBmNge%G(VZuWtK3{hS7Y?6(B^=wA zJ>|Y=W%mY)9d@Y>vsL1seY*HH_H?36WLUHUjH?}_+pq^~&f-Ns;3IaD05wU&5Nd*{ z(cT>SAUV6WNVTBfgLbhWX@bAVLl1bGXWi+n3lK-#`aqb{R*ZAM#IK^Z;*xvC%|LNO zJ@t@Jg2W->{?a`hBKG3do!}5>QR5K0>=h<1X{s6=f+NKiw1ZvYo;~m)Qk39Ln$S_i z5j?Z?Q6k5^vOY?D)8s||D_ZO{yD!S7SaHLIjWDl^@CZR(o+BOvl3a*=$7+|WCyJof zsN6kIta4(jrQZ~-%_Iq&UyDFldP@YEP{97{BoF*koKS*#11oEVx7>Oc<0nZ=QG>7| zJf!n$eMy6DDjxXkR;@NY!+%)s$%l0|X0}FmjqTDUHonu;(b9a^c8Zf-^6Wj^Ur3jP zpMMX;m5hHk4u2SwmUPU??Df`w0e#KZKT34W7$#G{@cM$8KAQ`Ex4azWH_+{tSLlBM D-_U0@ delta 3101 zcmZve4Nz3q7036!W#7Gz-DT0NF0hmbuDSxsf=lJgap@ou#b#BaC@6lQpg_Tq8mU^b zYC@-4aop6Cm=t22s$*M%!SQNsC4MBN60wd(O?5LzTSD6WL=B9$ZIA?d>hN%onK4UpSK+%ax+56npn+G79ubM`fF>>_=!Qi=r2C$R|l#3)(GYG^Y`xrzv1 zMJ)llNm>O{LZwi?-6XALX@!uMIG(OPyP~&$R`!qh* z_)Me!1tlE;&vzzQtp%$}yvksWHjUvL?HZ#rMr%|xIy8>Z7_V`RMwiAUjc$!UL{1O~ zr-0wSZm`9YS>RXXRb&DjRShcN5iB2+$Sj^~mb)X#n>-~>K8ZFw87+e%auI{V!Zyk- zetL|&g}j*C%x}2l(G(Y0Qe=moc)2@WR)>;F;QzV71_{YBgNQgoBy61~o6uXEueZao z5hT>`pCFxXB5$82*PF>?C@hj|$rQL!BeZfR}E<4~v zuOW<&tdJM$Nf6&$h1cS1buO3l$%t&c&2SWEGVsXPkRrr>j>54K3RlQaa7li(+#)iO zvO;!c_XjNk72`~l`0MY!nE^|uTc-I$qY)c6@QG&d?w~4fSShb3B$KPF`*2slBNE(l~(8gFYfw!m9+Z5w&$)p+R?#ZNAB-px^GB|dVje>RA zG?S-Kq=_^(9fN!mB{H9)1)Qe&M2h-->EO$yACOe;no3(KbR1#~qTZ*BKhL8J2<$vg zLwV&)x-@mLy+}rX{U^=+DNM{5M@^w zzq_4|7B1WSwBCTr_BK!z(bhm6==bqKQXI&B*SMKf_zKAEex@(I1vWQ5aM)Wl~!qgWnk{L*u3 zXMtSv$1)2I!<#owWgb37WnYfKd0RHC6SqXC!$eZyy^UZf5fl_1me9M;u@u8p6lp#zdn;1&VKJ|0bou*+UF- z%=->8x2T3dI?4{S*@JK!PX3Mg6;Zqn6oo1$b-=yTY%N|_-p*1GyW3f{A#ersG~v_6 ze#y3Asqxlx%qx-cV7b6V$+<4DPGNn;Y&hu@Kzc5+y+m8>pRL%qbeY`|L3DpDVgfv6 zZU`yC{hRR*wm4Au+0+FcQ&}i~gvZW|-Cuo(aR=b!s~@t1;^D6UGKW>He+!#gnOS)k zYu9g9JV9g*_Y79LNqGOKM08ux7W>nY$Fr5(gnn+4o`;XUCs!Z-gtUcvIXz z750QHf5dTKgwp>1D{A^DPuP_UIEF}k5(bfn$LrV+l*5F~gjK3?l;m@Fw9<~BF7A&} zI>o{4bSi&9U1?6qm&9f4(?b5E8PRdaf%n`TjG=+e7)WA%27RXzDv0+k!d_< ztYVBp=1o(2?8FP6p9R@?L4^|e8rFb!y@H?BT4i~WR!)5EHRX;(#&LU>l7bA>7+?2K zgbj9;|mrwjS%o8~q~_Vexc%m>L(&-eZ+hw1mtcAGNn z`zKf3Hy_bYu2>Ao56n}=fNy$WjwJeFVNWFSy&>thLUX!q9zO0FoA-;Uu`6%& aZo0_3FIz5Csbe2}cHN?qM!0$168%3Nf;aU5 diff --git a/boot/ocamldep b/boot/ocamldep index 61bbe7d579896466fd17d36163359126c61b2ac9..66696d9facda888306bf1b25ecfa1579dfe5b1fb 100755 GIT binary patch delta 625 zcmeA@BY6I_Adj-5era)$eolUJV$MeKrYJ_n&9kEP87I%x*|-44+Rb@!{=AGwC-2KPPP+N~ z|9_wb4B9}<2*k~Q{{IKL1jbJR^7)bYT0lM*5?>a`=R@MZ0h-4NY&6u#=uY<9gjT2-@IuI*O=j&$_XH^3-nJ4f2CO`daAL9f@-sxHs7?l|r zwomG3oX;p43iMnj5T6BNPd z`dY@j66pFv3=C2B3=Bq{+mA>vvomvP8S5Du>KSMkC2zkj&3uHNaqadw%FLCF+$M;$ zF6@yYjMLm2Be8^`(cGVYw*oNdf_cJlUYdDrAW|Nrv?6=?%8 zBM@r>`5@zAd?6s84~hTa_y7N#P(F}ixD4cTP3Mnf6rY@TmZRA!XS-Dn;|*!X=c!6B%!FDXRTNbxA#%%WbBc&tcSO6q}wthf$r0;m`I7a~P+w zC~o_Os%zDg^|NS5y%Hc3M^c1w$EP3xPA6QrmtnZ2N)Qb4>2%A zxiT;q^=zLj!OYIgqhqXRXsBnPos?RVxP6^8^AUE&Rojb|nJXDR?6IZ<{hZ7sNW#$Y zcXssk@$qz0htix%SanR7Rb}4E?3t4?{gx`T4~WsOrN+EnON}MPp0Q?ne=3VS_ HQ&|)Mas9Ox diff --git a/boot/ocamllex b/boot/ocamllex index 8be5a7bfda91f85c2ee79f90eec93a35be446fcd..bafc89c2da063cf2b435193538cdba7379853eb8 100755 GIT binary patch delta 615 zcmZXQ%_~Gv7>DnBO^iD;z9sT?O=D^_Gc<}QUkeL`4GY)I7>%NgkI2Huq(&AtQfF}* zCI0}4S=?+a6lGx}8-uLLin1_t{cc8GoO*iCb2|Obd*0)9X=`1w+GX#;{G2y36CRBm zmc$gI#J1ukw&S+un}zQcK)C=`_B8Btn6MiH7LW<@(v+dvK^Tnj=~HsDfZxg-a=B>& zN6a1UpeTFsCy;F}*0BEPp9h>g-b8u)v05x*Q@3VT8XTZ#VmjDwqce6g>07-?X&T~$ zIzV9UL(}wDetZm`Yj77_GI#|%$KcP%%T7Cr@Br8E7XUq1ueNl>R}-_5&LoA@qi$Nx zbm$kyK@F$`S)dtgruVg|8N8*J4#>tg`^Zj$`qoRkR6L0PZ-7gnPfUM8R?qwCR&uyM zf48*s=L=1`^R^)>;r9v^Q9gfB$Z1NUb4D{EH9AaRUIYZomUlFR35XzZ8^8bb+9G2bp?ohtd^vGXtc1*A_#&B6=zi9T0>lZFKM?s>LpB5Xcdhheo{ny z&xZKvI#fW;JWgI0V&r->@!Mg`UrQ#<4ydG2S#*)Ke;8s3ZOm(fB-xnJAVt`WyEpW0 z7)4m25do^l%)4fD31)jve)%#Cb0*^=++mjJSs0v&)=1AI_}EGxtQC*}zZHObE#Ri@ zgRn#IcfrBl2H^nIpkWx>D1|~;f)662Fseqpod<0pK5#WV^um)w@0Y<*y#DWg9pwGh zNiTG$fO2}PL!Bsm)1z(}XCppn%a^Y{|K4{GbMCxxdJ+Il)^Iy_Y#B5EHQ8r)U`7B= zpQR3bBX|^q(rI?tDO&QZO!6O_$hUf@Aj4FX|rHr$cek4P|sLE>`^j DeMOPK diff --git a/build/.cvsignore b/build/.cvsignore new file mode 100644 index 00000000..274c6e55 --- /dev/null +++ b/build/.cvsignore @@ -0,0 +1 @@ +ocamlbuild_mixed_mode diff --git a/build/buildbot b/build/buildbot index e9b2579e..f337e3f6 100755 --- a/build/buildbot +++ b/build/buildbot @@ -72,7 +72,7 @@ esac ( ./build/distclean.sh || : ) 2>&1 | log distclean -(cvs -q up -dP -r release310 || bad) 2>&1 | log cvs up +(cvs -q up -dP -r release311 || bad) 2>&1 | log cvs up finish_if_bad case "$opt_win" in diff --git a/build/camlp4-byte-only.sh b/build/camlp4-byte-only.sh index 2caf64c6..2ebf42d7 100755 --- a/build/camlp4-byte-only.sh +++ b/build/camlp4-byte-only.sh @@ -1,9 +1,7 @@ #!/bin/sh -# $Id: camlp4-byte-only.sh,v 1.3 2007/10/08 14:19:34 doligez Exp $ +# $Id: camlp4-byte-only.sh,v 1.3.4.1 2008/10/23 15:29:11 ertai Exp $ set -e -OCAMLBUILD_PARTIAL="true" -export OCAMLBUILD_PARTIAL cd `dirname $0`/.. . build/targets.sh set -x -$OCAMLBUILD $@ byte_stdlib_partial_mode $OCAMLC_BYTE $OCAMLLEX_BYTE $CAMLP4_BYTE +$OCAMLBUILD $@ byte_stdlib_mixed_mode $OCAMLC_BYTE $OCAMLLEX_BYTE $CAMLP4_BYTE diff --git a/build/camlp4-native-only.sh b/build/camlp4-native-only.sh index 8ad48048..ce70333c 100755 --- a/build/camlp4-native-only.sh +++ b/build/camlp4-native-only.sh @@ -1,9 +1,7 @@ #!/bin/sh -# $Id: camlp4-native-only.sh,v 1.3 2007/10/08 14:19:34 doligez Exp $ +# $Id: camlp4-native-only.sh,v 1.3.4.1 2008/10/23 15:29:11 ertai Exp $ set -e -OCAMLBUILD_PARTIAL="true" -export OCAMLBUILD_PARTIAL cd `dirname $0`/.. . build/targets.sh set -x -$OCAMLBUILD $@ native_stdlib_partial_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $CAMLP4_NATIVE +$OCAMLBUILD $@ native_stdlib_mixed_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $CAMLP4_NATIVE diff --git a/build/distclean.sh b/build/distclean.sh index 16c9b20f..145899e8 100755 --- a/build/distclean.sh +++ b/build/distclean.sh @@ -12,13 +12,14 @@ # # ######################################################################### -# $Id: distclean.sh,v 1.7 2008/01/11 16:13:16 doligez Exp $ +# $Id: distclean.sh,v 1.7.4.1 2008/10/23 15:29:11 ertai Exp $ cd `dirname $0`/.. set -ex (cd byterun && make clean) || : (cd asmrun && make clean) || : (cd yacc && make clean) || : +rm -f build/ocamlbuild_mixed_mode rm -rf _build rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader \ boot/myocamlbuild boot/myocamlbuild.native boot/myocamlbuild.native.exe \ diff --git a/build/fastworld.sh b/build/fastworld.sh index 4a82407e..905f37fd 100755 --- a/build/fastworld.sh +++ b/build/fastworld.sh @@ -1,7 +1,12 @@ #!/bin/sh -# $Id: fastworld.sh,v 1.3 2007/10/08 14:19:34 doligez Exp $ +# $Id: fastworld.sh,v 1.3.4.1 2008/10/23 15:29:11 ertai Exp $ cd `dirname $0` set -e +if [ -e ocamlbuild_mixed_mode ]; then + echo ocamlbuild mixed mode detected + echo 'please cleanup and re-launch (make clean ; ./build/distclean.sh)' + exit 1 +fi ./mkconfig.sh ./mkmyocamlbuild_config.sh . ../config/config.sh diff --git a/build/partial-boot.sh b/build/mixed-boot.sh similarity index 89% rename from build/partial-boot.sh rename to build/mixed-boot.sh index 79e0d629..122ff412 100755 --- a/build/partial-boot.sh +++ b/build/mixed-boot.sh @@ -12,12 +12,9 @@ # # ######################################################################### -# $Id: partial-boot.sh,v 1.5 2008/01/11 16:13:16 doligez Exp $ - set -ex cd `dirname $0`/.. -OCAMLBUILD_PARTIAL="true" -export OCAMLBUILD_PARTIAL +touch build/ocamlbuild_mixed_mode mkdir -p _build cp -rf boot _build/ ./build/mkconfig.sh diff --git a/build/ocamlbuild-byte-only.sh b/build/ocamlbuild-byte-only.sh index 19b0b98f..84a2d913 100755 --- a/build/ocamlbuild-byte-only.sh +++ b/build/ocamlbuild-byte-only.sh @@ -1,9 +1,7 @@ #!/bin/sh -# $Id: ocamlbuild-byte-only.sh,v 1.3 2007/10/08 14:19:34 doligez Exp $ +# $Id: ocamlbuild-byte-only.sh,v 1.3.4.1 2008/10/23 15:29:11 ertai Exp $ set -e -OCAMLBUILD_PARTIAL="true" -export OCAMLBUILD_PARTIAL cd `dirname $0`/.. . build/targets.sh set -x -$OCAMLBUILD $@ byte_stdlib_partial_mode $OCAMLC_BYTE $OCAMLLEX_BYTE $OCAMLBUILD_BYTE +$OCAMLBUILD $@ byte_stdlib_mixed_mode $OCAMLC_BYTE $OCAMLLEX_BYTE $OCAMLBUILD_BYTE diff --git a/build/ocamlbuild-native-only.sh b/build/ocamlbuild-native-only.sh index f0f75bfc..c5669276 100755 --- a/build/ocamlbuild-native-only.sh +++ b/build/ocamlbuild-native-only.sh @@ -1,9 +1,7 @@ #!/bin/sh -# $Id: ocamlbuild-native-only.sh,v 1.3 2007/10/08 14:19:34 doligez Exp $ +# $Id: ocamlbuild-native-only.sh,v 1.3.4.1 2008/10/23 15:29:11 ertai Exp $ set -e -OCAMLBUILD_PARTIAL="true" -export OCAMLBUILD_PARTIAL cd `dirname $0`/.. . build/targets.sh set -x -$OCAMLBUILD $@ native_stdlib_partial_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $OCAMLBUILD_NATIVE +$OCAMLBUILD $@ native_stdlib_mixed_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $OCAMLBUILD_NATIVE diff --git a/build/ocamlbuildlib-native-only.sh b/build/ocamlbuildlib-native-only.sh index f7f700ae..bde15ca4 100755 --- a/build/ocamlbuildlib-native-only.sh +++ b/build/ocamlbuildlib-native-only.sh @@ -1,9 +1,7 @@ #!/bin/sh -# $Id: ocamlbuildlib-native-only.sh,v 1.2 2007/11/27 12:21:53 ertai Exp $ +# $Id: ocamlbuildlib-native-only.sh,v 1.2.4.1 2008/10/23 15:29:11 ertai Exp $ set -e -OCAMLBUILD_PARTIAL="true" -export OCAMLBUILD_PARTIAL cd `dirname $0`/.. . build/targets.sh set -x -$OCAMLBUILD $@ native_stdlib_partial_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $OCAMLBUILDLIB_NATIVE +$OCAMLBUILD $@ native_stdlib_mixed_mode $OCAMLOPT_BYTE $OCAMLLEX_BYTE $OCAMLBUILDLIB_NATIVE diff --git a/build/world.sh b/build/world.sh index 925e2d23..0a9ab27f 100755 --- a/build/world.sh +++ b/build/world.sh @@ -1,7 +1,12 @@ #!/bin/sh -# $Id: world.sh,v 1.3 2007/10/08 14:19:34 doligez Exp $ +# $Id: world.sh,v 1.3.4.1 2008/10/23 15:29:11 ertai Exp $ cd `dirname $0` -set -ex +set -e +if [ -e ocamlbuild_mixed_mode ]; then + echo ocamlbuild mixed mode detected + echo 'please cleanup and re-launch (make clean ; ./build/distclean.sh)' + exit 1 +fi ./mkconfig.sh ./mkmyocamlbuild_config.sh . ../config/config.sh diff --git a/byterun/.depend b/byterun/.depend index dce39f11..b92cc6de 100644 --- a/byterun/.depend +++ b/byterun/.depend @@ -117,8 +117,8 @@ stacks.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ minor_gc.h startup.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h gc_ctrl.h instrtrace.h interp.h \ - intext.h io.h memory.h gc.h major_gc.h freelist.h minor_gc.h osdeps.h \ + dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ + interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ version.h str.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ @@ -255,8 +255,8 @@ stacks.d.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ minor_gc.h startup.d.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h gc_ctrl.h instrtrace.h interp.h \ - intext.h io.h memory.h gc.h major_gc.h freelist.h minor_gc.h osdeps.h \ + dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ + interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ version.h str.d.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ @@ -391,8 +391,8 @@ stacks.pic.o: stacks.c config.h ../config/m.h ../config/s.h compatibility.h \ minor_gc.h startup.pic.o: startup.c config.h ../config/m.h ../config/s.h compatibility.h \ alloc.h misc.h mlvalues.h backtrace.h callback.h custom.h debugger.h \ - dynlink.h exec.h fail.h fix_code.h gc_ctrl.h instrtrace.h interp.h \ - intext.h io.h memory.h gc.h major_gc.h freelist.h minor_gc.h osdeps.h \ + dynlink.h exec.h fail.h fix_code.h freelist.h gc_ctrl.h instrtrace.h \ + interp.h intext.h io.h memory.h gc.h major_gc.h minor_gc.h osdeps.h \ prims.h printexc.h reverse.h signals.h stacks.h sys.h startup.h \ version.h str.pic.o: str.c alloc.h compatibility.h misc.h config.h ../config/m.h \ diff --git a/byterun/Makefile b/byterun/Makefile index 1a56dd10..a22c069d 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile,v 1.64 2008/09/10 05:51:11 weis Exp $ +# $Id: Makefile,v 1.64.2.1 2008/11/08 16:29:02 xleroy Exp $ include Makefile.common @@ -48,7 +48,7 @@ libcamlrund.a: $(DOBJS) $(RANLIB) libcamlrund.a libcamlrun_shared.so: $(PICOBJS) - $(MKDLL) -o libcamlrun_shared.so $(PICOBJS) + $(MKDLL) -o libcamlrun_shared.so $(PICOBJS) $(BYTECCLIBS) .SUFFIXES: .d.o .pic.o diff --git a/byterun/config.h b/byterun/config.h index 2c4eb0aa..265d92a4 100644 --- a/byterun/config.h +++ b/byterun/config.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: config.h,v 1.42 2008/01/03 09:37:09 xleroy Exp $ */ +/* $Id: config.h,v 1.42.4.1 2008/11/02 14:30:05 xleroy Exp $ */ #ifndef CAML_CONFIG_H #define CAML_CONFIG_H @@ -107,7 +107,7 @@ typedef struct { uint32 l, h; } uint64, int64; /* Memory model parameters */ /* The size of a page for memory management (in bytes) is [1 << Page_log]. - It must be a multiple of [sizeof (value)] and >= 8. */ + It must be a multiple of [sizeof (value)] and >= 8 and <= 20. */ #define Page_log 12 /* A page is 4 kilobytes. */ /* Initial size of stack (bytes). */ diff --git a/byterun/freelist.c b/byterun/freelist.c index e8f111a8..ae9f4ce1 100644 --- a/byterun/freelist.c +++ b/byterun/freelist.c @@ -11,7 +11,12 @@ /* */ /***********************************************************************/ -/* $Id: freelist.c,v 1.20 2008/02/29 14:21:22 doligez Exp $ */ +/* $Id: freelist.c,v 1.20.4.1 2008/11/18 10:24:42 doligez Exp $ */ + +#define FREELIST_DEBUG 0 +#if FREELIST_DEBUG +#include +#endif #include @@ -43,6 +48,7 @@ static struct { } sentinel = {0, Make_header (0, 0, Caml_blue), 0, 0}; #define Fl_head ((char *) (&(sentinel.first_bp))) +static char *fl_prev = Fl_head; /* Current allocation pointer. */ static char *fl_last = NULL; /* Last block in the list. Only valid just after [caml_fl_allocate] returns NULL. */ char *caml_fl_merge = Fl_head; /* Current insertion pointer. Managed @@ -57,13 +63,17 @@ static char *beyond = NULL; #define Next(b) (((block *) (b))->next_bp) +#define Policy_next_fit 0 +#define Policy_first_fit 1 +uintnat caml_allocation_policy = Policy_next_fit; +#define policy caml_allocation_policy + #ifdef DEBUG static void fl_check (void) { char *cur, *prev; - int merge_found = 0; + int prev_found = 0, flp_found = 0, merge_found = 0; uintnat size_found = 0; - int flp_found = 0; int sz = 0; prev = Fl_head; @@ -71,7 +81,8 @@ static void fl_check (void) while (cur != NULL){ size_found += Whsize_bp (cur); Assert (Is_in_heap (cur)); - if (Wosize_bp (cur) > sz){ + if (cur == fl_prev) prev_found = 1; + if (policy == Policy_first_fit && Wosize_bp (cur) > sz){ sz = Wosize_bp (cur); if (flp_found < flp_size){ Assert (Next (flp[flp_found]) == cur); @@ -84,7 +95,8 @@ static void fl_check (void) prev = cur; cur = Next (prev); } - Assert (flp_found == flp_size); + if (policy == Policy_next_fit) Assert (prev_found || fl_prev == Fl_head); + if (policy == Policy_first_fit) Assert (flp_found == flp_size); Assert (merge_found || caml_fl_merge == Fl_head); Assert (size_found == caml_fl_cur_size); } @@ -121,16 +133,19 @@ static char *allocate_block (mlsize_t wh_sz, int flpi, char *prev, char *cur) In case 0, it gives an invalid header to the block. The function calling [caml_fl_allocate] will overwrite it. */ Hd_op (cur) = Make_header (0, 0, Caml_white); - if (flpi + 1 < flp_size && flp[flpi + 1] == cur){ - flp[flpi + 1] = prev; - }else if (flpi == flp_size - 1){ - beyond = (prev == Fl_head) ? NULL : prev; - -- flp_size; + if (policy == Policy_first_fit){ + if (flpi + 1 < flp_size && flp[flpi + 1] == cur){ + flp[flpi + 1] = prev; + }else if (flpi == flp_size - 1){ + beyond = (prev == Fl_head) ? NULL : prev; + -- flp_size; + } } }else{ /* Case 2. */ caml_fl_cur_size -= wh_sz; Hd_op (cur) = Make_header (Wosize_hd (h) - wh_sz, 0, Caml_blue); } + if (policy == Policy_next_fit) fl_prev = prev; return cur + Bosize_hd (h) - Bsize_wsize (wh_sz); } @@ -145,124 +160,180 @@ char *caml_fl_allocate (mlsize_t wo_sz) mlsize_t sz, prevsz; Assert (sizeof (char *) == sizeof (value)); Assert (wo_sz >= 1); - /* Search in the flp array. */ - for (i = 0; i < flp_size; i++){ - sz = Wosize_bp (Next (flp[i])); - if (sz >= wo_sz){ - result = allocate_block (Whsize_wosize (wo_sz), i, flp[i], Next (flp[i])); - goto update_flp; + switch (policy){ + case Policy_next_fit: + Assert (fl_prev != NULL); + /* Search from [fl_prev] to the end of the list. */ + prev = fl_prev; + cur = Next (prev); + while (cur != NULL){ Assert (Is_in_heap (cur)); + if (Wosize_bp (cur) >= wo_sz){ + return allocate_block (Whsize_wosize (wo_sz), 0, prev, cur); + } + prev = cur; + cur = Next (prev); } - } - /* Extend the flp array. */ - if (flp_size == 0){ + fl_last = prev; + /* Search from the start of the list to [fl_prev]. */ prev = Fl_head; - prevsz = 0; - }else{ - prev = Next (flp[flp_size - 1]); - prevsz = Wosize_bp (prev); - if (beyond != NULL) prev = beyond; - } - while (flp_size < FLP_MAX){ cur = Next (prev); - if (cur == NULL){ - fl_last = prev; - beyond = (prev == Fl_head) ? NULL : prev; - return NULL; - }else{ - sz = Wosize_bp (cur); - if (sz > prevsz){ - flp[flp_size] = prev; - ++ flp_size; - if (sz >= wo_sz){ - beyond = cur; - i = flp_size - 1; - result = allocate_block (Whsize_wosize (wo_sz), flp_size - 1, prev, - cur); - goto update_flp; - } - prevsz = sz; + while (prev != fl_prev){ + if (Wosize_bp (cur) >= wo_sz){ + return allocate_block (Whsize_wosize (wo_sz), 0, prev, cur); } + prev = cur; + cur = Next (prev); } - prev = cur; - } - beyond = cur; - - /* The flp table is full. Do a slow first-fit search. */ - - if (beyond != NULL){ - prev = beyond; - }else{ - prev = flp[flp_size - 1]; - } - prevsz = Wosize_bp (Next (flp[FLP_MAX-1])); - Assert (prevsz < wo_sz); - cur = Next (prev); - while (cur != NULL){ - Assert (Is_in_heap (cur)); - sz = Wosize_bp (cur); - if (sz < prevsz){ - beyond = cur; - }else if (sz >= wo_sz){ - return allocate_block (Whsize_wosize (wo_sz), flp_size, prev, cur); + /* No suitable block was found. */ + return NULL; + break; + + case Policy_first_fit: { + /* Search in the flp array. */ + for (i = 0; i < flp_size; i++){ + sz = Wosize_bp (Next (flp[i])); + if (sz >= wo_sz){ +#if FREELIST_DEBUG + if (i > 5) fprintf (stderr, "FLP: found at %d size=%d\n", i, wo_sz); +#endif + result = allocate_block (Whsize_wosize (wo_sz), i, flp[i], Next(flp[i])); + goto update_flp; + } } - prev = cur; - cur = Next (prev); - } - fl_last = prev; - return NULL; - - update_flp: /* (i, sz) */ - /* The block at [i] was removed or reduced. Update the table. */ - Assert (0 <= i && i < flp_size + 1); - if (i < flp_size){ - if (i > 0){ - prevsz = Wosize_bp (Next (flp[i-1])); - }else{ + /* Extend the flp array. */ + if (flp_size == 0){ + prev = Fl_head; prevsz = 0; + }else{ + prev = Next (flp[flp_size - 1]); + prevsz = Wosize_bp (prev); + if (beyond != NULL) prev = beyond; } - if (i == flp_size - 1){ - if (Wosize_bp (Next (flp[i])) <= prevsz){ - beyond = Next (flp[i]); - -- flp_size; + while (flp_size < FLP_MAX){ + cur = Next (prev); + if (cur == NULL){ + fl_last = prev; + beyond = (prev == Fl_head) ? NULL : prev; + return NULL; }else{ - beyond = NULL; - } - }else{ - char *buf [FLP_MAX]; - int j = 0; - mlsize_t oldsz = sz; - - prev = flp[i]; - while (prev != flp[i+1]){ - cur = Next (prev); sz = Wosize_bp (cur); if (sz > prevsz){ - buf[j++] = prev; - prevsz = sz; - if (sz >= oldsz){ - Assert (sz == oldsz); - break; + flp[flp_size] = prev; + ++ flp_size; + if (sz >= wo_sz){ + beyond = cur; + i = flp_size - 1; +#if FREELIST_DEBUG + if (flp_size > 5){ + fprintf (stderr, "FLP: extended to %d\n", flp_size); + } +#endif + result = allocate_block (Whsize_wosize (wo_sz), flp_size - 1, prev, + cur); + goto update_flp; } + prevsz = sz; } - prev = cur; } - if (FLP_MAX >= flp_size + j - 1){ - memmove (&flp[i+j], &flp[i+1], sizeof (block *) * (flp_size - i - 1)); - memmove (&flp[i], &buf[0], sizeof (block *) * j); - flp_size += j - 1; + prev = cur; + } + beyond = cur; + + /* The flp table is full. Do a slow first-fit search. */ +#if FREELIST_DEBUG + fprintf (stderr, "FLP: table is full -- slow first-fit\n"); +#endif + if (beyond != NULL){ + prev = beyond; + }else{ + prev = flp[flp_size - 1]; + } + prevsz = Wosize_bp (Next (flp[FLP_MAX-1])); + Assert (prevsz < wo_sz); + cur = Next (prev); + while (cur != NULL){ + Assert (Is_in_heap (cur)); + sz = Wosize_bp (cur); + if (sz < prevsz){ + beyond = cur; + }else if (sz >= wo_sz){ + return allocate_block (Whsize_wosize (wo_sz), flp_size, prev, cur); + } + prev = cur; + cur = Next (prev); + } + fl_last = prev; + return NULL; + + update_flp: /* (i, sz) */ + /* The block at [i] was removed or reduced. Update the table. */ + Assert (0 <= i && i < flp_size + 1); + if (i < flp_size){ + if (i > 0){ + prevsz = Wosize_bp (Next (flp[i-1])); + }else{ + prevsz = 0; + } + if (i == flp_size - 1){ + if (Wosize_bp (Next (flp[i])) <= prevsz){ + beyond = Next (flp[i]); + -- flp_size; + }else{ + beyond = NULL; + } }else{ - if (FLP_MAX > i + j){ - memmove (&flp[i+j], &flp[i+1], sizeof (block *) * (FLP_MAX - i - j)); - memmove (&flp[i], &buf[0], sizeof (block *) * j); + char *buf [FLP_MAX]; + int j = 0; + mlsize_t oldsz = sz; + + prev = flp[i]; + while (prev != flp[i+1]){ + cur = Next (prev); + sz = Wosize_bp (cur); + if (sz > prevsz){ + buf[j++] = prev; + prevsz = sz; + if (sz >= oldsz){ + Assert (sz == oldsz); + break; + } + } + prev = cur; + } +#if FREELIST_DEBUG + if (j > 2) fprintf (stderr, "FLP: update; buf size = %d\n", j); +#endif + if (FLP_MAX >= flp_size + j - 1){ + if (j != 1){ + memmove (&flp[i+j], &flp[i+1], sizeof (block *) * (flp_size-i-1)); + } + if (j > 0) memmove (&flp[i], &buf[0], sizeof (block *) * j); + flp_size += j - 1; }else{ - memmove (&flp[i], &buf[0], sizeof (block *) * (FLP_MAX - i)); + if (FLP_MAX > i + j){ + if (j != 1){ + memmove (&flp[i+j], &flp[i+1], sizeof (block *) * (FLP_MAX-i-j)); + } + if (j > 0) memmove (&flp[i], &buf[0], sizeof (block *) * j); + }else{ + if (i != FLP_MAX){ + memmove (&flp[i], &buf[0], sizeof (block *) * (FLP_MAX - i)); + } + } + flp_size = FLP_MAX - 1; + beyond = Next (flp[FLP_MAX - 1]); } - flp_size = FLP_MAX - 1; - beyond = Next (flp[FLP_MAX - 1]); } } + return result; + } + break; + + default: + Assert (0); /* unknown policy */ + break; } - return result; + return NULL; /* NOT REACHED */ } static char *last_fragment; @@ -291,7 +362,17 @@ static void truncate_flp (char *changed) void caml_fl_reset (void) { Next (Fl_head) = NULL; - truncate_flp (Fl_head); + switch (policy){ + case Policy_next_fit: + fl_prev = Fl_head; + break; + case Policy_first_fit: + truncate_flp (Fl_head); + break; + default: + Assert (0); + break; + } caml_fl_cur_size = 0; caml_fl_init_merge (); } @@ -316,7 +397,7 @@ char *caml_fl_merge_block (char *bp) Assert (prev < bp || prev == Fl_head); Assert (cur > bp || cur == NULL); - truncate_flp (prev); + if (policy == Policy_first_fit) truncate_flp (prev); /* If [last_fragment] and [bp] are adjacent, merge them. */ if (last_fragment == Hp_bp (bp)){ @@ -338,6 +419,7 @@ char *caml_fl_merge_block (char *bp) if (Wosize_hd (hd) + cur_whsz <= Max_wosize){ Next (prev) = next_cur; + if (policy == Policy_next_fit && fl_prev == cur) fl_prev = prev; hd = Make_header (Wosize_hd (hd) + cur_whsz, 0, Caml_blue); Hd_bp (bp) = hd; adj = bp + Bosize_hd (hd); @@ -395,7 +477,9 @@ void caml_fl_add_blocks (char *bp) if (fl_last == caml_fl_merge && bp < caml_gc_sweep_hp){ caml_fl_merge = (char *) Field (bp, 1); } - if (flp_size < FLP_MAX) flp [flp_size++] = fl_last; + if (policy == Policy_first_fit && flp_size < FLP_MAX){ + flp [flp_size++] = fl_last; + } }else{ char *cur, *prev; @@ -415,7 +499,7 @@ void caml_fl_add_blocks (char *bp) if (prev == caml_fl_merge && bp < caml_gc_sweep_hp){ caml_fl_merge = (char *) Field (bp, 1); } - truncate_flp (bp); + if (policy == Policy_first_fit) truncate_flp (bp); } } @@ -442,3 +526,20 @@ void caml_make_free_blocks (value *p, mlsize_t size, int do_merge) p += sz; } } + +void caml_set_allocation_policy (uintnat p) +{ + switch (p){ + case Policy_next_fit: + fl_prev = Fl_head; + break; + case Policy_first_fit: + flp_size = 0; + beyond = NULL; + break; + default: + Assert (0); + break; + } + policy = p; +} diff --git a/byterun/freelist.h b/byterun/freelist.h index ad84a338..1ec93e91 100644 --- a/byterun/freelist.h +++ b/byterun/freelist.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: freelist.h,v 1.13 2008/02/29 12:56:15 doligez Exp $ */ +/* $Id: freelist.h,v 1.13.4.1 2008/11/18 10:24:43 doligez Exp $ */ /* Free lists of heap blocks. */ @@ -30,6 +30,7 @@ void caml_fl_reset (void); char *caml_fl_merge_block (char *); void caml_fl_add_blocks (char *); void caml_make_free_blocks (value *, mlsize_t, int); +void caml_set_allocation_policy (uintnat); #endif /* CAML_FREELIST_H */ diff --git a/byterun/gc_ctrl.c b/byterun/gc_ctrl.c index d87912bb..69114da6 100644 --- a/byterun/gc_ctrl.c +++ b/byterun/gc_ctrl.c @@ -11,12 +11,13 @@ /* */ /***********************************************************************/ -/* $Id: gc_ctrl.c,v 1.53 2008/02/29 12:56:15 doligez Exp $ */ +/* $Id: gc_ctrl.c,v 1.53.4.2 2008/11/20 18:33:13 doligez Exp $ */ #include "alloc.h" #include "compact.h" #include "custom.h" #include "finalise.h" +#include "freelist.h" #include "gc.h" #include "gc_ctrl.h" #include "major_gc.h" @@ -41,8 +42,9 @@ intnat caml_stat_minor_collections = 0, caml_stat_heap_chunks = 0; extern asize_t caml_major_heap_increment; /* bytes; see major_gc.c */ -extern uintnat caml_percent_free; /* see major_gc.c */ -extern uintnat caml_percent_max; /* see compact.c */ +extern uintnat caml_percent_free; /* see major_gc.c */ +extern uintnat caml_percent_max; /* see compact.c */ +extern uintnat caml_allocation_policy; /* see freelist.c */ #define Next(hp) ((hp) + Bhsize_hp (hp)) @@ -306,7 +308,7 @@ CAMLprim value caml_gc_get(value v) CAMLparam0 (); /* v is ignored */ CAMLlocal1 (res); - res = caml_alloc_tuple (6); + res = caml_alloc_tuple (7); Store_field (res, 0, Val_long (Wsize_bsize (caml_minor_heap_size))); /* s */ Store_field (res, 1,Val_long(Wsize_bsize(caml_major_heap_increment)));/* i */ Store_field (res, 2, Val_long (caml_percent_free)); /* o */ @@ -317,6 +319,7 @@ CAMLprim value caml_gc_get(value v) #else Store_field (res, 5, Val_long (0)); #endif + Store_field (res, 6, Val_long (caml_allocation_policy)); /* a */ CAMLreturn (res); } @@ -347,11 +350,21 @@ static intnat norm_minsize (intnat s) return s; } +static intnat norm_policy (intnat p) +{ + if (p >= 0 && p <= 1){ + return p; + }else{ + return 1; + } +} + CAMLprim value caml_gc_set(value v) { uintnat newpf, newpm; asize_t newheapincr; asize_t newminsize; + uintnat newpolicy; caml_verb_gc = Long_val (Field (v, 3)); @@ -377,6 +390,11 @@ CAMLprim value caml_gc_set(value v) caml_gc_message (0x20, "New heap increment size: %luk bytes\n", caml_major_heap_increment/1024); } + newpolicy = norm_policy (Long_val (Field (v, 6))); + if (newpolicy != caml_allocation_policy){ + caml_gc_message (0x20, "New allocation policy: %d\n", newpolicy); + caml_set_allocation_policy (newpolicy); + } /* Minor heap size comes last because it will trigger a minor collection (thus invalidating [v]) and it can raise [Out_of_memory]. */ @@ -471,4 +489,6 @@ void caml_init_gc (uintnat minor_size, uintnat major_size, caml_gc_message (0x20, "Initial max overhead: %lu%%\n", caml_percent_max); caml_gc_message (0x20, "Initial heap increment: %luk bytes\n", caml_major_heap_increment / 1024); + caml_gc_message (0x20, "Initial allocation policy: %d\n", + caml_allocation_policy); } diff --git a/byterun/major_gc.c b/byterun/major_gc.c index 5f2863f8..c6aebf3f 100644 --- a/byterun/major_gc.c +++ b/byterun/major_gc.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: major_gc.c,v 1.62 2008/07/28 12:03:55 doligez Exp $ */ +/* $Id: major_gc.c,v 1.62.2.1 2008/11/12 12:53:07 doligez Exp $ */ #include @@ -358,13 +358,25 @@ intnat caml_major_collection_slice (intnat howmuch) MW = caml_stat_heap_size * 100 / (100 + caml_percent_free) Amount of sweeping work for the GC cycle: SW = caml_stat_heap_size - Amount of marking work for this slice: - MS = P * MW - MS = P * caml_stat_heap_size * 100 / (100 + caml_percent_free) - Amount of sweeping work for this slice: - SS = P * SW - SS = P * caml_stat_heap_size - This slice will either mark 2*MS words or sweep 2*SS words. + + In order to finish marking with a non-empty free list, we will + use 40% of the time for marking, and 60% for sweeping. + + If TW is the total work for this cycle, + MW = 40/100 * TW + SW = 60/100 * TW + + Amount of work to do for this slice: + W = P * TW + + Amount of marking work for a marking slice: + MS = P * MW / (40/100) + MS = P * caml_stat_heap_size * 250 / (100 + caml_percent_free) + Amount of sweeping work for a sweeping slice: + SS = P * SW / (60/100) + SS = P * caml_stat_heap_size * 5 / 3 + + This slice will either mark MS words or sweep SS words. */ if (caml_gc_phase == Phase_idle) start_cycle (); @@ -391,10 +403,10 @@ intnat caml_major_collection_slice (intnat howmuch) (uintnat) (p * 1000000)); if (caml_gc_phase == Phase_mark){ - computed_work = 2 * (intnat) (p * Wsize_bsize (caml_stat_heap_size) * 100 - / (100 + caml_percent_free)); + computed_work = (intnat) (p * Wsize_bsize (caml_stat_heap_size) * 250 + / (100 + caml_percent_free)); }else{ - computed_work = 2 * (intnat) (p * Wsize_bsize (caml_stat_heap_size)); + computed_work = (intnat) (p * Wsize_bsize (caml_stat_heap_size) * 5 / 3); } caml_gc_message (0x40, "ordered work = %ld words\n", howmuch); caml_gc_message (0x40, "computed work = %ld words\n", computed_work); diff --git a/byterun/memory.c b/byterun/memory.c index 9fdf706c..3ab37a42 100644 --- a/byterun/memory.c +++ b/byterun/memory.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: memory.c,v 1.46 2008/02/29 12:56:15 doligez Exp $ */ +/* $Id: memory.c,v 1.46.4.1 2008/11/02 14:30:05 xleroy Exp $ */ #include #include @@ -34,7 +34,10 @@ extern uintnat caml_percent_free; /* major_gc.c */ #define Page(p) ((uintnat) (p) >> Page_log) #define Page_mask ((uintnat) -1 << Page_log) -/* The page table is represented sparsely as a hash table +#ifdef ARCH_SIXTYFOUR + +/* 64-bit implementation: + The page table is represented sparsely as a hash table with linear probing */ struct page_table { @@ -161,6 +164,38 @@ static int caml_page_table_modify(uintnat page, int toclear, int toset) return 0; } +#else + +/* 32-bit implementation: + The page table is represented as a 2-level array of unsigned char */ + +CAMLexport unsigned char * caml_page_table[Pagetable1_size]; +static unsigned char caml_page_table_empty[Pagetable2_size] = { 0, }; + +int caml_page_table_initialize(mlsize_t bytesize) +{ + int i; + for (i = 0; i < Pagetable1_size; i++) + caml_page_table[i] = caml_page_table_empty; + return 0; +} + +static int caml_page_table_modify(uintnat page, int toclear, int toset) +{ + uintnat i = Pagetable_index1(page); + uintnat j = Pagetable_index2(page); + + if (caml_page_table[i] == caml_page_table_empty) { + unsigned char * new_tbl = calloc(Pagetable2_size, 1); + if (new_tbl == 0) return -1; + caml_page_table[i] = new_tbl; + } + caml_page_table[i][j] = (caml_page_table[i][j] & ~toclear) | toset; + return 0; +} + +#endif + int caml_page_table_add(int kind, void * start, void * end) { uintnat pstart = (uintnat) start & Page_mask; diff --git a/byterun/memory.h b/byterun/memory.h index f17903d0..fd16351e 100644 --- a/byterun/memory.h +++ b/byterun/memory.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: memory.h,v 1.59 2008/03/10 19:56:39 xleroy Exp $ */ +/* $Id: memory.h,v 1.59.4.1 2008/11/02 14:30:05 xleroy Exp $ */ /* Allocation macros and functions */ @@ -55,13 +55,34 @@ color_t caml_allocation_color (void *hp); #define In_static_data 4 #define In_code_area 8 +#ifdef ARCH_SIXTYFOUR + +/* 64 bits: Represent page table as a sparse hash table */ +int caml_page_table_lookup(void * addr); #define Classify_addr(a) (caml_page_table_lookup((void *)(a))) + +#else + +/* 32 bits: Represent page table as a 2-level array */ +#define Pagetable2_log 11 +#define Pagetable2_size (1 << Pagetable2_log) +#define Pagetable1_log (Page_log + Pagetable2_log) +#define Pagetable1_size (1 << (32 - Pagetable1_log)) +CAMLextern unsigned char * caml_page_table[Pagetable1_size]; + +#define Pagetable_index1(a) (((uintnat)(a)) >> Pagetable1_log) +#define Pagetable_index2(a) \ + ((((uintnat)(a)) >> Page_log) & (Pagetable2_size - 1)) +#define Classify_addr(a) \ + caml_page_table[Pagetable_index1(a)][Pagetable_index2(a)] + +#endif + #define Is_in_value_area(a) \ (Classify_addr(a) & (In_heap | In_young | In_static_data)) #define Is_in_heap(a) (Classify_addr(a) & In_heap) #define Is_in_heap_or_young(a) (Classify_addr(a) & (In_heap | In_young)) -int caml_page_table_lookup(void * addr); int caml_page_table_add(int kind, void * start, void * end); int caml_page_table_remove(int kind, void * start, void * end); int caml_page_table_initialize(mlsize_t bytesize); diff --git a/byterun/startup.c b/byterun/startup.c index bb4d882b..55be64ec 100644 --- a/byterun/startup.c +++ b/byterun/startup.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: startup.c,v 1.70 2008/03/14 13:47:24 xleroy Exp $ */ +/* $Id: startup.c,v 1.70.2.1 2008/11/18 10:24:43 doligez Exp $ */ /* Start-up code */ @@ -35,6 +35,7 @@ #include "exec.h" #include "fail.h" #include "fix_code.h" +#include "freelist.h" #include "gc_ctrl.h" #include "instrtrace.h" #include "interp.h" @@ -298,6 +299,7 @@ static void scanmult (char *opt, uintnat *var) static void parse_camlrunparam(void) { char *opt = getenv ("OCAMLRUNPARAM"); + uintnat p; if (opt == NULL) opt = getenv ("CAMLRUNPARAM"); @@ -313,6 +315,7 @@ static void parse_camlrunparam(void) case 'v': scanmult (opt, &caml_verb_gc); break; case 'b': caml_record_backtrace(Val_true); break; case 'p': caml_parser_trace = 1; break; + case 'a': scanmult (opt, &p); caml_set_allocation_policy (p); break; } } } @@ -473,4 +476,3 @@ CAMLexport void caml_startup_code( if (Is_exception_result(res)) caml_fatal_uncaught_exception(Extract_exception(res)); } - diff --git a/camlp4/Camlp4/PreCast.ml b/camlp4/Camlp4/PreCast.ml index 1b191f02..527c0c48 100644 --- a/camlp4/Camlp4/PreCast.ml +++ b/camlp4/Camlp4/PreCast.ml @@ -19,7 +19,7 @@ module Id = struct value name = "Camlp4.PreCast"; - value version = "$Id: PreCast.ml,v 1.5 2007/10/08 14:19:34 doligez Exp $"; + value version = Sys.ocaml_version; end; type camlp4_token = Sig.camlp4_token == diff --git a/camlp4/Camlp4/Printers/DumpCamlp4Ast.ml b/camlp4/Camlp4/Printers/DumpCamlp4Ast.ml index 77e661da..bd220c16 100644 --- a/camlp4/Camlp4/Printers/DumpCamlp4Ast.ml +++ b/camlp4/Camlp4/Printers/DumpCamlp4Ast.ml @@ -19,7 +19,7 @@ module Id = struct value name = "Camlp4Printers.DumpCamlp4Ast"; - value version = "$Id: DumpCamlp4Ast.ml,v 1.7 2007/11/21 17:53:10 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Syntax) diff --git a/camlp4/Camlp4/Printers/DumpOCamlAst.ml b/camlp4/Camlp4/Printers/DumpOCamlAst.ml index f82d659c..dd6c60f6 100644 --- a/camlp4/Camlp4/Printers/DumpOCamlAst.ml +++ b/camlp4/Camlp4/Printers/DumpOCamlAst.ml @@ -19,7 +19,7 @@ module Id : Sig.Id = struct value name = "Camlp4Printers.DumpOCamlAst"; - value version = "$Id: DumpOCamlAst.ml,v 1.7 2007/11/21 17:53:10 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) diff --git a/camlp4/Camlp4/Printers/Null.ml b/camlp4/Camlp4/Printers/Null.ml index 2b009302..d593f9ef 100644 --- a/camlp4/Camlp4/Printers/Null.ml +++ b/camlp4/Camlp4/Printers/Null.ml @@ -19,7 +19,7 @@ module Id = struct value name = "Camlp4.Printers.Null"; - value version = "$Id: Null.ml,v 1.2 2007/02/07 10:09:21 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Syntax) = struct diff --git a/camlp4/Camlp4/Printers/OCaml.ml b/camlp4/Camlp4/Printers/OCaml.ml index 1df25583..b3641718 100644 --- a/camlp4/Camlp4/Printers/OCaml.ml +++ b/camlp4/Camlp4/Printers/OCaml.ml @@ -20,7 +20,7 @@ open Format; module Id = struct value name = "Camlp4.Printers.OCaml"; - value version = "$Id: OCaml.ml,v 1.39 2008/10/05 16:25:28 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4/Printers/OCamlr.ml b/camlp4/Camlp4/Printers/OCamlr.ml index ffe3b163..a1aa40c5 100644 --- a/camlp4/Camlp4/Printers/OCamlr.ml +++ b/camlp4/Camlp4/Printers/OCamlr.ml @@ -20,7 +20,7 @@ open Format; module Id = struct value name = "Camlp4.Printers.OCamlr"; - value version = "$Id: OCamlr.ml,v 1.23 2008/10/05 16:30:55 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4/Sig.ml b/camlp4/Camlp4/Sig.ml index a03887c2..3e7106e7 100644 --- a/camlp4/Camlp4/Sig.ml +++ b/camlp4/Camlp4/Sig.ml @@ -18,7 +18,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Sig.ml,v 1.7 2008/10/04 10:47:56 ertai Exp $ *) + (** Camlp4 signature repository *) @@ -640,9 +640,11 @@ module type AstFilters = sig value register_sig_item_filter : (filter Ast.sig_item) -> unit; value register_str_item_filter : (filter Ast.str_item) -> unit; + value register_topphrase_filter : (filter Ast.str_item) -> unit; value fold_interf_filters : ('a -> filter Ast.sig_item -> 'a) -> 'a -> 'a; value fold_implem_filters : ('a -> filter Ast.str_item -> 'a) -> 'a -> 'a; + value fold_topphrase_filters : ('a -> filter Ast.str_item -> 'a) -> 'a -> 'a; end; diff --git a/camlp4/Camlp4/Struct/AstFilters.ml b/camlp4/Camlp4/Struct/AstFilters.ml index 9962d8a1..665e610a 100644 --- a/camlp4/Camlp4/Struct/AstFilters.ml +++ b/camlp4/Camlp4/Struct/AstFilters.ml @@ -28,7 +28,10 @@ module Make (Ast : Sig.Camlp4Ast) value fold_interf_filters f i = Queue.fold f i interf_filters; value implem_filters = Queue.create (); value fold_implem_filters f i = Queue.fold f i implem_filters; + value topphrase_filters = Queue.create (); + value fold_topphrase_filters f i = Queue.fold f i topphrase_filters; value register_sig_item_filter f = Queue.add f interf_filters; value register_str_item_filter f = Queue.add f implem_filters; + value register_topphrase_filter f = Queue.add f topphrase_filters; end; diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml index e41c8153..fa6deaaa 100644 --- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml +++ b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.ml @@ -18,7 +18,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Camlp4Ast2OCamlAst.ml,v 1.22 2008/10/04 11:11:09 ertai Exp $ *) + module Make (Ast : Sig.Camlp4Ast) = struct open Format; diff --git a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli index f3c15e29..6c284833 100644 --- a/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli +++ b/camlp4/Camlp4/Struct/Camlp4Ast2OCamlAst.mli @@ -18,7 +18,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Camlp4Ast2OCamlAst.mli,v 1.5 2008/01/11 16:13:16 doligez Exp $ *) + module Make (Camlp4Ast : Sig.Camlp4Ast) : sig open Camlp4Ast; diff --git a/camlp4/Camlp4/Struct/DynLoader.ml b/camlp4/Camlp4/Struct/DynLoader.ml index f5e4986e..f8e8c22f 100644 --- a/camlp4/Camlp4/Struct/DynLoader.ml +++ b/camlp4/Camlp4/Struct/DynLoader.ml @@ -19,7 +19,7 @@ *) -(* $Id: DynLoader.ml,v 1.4 2007/11/06 15:16:56 frisch Exp $ *) + type t = Queue.t string; diff --git a/camlp4/Camlp4/Struct/Grammar/Fold.ml b/camlp4/Camlp4/Struct/Grammar/Fold.ml index c6fa82a5..6da366f7 100644 --- a/camlp4/Camlp4/Struct/Grammar/Fold.ml +++ b/camlp4/Camlp4/Struct/Grammar/Fold.ml @@ -13,7 +13,7 @@ (* *) (****************************************************************************) -(* $Id: Fold.ml,v 1.3 2007/02/07 10:09:21 ertai Exp $ *) + (* Authors: * - Daniel de Rauglaudre: initial version diff --git a/camlp4/Camlp4/Struct/Grammar/Fold.mli b/camlp4/Camlp4/Struct/Grammar/Fold.mli index d5ae0448..0b9b22b7 100644 --- a/camlp4/Camlp4/Struct/Grammar/Fold.mli +++ b/camlp4/Camlp4/Struct/Grammar/Fold.mli @@ -13,7 +13,7 @@ (* *) (****************************************************************************) -(* $Id: Fold.mli,v 1.2 2006/07/08 17:21:32 pouillar Exp $ *) + (* Authors: * - Daniel de Rauglaudre: initial version diff --git a/camlp4/Camlp4/Struct/Grammar/Parser.mli b/camlp4/Camlp4/Struct/Grammar/Parser.mli index 0e6c44c0..695982a3 100644 --- a/camlp4/Camlp4/Struct/Grammar/Parser.mli +++ b/camlp4/Camlp4/Struct/Grammar/Parser.mli @@ -13,7 +13,7 @@ (* *) (****************************************************************************) -(* $Id: Parser.mli,v 1.3 2008/10/03 15:18:37 ertai Exp $ *) + (* Authors: * - Daniel de Rauglaudre: initial version diff --git a/camlp4/Camlp4/Struct/Lexer.mll b/camlp4/Camlp4/Struct/Lexer.mll index 87193bca..f024fa43 100644 --- a/camlp4/Camlp4/Struct/Lexer.mll +++ b/camlp4/Camlp4/Struct/Lexer.mll @@ -17,7 +17,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Lexer.mll,v 1.10 2008/01/11 16:13:16 doligez Exp $ *) + (* The lexer definition *) diff --git a/camlp4/Camlp4/Struct/Quotation.ml b/camlp4/Camlp4/Struct/Quotation.ml index 9401b259..65202c87 100644 --- a/camlp4/Camlp4/Struct/Quotation.ml +++ b/camlp4/Camlp4/Struct/Quotation.ml @@ -18,7 +18,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Quotation.ml,v 1.6 2007/11/21 17:57:54 ertai Exp $ *) + module Make (Ast : Sig.Camlp4Ast) : Sig.Quotation with module Ast = Ast diff --git a/camlp4/Camlp4Bin.ml b/camlp4/Camlp4Bin.ml index f49bd914..5e9ff0fd 100644 --- a/camlp4/Camlp4Bin.ml +++ b/camlp4/Camlp4Bin.ml @@ -18,7 +18,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Camlp4Bin.ml,v 1.19 2008/10/03 15:41:24 ertai Exp $ *) + open Camlp4; open PreCast.Syntax; diff --git a/camlp4/Camlp4Filters/Camlp4AstLifter.ml b/camlp4/Camlp4Filters/Camlp4AstLifter.ml index f3a0bbfd..768e4dac 100644 --- a/camlp4/Camlp4Filters/Camlp4AstLifter.ml +++ b/camlp4/Camlp4Filters/Camlp4AstLifter.ml @@ -22,7 +22,7 @@ open Camlp4; module Id = struct value name = "Camlp4AstLifter"; - value version = "$Id: Camlp4AstLifter.ml,v 1.1 2007/02/07 10:09:22 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (AstFilters : Camlp4.Sig.AstFilters) = struct diff --git a/camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml b/camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml index faccf97b..3d338c41 100644 --- a/camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml +++ b/camlp4/Camlp4Filters/Camlp4ExceptionTracer.ml @@ -22,7 +22,7 @@ open Camlp4; module Id = struct value name = "Camlp4ExceptionTracer"; - value version = "$Id: Camlp4ExceptionTracer.ml,v 1.1 2007/02/07 10:09:22 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (AstFilters : Camlp4.Sig.AstFilters) = struct diff --git a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml b/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml index b44f7f16..f5efd2c6 100644 --- a/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml +++ b/camlp4/Camlp4Filters/Camlp4FoldGenerator.ml @@ -22,7 +22,7 @@ open Camlp4; module Id = struct value name = "Camlp4FoldGenerator"; - value version = "$Id: Camlp4FoldGenerator.ml,v 1.3 2007/11/21 17:51:39 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (AstFilters : Camlp4.Sig.AstFilters) = struct diff --git a/camlp4/Camlp4Filters/Camlp4LocationStripper.ml b/camlp4/Camlp4Filters/Camlp4LocationStripper.ml index 2c8f407e..533292de 100644 --- a/camlp4/Camlp4Filters/Camlp4LocationStripper.ml +++ b/camlp4/Camlp4Filters/Camlp4LocationStripper.ml @@ -22,7 +22,7 @@ open Camlp4; module Id = struct value name = "Camlp4LocationStripper"; - value version = "$Id: Camlp4LocationStripper.ml,v 1.2 2007/10/08 14:19:34 doligez Exp $"; + value version = Sys.ocaml_version; end; module Make (AstFilters : Camlp4.Sig.AstFilters) = struct diff --git a/camlp4/Camlp4Filters/Camlp4MapGenerator.ml b/camlp4/Camlp4Filters/Camlp4MapGenerator.ml index db5fb5c9..52b00eb6 100644 --- a/camlp4/Camlp4Filters/Camlp4MapGenerator.ml +++ b/camlp4/Camlp4Filters/Camlp4MapGenerator.ml @@ -1,5 +1,5 @@ (* This module is useless now. Camlp4FoldGenerator handles map too. *) module Id = struct value name = "Camlp4MapGenerator"; - value version = "$Id: Camlp4MapGenerator.ml,v 1.4 2008/01/11 16:13:16 doligez Exp $"; + value version = Sys.ocaml_version; end; diff --git a/camlp4/Camlp4Filters/Camlp4Profiler.ml b/camlp4/Camlp4Filters/Camlp4Profiler.ml index d00e3612..18008516 100644 --- a/camlp4/Camlp4Filters/Camlp4Profiler.ml +++ b/camlp4/Camlp4Filters/Camlp4Profiler.ml @@ -21,7 +21,7 @@ open Camlp4; module Id = struct value name = "Camlp4Profiler"; - value version = "$Id: Camlp4Profiler.ml,v 1.1 2007/02/07 10:09:22 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (AstFilters : Camlp4.Sig.AstFilters) = struct diff --git a/camlp4/Camlp4Filters/Camlp4TrashRemover.ml b/camlp4/Camlp4Filters/Camlp4TrashRemover.ml index b0005cae..07ead66a 100644 --- a/camlp4/Camlp4Filters/Camlp4TrashRemover.ml +++ b/camlp4/Camlp4Filters/Camlp4TrashRemover.ml @@ -22,7 +22,7 @@ open Camlp4; module Id = struct value name = "Camlp4TrashRemover"; - value version = "$Id: Camlp4TrashRemover.ml,v 1.2 2007/10/08 14:19:34 doligez Exp $"; + value version = Sys.ocaml_version; end; module Make (AstFilters : Camlp4.Sig.AstFilters) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4AstLoader.ml b/camlp4/Camlp4Parsers/Camlp4AstLoader.ml index d5fd144a..67d04edf 100644 --- a/camlp4/Camlp4Parsers/Camlp4AstLoader.ml +++ b/camlp4/Camlp4Parsers/Camlp4AstLoader.ml @@ -20,7 +20,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4AstLoader"; - value version = "$Id: Camlp4AstLoader.ml,v 1.1 2007/02/07 10:09:22 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Ast : Camlp4.Sig.Ast) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4DebugParser.ml b/camlp4/Camlp4Parsers/Camlp4DebugParser.ml index 8331e5eb..a815a96a 100644 --- a/camlp4/Camlp4Parsers/Camlp4DebugParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4DebugParser.ml @@ -19,7 +19,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4DebugParser"; - value version = "$Id: Camlp4DebugParser.ml,v 1.1 2007/02/07 10:09:22 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml b/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml index 1b47156a..50cbdb2b 100644 --- a/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4GrammarParser.ml @@ -21,7 +21,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4GrammarParser"; - value version = "$Id: Camlp4GrammarParser.ml,v 1.5 2008/01/11 16:13:16 doligez Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml b/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml index 69d9fe2c..05cfab47 100644 --- a/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml +++ b/camlp4/Camlp4Parsers/Camlp4ListComprehension.ml @@ -21,7 +21,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4ListComprenhsion"; - value version = "$Id: Camlp4ListComprehension.ml,v 1.2 2007/11/21 17:51:16 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4MacroParser.ml b/camlp4/Camlp4Parsers/Camlp4MacroParser.ml index 0995fac3..ea359152 100644 --- a/camlp4/Camlp4Parsers/Camlp4MacroParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4MacroParser.ml @@ -23,7 +23,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4MacroParser"; - value version = "$Id: Camlp4MacroParser.ml,v 1.5 2008/10/03 14:19:19 ertai Exp $"; + value version = Sys.ocaml_version; end; (* diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml index 7dee9d13..8a1b53c0 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlParser.ml @@ -21,7 +21,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id : Sig.Id = struct value name = "Camlp4OCamlParser"; - value version = "$Id: Camlp4OCamlParser.ml,v 1.14 2008/10/05 15:26:54 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml index ccc38915..94a2bdb2 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.ml @@ -22,7 +22,7 @@ open Camlp4; module Id : Sig.Id = struct value name = "Camlp4OCamlParserParser"; - value version = "$Id: Camlp4OCamlParserParser.ml,v 1.1 2007/02/07 10:09:22 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml index c9e1e846..e56ab361 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.ml @@ -19,7 +19,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4Reloaded"; - value version = "$Id: Camlp4OCamlReloadedParser.ml,v 1.2 2007/10/08 14:19:34 doligez Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml index 91dbd575..f3beee67 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.ml @@ -20,7 +20,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4OCamlRevisedParser"; - value version = "$Id: Camlp4OCamlRevisedParser.ml,v 1.15 2008/10/05 15:26:54 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml index e33772c7..4e4d35d8 100644 --- a/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml +++ b/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.ml @@ -21,7 +21,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id : Sig.Id = struct value name = "Camlp4OCamlRevisedParserParser"; - value version = "$Id: Camlp4OCamlRevisedParserParser.ml,v 1.4 2008/01/11 16:13:16 doligez Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) = struct diff --git a/camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml b/camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml index bcc8cd77..50e57fa1 100644 --- a/camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml +++ b/camlp4/Camlp4Parsers/Camlp4QuotationCommon.ml @@ -19,7 +19,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4QuotationCommon"; - value version = "$Id: Camlp4QuotationCommon.ml,v 1.5 2008/01/11 16:13:16 doligez Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) diff --git a/camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml b/camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml index 2f8be435..fb225a58 100644 --- a/camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml +++ b/camlp4/Camlp4Parsers/Camlp4QuotationExpander.ml @@ -21,7 +21,7 @@ open Camlp4; (* -*- camlp4r -*- *) module Id = struct value name = "Camlp4QuotationExpander"; - value version = "$Id: Camlp4QuotationExpander.ml,v 1.1 2007/02/07 10:09:22 ertai Exp $"; + value version = Sys.ocaml_version; end; module Make (Syntax : Sig.Camlp4Syntax) diff --git a/camlp4/Camlp4Top/Rprint.ml b/camlp4/Camlp4Top/Rprint.ml index 2e5a5ca9..ff2a7e58 100644 --- a/camlp4/Camlp4Top/Rprint.ml +++ b/camlp4/Camlp4Top/Rprint.ml @@ -18,7 +18,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Rprint.ml,v 1.5 2008/01/11 16:13:16 doligez Exp $ *) + (* There is a few Obj.magic due to the fact that we no longer have compiler files like Parsetree, Location, Longident but Camlp4_import that wrap them to diff --git a/camlp4/Camlp4Top/Top.ml b/camlp4/Camlp4Top/Top.ml index f1cd069d..4bb92bdc 100644 --- a/camlp4/Camlp4Top/Top.ml +++ b/camlp4/Camlp4Top/Top.ml @@ -18,7 +18,7 @@ * - Nicolas Pouillard: refactoring *) -(* $Id: Top.ml,v 1.4.4.1 2008/10/13 13:34:06 ertai Exp $ *) + (* There is a few Obj.magic due to the fact that we no longer have compiler files like Parsetree, Location, Longident but Camlp4_import that wrap them to @@ -102,8 +102,13 @@ value wrap parse_fun = value toplevel_phrase token_stream = match Gram.parse_tokens_after_filter Syntax.top_phrase token_stream with - [ Some phr -> Ast2pt.phrase phr - | None -> raise End_of_file ]; + [ Some str_item -> + let str_item = + AstFilters.fold_topphrase_filters (fun t filter -> filter t) str_item + in + Ast2pt.phrase str_item + + | None -> raise End_of_file ]; value use_file token_stream = let (pl0, eoi) = diff --git a/camlp4/Makefile b/camlp4/Makefile index 1fbb95f7..8686e25b 100644 --- a/camlp4/Makefile +++ b/camlp4/Makefile @@ -10,7 +10,7 @@ # # ######################################################################### -# $Id: Makefile,v 1.40 2007/02/07 10:09:21 ertai Exp $ + # RELEASE NOTE: # Do not forget to call make genclean to update Makefile.clean before a diff --git a/camlp4/boot/Camlp4.ml b/camlp4/boot/Camlp4.ml index 57104c22..ea3f335d 100644 --- a/camlp4/boot/Camlp4.ml +++ b/camlp4/boot/Camlp4.ml @@ -372,7 +372,7 @@ module Sig = * - Daniel de Rauglaudre: initial version * - Nicolas Pouillard: refactoring *) - (* $Id$ *) + (** Camlp4 signature repository *) (** {6 Basic signatures} *) (** Signature with just a type. *) @@ -17462,7 +17462,7 @@ module Printers = struct let name = "Camlp4Printers.DumpCamlp4Ast" - let version = "$Id$" + let version = Sys.ocaml_version end @@ -17505,7 +17505,7 @@ module Printers = struct let name = "Camlp4Printers.DumpOCamlAst" - let version = "$Id$" + let version = Sys.ocaml_version end @@ -17556,7 +17556,7 @@ module Printers = struct module Id = struct let name = "Camlp4.Printers.Null" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Syntax) = @@ -17821,7 +17821,7 @@ module Printers = module Id = struct let name = "Camlp4.Printers.OCaml" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Camlp4Syntax) = @@ -19255,7 +19255,7 @@ module Printers = module Id = struct let name = "Camlp4.Printers.OCamlr" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Camlp4Syntax) = @@ -20204,7 +20204,7 @@ module PreCast : end = struct module Id = struct let name = "Camlp4.PreCast" - let version = "$Id$" + let version = Sys.ocaml_version end type camlp4_token = diff --git a/camlp4/boot/Makefile b/camlp4/boot/Makefile index 2cc9f17e..b6a14631 100644 --- a/camlp4/boot/Makefile +++ b/camlp4/boot/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.2 2006/11/15 14:49:26 doligez Exp $ + MAX_SAVE = 10 diff --git a/camlp4/boot/camlp4boot.ml b/camlp4/boot/camlp4boot.ml index f58725c7..0167ceff 100644 --- a/camlp4/boot/camlp4boot.ml +++ b/camlp4/boot/camlp4boot.ml @@ -22,7 +22,7 @@ module R = *) module Id = struct let name = "Camlp4OCamlRevisedParser" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Camlp4Syntax) = @@ -8525,7 +8525,7 @@ module Camlp4QuotationCommon = *) module Id = struct let name = "Camlp4QuotationCommon" - let version = "$Id$" + let version = Sys.ocaml_version end module Make @@ -9224,7 +9224,7 @@ module Q = *) module Id = struct let name = "Camlp4QuotationExpander" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Camlp4Syntax) = @@ -9263,7 +9263,7 @@ module Rp = *) module Id : Sig.Id = struct let name = "Camlp4OCamlRevisedParserParser" - let version = "$Id$" + let version = Sys.ocaml_version end @@ -10194,7 +10194,7 @@ module G = *) module Id = struct let name = "Camlp4GrammarParser" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Camlp4Syntax) = @@ -12593,7 +12593,7 @@ module M = *) module Id = struct let name = "Camlp4MacroParser" - let version = "$Id$" + let version = Sys.ocaml_version end (* @@ -13648,7 +13648,7 @@ module D = *) module Id = struct let name = "Camlp4DebugParser" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Camlp4Syntax) = @@ -13841,7 +13841,7 @@ module L = *) module Id = struct let name = "Camlp4ListComprenhsion" - let version = "$Id$" + let version = Sys.ocaml_version end module Make (Syntax : Sig.Camlp4Syntax) = @@ -14216,7 +14216,7 @@ module B = * - Daniel de Rauglaudre: initial version * - Nicolas Pouillard: refactoring *) - (* $Id$ *) + open Camlp4 open PreCast.Syntax diff --git a/camlp4/man/Makefile b/camlp4/man/Makefile index b2df6374..bf33c7a0 100644 --- a/camlp4/man/Makefile +++ b/camlp4/man/Makefile @@ -1,4 +1,4 @@ -# $Id: Makefile,v 1.7 2006/06/29 08:12:44 pouillar Exp $ + include ../config/Makefile.cnf diff --git a/camlp4/mkcamlp4.ml b/camlp4/mkcamlp4.ml index c741f6aa..e5853503 100644 --- a/camlp4/mkcamlp4.ml +++ b/camlp4/mkcamlp4.ml @@ -17,7 +17,7 @@ * - Nicolas Pouillard: rewriting in OCaml *) -(* $Id: mkcamlp4.ml,v 1.4 2008/10/03 15:50:09 ertai Exp $ *) + open Camlp4; open Camlp4_config; diff --git a/config/Makefile.mingw b/config/Makefile.mingw index a2e33ff1..a94f6932 100644 --- a/config/Makefile.mingw +++ b/config/Makefile.mingw @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.mingw,v 1.27 2008/07/29 08:31:41 xleroy Exp $ +# $Id: Makefile.mingw,v 1.27.2.1 2008/11/09 09:44:24 xleroy Exp $ # Configuration for Windows, Mingw compiler @@ -149,8 +149,7 @@ BNG_ASM_LEVEL=1 # There must be no spaces or special characters in $(TK_ROOT) TK_ROOT=c:/tcl TK_DEFS=-I$(TK_ROOT)/include -TK_LINK=$(TK_ROOT)/bin/tk83.dll $(TK_ROOT)/bin/tcl83.dll -lws2_32 -#TK_LINK=$(TK_ROOT)/lib/tk84.lib $(TK_ROOT)/lib/tcl84.lib -lws2_32 +TK_LINK=$(TK_ROOT)/bin/tk84.dll $(TK_ROOT)/bin/tcl84.dll -lws2_32 ############# Aliases for common commands diff --git a/config/Makefile.msvc b/config/Makefile.msvc index bfea63cb..044f4b7c 100644 --- a/config/Makefile.msvc +++ b/config/Makefile.msvc @@ -11,7 +11,7 @@ # # ######################################################################### -# $Id: Makefile.msvc,v 1.30 2008/07/29 08:31:41 xleroy Exp $ +# $Id: Makefile.msvc,v 1.30.2.1 2008/11/10 15:24:51 xleroy Exp $ # Configuration for Windows, Visual C++ compiler @@ -150,13 +150,12 @@ TK_ROOT=c:/tcl TK_DEFS=-I$(TK_ROOT)/include # The following definition avoids hard-wiring $(TK_ROOT) in the libraries # produced by OCaml, and is therefore required for binary distribution -# of these libraries. However, $(TK_ROOT) must be added to the LIB +# of these libraries. However, $(TK_ROOT)/lib must be added to the LIB # environment variable, as described in README.win32. -#TK_LINK=tk84.lib tcl84.lib ws2_32.lib -TK_LINK=tk83.lib tcl83.lib ws2_32.lib +TK_LINK=tk84.lib tcl84.lib ws2_32.lib # An alternative definition that avoids mucking with the LIB variable, # but hard-wires the Tcl/Tk location in the binaries -# TK_LINK=$(TK_ROOT)/tk83.lib $(TK_ROOT)/tcl83.lib ws2_32.lib +# TK_LINK=$(TK_ROOT)/tk84.lib $(TK_ROOT)/tcl84.lib ws2_32.lib ############# Aliases for common commands diff --git a/configure b/configure index 748f1cef..503f5556 100755 --- a/configure +++ b/configure @@ -13,7 +13,7 @@ # # ######################################################################### -# $Id: configure,v 1.266 2008/10/06 13:31:47 doligez Exp $ +# $Id: configure,v 1.266.2.1 2008/11/07 10:34:16 xleroy Exp $ configure_options="$*" prefix=/usr/local @@ -260,8 +260,10 @@ case "$bytecc,$host" in bytecccompopts="-fno-defer-pop -no-cpp-precomp $gcc_warnings" mathlib="" # Tell gcc that we can use 32-bit code addresses for threaded code - # even if we compile in 64-bit mode - echo "#define ARCH_CODE32" >> m.h;; + # unless we are compiled for a shared library (-fPIC option) + echo "#ifndef __PIC__" >> m.h + echo "# define ARCH_CODE32" >> m.h + echo "#endif" >> m.h;; *,*-*-beos*) bytecccompopts="-fno-defer-pop $gcc_warnings" # No -lm library @@ -566,20 +568,13 @@ if test $withsharedlibs = "yes"; then mksharedlibrpath="-rpath " shared_libraries_supported=true;; i[3456]86-*-darwin*) - dyld=ld - if test -f /usr/bin/ld_classic; then - # The new linker in Mac OS X 10.5 does not support read_only_relocs - # dyld=/usr/bin/ld_classic XXX FIXME incompatible with X11 libs - : - fi - mksharedlib="$dyld -bundle -flat_namespace -undefined suppress -read_only_relocs suppress" + mksharedlib="$bytecc -bundle -flat_namespace -undefined suppress -read_only_relocs suppress" bytecccompopts="$dl_defs $bytecccompopts" dl_needs_underscore=false shared_libraries_supported=true;; *-apple-darwin*) mksharedlib="$bytecc -bundle -flat_namespace -undefined suppress" bytecccompopts="$dl_defs $bytecccompopts" - #sharedcccompopts="-fnocommon" dl_needs_underscore=false shared_libraries_supported=true;; m88k-*-openbsd*) @@ -625,7 +620,11 @@ case "$host" in i[3456]86-*-solaris*) arch=i386; system=solaris;; i[3456]86-*-beos*) arch=i386; system=beos;; i[3456]86-*-cygwin*) arch=i386; system=cygwin;; - i[3456]86-*-darwin*) arch=i386; system=macosx;; + i[3456]86-*-darwin*) if $arch64; then + arch=amd64; system=macosx + else + arch=i386; system=macosx + fi;; i[3456]86-*-gnu*) arch=i386; system=gnu;; mips-*-irix6*) arch=mips; system=irix;; hppa1.1-*-hpux*) arch=hppa; system=hpux;; @@ -647,6 +646,7 @@ case "$host" in x86_64-*-freebsd*) arch=amd64; system=freebsd;; x86_64-*-netbsd*) arch=amd64; system=netbsd;; x86_64-*-openbsd*) arch=amd64; system=openbsd;; + x86_64-*-darwin9.5) arch=amd64; system=macosx;; esac # Some platforms exist both in 32-bit and 64-bit variants, not distinguished @@ -685,6 +685,7 @@ case "$arch,$nativecc,$system,$host_type" in *,*,rhapsody,*) nativecccompopts="$gcc_warnings -DDARWIN_VERSION_6 $dl_defs" if $arch64; then partialld="ld -r -arch ppc64"; fi;; *,gcc*,cygwin,*) nativecccompopts="$gcc_warnings -U_WIN32";; + amd64,gcc*,macosx,*) partialld="ld -r -arch x86_64";; *,gcc*,*,*) nativecccompopts="$gcc_warnings";; esac @@ -696,6 +697,8 @@ case "$arch,$model,$system" in asppprofflags='-pg -DPROFILING';; alpha,*,*) as='as' aspp='gcc -c';; + amd64,*,macosx) as='as -arch x86_64' + aspp='gcc -arch x86_64 -c';; amd64,*,*) as='as' aspp='gcc -c';; arm,*,*) as='as'; @@ -734,6 +737,7 @@ case "$arch,$model,$system" in i386,*,linux_elf) profiling='prof';; i386,*,gnu) profiling='prof';; i386,*,bsd_elf) profiling='prof';; + amd64,*,macosx) profiling='prof';; i386,*,macosx) profiling='prof';; sparc,*,solaris) profiling='prof' @@ -1092,27 +1096,27 @@ fi # Determine if system stack overflows can be detected case "$arch,$system" in - i386,linux_elf|amd64,linux|power,rhapsody|i386,macosx) + i386,linux_elf|amd64,linux|power,rhapsody|amd64,macosx|i386,macosx|amd64,macosx) echo "System stack overflow can be detected." echo "#define HAS_STACK_OVERFLOW_DETECTION" >> s.h;; *) echo "Cannot detect system stack overflow.";; esac -# Determine the target architecture for the "num" library - -case "$host" in - alpha*-*-*) bng_arch=alpha; bng_asm_level=1;; - i[3456]86-*-*) bng_arch=ia32 - if sh ./trycompile ia32sse2.c - then bng_asm_level=2 - else bng_asm_level=1 - fi;; - mips-*-*) bng_arch=mips; bng_asm_level=1;; - powerpc-*-*) bng_arch=ppc; bng_asm_level=1;; - sparc*-*-*) bng_arch=sparc; bng_asm_level=1;; - x86_64-*-*) bng_arch=amd64; bng_asm_level=1;; - *) bng_arch=generic; bng_asm_level=0;; +x# Determine the target architecture for the "num" library + +case "$arch" in + alpha) bng_arch=alpha; bng_asm_level=1;; + i386) bng_arch=ia32 + if sh ./trycompile ia32sse2.c + then bng_asm_level=2 + else bng_asm_level=1 + fi;; + mips) bng_arch=mips; bng_asm_level=1;; + power) bng_arch=ppc; bng_asm_level=1;; + sparc) bng_arch=sparc; bng_asm_level=1;; + amd64) bng_arch=amd64; bng_asm_level=1;; + *) bng_arch=generic; bng_asm_level=0;; esac echo "BNG_ARCH=$bng_arch" >> Makefile diff --git a/driver/optcompile.ml b/driver/optcompile.ml index 096350b9..c502c109 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: optcompile.ml,v 1.56.2.1 2008/10/08 13:07:13 doligez Exp $ *) +(* $Id: optcompile.ml,v 1.56.2.2 2008/10/17 14:01:35 doligez Exp $ *) (* The batch compiler *) @@ -134,11 +134,13 @@ let implementation ppf sourcefile outputprefix = Compilenv.save_unit_info cmxfile; end; Warnings.check_fatal (); - Pparse.remove_preprocessed inputfile + Pparse.remove_preprocessed inputfile; + Stypes.dump (outputprefix ^ ".annot"); with x -> remove_file objfile; remove_file cmxfile; Pparse.remove_preprocessed_if_ast inputfile; + Stypes.dump (outputprefix ^ ".annot"); raise x let c_file name = diff --git a/emacs/caml.el b/emacs/caml.el index 18ec3c33..1f3c8f3a 100644 --- a/emacs/caml.el +++ b/emacs/caml.el @@ -10,7 +10,7 @@ ;(* *) ;(***********************************************************************) -;(* $Id: caml.el,v 1.44 2008/08/19 12:54:51 doligez Exp $ *) +;(* $Id: caml.el,v 1.44.2.1 2008/10/29 12:30:57 doligez Exp $ *) ;;; caml.el --- O'Caml code editing commands for Emacs @@ -791,7 +791,7 @@ variable caml-mode-indentation." ;; Hence we add a regexp. (defconst caml-error-regexp - "^[A-\377]+ \"\\([^\"\n]+\\)\", [A-\377]+ \\([0-9]+\\)[-,:]" + "^[ A-\377]+ \"\\([^\"\n]+\\)\", [A-\377]+ \\([0-9]+\\)[-,:]" "Regular expression matching the error messages produced by camlc.") (if (boundp 'compilation-error-regexp-alist) @@ -804,7 +804,7 @@ variable caml-mode-indentation." ;; A regexp to extract the range info (defconst caml-error-chars-regexp - ".*, .*, [A-\377]+ \\([0-9]+\\)-\\([0-9]+\\):" + ".*, .*, [A-\377]+ \\([0-9]+\\)-\\([0-9]+\\):?" "Regular expression extracting the character numbers from an error message produced by camlc.") @@ -816,7 +816,7 @@ from an error message produced by camlc.") (defun caml-string-to-int (x) (if (fboundp 'string-to-number) (string-to-number x) (string-to-int x))) -;;itz 04-21-96 somebody didn't get the documetation for next-error +;;itz 04-21-96 somebody didn't get the documentation for next-error ;;right. When the optional argument is a number n, it should move ;;forward n errors, not reparse. diff --git a/man/ocamlc.m b/man/ocamlc.m index 0ce1e8d8..a7fae5d3 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -1,4 +1,4 @@ -\" $Id: ocamlc.m,v 1.12 2008/09/15 14:12:56 doligez Exp $ +\" $Id: ocamlc.m,v 1.12.2.1 2008/10/29 12:38:52 doligez Exp $ .TH OCAMLC 1 @@ -421,8 +421,8 @@ as a preprocessor for each source file. The output of is redirected to an intermediate file, which is compiled. If there are no compilation errors, the intermediate file is deleted afterwards. The name of this -file is built from the basename of the source file with the extension -.ppi for an interface (.mli) file and .ppo for an implementation +file is built from the basename of the source file with the extension .ppi +for an interface (.mli) file and .ppo for an implementation (.ml) file. .TP .B \-principal @@ -561,7 +561,7 @@ into errors. The compiler will stop with an error when one of these warnings is emitted. The .I warning\-list has the same meaning as for -the "-w" option: an uppercase character turns the corresponding +the "\-w" option: an uppercase character turns the corresponding warning into an error, a lowercase character leaves it as a warning. The default setting is .B \-warn\-error\ a diff --git a/man/ocamlopt.m b/man/ocamlopt.m index 3872bd87..cdebf3d1 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -1,4 +1,4 @@ -\" $Id: ocamlopt.m,v 1.10 2008/09/15 14:12:56 doligez Exp $ +\" $Id: ocamlopt.m,v 1.10.2.1 2008/10/29 12:38:52 doligez Exp $ .TH OCAMLOPT 1 .SH NAME @@ -222,7 +222,7 @@ and edit that file to remove all declarations of unexported names. Add the given directory to the list of directories searched for compiled interface files (.cmi) and compiled object code files (.cmo). By default, the current directory is searched first, then the -standard library directory. Directories added with -I are searched +standard library directory. Directories added with \-I are searched after the current directory, in the order in which they were given on the command line, but before the standard library directory. @@ -536,7 +536,7 @@ into errors. The compiler will stop with an error when one of these warnings is emitted. The .I warning\-list has the same meaning as for -the "-w" option: an uppercase character turns the corresponding +the "\-w" option: an uppercase character turns the corresponding warning into an error, a lowercase character leaves it as a warning. The default setting is .B \-warn\-error\ a @@ -577,7 +577,7 @@ trigonometric operations .BR cos , .BR sin , .B tan -have their range reduced to [-2^64, 2^64]. +have their range reduced to [\-2^64, 2^64]. .SH OPTIONS FOR THE AMD64 ARCHITECTURE diff --git a/man/ocamlrun.m b/man/ocamlrun.m index 1b51e3ab..a4c52de4 100644 --- a/man/ocamlrun.m +++ b/man/ocamlrun.m @@ -1,4 +1,4 @@ -\" $Id: ocamlrun.m,v 1.6 2008/09/15 14:12:56 doligez Exp $ +\" $Id: ocamlrun.m,v 1.6.2.1 2008/11/18 10:41:17 doligez Exp $ .TH OCAMLRUN 1 .SH NAME @@ -104,18 +104,24 @@ record documented in .IR "The Objective Caml user's manual", chapter "Standard Library", section "Gc". .TP -.BR b +.B b Trigger the printing of a stack backtrace when an uncaught exception aborts the program. This option takes no argument. .TP -.BR p +.B p Turn on debugging support for .BR ocamlyacc -generated parsers. When this option is on, the pushdown automaton that executes the parsers prints a trace of its actions. This option takes no argument. .TP +.BR a \ (allocation_policy) +The policy used for allocating in the OCaml heap. Possible values +are 0 for the next-fit policy, and 1 for the first-fit +policy. Next-fit is somewhat faster, but first-fit is better for +avoiding fragmentation and the associated heap compactions. +.TP .BR s \ (minor_heap_size) The size of the minor heap (in words). .TP diff --git a/myocamlbuild.ml b/myocamlbuild.ml index 6050eb69..2c947952 100644 --- a/myocamlbuild.ml +++ b/myocamlbuild.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: myocamlbuild.ml,v 1.23 2008/10/03 15:41:25 ertai Exp $ *) +(* $Id: myocamlbuild.ml,v 1.23.2.2 2008/10/23 15:29:11 ertai Exp $ *) open Ocamlbuild_plugin open Command @@ -110,21 +110,21 @@ let full_ocamlrun = P((Sys.getcwd ()) / "boot/ocamlrun") let boot_ocamlc = S[ocamlrun; A"boot/ocamlc"; A"-I"; A"boot"; A"-nostdlib"] -let partial = bool_of_string (getenv ~default:"false" "OCAMLBUILD_PARTIAL");; +let mixed = Pathname.exists "build/ocamlbuild_mixed_mode";; -let if_partial_dir dir = - if partial then ".."/dir else dir;; +let if_mixed_dir dir = + if mixed then ".."/dir else dir;; let unix_dir = match Sys.os_type with - | "Win32" -> if_partial_dir "otherlibs/win32unix" - | _ -> if_partial_dir "otherlibs/unix";; + | "Win32" -> if_mixed_dir "otherlibs/win32unix" + | _ -> if_mixed_dir "otherlibs/unix";; -let threads_dir = if_partial_dir "otherlibs/threads";; -let systhreads_dir = if_partial_dir "otherlibs/systhreads";; -let dynlink_dir = if_partial_dir "otherlibs/dynlink";; -let str_dir = if_partial_dir "otherlibs/str";; -let toplevel_dir = if_partial_dir "toplevel";; +let threads_dir = if_mixed_dir "otherlibs/threads";; +let systhreads_dir = if_mixed_dir "otherlibs/systhreads";; +let dynlink_dir = if_mixed_dir "otherlibs/dynlink";; +let str_dir = if_mixed_dir "otherlibs/str";; +let toplevel_dir = if_mixed_dir "toplevel";; let ocamlc_solver = let native_deps = ["ocamlc.opt"; "stdlib/stdlib.cmxa"; @@ -156,7 +156,7 @@ let ar = A"ar";; dispatch begin function | Before_hygiene -> - if partial then + if mixed then let patt = String.concat "," ["asmcomp"; "bytecomp"; "debugger"; "driver"; "lex"; "ocamldoc"; "otherlibs"; "parsing"; "stdlib"; "tools"; @@ -364,8 +364,8 @@ let import_stdlib_contents build exts = List.iter Outcome.ignore_good res ;; -rule "byte stdlib in partial mode" - ~stamp:"byte_stdlib_partial_mode" +rule "byte stdlib in mixed mode" + ~stamp:"byte_stdlib_mixed_mode" ~deps:["stdlib/stdlib.mllib"; "stdlib/stdlib.cma"; "stdlib/std_exit.cmo"; "stdlib/libcamlrun"-.-C.a; "stdlib/camlheader"; "stdlib/camlheader_ur"] @@ -378,8 +378,8 @@ rule "byte stdlib in partial mode" Nop end;; -rule "native stdlib in partial mode" - ~stamp:"native_stdlib_partial_mode" +rule "native stdlib in mixed mode" + ~stamp:"native_stdlib_mixed_mode" ~deps:["stdlib/stdlib.mllib"; "stdlib/stdlib.cmxa"; "stdlib/stdlib"-.-C.a; "stdlib/std_exit.cmx"; "stdlib/std_exit"-.-C.o; "stdlib/libasmrun"-.-C.a; @@ -785,7 +785,7 @@ let mk_camlp4_bin name ?unix:(link_unix=true) modules = then A"unix.cma", A"unix.cmxa", S[A"-I"; P unix_dir] else N,N,N in let dep_unix_byte, dep_unix_native = - if link_unix && not partial + if link_unix && not mixed then [unix_dir/"unix.cma"], [unix_dir/"unix.cmxa"; unix_dir/"unix"-.-C.a] else [],[] in @@ -793,15 +793,19 @@ let mk_camlp4_bin name ?unix:(link_unix=true) modules = let cmos = add_extensions ["cmo"] deps in let cmxs = add_extensions ["cmx"] deps in let objs = add_extensions [C.o] deps in - let dep_dynlink_native = - if partial then [] else [dynlink_dir/"dynlink.cmxa"; dynlink_dir/"dynlink"-.-C.a] + let dep_dynlink_byte, dep_dynlink_native = + if mixed + then [], [] + else [dynlink_dir/"dynlink.cma"], + [dynlink_dir/"dynlink.cmxa"; dynlink_dir/"dynlink"-.-C.a] in rule byte - ~deps:(camlp4lib_cma::cmos @ dep_unix_byte) + ~deps:(camlp4lib_cma::cmos @ dep_unix_byte @ dep_dynlink_byte) ~prod:(add_exe byte) ~insert:(`before "ocaml: cmo* -> byte") begin fun _ _ -> - Cmd(S[ocamlc; include_unix; unix_cma; T(tags_of_pathname byte++"ocaml"++"link"++"byte"); + Cmd(S[ocamlc; A"-I"; P dynlink_dir; A "dynlink.cma"; include_unix; unix_cma; + T(tags_of_pathname byte++"ocaml"++"link"++"byte"); P camlp4lib_cma; A"-linkall"; atomize cmos; A"-o"; Px (add_exe byte)]) end; rule native @@ -809,7 +813,8 @@ let mk_camlp4_bin name ?unix:(link_unix=true) modules = ~prod:(add_exe native) ~insert:(`before "ocaml: cmx* & o* -> native") begin fun _ _ -> - Cmd(S[ocamlopt; A"-I"; P dynlink_dir; A "dynlink.cmxa"; include_unix; unix_cmxa; T(tags_of_pathname native++"ocaml"++"link"++"native"); + Cmd(S[ocamlopt; A"-I"; P dynlink_dir; A "dynlink.cmxa"; include_unix; unix_cmxa; + T(tags_of_pathname native++"ocaml"++"link"++"native"); P camlp4lib_cmxa; A"-linkall"; atomize cmxs; A"-o"; Px (add_exe native)]) end;; diff --git a/ocamlbuild/display.ml b/ocamlbuild/display.ml index 7d638b1d..326ab16b 100644 --- a/ocamlbuild/display.ml +++ b/ocamlbuild/display.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: display.ml,v 1.3 2008/01/11 16:13:16 doligez Exp $ *) +(* $Id: display.ml,v 1.3.4.1 2008/11/06 15:40:39 ertai Exp $ *) (* Original author: Berke Durak *) (* Display *) open My_std;; @@ -61,7 +61,7 @@ type display_line = type display = { di_log_level : int; - di_log_channel : (Format.formatter * out_channel) option; + mutable di_log_channel : (Format.formatter * out_channel) option; di_channel : out_channel; di_formatter : Format.formatter; di_display_line : display_line; @@ -274,7 +274,8 @@ let finish ?(how=`Success) di = call_if di.di_log_channel begin fun (fmt, oc) -> Format.fprintf fmt "# Compilation %ssuccessful.@." (if how = `Error then "un" else ""); - close_out oc + close_out oc; + di.di_log_channel <- None end; match di.di_display_line with | Classic -> () diff --git a/ocamlbuild/main.ml b/ocamlbuild/main.ml index 71ca30e2..38dc396f 100644 --- a/ocamlbuild/main.ml +++ b/ocamlbuild/main.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: main.ml,v 1.21 2008/01/11 16:13:16 doligez Exp $ *) +(* $Id: main.ml,v 1.21.4.1 2008/11/06 15:40:39 ertai Exp $ *) (* Original author: Berke Durak *) open My_std open Log @@ -24,6 +24,7 @@ exception Exit_build_error of string exception Exit_silently let clean () = + Log.finish (); Shell.rm_rf !Options.build_dir; if !Options.make_links then begin let entry = diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml index d2ad68dd..d9085010 100644 --- a/ocamlbuild/ocaml_specific.ml +++ b/ocamlbuild/ocaml_specific.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: ocaml_specific.ml,v 1.23 2008/08/05 13:06:56 ertai Exp $ *) +(* $Id: ocaml_specific.ml,v 1.23.2.1 2008/10/22 11:23:57 ertai Exp $ *) (* Original author: Nicolas Pouillard *) open My_std open Format @@ -404,6 +404,7 @@ flag ["ocaml"; "debug"; "pack"; "native"] (A "-g");; flag ["ocaml"; "link"; "native"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "link"; "byte"; "output_obj"] (A"-output-obj");; flag ["ocaml"; "dtypes"; "compile"] (A "-dtypes");; +flag ["ocaml"; "annot"; "compile"] (A "-annot");; flag ["ocaml"; "rectypes"; "compile"] (A "-rectypes");; flag ["ocaml"; "rectypes"; "infer_interface"] (A "-rectypes");; flag ["ocaml"; "linkall"; "link"] (A "-linkall");; diff --git a/ocamlbuild/plugin.ml b/ocamlbuild/plugin.ml index d0ded9ec..043a6fca 100644 --- a/ocamlbuild/plugin.ml +++ b/ocamlbuild/plugin.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: plugin.ml,v 1.4 2008/01/11 16:13:16 doligez Exp $ *) +(* $Id: plugin.ml,v 1.4.4.1 2008/11/06 15:40:39 ertai Exp $ *) (* Original author: Nicolas Pouillard *) open My_std open Format @@ -98,6 +98,7 @@ module Make(U:sig end) = if not !Options.just_plugin then let spec = S[!Options.ocamlrun; P(!Options.build_dir/plugin); A"-no-plugin"; atomize (List.tl (Array.to_list Sys.argv))] in + let () = Log.finish () in raise (Exit_silently_with_code (sys_command (Command.string_of_command_spec spec))) end else diff --git a/ocamldoc/odoc_html.ml b/ocamldoc/odoc_html.ml index aafd132c..21294cb0 100644 --- a/ocamldoc/odoc_html.ml +++ b/ocamldoc/odoc_html.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_html.ml,v 1.64 2008/07/23 08:55:36 guesdon Exp $ *) +(* $Id: odoc_html.ml,v 1.64.2.1 2008/11/10 13:03:55 guesdon Exp $ *) (** Generation of html documentation.*) @@ -275,7 +275,7 @@ class virtual text = None else match s.[n] with - | '\n' -> iter_first (n+1) + | '\n' -> iter_first (n+1) | _ -> Some n in match iter_first 0 with diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml index a550118c..2e495b18 100644 --- a/ocamldoc/odoc_man.ml +++ b/ocamldoc/odoc_man.ml @@ -9,7 +9,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_man.ml,v 1.28 2008/07/23 08:55:36 guesdon Exp $ *) +(* $Id: odoc_man.ml,v 1.28.2.1 2008/10/29 11:58:35 guesdon Exp $ *) (** The man pages generator. *) open Odoc_info @@ -204,6 +204,8 @@ class man = match s.[i] with '\\' -> Buffer.add_string b "\\(rs" | '.' -> Buffer.add_string b "\\&." + | '\'' -> Buffer.add_string b "\\&'" + | '-' -> Buffer.add_string b "\\-" | c -> Buffer.add_char b c done; Buffer.contents b @@ -633,15 +635,15 @@ class man = (** Print groff string for a module comment.*) method man_of_module_comment b text = - bs b "\n.pp\n"; + bs b "\n.PP\n"; self#man_of_text b [Code ("=== "^(Odoc_misc.string_of_text text)^" ===")]; - bs b "\n.pp\n" + bs b "\n.PP\n" (** Print groff string for a class comment.*) method man_of_class_comment b text = - bs b "\n.pp\n"; + bs b "\n.PP\n"; self#man_of_text b [Code ("=== "^(Odoc_misc.string_of_text text)^" ===")]; - bs b "\n.pp\n" + bs b "\n.PP\n" (** Print groff string for an included module. *) method man_of_included_module b m_name im = diff --git a/ocamldoc/odoc_ocamlhtml.mll b/ocamldoc/odoc_ocamlhtml.mll index 05cda08a..e7c5c77c 100644 --- a/ocamldoc/odoc_ocamlhtml.mll +++ b/ocamldoc/odoc_ocamlhtml.mll @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: odoc_ocamlhtml.mll,v 1.10 2008/01/11 16:13:16 doligez Exp $ *) +(* $Id: odoc_ocamlhtml.mll,v 1.10.4.1 2008/11/10 13:03:55 guesdon Exp $ *) (** Generation of html code to display OCaml code. *) open Lexing @@ -202,7 +202,7 @@ let reset_string_buffer () = Buffer.reset string_buffer let store_string_char = Buffer.add_char string_buffer let get_stored_string () = let s = Buffer.contents string_buffer in - String.escaped s + s (** To translate escape sequences *) @@ -219,6 +219,11 @@ let char_for_decimal_code lexbuf i = (Char.code(Lexing.lexeme_char lexbuf (i+2)) - 48) in Char.chr(c land 0xFF) +let char_for_hexa_code lexbuf i = + let c = 16 * (Char.code(Lexing.lexeme_char lexbuf i) - 48) + + (Char.code(Lexing.lexeme_char lexbuf (i+1)) - 48) in + Char.chr(c land 0xFF) + (** To store the position of the beginning of a string and comment *) let string_start_pos = ref 0;; let comment_start_pos = ref [];; @@ -426,6 +431,7 @@ and comment = parse comment_start_pos := l; comment lexbuf; } +(* These filters are useless | "\"" { reset_string_buffer(); string_start_pos := Lexing.lexeme_start lexbuf; @@ -437,11 +443,6 @@ and comment = parse raise (Error (Unterminated_string_in_comment, st, st + 2)) end; comment lexbuf } - | "''" - { - store_comment_char '\''; - store_comment_char '\''; - comment lexbuf } | "'" [^ '\\' '\''] "'" { store_comment_char '\''; @@ -455,13 +456,20 @@ and comment = parse store_comment_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)) ; store_comment_char '\''; comment lexbuf } - | "'\\" ['0'-'9'] ['0'-'9'] ['0'-'9'] "'" + | "\\" ['0'-'9'] ['0'-'9'] ['0'-'9'] { - store_comment_char '\''; - store_comment_char '\\'; store_comment_char(char_for_decimal_code lexbuf 1); + comment lexbuf } + | "\\x" ['0'-'9' 'A'-'Z' 'a'-'z' ] ['0'-'9' 'A'-'Z' 'a'-'z'] + { + store_comment_char(char_for_hexa_code lexbuf 2); + string lexbuf } + | "''" + { + store_comment_char '\''; store_comment_char '\''; comment lexbuf } +*) | eof { let st = List.hd !comment_start_pos in raise (Error (Unterminated_comment, st, st + 2)); @@ -475,11 +483,16 @@ and string = parse { () } | '\\' ("\010" | "\013" | "\013\010") [' ' '\009'] * { string lexbuf } - | '\\' ['\\' '"' 'n' 't' 'b' 'r'] - { store_string_char(char_for_backslash(Lexing.lexeme_char lexbuf 1)); + | '\\' ['\\' '"' 'n' 't' 'b' 'r' ] + { Buffer.add_string string_buffer (Lexing.lexeme lexbuf) ; string lexbuf } | '\\' ['0'-'9'] ['0'-'9'] ['0'-'9'] - { store_string_char(char_for_decimal_code lexbuf 1); + { + Buffer.add_string string_buffer (Lexing.lexeme lexbuf) ; + string lexbuf + } + | '\\' 'x' ['0'-'9' 'A'-'Z' 'a'-'z' ] ['0'-'9' 'A'-'Z' 'a'-'z'] + { Buffer.add_string string_buffer (Lexing.lexeme lexbuf) ; string lexbuf } | eof { raise (Error (Unterminated_string, diff --git a/otherlibs/bigarray/bigarray.h b/otherlibs/bigarray/bigarray.h index 3fd80cf8..7fc10e63 100644 --- a/otherlibs/bigarray/bigarray.h +++ b/otherlibs/bigarray/bigarray.h @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bigarray.h,v 1.9 2006/01/27 14:33:42 doligez Exp $ */ +/* $Id: bigarray.h,v 1.9.14.1 2008/11/09 09:03:50 xleroy Exp $ */ #ifndef CAML_BIGARRAY_H #define CAML_BIGARRAY_H @@ -90,5 +90,6 @@ CAMLBAextern value caml_ba_alloc(int flags, int num_dims, void * data, intnat * dim); CAMLBAextern value caml_ba_alloc_dims(int flags, int num_dims, void * data, ... /*dimensions, with type intnat */); +CAMLBAextern uintnat caml_ba_byte_size(struct caml_ba_array * b); #endif diff --git a/otherlibs/bigarray/bigarray_stubs.c b/otherlibs/bigarray/bigarray_stubs.c index 3ec50637..d1d19d9b 100644 --- a/otherlibs/bigarray/bigarray_stubs.c +++ b/otherlibs/bigarray/bigarray_stubs.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: bigarray_stubs.c,v 1.23 2008/01/04 09:52:27 xleroy Exp $ */ +/* $Id: bigarray_stubs.c,v 1.23.4.1 2008/11/09 09:03:51 xleroy Exp $ */ #include #include @@ -56,7 +56,7 @@ int caml_ba_element_size[] = /* Compute the number of bytes for the elements of a big array */ -uintnat caml_ba_byte_size(struct caml_ba_array * b) +CAMLexport uintnat caml_ba_byte_size(struct caml_ba_array * b) { return caml_ba_num_elts(b) * caml_ba_element_size[b->flags & CAML_BA_KIND_MASK]; diff --git a/otherlibs/labltk/browser/Makefile.nt b/otherlibs/labltk/browser/Makefile.nt index 12550fe8..df1e92ac 100644 --- a/otherlibs/labltk/browser/Makefile.nt +++ b/otherlibs/labltk/browser/Makefile.nt @@ -2,15 +2,16 @@ OTHERSLIB=-I $(OTHERS)/win32unix -I $(OTHERS)/str -I $(OTHERS)/systhreads CCFLAGS=-I../../../byterun $(TK_DEFS) +include Makefile.shared + ifeq ($(CCOMPTYPE),cc) -WINDOWS_APP=-ccopt "-Wl,--subsystem,windows" +WINDOWS_APP=-ccopt "-link -Wl,--subsystem,windows" else -WINDOWS_APP=-ccopt "/link /subsystem:windows" +WINDOWS_APP=-ccopt "-link /subsystem:windows" endif -OCAMLBR=threads.cma winmain.$(O) $(WINDOWS_APP) - -include Makefile.shared +XTRAOBJ=winmain.$(O) +XTRALIBS=threads.cma -custom $(WINDOWS_APP) dummy.mli: cp dummyWin.mli dummy.mli diff --git a/otherlibs/labltk/browser/Makefile.shared b/otherlibs/labltk/browser/Makefile.shared index c5080b7c..e25a2a9d 100644 --- a/otherlibs/labltk/browser/Makefile.shared +++ b/otherlibs/labltk/browser/Makefile.shared @@ -30,10 +30,11 @@ JG = jg_tk.cmo jg_config.cmo jg_bind.cmo jg_completion.cmo \ all: ocamlbrowser$(EXE) ocamlbrowser$(EXE): $(TOPDIR)/toplevel/toplevellib.cma jglib.cma $(OBJ) \ - ../support/lib$(LIBNAME).$(A) + ../support/lib$(LIBNAME).$(A) $(XTRAOBJ) $(CAMLC) -o ocamlbrowser$(EXE) $(INCLUDES) \ $(TOPDIR)/toplevel/toplevellib.cma \ - unix.cma str.cma $(OCAMLBR) $(LIBNAME).cma jglib.cma $(OBJ) + unix.cma str.cma $(XTRALIBS) $(LIBNAME).cma jglib.cma \ + $(OBJ) $(XTRAOBJ) ocamlbrowser.cma: jglib.cma $(OBJ) $(CAMLC) -a -o $@ -linkall jglib.cma $(OBJ) diff --git a/otherlibs/labltk/browser/winmain.c b/otherlibs/labltk/browser/winmain.c index b647fb79..2eb32e67 100644 --- a/otherlibs/labltk/browser/winmain.c +++ b/otherlibs/labltk/browser/winmain.c @@ -3,16 +3,22 @@ #include #include -CAMLextern int __argc; -CAMLextern char **__argv; -CAMLextern void caml_expand_command_line(int * argcp, char *** argvp); +/*CAMLextern int __argc; */ +/* CAMLextern char **__argv; */ +/* CAMLextern void caml_expand_command_line(int * argcp, char *** argvp); */ /* extern void caml_main (char **); */ int WINAPI WinMain(HINSTANCE h, HINSTANCE HPrevInstance, LPSTR lpCmdLine, int nCmdShow) { - caml_expand_command_line(&__argc, &__argv); - caml_main(__argv); + char exe_name[1024]; + char * argv[2]; + + GetModuleFileName(NULL, exe_name, sizeof(exe_name) - 1); + exe_name[sizeof(exe_name) - 1] = '0'; + argv[0] = exe_name; + argv[1] = NULL; + caml_main(argv); sys_exit(Val_int(0)); return 0; } diff --git a/otherlibs/win32unix/select.c b/otherlibs/win32unix/select.c index f30c898b..d3926204 100644 --- a/otherlibs/win32unix/select.c +++ b/otherlibs/win32unix/select.c @@ -11,7 +11,7 @@ /* */ /***********************************************************************/ -/* $Id: select.c,v 1.14 2008/07/31 12:09:18 xleroy Exp $ */ +/* $Id: select.c,v 1.14.2.1 2008/10/29 13:38:56 xleroy Exp $ */ #include #include @@ -771,6 +771,9 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value /* Time to wait */ DWORD milliseconds; + /* Is there static select data */ + BOOL hasStaticData = FALSE; + /* Wait return */ DWORD waitRet; @@ -797,6 +800,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value iterSelectData = NULL; iterResult = NULL; err = 0; + hasStaticData = 0; waitRet = 0; readfds_len = caml_list_length(readfds); writefds_len = caml_list_length(writefds); @@ -892,6 +896,16 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value iterSelectData = lpSelectData; while (iterSelectData != NULL) { + /* Check if it is static data. If this is the case, launch everything + * but don't wait for events. It helps to test if there are events on + * any other fd (which are not static), knowing that there is at least + * one result (the static data). + */ + if (iterSelectData->EType == SELECT_TYPE_STATIC) + { + hasStaticData = TRUE; + }; + /* Execute APC */ if (iterSelectData->funcWorker != NULL) { @@ -914,7 +928,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value if (nEventsCount > 0) { /* Waiting for event */ - if (err == 0) + if (err == 0 && !hasStaticData) { DBUG_PRINT("Waiting for one select worker to be done"); switch (WaitForMultipleObjects(nEventsCount, lpEventsDone, FALSE, milliseconds)) @@ -958,7 +972,7 @@ CAMLprim value unix_select(value readfds, value writefds, value exceptfds, value } } /* Nothing to monitor but some time to wait. */ - else + else if (!hasStaticData) { Sleep(milliseconds); } diff --git a/stdlib/filename.ml b/stdlib/filename.ml index a94a12f3..b7849968 100644 --- a/stdlib/filename.ml +++ b/stdlib/filename.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: filename.ml,v 1.41 2007/01/09 13:42:17 doligez Exp $ *) +(* $Id: filename.ml,v 1.41.12.1 2008/11/20 18:36:52 doligez Exp $ *) let generic_quote quotequote s = let l = String.length s in @@ -98,21 +98,24 @@ module Win32 = struct let b = Buffer.create (l + 20) in Buffer.add_char b '\"'; let rec loop i = - if i = l then () else + if i = l then Buffer.add_char b '\"' else match s.[i] with | '\"' -> loop_bs 0 i; | '\\' -> loop_bs 0 i; | c -> Buffer.add_char b c; loop (i+1); and loop_bs n i = - if i = l then add_bs (2*n) else - match s.[i] with - | '\"' -> add_bs (2*n+1); Buffer.add_char b '\"'; loop (i+1); - | '\\' -> loop_bs (n+1) (i+1); - | c -> add_bs n; loop i + if i = l then begin + Buffer.add_char b '\"'; + add_bs n; + end else begin + match s.[i] with + | '\"' -> add_bs (2*n+1); Buffer.add_char b '\"'; loop (i+1); + | '\\' -> loop_bs (n+1) (i+1); + | c -> add_bs n; loop i + end and add_bs n = for j = 1 to n do Buffer.add_char b '\\'; done in loop 0; - Buffer.add_char b '\"'; Buffer.contents b let has_drive s = let is_letter = function diff --git a/stdlib/gc.ml b/stdlib/gc.ml index fac7ab38..faed5cf9 100644 --- a/stdlib/gc.ml +++ b/stdlib/gc.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: gc.ml,v 1.20 2004/06/14 13:27:36 doligez Exp $ *) +(* $Id: gc.ml,v 1.20.24.1 2008/11/18 10:24:43 doligez Exp $ *) type stat = { minor_words : float; @@ -38,6 +38,7 @@ type control = { mutable verbose : int; mutable max_overhead : int; mutable stack_limit : int; + mutable allocation_policy : int; };; external stat : unit -> stat = "caml_gc_stat";; diff --git a/stdlib/gc.mli b/stdlib/gc.mli index 6a60a967..ee56196d 100644 --- a/stdlib/gc.mli +++ b/stdlib/gc.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: gc.mli,v 1.44 2008/02/29 14:21:22 doligez Exp $ *) +(* $Id: gc.mli,v 1.44.4.1 2008/11/18 10:24:43 doligez Exp $ *) (** Memory management control and statistics; finalised values. *) @@ -126,6 +126,14 @@ type control = (** The maximum size of the stack (in words). This is only relevant to the byte-code runtime, as the native code runtime uses the operating system's stack. Default: 256k. *) + + mutable allocation_policy : int; + (** The policy used for allocating in the heap. Possible + values are 0 and 1. 0 is the next-fit policy, which is + quite fast but can result in fragmentation. 1 is the + first-fit policy, which can be slower in some cases but + can be better for programs with fragmentation problems. + Default: 0. *) } (** The GC parameters are given as a [control] record. Note that these parameters can also be initialised by setting the diff --git a/stdlib/string.ml b/stdlib/string.ml index 292b8ba4..908be652 100644 --- a/stdlib/string.ml +++ b/stdlib/string.ml @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: string.ml,v 1.28 2008/07/22 11:29:00 weis Exp $ *) +(* $Id: string.ml,v 1.28.2.1 2008/11/12 10:53:47 doligez Exp $ *) (* String operations *) @@ -154,7 +154,7 @@ let index s c = index_rec s (length s) 0 c;; let index_from s i c = let l = length s in - if i < 0 || i >= l then invalid_arg "String.index_from" else + if i < 0 || i > l then invalid_arg "String.index_from" else index_rec s l i c;; let rec rindex_rec s i c = @@ -164,22 +164,18 @@ let rec rindex_rec s i c = let rindex s c = rindex_rec s (length s - 1) c;; let rindex_from s i c = - let l = length s in - if i < 0 || i >= l then invalid_arg "String.rindex_from" else + if i < -1 || i >= length s then invalid_arg "String.rindex_from" else rindex_rec s i c;; let contains_from s i c = let l = length s in - if i < 0 || i >= l then invalid_arg "String.contains_from" else + if i < 0 || i > l then invalid_arg "String.contains_from" else try ignore (index_rec s l i c); true with Not_found -> false;; -let contains s c = - let l = length s in - l <> 0 && contains_from s 0 c;; +let contains s c = contains_from s 0 c;; let rcontains_from s i c = - let l = length s in - if i < 0 || i >= l then invalid_arg "String.rcontains_from" else + if i < 0 || i >= length s then invalid_arg "String.rcontains_from" else try ignore (rindex_rec s i c); true with Not_found -> false;; type t = string diff --git a/stdlib/weak.mli b/stdlib/weak.mli index 437bab24..b2dcf606 100644 --- a/stdlib/weak.mli +++ b/stdlib/weak.mli @@ -11,7 +11,7 @@ (* *) (***********************************************************************) -(* $Id: weak.mli,v 1.16 2008/09/17 14:55:30 doligez Exp $ *) +(* $Id: weak.mli,v 1.16.2.1 2008/11/13 10:39:46 doligez Exp $ *) (** Arrays of weak pointers and hash tables of weak pointers. *) @@ -20,8 +20,11 @@ type 'a t (** The type of arrays of weak pointers (weak arrays). A weak - pointer is a value that the garbage collector may erase at - any time. + pointer is a value that the garbage collector may erase whenever + the value is not used any more (through normal pointers) by the + program. Note that finalisation functions are run after the + weak pointers are erased. + A weak pointer is said to be full if it points to a value, empty if the value was erased by the GC. diff --git a/tools/make-package-macosx b/tools/make-package-macosx index fa2cf436..2b9ee1fb 100755 --- a/tools/make-package-macosx +++ b/tools/make-package-macosx @@ -12,7 +12,7 @@ # # ######################################################################### -# $Id: make-package-macosx,v 1.16 2008/02/29 14:21:22 doligez Exp $ +# $Id: make-package-macosx,v 1.16.4.1 2008/10/16 15:57:00 doligez Exp $ cd package-macosx rm -rf ocaml.pkg ocaml-rw.dmg @@ -87,7 +87,8 @@ mkdir -p resources cat >resources/ReadMe.txt < Clflags.principal := b)); + Hashtbl.add directive_table "rectypes" + (Directive_none(fun () -> Clflags.recursive_types := true)); + Hashtbl.add directive_table "warnings" (Directive_string (parse_warnings std_out false)); diff --git a/toplevel/topdirs.ml b/toplevel/topdirs.ml index 204df79a..50cbc4ed 100644 --- a/toplevel/topdirs.ml +++ b/toplevel/topdirs.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: topdirs.ml,v 1.66 2006/09/28 21:36:38 xleroy Exp $ *) +(* $Id: topdirs.ml,v 1.66.14.1 2008/11/19 02:35:40 garrigue Exp $ *) (* Toplevel directives *) @@ -294,6 +294,9 @@ let _ = Hashtbl.add directive_table "principal" (Directive_bool(fun b -> Clflags.principal := b)); + Hashtbl.add directive_table "rectypes" + (Directive_none(fun () -> Clflags.recursive_types := true)); + Hashtbl.add directive_table "warnings" (Directive_string (parse_warnings std_out false)); diff --git a/typing/ctype.mli b/typing/ctype.mli index f0115532..d8c3d60f 100644 --- a/typing/ctype.mli +++ b/typing/ctype.mli @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ctype.mli,v 1.55 2007/11/01 18:36:43 weis Exp $ *) +(* $Id: ctype.mli,v 1.55.4.1 2008/10/16 03:05:26 garrigue Exp $ *) (* Operations on core types *) @@ -131,6 +131,7 @@ val apply: val expand_head_once: Env.t -> type_expr -> type_expr val expand_head: Env.t -> type_expr -> type_expr +val try_expand_once_opt: Env.t -> type_expr -> type_expr val expand_head_opt: Env.t -> type_expr -> type_expr (** The compiler's own version of [expand_head] necessary for type-based optimisations. *) diff --git a/typing/includecore.ml b/typing/includecore.ml index 91750f21..ba4d1120 100644 --- a/typing/includecore.ml +++ b/typing/includecore.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: includecore.ml,v 1.35 2007/11/28 22:27:35 weis Exp $ *) +(* $Id: includecore.ml,v 1.35.4.2 2008/10/16 03:05:26 garrigue Exp $ *) (* Inclusion checks for the core language *) @@ -54,7 +54,7 @@ let is_absrow env ty = end | _ -> false -let type_manifest env ty1 params1 ty2 params2 = +let type_manifest env ty1 params1 ty2 params2 priv2 = let ty1' = Ctype.expand_head env ty1 and ty2' = Ctype.expand_head env ty2 in match ty1'.desc, ty2'.desc with Tvariant row1, Tvariant row2 when is_absrow env (Btype.row_more row2) -> @@ -97,7 +97,13 @@ let type_manifest env ty1 params1 ty2 params2 = List.split (List.map (fun (_,_,t1,_,t2) -> t1, t2) pairs) in Ctype.equal env true (params1 @ tl1) (params2 @ tl2) | _ -> - Ctype.equal env true (ty1 :: params1) (ty2 :: params2) + let rec check_super ty1 = + Ctype.equal env true (ty1 :: params1) (ty2 :: params2) || + priv2 = Private && + try check_super + (Ctype.try_expand_once_opt env (Ctype.expand_head env ty1)) + with Ctype.Cannot_expand -> false + in check_super ty1 (* Inclusion between type declarations *) @@ -131,6 +137,7 @@ let type_declarations env id decl1 decl2 = Ctype.equal env true decl1.type_params decl2.type_params | (Some ty1, Some ty2) -> type_manifest env ty1 decl1.type_params ty2 decl2.type_params + decl2.type_private | (None, Some ty2) -> let ty1 = Btype.newgenty (Tconstr(Pident id, decl2.type_params, ref Mnil)) diff --git a/utils/ccomp.ml b/utils/ccomp.ml index 17ba4c4d..91a6a9d4 100644 --- a/utils/ccomp.ml +++ b/utils/ccomp.ml @@ -10,7 +10,7 @@ (* *) (***********************************************************************) -(* $Id: ccomp.ml,v 1.28.4.1 2008/10/15 08:48:51 xleroy Exp $ *) +(* $Id: ccomp.ml,v 1.28.4.2 2008/10/16 15:57:00 doligez Exp $ *) (* Compiling C files and building C libraries *) @@ -118,7 +118,7 @@ let call_linker mode output_name files extra = ) (Filename.quote output_name) (if !Clflags.gprofile then Config.cc_profile else "") - (Clflags.std_include_flag "-I") + "" (*(Clflags.std_include_flag "-I")*) (quote_prefixed "-L" !Config.load_path) files extra -- 2.30.2