author | Brian Cameron <brian.cameron@oracle.com> |
Wed, 21 Aug 2013 14:33:32 -0700 | |
changeset 1450 | 02791a89ea4f |
parent 1449 | d430caca2495 |
child 1451 | 83c10cf4601d |
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/meta-packages/history/SUNWocaml.p5m Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,30 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +# + +# +# Legacy package information for renamed SUNWocaml package +# +set name=pkg.fmri value=pkg:/[email protected],5.11-0.175.0.0.0.0.0 +set name=pkg.renamed value=true +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) +depend type=require fmri=runtime/[email protected]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/ocaml/Makefile Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,163 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# + +# +# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +# + +include ../../make-rules/shared-macros.mk + +PATH=/usr/bin:/usr/gnu/bin:/usr/sbin:$(SPRO_VROOT)/bin + +COMPONENT_NAME= ocaml +COMPONENT_VERSION= 3.11.2 +COMPONENT_PROJECT_URL= http://www.ocaml.org +COMPONENT_SRC= $(COMPONENT_NAME)-$(COMPONENT_VERSION) +COMPONENT_ARCHIVE= $(COMPONENT_SRC).tar.bz2 +COMPONENT_ARCHIVE_HASH= \ + sha256:86f3387a0d7e7c8be2a3c53af083a5a726e333686208d5ea0dd6bb5ac3f58143 +COMPONENT_ARCHIVE_URL= http://caml.inria.fr/distrib/ocaml-3.11/$(COMPONENT_ARCHIVE) + +# Documentation sources +# +COMPONENT_ARCHIVE_1= ocaml-3.11-refman.html.tar.gz +COMPONENT_ARCHIVE_HASH_1= \ + sha256:1c65b334ccb155aefa1e5e930a91f816d843d37e26b27d3a0351c57149005a5c +COMPONENT_ARCHIVE_URL_1= http://caml.inria.fr/distrib/ocaml-3.11/$(COMPONENT_ARCHIVE_1) + +COMPONENT_ARCHIVE_2= ocaml-3.11-refman.pdf +COMPONENT_ARCHIVE_HASH_2= \ + sha256:35f5adfeb92817f7e3ef66dec6b4ca910f48a3a2cf0bfa34bd155fe6866de405 +COMPONENT_ARCHIVE_URL_2= http://caml.inria.fr/distrib/ocaml-3.11/$(COMPONENT_ARCHIVE_2) + +COMPONENT_ARCHIVE_3= ocaml-3.11-refman.info.tar.gz +COMPONENT_ARCHIVE_HASH_3= \ + sha256:48eedc6a870bef84562b2d0ed25d9c3b15ab646f72ecfb4c6c2cbaccc6b4081d +COMPONENT_ARCHIVE_URL_3= http://caml.inria.fr/distrib/ocaml-3.11/$(COMPONENT_ARCHIVE_3) + +COMPONENT_BUGDB= utility/ocaml + +include ../../make-rules/prep.mk +include ../../make-rules/configure.mk +include ../../make-rules/ips.mk + +CONFIGURE_ENV += CFLAGS="$(CFLAGS)" + +# We don't support 64-bit yet, but this will be needed when we do. +CONFIGURE_ENV.64 += UL_LDFLAGS="-m64" + +# Ocaml does not use a standard configure script, but has its own handwritten +# one. So we must specify the arguments it accepts by hand. +# +CONFIGURE_OPTIONS = --bindir $(CONFIGURE_BINDIR.$(BITS)) +CONFIGURE_OPTIONS += --libdir $(CONFIGURE_LIBDIR.$(BITS))/ocaml +CONFIGURE_OPTIONS += --x11lib $(CONFIGURE_LIBDIR.$(BITS)) +CONFIGURE_OPTIONS += --x11include $(CONFIGURE_INCLUDEDIR) +CONFIGURE_OPTIONS += --mandir $(CONFIGURE_MANDIR) +CONFIGURE_OPTIONS += -cc cc +CONFIGURE_OPTIONS += -aspp "/usr/bin/as -P" +CONFIGURE_OPTIONS += -as "/usr/bin/as" + +COMPONENT_PRE_CONFIGURE_ACTION = \ + ($(CLONEY) $(SOURCE_DIR) $(@D)) + +COMPONENT_BUILD_TARGETS = world opt opt.opt + +# Set up some environment variables to make things look nicer. +# +UL_OCAML_PDFDOC = $(COMPONENT_DIR)/$(COMPONENT_ARCHIVE_2) +UL_OCAML_INCLUDES = -nostdlib -I stdlib -I utils -I parsing -I typing -I bytecomp -I asmcomp -I driver +UL_OCAML_ALLINCLUDES = $(UL_OCAML_INCLUDES) -I otherlibs/unix -I otherlibs/str -I otherlibs/dynlink +UL_PROTO_BINDIR = $(PROTO_DIR)/$(CONFIGURE_BINDIR.$(BITS)) +UL_PROTO_LIBDIR = $(PROTO_DIR)/$(CONFIGURE_LIBDIR.$(BITS)) +UL_PROTO_INFODIR = $(PROTO_DIR)/$(CONFIGURE_INFODIR) +UL_PROTO_DATADIR = $(PROTO_DIR)/$(CONFIGURE_PREFIX)/share +COMPONENT_INSTALL_ARGS += EMACSDIR="$(UL_PROTO_DATADIR)/emacs/site-lisp" +UL_PROTO_DOCDIR = $(UL_PROTO_DATADIR)/doc/ocaml +UL_PROTO_EXAM = $(UL_PROTO_DOCDIR)/otherlibs/labltk + +# This action unpacks the additional tarballs and builds some additional +# useful programs. For example, the ocamlbyteinfo and ocamlplugininfo +# utilities are useful additions from Debian, and also included in RHEL. +# http://git.debian.org/?p=pkg-ocaml-maint/packages/ocaml.git;a=tree;f=debian/ocamlbyteinfo;hb=HEAD +# + +COMPONENT_POST_BUILD_ACTION = (cd $(@D); \ + export LD_EXEC_OPTIONS="-z aslr=disable"; \ + $(UNPACK) $(UNPACK_ARGS) ../../$(COMPONENT_ARCHIVE_1); \ + $(UNPACK) $(UNPACK_ARGS) ../../$(COMPONENT_ARCHIVE_3); \ + $(CP) $(COMPONENT_DIR)/files/ocamlbyteinfo.ml $(@D); \ + $(CP) $(COMPONENT_DIR)/files/ocamlplugininfo.ml $(@D); \ + $(CP) ./otherlibs/dynlink/natdynlink.ml .; \ + ($(ENV) $(COMPONENT_BUILD_ENV) $(GMAKE) \ + $(COMPONENT_BUILD_ARGS) -C emacs ocamltags); \ + ($(ENV) $(COMPONENT_BUILD_ENV) \ + boot/ocamlrun ./ocamlc $(UL_OCAML_ALLINCLUDES) \ + dynlinkaux.cmo ocamlbyteinfo.ml -o ocamlbyteinfo); \ + ($(ENV) $(COMPONENT_BUILD_ENV) \ + boot/ocamlrun ./ocamlopt $(UL_OCAML_ALLINCLUDES) \ + unix.cmxa str.cmxa natdynlink.ml ocamlplugininfo.ml \ + -o ocamlplugininfo); \ + ($(ENV) $(COMPONENT_BUILD_ENV) \ + boot/ocamlrun ./ocamlopt $(UL_OCAML_INCLUDES) \ + -o objinfo config.cmx tools/objinfo.ml)) + +COMPONENT_INSTALL_ARGS += BINDIR="$(UL_PROTO_BINDIR)" +COMPONENT_INSTALL_ARGS += LIBDIR="$(UL_PROTO_LIBDIR)/ocaml" +COMPONENT_INSTALL_ARGS += MANDIR="$(PROTOUSRSHAREMANDIR)" +COMPONENT_INSTALL_ARGS += EMACSDIR="$(UL_PROTO_DATADIR)/emacs/site-lisp" + +# This action moves additional files we want to install into the proto area. +# I prefer using "cp -R" for copying the documentation tarball and example +# contents since it will make it easier to see new files need to be packaged +# when Ocaml is updated. +# +COMPONENT_POST_INSTALL_ACTION = (cd $(@D)/emacs ; \ + $(ENV) $(COMPONENT_BUILD_ENV) $(GMAKE) install install-ocamltags $(COMPONENT_INSTALL_ARGS); \ + cd $(@D); \ + $(MKDIR) -p $(UL_PROTO_INFODIR); \ + $(CP) $(@D)/infoman/ocaml*.gz $(UL_PROTO_INFODIR); \ + $(MKDIR) -p $(UL_PROTO_EXAM); \ + $(CP) $(UL_OCAML_PDFDOC) $(UL_PROTO_DOCDIR)/refman.pdf; \ + $(CP) -R $(@D)/htmlman $(UL_PROTO_DOCDIR); \ + $(CP) -R $(@D)/otherlibs/labltk/examples_* $(UL_PROTO_EXAM); \ + $(RM) $(UL_PROTO_EXAM)/examples_*/.cvsignore) + +# ASLR should be enabled when 64-bit support is enabled, which is planned as +# a follow-on step. +# +ASLR_MODE = $(ASLR_DISABLE) + +# Files built in the COMPONENT_POST_INSTALL_ACTION are found by setting +# PKG_PROTO_DIRS as follows: +# +PKG_PROTO_DIRS += $(BUILD_DIR_$(BITS)) + +# common targets +build: $(BUILD_32) + +install: $(INSTALL_32) + +test: $(TEST_32) + +BUILD_PKG_DEPENDENCIES = $(BUILD_TOOLS) + +include ../../make-rules/depend.mk
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/ocaml/files/ocamlbyteinfo.ml Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,101 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2009 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the GNU Library General Public License, with *) +(* the special exception on linking described in file ../../LICENSE. *) +(* *) +(***********************************************************************) + +(* $Id: ocamlbyteinfo.ml,v 1.1 2010/01/11 18:45:03 rjones Exp $ *) + +(* Dumps a bytecode binary file *) + +open Sys +open Dynlinkaux + +let input_stringlist ic len = + let get_string_list sect len = + let rec fold s e acc = + if e != len then + if sect.[e] = '\000' then + fold (e+1) (e+1) (String.sub sect s (e-s) :: acc) + else fold s (e+1) acc + else acc + in fold 0 0 [] + in + let sect = String.create len in + let _ = really_input ic sect 0 len in + get_string_list sect len + +let print = Printf.printf +let perr s = + Printf.eprintf "%s\n" s; + exit(1) +let p_title title = print "%s:\n" title + +let p_section title format pdata = function + | [] -> () + | l -> + p_title title; + List.iter + (fun (name, data) -> print format (pdata data) name) + l + +let p_list title format = function + | [] -> () + | l -> + p_title title; + List.iter + (fun name -> print format name) + l + +let _ = + try + let input_name = Sys.argv.(1) in + let ic = open_in_bin input_name in + Bytesections.read_toc ic; + List.iter + (fun section -> + try + let len = Bytesections.seek_section ic section in + if len > 0 then match section with + | "CRCS" -> + p_section + "Imported Units" + "\t%s\t%s\n" + Digest.to_hex + (input_value ic : (string * Digest.t) list) + | "DLLS" -> + p_list + "Used Dlls" "\t%s\n" + (input_stringlist ic len) + | "DLPT" -> + p_list + "Additional Dll paths" + "\t%s\n" + (input_stringlist ic len) + | "PRIM" -> + let prims = (input_stringlist ic len) in + print "Uses unsafe features: "; + begin match prims with + [] -> print "no\n" + | l -> print "YES\n"; + p_list "Primitives declared in this module" + "\t%s\n" + l + end + | _ -> () + with Not_found | Failure _ | Invalid_argument _ -> () + ) + ["CRCS"; "DLLS"; "DLPT"; "PRIM"]; + close_in ic + with + | Sys_error msg -> + perr msg + | Invalid_argument("index out of bounds") -> + perr (Printf.sprintf "Usage: %s filename" Sys.argv.(0))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/ocaml/files/ocamlplugininfo.ml Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,109 @@ +(***********************************************************************) +(* *) +(* Objective Caml *) +(* *) +(* Xavier Leroy, projet Gallium, INRIA Rocquencourt *) +(* *) +(* Copyright 2009 Institut National de Recherche en Informatique et *) +(* en Automatique. All rights reserved. This file is distributed *) +(* under the terms of the GNU Library General Public License, with *) +(* the special exception on linking described in file ../../LICENSE. *) +(* *) +(***********************************************************************) + +(* $Id: ocamlplugininfo.ml,v 1.1 2010/01/11 18:45:03 rjones Exp $ *) + +(* Dumps a .cmxs file *) + +open Natdynlink +open Format + +let file = + try + Sys.argv.(1) + with _ -> begin + Printf.eprintf "Usage: %s file.cmxs\n" Sys.argv.(0); + exit(1) + end + +exception Abnormal_exit + +let error s e = + let eprint = Printf.eprintf in + let print_exc s = function + | End_of_file -> + eprint "%s: %s\n" s file + | Abnormal_exit -> + eprint "%s\n" s + | e -> eprint "%s\n" (Printexc.to_string e) + in + print_exc s e; + exit(1) + +let read_in command = + let cmd = Printf.sprintf command file in + let ic = Unix.open_process_in cmd in + try + let line = input_line ic in + begin match (Unix.close_process_in ic) with + | Unix.WEXITED 0 -> Str.split (Str.regexp "[ ]+") line + | Unix.WEXITED _ | Unix.WSIGNALED _ | Unix.WSTOPPED _ -> + error + (Printf.sprintf + "Command \"%s\" exited abnormally" + cmd + ) + Abnormal_exit + end + with e -> error "File is empty" e + +let get_offset adr_off adr_sec = + try + let adr = List.nth adr_off 4 in + let off = List.nth adr_off 5 in + let sec = List.hd adr_sec in + + let (!) x = Int64.of_string ("0x" ^ x) in + let (+) = Int64.add in + let (-) = Int64.sub in + + Int64.to_int (!off + !sec - !adr) + + with Failure _ | Invalid_argument _ -> + error + "Command output doesn't have the expected format" + Abnormal_exit + +let print_infos name crc defines cmi cmx = + let print_name_crc (name, crc) = + printf "@ %s (%s)" name (Digest.to_hex crc) + in + let pr_imports ppf imps = List.iter print_name_crc imps in + printf "Name: %s@." name; + printf "CRC of implementation: %s@." (Digest.to_hex crc); + printf "@[<hov 2>Globals defined:"; + List.iter (fun s -> printf "@ %s" s) defines; + printf "@]@."; + printf "@[<v 2>Interfaces imported:%a@]@." pr_imports cmi; + printf "@[<v 2>Implementations imported:%a@]@." pr_imports cmx + +let _ = + let adr_off = read_in "objdump -h %s | grep ' .data '" in + let adr_sec = read_in "objdump -T %s | grep ' caml_plugin_header$'" in + + let ic = open_in file in + let _ = seek_in ic (get_offset adr_off adr_sec) in + let header = (input_value ic : Natdynlink.dynheader) in + if header.magic <> Natdynlink.dyn_magic_number then + raise(Error(Natdynlink.Not_a_bytecode_file file)) + else begin + List.iter + (fun ui -> + print_infos + ui.name + ui.crc + ui.defines + ui.imports_cmi + ui.imports_cmx) + header.units + end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/ocaml/ocaml.p5m Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,1388 @@ +# +# CDDL HEADER START +# +# The contents of this file are subject to the terms of the +# Common Development and Distribution License (the "License"). +# You may not use this file except in compliance with the License. +# +# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE +# or http://www.opensolaris.org/os/licensing. +# See the License for the specific language governing permissions +# and limitations under the License. +# +# When distributing Covered Code, include this CDDL HEADER in each +# file and include the License file at usr/src/OPENSOLARIS.LICENSE. +# If applicable, add the following below this CDDL HEADER, with the +# fields enclosed by brackets "[]" replaced with your own identifying +# information: Portions Copyright [yyyy] [name of copyright owner] +# +# CDDL HEADER END +# +# Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved. +# +<transform file path=(.+)/man/man3/(.+).3o$ -> set action.hash %<\1>/man/man3/%<\2>.3o > +<transform file -> edit path man/man3 man/man3o > +<transform file path=usr.*/man/.+ -> default mangler.man.stability volatile> + +set name=pkg.fmri \ + value=pkg:/runtime/ocaml@$(IPS_COMPONENT_VERSION),$(BUILD_VERSION) +set name=pkg.summary value="Objective Caml compiler and programming environment" +set name=pkg.description \ + value="Objective Caml is a high-level, strongly-typed, functional and object-oriented programming language from the ML family of languages. This package comprises two batch compilers (a fast bytecode compiler and an optimizing native-code compiler), an interactive toplevel system, parsing tools (Lex,Yacc,Camlp4), a replay debugger, a documentation generator, and a comprehensive library." +set name=com.oracle.info.description value="the ocaml language" +set name=info.classification \ + value=org.opensolaris.category.2008:Development/System +set name=info.source-url value=$(COMPONENT_ARCHIVE_URL) +set name=info.upstream-url value=$(COMPONENT_PROJECT_URL) +set name=org.opensolaris.arc-caseid value=PSARC/2008/406 +set name=org.opensolaris.consolidation value=$(CONSOLIDATION) +# +file path=usr/bin/camlp4 +file path=usr/bin/camlp4boot +file path=usr/bin/camlp4o +file path=usr/bin/camlp4o.opt +file path=usr/bin/camlp4of +file path=usr/bin/camlp4of.opt +file path=usr/bin/camlp4oof +file path=usr/bin/camlp4oof.opt +file path=usr/bin/camlp4orf +file path=usr/bin/camlp4orf.opt +file path=usr/bin/camlp4prof +file path=usr/bin/camlp4r +file path=usr/bin/camlp4r.opt +file path=usr/bin/camlp4rf +file path=usr/bin/camlp4rf.opt +file path=usr/bin/labltk +file path=usr/bin/mkcamlp4 +file path=usr/bin/ocaml +file path=usr/bin/ocamlbrowser +file path=usr/bin/ocamlbuild +file path=usr/bin/ocamlbuild.byte +file path=usr/bin/ocamlbuild.native +file ocamlbyteinfo path=usr/bin/ocamlbyteinfo +file path=usr/bin/ocamlc +file path=usr/bin/ocamlc.opt +file path=usr/bin/ocamlcp +file path=usr/bin/ocamldebug +file path=usr/bin/ocamldep +file path=usr/bin/ocamldep.opt +file path=usr/bin/ocamldoc +file path=usr/bin/ocamldoc.opt +file path=usr/bin/ocamllex +file path=usr/bin/ocamllex.opt +file path=usr/bin/ocamlmklib +file path=usr/bin/ocamlmktop +file objinfo path=usr/bin/ocamlobjinfo +file path=usr/bin/ocamlopt +file path=usr/bin/ocamlopt.opt +file ocamlplugininfo path=usr/bin/ocamlplugininfo +file path=usr/bin/ocamlprof +file path=usr/bin/ocamlrun +file path=usr/bin/ocamltags +file path=usr/bin/ocamlyacc +file path=usr/lib/ocaml/Makefile.config +file path=usr/lib/ocaml/addlabels +file path=usr/lib/ocaml/arg.cmi +file path=usr/lib/ocaml/arg.cmx +file path=usr/lib/ocaml/arg.ml +file path=usr/lib/ocaml/arg.mli +file path=usr/lib/ocaml/arith_flags.cmx +file path=usr/lib/ocaml/arith_status.cmi +file path=usr/lib/ocaml/arith_status.cmx +file path=usr/lib/ocaml/arith_status.mli +file path=usr/lib/ocaml/array.cmi +file path=usr/lib/ocaml/array.cmx +file path=usr/lib/ocaml/array.ml +file path=usr/lib/ocaml/array.mli +file path=usr/lib/ocaml/arrayLabels.cmi +file path=usr/lib/ocaml/arrayLabels.cmx +file path=usr/lib/ocaml/arrayLabels.ml +file path=usr/lib/ocaml/arrayLabels.mli +file path=usr/lib/ocaml/big_int.cmi +file path=usr/lib/ocaml/big_int.cmx +file path=usr/lib/ocaml/big_int.mli +file path=usr/lib/ocaml/bigarray.a +file path=usr/lib/ocaml/bigarray.cma +file path=usr/lib/ocaml/bigarray.cmi +file path=usr/lib/ocaml/bigarray.cmx +file path=usr/lib/ocaml/bigarray.cmxa +file path=usr/lib/ocaml/bigarray.mli +file path=usr/lib/ocaml/buffer.cmi +file path=usr/lib/ocaml/buffer.cmx +file path=usr/lib/ocaml/buffer.ml +file path=usr/lib/ocaml/buffer.mli +file path=usr/lib/ocaml/callback.cmi +file path=usr/lib/ocaml/callback.cmx +file path=usr/lib/ocaml/callback.ml +file path=usr/lib/ocaml/callback.mli +file path=usr/lib/ocaml/caml/alloc.h +file path=usr/lib/ocaml/caml/bigarray.h +file path=usr/lib/ocaml/caml/callback.h +file path=usr/lib/ocaml/caml/compatibility.h +file path=usr/lib/ocaml/caml/config.h +file path=usr/lib/ocaml/caml/custom.h +file path=usr/lib/ocaml/caml/fail.h +file path=usr/lib/ocaml/caml/intext.h +file path=usr/lib/ocaml/caml/memory.h +file path=usr/lib/ocaml/caml/misc.h +file path=usr/lib/ocaml/caml/mlvalues.h +file path=usr/lib/ocaml/caml/printexc.h +file path=usr/lib/ocaml/caml/signals.h +file path=usr/lib/ocaml/caml/unixsupport.h +file path=usr/lib/ocaml/camlheader +file path=usr/lib/ocaml/camlheader_ur +file path=usr/lib/ocaml/camlinternalLazy.cmi +file path=usr/lib/ocaml/camlinternalLazy.cmx +file path=usr/lib/ocaml/camlinternalLazy.ml +file path=usr/lib/ocaml/camlinternalLazy.mli +file path=usr/lib/ocaml/camlinternalMod.cmi +file path=usr/lib/ocaml/camlinternalMod.cmx +file path=usr/lib/ocaml/camlinternalMod.ml +file path=usr/lib/ocaml/camlinternalMod.mli +file path=usr/lib/ocaml/camlinternalOO.cmi +file path=usr/lib/ocaml/camlinternalOO.cmx +file path=usr/lib/ocaml/camlinternalOO.ml +file path=usr/lib/ocaml/camlinternalOO.mli +file path=usr/lib/ocaml/camlp4/Camlp4.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Bin.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Bin.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Bin.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Bin.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4AstLifter.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4AstLifter.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4AstLifter.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4AstLifter.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4ExceptionTracer.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4ExceptionTracer.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4ExceptionTracer.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4ExceptionTracer.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4FoldGenerator.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4FoldGenerator.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4FoldGenerator.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4FoldGenerator.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4LocationStripper.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4LocationStripper.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4LocationStripper.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4LocationStripper.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MapGenerator.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MapGenerator.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MapGenerator.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MapGenerator.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MetaGenerator.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MetaGenerator.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MetaGenerator.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4MetaGenerator.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4Profiler.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4Profiler.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4Profiler.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4Profiler.o +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4TrashRemover.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4TrashRemover.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4TrashRemover.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Filters/Camlp4TrashRemover.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4AstLoader.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4AstLoader.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4AstLoader.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4AstLoader.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4DebugParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4DebugParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4DebugParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4DebugParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4GrammarParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4GrammarParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4GrammarParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4GrammarParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4ListComprehension.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4ListComprehension.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4ListComprehension.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4ListComprehension.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4MacroParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4MacroParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4MacroParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4MacroParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlOriginalQuotationExpander.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlParserParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlReloadedParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedParserParser.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4OCamlRevisedQuotationExpander.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationCommon.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationCommon.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationCommon.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationCommon.o +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationExpander.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationExpander.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationExpander.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Parsers/Camlp4QuotationExpander.o +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AstDumper.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AstDumper.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AstDumper.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AstDumper.o +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AutoPrinter.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AutoPrinter.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AutoPrinter.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4AutoPrinter.o +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4NullDumper.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4NullDumper.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4NullDumper.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4NullDumper.o +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlAstDumper.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlAstDumper.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlAstDumper.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlAstDumper.o +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlPrinter.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlPrinter.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlPrinter.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlPrinter.o +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Printers/Camlp4OCamlRevisedPrinter.o +file path=usr/lib/ocaml/camlp4/Camlp4Top.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Top.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Top/Rprint.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Top/Rprint.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Top/Rprint.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Top/Rprint.o +file path=usr/lib/ocaml/camlp4/Camlp4Top/Top.cmi +file path=usr/lib/ocaml/camlp4/Camlp4Top/Top.cmo +file path=usr/lib/ocaml/camlp4/Camlp4Top/Top.cmx +file path=usr/lib/ocaml/camlp4/Camlp4Top/Top.o +file path=usr/lib/ocaml/camlp4/Camlp4_config.cmi +file path=usr/lib/ocaml/camlp4/Camlp4_import.cmi +file path=usr/lib/ocaml/camlp4/camlp4fulllib.a +file path=usr/lib/ocaml/camlp4/camlp4fulllib.cma +file path=usr/lib/ocaml/camlp4/camlp4fulllib.cmxa +file path=usr/lib/ocaml/camlp4/camlp4lib.a +file path=usr/lib/ocaml/camlp4/camlp4lib.cma +file path=usr/lib/ocaml/camlp4/camlp4lib.cmxa +file path=usr/lib/ocaml/camlp4/camlp4o.cma +file path=usr/lib/ocaml/camlp4/camlp4of.cma +file path=usr/lib/ocaml/camlp4/camlp4oof.cma +file path=usr/lib/ocaml/camlp4/camlp4orf.cma +file path=usr/lib/ocaml/camlp4/camlp4prof.cmi +file path=usr/lib/ocaml/camlp4/camlp4prof.cmo +file path=usr/lib/ocaml/camlp4/camlp4prof.cmx +file path=usr/lib/ocaml/camlp4/camlp4prof.o +file path=usr/lib/ocaml/camlp4/camlp4r.cma +file path=usr/lib/ocaml/camlp4/camlp4rf.cma +file path=usr/lib/ocaml/char.cmi +file path=usr/lib/ocaml/char.cmx +file path=usr/lib/ocaml/char.ml +file path=usr/lib/ocaml/char.mli +file path=usr/lib/ocaml/complex.cmi +file path=usr/lib/ocaml/complex.cmx +file path=usr/lib/ocaml/complex.ml +file path=usr/lib/ocaml/complex.mli +file path=usr/lib/ocaml/condition.mli +file path=usr/lib/ocaml/dbm.a +file path=usr/lib/ocaml/dbm.cma +file path=usr/lib/ocaml/dbm.cmi +file path=usr/lib/ocaml/dbm.cmx +file path=usr/lib/ocaml/dbm.cmxa +file path=usr/lib/ocaml/dbm.mli +file path=usr/lib/ocaml/digest.cmi +file path=usr/lib/ocaml/digest.cmx +file path=usr/lib/ocaml/digest.ml +file path=usr/lib/ocaml/digest.mli +file path=usr/lib/ocaml/dynlink.a +file path=usr/lib/ocaml/dynlink.cma +file path=usr/lib/ocaml/dynlink.cmi +file path=usr/lib/ocaml/dynlink.cmx +file path=usr/lib/ocaml/dynlink.cmxa +file path=usr/lib/ocaml/dynlink.mli +file path=usr/lib/ocaml/event.mli +file path=usr/lib/ocaml/expunge +file path=usr/lib/ocaml/extract_crc +file path=usr/lib/ocaml/filename.cmi +file path=usr/lib/ocaml/filename.cmx +file path=usr/lib/ocaml/filename.ml +file path=usr/lib/ocaml/filename.mli +file path=usr/lib/ocaml/format.cmi +file path=usr/lib/ocaml/format.cmx +file path=usr/lib/ocaml/format.ml +file path=usr/lib/ocaml/format.mli +file path=usr/lib/ocaml/gc.cmi +file path=usr/lib/ocaml/gc.cmx +file path=usr/lib/ocaml/gc.ml +file path=usr/lib/ocaml/gc.mli +file path=usr/lib/ocaml/genlex.cmi +file path=usr/lib/ocaml/genlex.cmx +file path=usr/lib/ocaml/genlex.ml +file path=usr/lib/ocaml/genlex.mli +file path=usr/lib/ocaml/graphics.a +file path=usr/lib/ocaml/graphics.cma +file path=usr/lib/ocaml/graphics.cmi +file path=usr/lib/ocaml/graphics.cmx +file path=usr/lib/ocaml/graphics.cmxa +file path=usr/lib/ocaml/graphics.mli +file path=usr/lib/ocaml/graphicsX11.cmi +file path=usr/lib/ocaml/graphicsX11.cmx +file path=usr/lib/ocaml/graphicsX11.mli +file path=usr/lib/ocaml/hashtbl.cmi +file path=usr/lib/ocaml/hashtbl.cmx +file path=usr/lib/ocaml/hashtbl.ml +file path=usr/lib/ocaml/hashtbl.mli +file path=usr/lib/ocaml/int32.cmi +file path=usr/lib/ocaml/int32.cmx +file path=usr/lib/ocaml/int32.ml +file path=usr/lib/ocaml/int32.mli +file path=usr/lib/ocaml/int64.cmi +file path=usr/lib/ocaml/int64.cmx +file path=usr/lib/ocaml/int64.ml +file path=usr/lib/ocaml/int64.mli +file path=usr/lib/ocaml/int_misc.cmx +file path=usr/lib/ocaml/labltk/balloon.cmi +file path=usr/lib/ocaml/labltk/balloon.cmx +file path=usr/lib/ocaml/labltk/balloon.mli +file path=usr/lib/ocaml/labltk/bell.cmi +file path=usr/lib/ocaml/labltk/bell.cmx +file path=usr/lib/ocaml/labltk/bell.mli +file path=usr/lib/ocaml/labltk/button.cmi +file path=usr/lib/ocaml/labltk/button.cmx +file path=usr/lib/ocaml/labltk/button.mli +file path=usr/lib/ocaml/labltk/cBell.cmi +file path=usr/lib/ocaml/labltk/cBell.cmx +file path=usr/lib/ocaml/labltk/cBell.mli +file path=usr/lib/ocaml/labltk/cButton.cmi +file path=usr/lib/ocaml/labltk/cButton.cmx +file path=usr/lib/ocaml/labltk/cButton.mli +file path=usr/lib/ocaml/labltk/cCanvas.cmi +file path=usr/lib/ocaml/labltk/cCanvas.cmx +file path=usr/lib/ocaml/labltk/cCanvas.mli +file path=usr/lib/ocaml/labltk/cCheckbutton.cmi +file path=usr/lib/ocaml/labltk/cCheckbutton.cmx +file path=usr/lib/ocaml/labltk/cCheckbutton.mli +file path=usr/lib/ocaml/labltk/cClipboard.cmi +file path=usr/lib/ocaml/labltk/cClipboard.cmx +file path=usr/lib/ocaml/labltk/cClipboard.mli +file path=usr/lib/ocaml/labltk/cDialog.cmi +file path=usr/lib/ocaml/labltk/cDialog.cmx +file path=usr/lib/ocaml/labltk/cDialog.mli +file path=usr/lib/ocaml/labltk/cEncoding.cmi +file path=usr/lib/ocaml/labltk/cEncoding.cmx +file path=usr/lib/ocaml/labltk/cEncoding.mli +file path=usr/lib/ocaml/labltk/cEntry.cmi +file path=usr/lib/ocaml/labltk/cEntry.cmx +file path=usr/lib/ocaml/labltk/cEntry.mli +file path=usr/lib/ocaml/labltk/cFocus.cmi +file path=usr/lib/ocaml/labltk/cFocus.cmx +file path=usr/lib/ocaml/labltk/cFocus.mli +file path=usr/lib/ocaml/labltk/cFont.cmi +file path=usr/lib/ocaml/labltk/cFont.cmx +file path=usr/lib/ocaml/labltk/cFont.mli +file path=usr/lib/ocaml/labltk/cFrame.cmi +file path=usr/lib/ocaml/labltk/cFrame.cmx +file path=usr/lib/ocaml/labltk/cFrame.mli +file path=usr/lib/ocaml/labltk/cGrab.cmi +file path=usr/lib/ocaml/labltk/cGrab.cmx +file path=usr/lib/ocaml/labltk/cGrab.mli +file path=usr/lib/ocaml/labltk/cGrid.cmi +file path=usr/lib/ocaml/labltk/cGrid.cmx +file path=usr/lib/ocaml/labltk/cGrid.mli +file path=usr/lib/ocaml/labltk/cImage.cmi +file path=usr/lib/ocaml/labltk/cImage.cmx +file path=usr/lib/ocaml/labltk/cImage.mli +file path=usr/lib/ocaml/labltk/cImagebitmap.cmi +file path=usr/lib/ocaml/labltk/cImagebitmap.cmx +file path=usr/lib/ocaml/labltk/cImagebitmap.mli +file path=usr/lib/ocaml/labltk/cImagephoto.cmi +file path=usr/lib/ocaml/labltk/cImagephoto.cmx +file path=usr/lib/ocaml/labltk/cImagephoto.mli +file path=usr/lib/ocaml/labltk/cLabel.cmi +file path=usr/lib/ocaml/labltk/cLabel.cmx +file path=usr/lib/ocaml/labltk/cLabel.mli +file path=usr/lib/ocaml/labltk/cListbox.cmi +file path=usr/lib/ocaml/labltk/cListbox.cmx +file path=usr/lib/ocaml/labltk/cListbox.mli +file path=usr/lib/ocaml/labltk/cMenu.cmi +file path=usr/lib/ocaml/labltk/cMenu.cmx +file path=usr/lib/ocaml/labltk/cMenu.mli +file path=usr/lib/ocaml/labltk/cMenubutton.cmi +file path=usr/lib/ocaml/labltk/cMenubutton.cmx +file path=usr/lib/ocaml/labltk/cMenubutton.mli +file path=usr/lib/ocaml/labltk/cMessage.cmi +file path=usr/lib/ocaml/labltk/cMessage.cmx +file path=usr/lib/ocaml/labltk/cMessage.mli +file path=usr/lib/ocaml/labltk/cOption.cmi +file path=usr/lib/ocaml/labltk/cOption.cmx +file path=usr/lib/ocaml/labltk/cOption.mli +file path=usr/lib/ocaml/labltk/cOptionmenu.cmi +file path=usr/lib/ocaml/labltk/cOptionmenu.cmx +file path=usr/lib/ocaml/labltk/cOptionmenu.mli +file path=usr/lib/ocaml/labltk/cPack.cmi +file path=usr/lib/ocaml/labltk/cPack.cmx +file path=usr/lib/ocaml/labltk/cPack.mli +file path=usr/lib/ocaml/labltk/cPalette.cmi +file path=usr/lib/ocaml/labltk/cPalette.cmx +file path=usr/lib/ocaml/labltk/cPalette.mli +file path=usr/lib/ocaml/labltk/cPixmap.cmi +file path=usr/lib/ocaml/labltk/cPixmap.cmx +file path=usr/lib/ocaml/labltk/cPixmap.mli +file path=usr/lib/ocaml/labltk/cPlace.cmi +file path=usr/lib/ocaml/labltk/cPlace.cmx +file path=usr/lib/ocaml/labltk/cPlace.mli +file path=usr/lib/ocaml/labltk/cRadiobutton.cmi +file path=usr/lib/ocaml/labltk/cRadiobutton.cmx +file path=usr/lib/ocaml/labltk/cRadiobutton.mli +file path=usr/lib/ocaml/labltk/cResource.cmi +file path=usr/lib/ocaml/labltk/cResource.cmx +file path=usr/lib/ocaml/labltk/cResource.mli +file path=usr/lib/ocaml/labltk/cScale.cmi +file path=usr/lib/ocaml/labltk/cScale.cmx +file path=usr/lib/ocaml/labltk/cScale.mli +file path=usr/lib/ocaml/labltk/cScrollbar.cmi +file path=usr/lib/ocaml/labltk/cScrollbar.cmx +file path=usr/lib/ocaml/labltk/cScrollbar.mli +file path=usr/lib/ocaml/labltk/cSelection.cmi +file path=usr/lib/ocaml/labltk/cSelection.cmx +file path=usr/lib/ocaml/labltk/cSelection.mli +file path=usr/lib/ocaml/labltk/cText.cmi +file path=usr/lib/ocaml/labltk/cText.cmx +file path=usr/lib/ocaml/labltk/cText.mli +file path=usr/lib/ocaml/labltk/cTk.cmi +file path=usr/lib/ocaml/labltk/cTk.cmx +file path=usr/lib/ocaml/labltk/cTkvars.cmi +file path=usr/lib/ocaml/labltk/cTkvars.cmx +file path=usr/lib/ocaml/labltk/cTkvars.mli +file path=usr/lib/ocaml/labltk/cTkwait.cmi +file path=usr/lib/ocaml/labltk/cTkwait.cmx +file path=usr/lib/ocaml/labltk/cTkwait.mli +file path=usr/lib/ocaml/labltk/cToplevel.cmi +file path=usr/lib/ocaml/labltk/cToplevel.cmx +file path=usr/lib/ocaml/labltk/cToplevel.mli +file path=usr/lib/ocaml/labltk/cWinfo.cmi +file path=usr/lib/ocaml/labltk/cWinfo.cmx +file path=usr/lib/ocaml/labltk/cWinfo.mli +file path=usr/lib/ocaml/labltk/cWm.cmi +file path=usr/lib/ocaml/labltk/cWm.cmx +file path=usr/lib/ocaml/labltk/cWm.mli +file path=usr/lib/ocaml/labltk/camltk.cmi +file path=usr/lib/ocaml/labltk/camltk.cmx +file path=usr/lib/ocaml/labltk/canvas.cmi +file path=usr/lib/ocaml/labltk/canvas.cmx +file path=usr/lib/ocaml/labltk/canvas.mli +file path=usr/lib/ocaml/labltk/checkbutton.cmi +file path=usr/lib/ocaml/labltk/checkbutton.cmx +file path=usr/lib/ocaml/labltk/checkbutton.mli +file path=usr/lib/ocaml/labltk/clipboard.cmi +file path=usr/lib/ocaml/labltk/clipboard.cmx +file path=usr/lib/ocaml/labltk/clipboard.mli +file path=usr/lib/ocaml/labltk/dialog.cmi +file path=usr/lib/ocaml/labltk/dialog.cmx +file path=usr/lib/ocaml/labltk/dialog.mli +file path=usr/lib/ocaml/labltk/encoding.cmi +file path=usr/lib/ocaml/labltk/encoding.cmx +file path=usr/lib/ocaml/labltk/encoding.mli +file path=usr/lib/ocaml/labltk/entry.cmi +file path=usr/lib/ocaml/labltk/entry.cmx +file path=usr/lib/ocaml/labltk/entry.mli +file path=usr/lib/ocaml/labltk/fileevent.cmi +file path=usr/lib/ocaml/labltk/fileevent.cmx +file path=usr/lib/ocaml/labltk/fileevent.mli +file path=usr/lib/ocaml/labltk/fileselect.cmi +file path=usr/lib/ocaml/labltk/fileselect.cmx +file path=usr/lib/ocaml/labltk/fileselect.mli +file path=usr/lib/ocaml/labltk/focus.cmi +file path=usr/lib/ocaml/labltk/focus.cmx +file path=usr/lib/ocaml/labltk/focus.mli +file path=usr/lib/ocaml/labltk/font.cmi +file path=usr/lib/ocaml/labltk/font.cmx +file path=usr/lib/ocaml/labltk/font.mli +file path=usr/lib/ocaml/labltk/frame.cmi +file path=usr/lib/ocaml/labltk/frame.cmx +file path=usr/lib/ocaml/labltk/frame.mli +file path=usr/lib/ocaml/labltk/frx_after.cmi +file path=usr/lib/ocaml/labltk/frx_after.mli +file path=usr/lib/ocaml/labltk/frx_color.cmi +file path=usr/lib/ocaml/labltk/frx_color.mli +file path=usr/lib/ocaml/labltk/frx_ctext.cmi +file path=usr/lib/ocaml/labltk/frx_ctext.mli +file path=usr/lib/ocaml/labltk/frx_dialog.cmi +file path=usr/lib/ocaml/labltk/frx_dialog.mli +file path=usr/lib/ocaml/labltk/frx_entry.cmi +file path=usr/lib/ocaml/labltk/frx_entry.mli +file path=usr/lib/ocaml/labltk/frx_fillbox.cmi +file path=usr/lib/ocaml/labltk/frx_fillbox.mli +file path=usr/lib/ocaml/labltk/frx_fit.cmi +file path=usr/lib/ocaml/labltk/frx_fit.mli +file path=usr/lib/ocaml/labltk/frx_focus.cmi +file path=usr/lib/ocaml/labltk/frx_focus.mli +file path=usr/lib/ocaml/labltk/frx_font.cmi +file path=usr/lib/ocaml/labltk/frx_font.mli +file path=usr/lib/ocaml/labltk/frx_lbutton.mli +file path=usr/lib/ocaml/labltk/frx_listbox.cmi +file path=usr/lib/ocaml/labltk/frx_listbox.mli +file path=usr/lib/ocaml/labltk/frx_mem.cmi +file path=usr/lib/ocaml/labltk/frx_mem.mli +file path=usr/lib/ocaml/labltk/frx_misc.cmi +file path=usr/lib/ocaml/labltk/frx_misc.mli +file path=usr/lib/ocaml/labltk/frx_req.cmi +file path=usr/lib/ocaml/labltk/frx_req.mli +file path=usr/lib/ocaml/labltk/frx_rpc.cmi +file path=usr/lib/ocaml/labltk/frx_rpc.mli +file path=usr/lib/ocaml/labltk/frx_selection.cmi +file path=usr/lib/ocaml/labltk/frx_selection.mli +file path=usr/lib/ocaml/labltk/frx_synth.cmi +file path=usr/lib/ocaml/labltk/frx_synth.mli +file path=usr/lib/ocaml/labltk/frx_text.cmi +file path=usr/lib/ocaml/labltk/frx_text.mli +file path=usr/lib/ocaml/labltk/frx_toplevel.mli +file path=usr/lib/ocaml/labltk/frx_widget.cmi +file path=usr/lib/ocaml/labltk/frx_widget.mli +file path=usr/lib/ocaml/labltk/frxlib.a +file path=usr/lib/ocaml/labltk/frxlib.cma +file path=usr/lib/ocaml/labltk/frxlib.cmxa +file path=usr/lib/ocaml/labltk/grab.cmi +file path=usr/lib/ocaml/labltk/grab.cmx +file path=usr/lib/ocaml/labltk/grab.mli +file path=usr/lib/ocaml/labltk/grid.cmi +file path=usr/lib/ocaml/labltk/grid.cmx +file path=usr/lib/ocaml/labltk/grid.mli +file path=usr/lib/ocaml/labltk/image.cmi +file path=usr/lib/ocaml/labltk/image.cmx +file path=usr/lib/ocaml/labltk/image.mli +file path=usr/lib/ocaml/labltk/imagebitmap.cmi +file path=usr/lib/ocaml/labltk/imagebitmap.cmx +file path=usr/lib/ocaml/labltk/imagebitmap.mli +file path=usr/lib/ocaml/labltk/imagephoto.cmi +file path=usr/lib/ocaml/labltk/imagephoto.cmx +file path=usr/lib/ocaml/labltk/imagephoto.mli +file path=usr/lib/ocaml/labltk/jpf_font.cmi +file path=usr/lib/ocaml/labltk/jpf_font.cmx +file path=usr/lib/ocaml/labltk/jpf_font.mli +file path=usr/lib/ocaml/labltk/jpflib.a +file path=usr/lib/ocaml/labltk/jpflib.cma +file path=usr/lib/ocaml/labltk/jpflib.cmxa +file path=usr/lib/ocaml/labltk/label.cmi +file path=usr/lib/ocaml/labltk/label.cmx +file path=usr/lib/ocaml/labltk/label.mli +file path=usr/lib/ocaml/labltk/labltk.a +file path=usr/lib/ocaml/labltk/labltk.cma +file path=usr/lib/ocaml/labltk/labltk.cmi +file path=usr/lib/ocaml/labltk/labltk.cmx +file path=usr/lib/ocaml/labltk/labltk.cmxa +file path=usr/lib/ocaml/labltk/labltktop +file path=usr/lib/ocaml/labltk/liblabltk.a +file path=usr/lib/ocaml/labltk/libtkanim.a +file path=usr/lib/ocaml/labltk/listbox.cmi +file path=usr/lib/ocaml/labltk/listbox.cmx +file path=usr/lib/ocaml/labltk/listbox.mli +file path=usr/lib/ocaml/labltk/menu.cmi +file path=usr/lib/ocaml/labltk/menu.cmx +file path=usr/lib/ocaml/labltk/menu.mli +file path=usr/lib/ocaml/labltk/menubutton.cmi +file path=usr/lib/ocaml/labltk/menubutton.cmx +file path=usr/lib/ocaml/labltk/menubutton.mli +file path=usr/lib/ocaml/labltk/message.cmi +file path=usr/lib/ocaml/labltk/message.cmx +file path=usr/lib/ocaml/labltk/message.mli +file path=usr/lib/ocaml/labltk/option.cmi +file path=usr/lib/ocaml/labltk/option.cmx +file path=usr/lib/ocaml/labltk/option.mli +file path=usr/lib/ocaml/labltk/optionmenu.cmi +file path=usr/lib/ocaml/labltk/optionmenu.cmx +file path=usr/lib/ocaml/labltk/optionmenu.mli +file path=usr/lib/ocaml/labltk/pack.cmi +file path=usr/lib/ocaml/labltk/pack.cmx +file path=usr/lib/ocaml/labltk/pack.mli +file path=usr/lib/ocaml/labltk/palette.cmi +file path=usr/lib/ocaml/labltk/palette.cmx +file path=usr/lib/ocaml/labltk/palette.mli +file path=usr/lib/ocaml/labltk/pixmap.cmi +file path=usr/lib/ocaml/labltk/pixmap.cmx +file path=usr/lib/ocaml/labltk/pixmap.mli +file path=usr/lib/ocaml/labltk/place.cmi +file path=usr/lib/ocaml/labltk/place.cmx +file path=usr/lib/ocaml/labltk/place.mli +file path=usr/lib/ocaml/labltk/pp +file path=usr/lib/ocaml/labltk/protocol.cmi +file path=usr/lib/ocaml/labltk/protocol.cmx +file path=usr/lib/ocaml/labltk/protocol.mli +file path=usr/lib/ocaml/labltk/radiobutton.cmi +file path=usr/lib/ocaml/labltk/radiobutton.cmx +file path=usr/lib/ocaml/labltk/radiobutton.mli +file path=usr/lib/ocaml/labltk/rawwidget.cmi +file path=usr/lib/ocaml/labltk/rawwidget.cmx +file path=usr/lib/ocaml/labltk/rawwidget.mli +file path=usr/lib/ocaml/labltk/scale.cmi +file path=usr/lib/ocaml/labltk/scale.cmx +file path=usr/lib/ocaml/labltk/scale.mli +file path=usr/lib/ocaml/labltk/scrollbar.cmi +file path=usr/lib/ocaml/labltk/scrollbar.cmx +file path=usr/lib/ocaml/labltk/scrollbar.mli +file path=usr/lib/ocaml/labltk/selection.cmi +file path=usr/lib/ocaml/labltk/selection.cmx +file path=usr/lib/ocaml/labltk/selection.mli +file path=usr/lib/ocaml/labltk/shell.cmi +file path=usr/lib/ocaml/labltk/shell.cmx +file path=usr/lib/ocaml/labltk/shell.mli +file path=usr/lib/ocaml/labltk/text.cmi +file path=usr/lib/ocaml/labltk/text.cmx +file path=usr/lib/ocaml/labltk/text.mli +file path=usr/lib/ocaml/labltk/textvariable.cmi +file path=usr/lib/ocaml/labltk/textvariable.cmx +file path=usr/lib/ocaml/labltk/textvariable.mli +file path=usr/lib/ocaml/labltk/timer.cmi +file path=usr/lib/ocaml/labltk/timer.cmx +file path=usr/lib/ocaml/labltk/timer.mli +file path=usr/lib/ocaml/labltk/tk.cmi +file path=usr/lib/ocaml/labltk/tk.cmx +file path=usr/lib/ocaml/labltk/tkanim.a +file path=usr/lib/ocaml/labltk/tkanim.cma +file path=usr/lib/ocaml/labltk/tkanim.cmi +file path=usr/lib/ocaml/labltk/tkanim.cmxa +file path=usr/lib/ocaml/labltk/tkanim.mli +file path=usr/lib/ocaml/labltk/tkcompiler +file path=usr/lib/ocaml/labltk/tkthread.cmi +file path=usr/lib/ocaml/labltk/tkthread.cmo +file path=usr/lib/ocaml/labltk/tkthread.cmx +file path=usr/lib/ocaml/labltk/tkthread.mli +file path=usr/lib/ocaml/labltk/tkthread.o +file path=usr/lib/ocaml/labltk/tkvars.cmi +file path=usr/lib/ocaml/labltk/tkvars.cmx +file path=usr/lib/ocaml/labltk/tkvars.mli +file path=usr/lib/ocaml/labltk/tkwait.cmi +file path=usr/lib/ocaml/labltk/tkwait.cmx +file path=usr/lib/ocaml/labltk/tkwait.mli +file path=usr/lib/ocaml/labltk/toplevel.cmi +file path=usr/lib/ocaml/labltk/toplevel.cmx +file path=usr/lib/ocaml/labltk/toplevel.mli +file path=usr/lib/ocaml/labltk/widget.cmi +file path=usr/lib/ocaml/labltk/widget.cmx +file path=usr/lib/ocaml/labltk/widget.mli +file path=usr/lib/ocaml/labltk/winfo.cmi +file path=usr/lib/ocaml/labltk/winfo.cmx +file path=usr/lib/ocaml/labltk/winfo.mli +file path=usr/lib/ocaml/labltk/wm.cmi +file path=usr/lib/ocaml/labltk/wm.cmx +file path=usr/lib/ocaml/labltk/wm.mli +file path=usr/lib/ocaml/lazy.cmi +file path=usr/lib/ocaml/lazy.cmx +file path=usr/lib/ocaml/lazy.ml +file path=usr/lib/ocaml/lazy.mli +file path=usr/lib/ocaml/ld.conf +file path=usr/lib/ocaml/lexing.cmi +file path=usr/lib/ocaml/lexing.cmx +file path=usr/lib/ocaml/lexing.ml +file path=usr/lib/ocaml/lexing.mli +file path=usr/lib/ocaml/libasmrun.a +link path=usr/lib/ocaml/libasmrunp.a target=libasmrun.a +file path=usr/lib/ocaml/libbigarray.a +file path=usr/lib/ocaml/libcamlrun.a +file path=usr/lib/ocaml/libcamlrun_shared.so +file path=usr/lib/ocaml/libgraphics.a +file path=usr/lib/ocaml/libmldbm.a +file path=usr/lib/ocaml/libnums.a +file path=usr/lib/ocaml/libstr.a +file path=usr/lib/ocaml/libthreads.a +file path=usr/lib/ocaml/libthreadsnat.a +file path=usr/lib/ocaml/libunix.a +file path=usr/lib/ocaml/list.cmi +file path=usr/lib/ocaml/list.cmx +file path=usr/lib/ocaml/list.ml +file path=usr/lib/ocaml/list.mli +file path=usr/lib/ocaml/listLabels.cmi +file path=usr/lib/ocaml/listLabels.cmx +file path=usr/lib/ocaml/listLabels.ml +file path=usr/lib/ocaml/listLabels.mli +file path=usr/lib/ocaml/map.cmi +file path=usr/lib/ocaml/map.cmx +file path=usr/lib/ocaml/map.ml +file path=usr/lib/ocaml/map.mli +file path=usr/lib/ocaml/marshal.cmi +file path=usr/lib/ocaml/marshal.cmx +file path=usr/lib/ocaml/marshal.ml +file path=usr/lib/ocaml/marshal.mli +file path=usr/lib/ocaml/moreLabels.cmi +file path=usr/lib/ocaml/moreLabels.cmx +file path=usr/lib/ocaml/moreLabels.ml +file path=usr/lib/ocaml/moreLabels.mli +file path=usr/lib/ocaml/mutex.mli +file path=usr/lib/ocaml/nat.cmi +file path=usr/lib/ocaml/nat.cmx +file path=usr/lib/ocaml/nat.mli +file path=usr/lib/ocaml/nativeint.cmi +file path=usr/lib/ocaml/nativeint.cmx +file path=usr/lib/ocaml/nativeint.ml +file path=usr/lib/ocaml/nativeint.mli +file path=usr/lib/ocaml/num.cmi +file path=usr/lib/ocaml/num.cmx +file path=usr/lib/ocaml/num.mli +file path=usr/lib/ocaml/nums.a +file path=usr/lib/ocaml/nums.cma +file path=usr/lib/ocaml/nums.cmxa +file path=usr/lib/ocaml/obj.cmi +file path=usr/lib/ocaml/obj.cmx +file path=usr/lib/ocaml/obj.ml +file path=usr/lib/ocaml/obj.mli +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild.cmo +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild.cmx +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild.o +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_executor.cmi +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_executor.cmo +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_executor.cmx +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_executor.o +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_pack.cmi +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_plugin.cmi +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_unix_plugin.cmi +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_unix_plugin.cmo +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_unix_plugin.cmx +file path=usr/lib/ocaml/ocamlbuild/ocamlbuild_unix_plugin.o +file path=usr/lib/ocaml/ocamlbuild/ocamlbuildlib.a +file path=usr/lib/ocaml/ocamlbuild/ocamlbuildlib.cma +file path=usr/lib/ocaml/ocamlbuild/ocamlbuildlib.cmxa +file path=usr/lib/ocaml/ocamldoc/ocamldoc.hva +file path=usr/lib/ocaml/ocamldoc/odoc.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_analyse.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_args.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_ast.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_class.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_comments.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_comments_global.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_config.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_control.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_cross.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_dag2html.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_dep.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_dot.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_env.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_exception.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_global.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_html.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_info.a +file path=usr/lib/ocaml/ocamldoc/odoc_info.cma +file path=usr/lib/ocaml/ocamldoc/odoc_info.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_info.cmxa +file path=usr/lib/ocaml/ocamldoc/odoc_info.mli +file path=usr/lib/ocaml/ocamldoc/odoc_inherit.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_latex.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_latex_style.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_lexer.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_man.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_merge.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_messages.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_misc.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_module.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_name.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_ocamlhtml.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_parameter.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_parser.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_print.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_scan.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_search.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_see_lexer.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_sig.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_str.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_test.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_texi.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_text.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_text_lexer.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_text_parser.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_to_text.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_type.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_types.cmi +file path=usr/lib/ocaml/ocamldoc/odoc_value.cmi +file path=usr/lib/ocaml/oo.cmi +file path=usr/lib/ocaml/oo.cmx +file path=usr/lib/ocaml/oo.ml +file path=usr/lib/ocaml/oo.mli +file path=usr/lib/ocaml/outcometree.cmi +file path=usr/lib/ocaml/outcometree.mli +file path=usr/lib/ocaml/parsing.cmi +file path=usr/lib/ocaml/parsing.cmx +file path=usr/lib/ocaml/parsing.ml +file path=usr/lib/ocaml/parsing.mli +file path=usr/lib/ocaml/pervasives.cmi +file path=usr/lib/ocaml/pervasives.cmx +file path=usr/lib/ocaml/pervasives.ml +file path=usr/lib/ocaml/pervasives.mli +file path=usr/lib/ocaml/printexc.cmi +file path=usr/lib/ocaml/printexc.cmx +file path=usr/lib/ocaml/printexc.ml +file path=usr/lib/ocaml/printexc.mli +file path=usr/lib/ocaml/printf.cmi +file path=usr/lib/ocaml/printf.cmx +file path=usr/lib/ocaml/printf.ml +file path=usr/lib/ocaml/printf.mli +file path=usr/lib/ocaml/profiling.cmi +file path=usr/lib/ocaml/profiling.cmo +file path=usr/lib/ocaml/queue.cmi +file path=usr/lib/ocaml/queue.cmx +file path=usr/lib/ocaml/queue.ml +file path=usr/lib/ocaml/queue.mli +file path=usr/lib/ocaml/random.cmi +file path=usr/lib/ocaml/random.cmx +file path=usr/lib/ocaml/random.ml +file path=usr/lib/ocaml/random.mli +file path=usr/lib/ocaml/ratio.cmi +file path=usr/lib/ocaml/ratio.cmx +file path=usr/lib/ocaml/ratio.mli +file path=usr/lib/ocaml/scanf.cmi +file path=usr/lib/ocaml/scanf.cmx +file path=usr/lib/ocaml/scanf.ml +file path=usr/lib/ocaml/scanf.mli +file path=usr/lib/ocaml/scrapelabels +file path=usr/lib/ocaml/set.cmi +file path=usr/lib/ocaml/set.cmx +file path=usr/lib/ocaml/set.ml +file path=usr/lib/ocaml/set.mli +file path=usr/lib/ocaml/sort.cmi +file path=usr/lib/ocaml/sort.cmx +file path=usr/lib/ocaml/sort.ml +file path=usr/lib/ocaml/sort.mli +file path=usr/lib/ocaml/stack.cmi +file path=usr/lib/ocaml/stack.cmx +file path=usr/lib/ocaml/stack.ml +file path=usr/lib/ocaml/stack.mli +file path=usr/lib/ocaml/stdLabels.cmi +file path=usr/lib/ocaml/stdLabels.cmx +file path=usr/lib/ocaml/stdLabels.ml +file path=usr/lib/ocaml/stdLabels.mli +file path=usr/lib/ocaml/std_exit.cmi +file path=usr/lib/ocaml/std_exit.cmo +file path=usr/lib/ocaml/std_exit.cmx +file path=usr/lib/ocaml/std_exit.ml +file path=usr/lib/ocaml/std_exit.o +link path=usr/lib/ocaml/std_exit.p.cmx target=std_exit.cmx +link path=usr/lib/ocaml/std_exit.p.o target=std_exit.o +file path=usr/lib/ocaml/stdlib.a +file path=usr/lib/ocaml/stdlib.cma +file path=usr/lib/ocaml/stdlib.cmxa +link path=usr/lib/ocaml/stdlib.p.a target=stdlib.a +link path=usr/lib/ocaml/stdlib.p.cmxa target=stdlib.cmxa +file path=usr/lib/ocaml/str.a +file path=usr/lib/ocaml/str.cma +file path=usr/lib/ocaml/str.cmi +file path=usr/lib/ocaml/str.cmx +file path=usr/lib/ocaml/str.cmxa +file path=usr/lib/ocaml/str.mli +file path=usr/lib/ocaml/stream.cmi +file path=usr/lib/ocaml/stream.cmx +file path=usr/lib/ocaml/stream.ml +file path=usr/lib/ocaml/stream.mli +file path=usr/lib/ocaml/string.cmi +file path=usr/lib/ocaml/string.cmx +file path=usr/lib/ocaml/string.ml +file path=usr/lib/ocaml/string.mli +file path=usr/lib/ocaml/stringLabels.cmi +file path=usr/lib/ocaml/stringLabels.cmx +file path=usr/lib/ocaml/stringLabels.ml +file path=usr/lib/ocaml/stringLabels.mli +file path=usr/lib/ocaml/stublibs/dllbigarray.so +file path=usr/lib/ocaml/stublibs/dllgraphics.so +file path=usr/lib/ocaml/stublibs/dlllabltk.so +file path=usr/lib/ocaml/stublibs/dllmldbm.so +file path=usr/lib/ocaml/stublibs/dllnums.so +file path=usr/lib/ocaml/stublibs/dllstr.so +file path=usr/lib/ocaml/stublibs/dllthreads.so +file path=usr/lib/ocaml/stublibs/dlltkanim.so +file path=usr/lib/ocaml/stublibs/dllunix.so +file path=usr/lib/ocaml/stublibs/dllvmthreads.so +file path=usr/lib/ocaml/sys.cmi +file path=usr/lib/ocaml/sys.cmx +file path=usr/lib/ocaml/sys.ml +file path=usr/lib/ocaml/sys.mli +file path=usr/lib/ocaml/thread.mli +file path=usr/lib/ocaml/threadUnix.mli +file path=usr/lib/ocaml/threads/condition.cmi +file path=usr/lib/ocaml/threads/condition.cmx +file path=usr/lib/ocaml/threads/event.cmi +file path=usr/lib/ocaml/threads/event.cmx +file path=usr/lib/ocaml/threads/mutex.cmi +file path=usr/lib/ocaml/threads/mutex.cmx +file path=usr/lib/ocaml/threads/thread.cmi +file path=usr/lib/ocaml/threads/thread.cmx +file path=usr/lib/ocaml/threads/threadUnix.cmi +file path=usr/lib/ocaml/threads/threadUnix.cmx +file path=usr/lib/ocaml/threads/threads.a +file path=usr/lib/ocaml/threads/threads.cma +file path=usr/lib/ocaml/threads/threads.cmxa +file path=usr/lib/ocaml/topdirs.cmi +file path=usr/lib/ocaml/toplevellib.cma +file path=usr/lib/ocaml/toploop.cmi +file path=usr/lib/ocaml/topmain.cmi +file path=usr/lib/ocaml/topstart.cmo +file path=usr/lib/ocaml/unix.a +file path=usr/lib/ocaml/unix.cma +file path=usr/lib/ocaml/unix.cmi +file path=usr/lib/ocaml/unix.cmx +file path=usr/lib/ocaml/unix.cmxa +file path=usr/lib/ocaml/unix.mli +file path=usr/lib/ocaml/unixLabels.cmi +file path=usr/lib/ocaml/unixLabels.cmx +file path=usr/lib/ocaml/unixLabels.mli +file path=usr/lib/ocaml/vmthreads/condition.cmi +file path=usr/lib/ocaml/vmthreads/condition.mli +file path=usr/lib/ocaml/vmthreads/event.cmi +file path=usr/lib/ocaml/vmthreads/event.mli +file path=usr/lib/ocaml/vmthreads/libvmthreads.a +file path=usr/lib/ocaml/vmthreads/mutex.cmi +file path=usr/lib/ocaml/vmthreads/mutex.mli +file path=usr/lib/ocaml/vmthreads/stdlib.cma +file path=usr/lib/ocaml/vmthreads/thread.cmi +file path=usr/lib/ocaml/vmthreads/thread.mli +file path=usr/lib/ocaml/vmthreads/threadUnix.cmi +file path=usr/lib/ocaml/vmthreads/threadUnix.mli +file path=usr/lib/ocaml/vmthreads/threads.cma +file path=usr/lib/ocaml/vmthreads/unix.cma +file path=usr/lib/ocaml/weak.cmi +file path=usr/lib/ocaml/weak.cmx +file path=usr/lib/ocaml/weak.ml +file path=usr/lib/ocaml/weak.mli +file path=usr/share/doc/ocaml/htmlman/contents_motif.gif +file path=usr/share/doc/ocaml/htmlman/expr.html +file path=usr/share/doc/ocaml/htmlman/index.html +file path=usr/share/doc/ocaml/htmlman/language.html +file path=usr/share/doc/ocaml/htmlman/lex.html +file path=usr/share/doc/ocaml/htmlman/libgraph.gif +file path=usr/share/doc/ocaml/htmlman/libref/Arg.html +file path=usr/share/doc/ocaml/htmlman/libref/Arith_status.html +file path=usr/share/doc/ocaml/htmlman/libref/Array.html +file path=usr/share/doc/ocaml/htmlman/libref/ArrayLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/Big_int.html +file path=usr/share/doc/ocaml/htmlman/libref/Bigarray.Array1.html +file path=usr/share/doc/ocaml/htmlman/libref/Bigarray.Array2.html +file path=usr/share/doc/ocaml/htmlman/libref/Bigarray.Array3.html +file path=usr/share/doc/ocaml/htmlman/libref/Bigarray.Genarray.html +file path=usr/share/doc/ocaml/htmlman/libref/Bigarray.html +file path=usr/share/doc/ocaml/htmlman/libref/Buffer.html +file path=usr/share/doc/ocaml/htmlman/libref/Callback.html +file path=usr/share/doc/ocaml/htmlman/libref/CamlinternalLazy.html +file path=usr/share/doc/ocaml/htmlman/libref/CamlinternalMod.html +file path=usr/share/doc/ocaml/htmlman/libref/CamlinternalOO.html +file path=usr/share/doc/ocaml/htmlman/libref/Char.html +file path=usr/share/doc/ocaml/htmlman/libref/Complex.html +file path=usr/share/doc/ocaml/htmlman/libref/Condition.html +file path=usr/share/doc/ocaml/htmlman/libref/Dbm.html +file path=usr/share/doc/ocaml/htmlman/libref/Digest.html +file path=usr/share/doc/ocaml/htmlman/libref/Dynlink.html +file path=usr/share/doc/ocaml/htmlman/libref/Event.html +file path=usr/share/doc/ocaml/htmlman/libref/Filename.html +file path=usr/share/doc/ocaml/htmlman/libref/Format.html +file path=usr/share/doc/ocaml/htmlman/libref/Gc.html +file path=usr/share/doc/ocaml/htmlman/libref/Genlex.html +file path=usr/share/doc/ocaml/htmlman/libref/Graphics.html +file path=usr/share/doc/ocaml/htmlman/libref/GraphicsX11.html +file path=usr/share/doc/ocaml/htmlman/libref/Hashtbl.HashedType.html +file path=usr/share/doc/ocaml/htmlman/libref/Hashtbl.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/Hashtbl.S.html +file path=usr/share/doc/ocaml/htmlman/libref/Hashtbl.html +file path=usr/share/doc/ocaml/htmlman/libref/Int32.html +file path=usr/share/doc/ocaml/htmlman/libref/Int64.html +file path=usr/share/doc/ocaml/htmlman/libref/Lazy.html +file path=usr/share/doc/ocaml/htmlman/libref/Lexing.html +file path=usr/share/doc/ocaml/htmlman/libref/List.html +file path=usr/share/doc/ocaml/htmlman/libref/ListLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/Map.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/Map.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/Map.S.html +file path=usr/share/doc/ocaml/htmlman/libref/Map.html +file path=usr/share/doc/ocaml/htmlman/libref/Marshal.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Hashtbl.HashedType.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Hashtbl.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Hashtbl.S.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Hashtbl.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Map.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Map.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Map.S.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Map.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Set.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Set.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Set.S.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.Set.html +file path=usr/share/doc/ocaml/htmlman/libref/MoreLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/Mutex.html +file path=usr/share/doc/ocaml/htmlman/libref/Nativeint.html +file path=usr/share/doc/ocaml/htmlman/libref/Num.html +file path=usr/share/doc/ocaml/htmlman/libref/Obj.html +file path=usr/share/doc/ocaml/htmlman/libref/Oo.html +file path=usr/share/doc/ocaml/htmlman/libref/Parsing.html +file path=usr/share/doc/ocaml/htmlman/libref/Pervasives.LargeFile.html +file path=usr/share/doc/ocaml/htmlman/libref/Pervasives.html +file path=usr/share/doc/ocaml/htmlman/libref/Printexc.html +file path=usr/share/doc/ocaml/htmlman/libref/Printf.html +file path=usr/share/doc/ocaml/htmlman/libref/Queue.html +file path=usr/share/doc/ocaml/htmlman/libref/Random.State.html +file path=usr/share/doc/ocaml/htmlman/libref/Random.html +file path=usr/share/doc/ocaml/htmlman/libref/Scanf.Scanning.html +file path=usr/share/doc/ocaml/htmlman/libref/Scanf.html +file path=usr/share/doc/ocaml/htmlman/libref/Set.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/Set.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/Set.S.html +file path=usr/share/doc/ocaml/htmlman/libref/Set.html +file path=usr/share/doc/ocaml/htmlman/libref/Sort.html +file path=usr/share/doc/ocaml/htmlman/libref/Stack.html +file path=usr/share/doc/ocaml/htmlman/libref/StdLabels.Array.html +file path=usr/share/doc/ocaml/htmlman/libref/StdLabels.List.html +file path=usr/share/doc/ocaml/htmlman/libref/StdLabels.String.html +file path=usr/share/doc/ocaml/htmlman/libref/StdLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/Str.html +file path=usr/share/doc/ocaml/htmlman/libref/Stream.html +file path=usr/share/doc/ocaml/htmlman/libref/String.html +file path=usr/share/doc/ocaml/htmlman/libref/StringLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/Sys.html +file path=usr/share/doc/ocaml/htmlman/libref/Thread.html +file path=usr/share/doc/ocaml/htmlman/libref/ThreadUnix.html +file path=usr/share/doc/ocaml/htmlman/libref/Tk.html +file path=usr/share/doc/ocaml/htmlman/libref/Unix.LargeFile.html +file path=usr/share/doc/ocaml/htmlman/libref/Unix.html +file path=usr/share/doc/ocaml/htmlman/libref/UnixLabels.LargeFile.html +file path=usr/share/doc/ocaml/htmlman/libref/UnixLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/Weak.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/Weak.S.html +file path=usr/share/doc/ocaml/htmlman/libref/Weak.html +file path=usr/share/doc/ocaml/htmlman/libref/index.html +file path=usr/share/doc/ocaml/htmlman/libref/index_attributes.html +file path=usr/share/doc/ocaml/htmlman/libref/index_class_types.html +file path=usr/share/doc/ocaml/htmlman/libref/index_classes.html +file path=usr/share/doc/ocaml/htmlman/libref/index_exceptions.html +file path=usr/share/doc/ocaml/htmlman/libref/index_methods.html +file path=usr/share/doc/ocaml/htmlman/libref/index_module_types.html +file path=usr/share/doc/ocaml/htmlman/libref/index_modules.html +file path=usr/share/doc/ocaml/htmlman/libref/index_types.html +file path=usr/share/doc/ocaml/htmlman/libref/index_values.html +file path=usr/share/doc/ocaml/htmlman/libref/style.css +file path=usr/share/doc/ocaml/htmlman/libref/type_Arg.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Arith_status.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Array.html +file path=usr/share/doc/ocaml/htmlman/libref/type_ArrayLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Big_int.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Bigarray.Array1.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Bigarray.Array2.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Bigarray.Array3.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Bigarray.Genarray.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Bigarray.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Buffer.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Callback.html +file path=usr/share/doc/ocaml/htmlman/libref/type_CamlinternalLazy.html +file path=usr/share/doc/ocaml/htmlman/libref/type_CamlinternalMod.html +file path=usr/share/doc/ocaml/htmlman/libref/type_CamlinternalOO.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Char.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Complex.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Condition.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Dbm.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Digest.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Dynlink.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Event.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Filename.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Format.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Gc.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Genlex.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Graphics.html +file path=usr/share/doc/ocaml/htmlman/libref/type_GraphicsX11.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Hashtbl.HashedType.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Hashtbl.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Hashtbl.S.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Hashtbl.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Int32.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Int64.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Lazy.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Lexing.html +file path=usr/share/doc/ocaml/htmlman/libref/type_List.html +file path=usr/share/doc/ocaml/htmlman/libref/type_ListLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Map.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Map.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Map.S.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Map.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Marshal.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Hashtbl.HashedType.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Hashtbl.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Hashtbl.S.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Hashtbl.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Map.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Map.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Map.S.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Map.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Set.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Set.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Set.S.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.Set.html +file path=usr/share/doc/ocaml/htmlman/libref/type_MoreLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Mutex.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Nativeint.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Num.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Obj.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Oo.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Parsing.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Pervasives.LargeFile.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Pervasives.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Printexc.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Printf.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Queue.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Random.State.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Random.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Scanf.Scanning.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Scanf.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Set.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Set.OrderedType.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Set.S.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Set.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Sort.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Stack.html +file path=usr/share/doc/ocaml/htmlman/libref/type_StdLabels.Array.html +file path=usr/share/doc/ocaml/htmlman/libref/type_StdLabels.List.html +file path=usr/share/doc/ocaml/htmlman/libref/type_StdLabels.String.html +file path=usr/share/doc/ocaml/htmlman/libref/type_StdLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Str.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Stream.html +file path=usr/share/doc/ocaml/htmlman/libref/type_String.html +file path=usr/share/doc/ocaml/htmlman/libref/type_StringLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Sys.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Thread.html +file path=usr/share/doc/ocaml/htmlman/libref/type_ThreadUnix.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Tk.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Unix.LargeFile.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Unix.html +file path=usr/share/doc/ocaml/htmlman/libref/type_UnixLabels.LargeFile.html +file path=usr/share/doc/ocaml/htmlman/libref/type_UnixLabels.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Weak.Make.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Weak.S.html +file path=usr/share/doc/ocaml/htmlman/libref/type_Weak.html +file path=usr/share/doc/ocaml/htmlman/manual.css +file path=usr/share/doc/ocaml/htmlman/manual.haux +file path=usr/share/doc/ocaml/htmlman/manual.hmanual +file path=usr/share/doc/ocaml/htmlman/manual.hmanual.hind +file path=usr/share/doc/ocaml/htmlman/manual.hmanual.kwd.hind +file path=usr/share/doc/ocaml/htmlman/manual.htoc +file path=usr/share/doc/ocaml/htmlman/manual001.html +file path=usr/share/doc/ocaml/htmlman/manual002.html +file path=usr/share/doc/ocaml/htmlman/manual003.html +file path=usr/share/doc/ocaml/htmlman/manual004.html +file path=usr/share/doc/ocaml/htmlman/manual005.html +file path=usr/share/doc/ocaml/htmlman/manual006.html +file path=usr/share/doc/ocaml/htmlman/manual007.html +file path=usr/share/doc/ocaml/htmlman/manual008.html +file path=usr/share/doc/ocaml/htmlman/manual010.html +file path=usr/share/doc/ocaml/htmlman/manual011.html +file path=usr/share/doc/ocaml/htmlman/manual012.html +file path=usr/share/doc/ocaml/htmlman/manual013.html +file path=usr/share/doc/ocaml/htmlman/manual016.html +file path=usr/share/doc/ocaml/htmlman/manual017.html +file path=usr/share/doc/ocaml/htmlman/manual018.html +file path=usr/share/doc/ocaml/htmlman/manual019.html +file path=usr/share/doc/ocaml/htmlman/manual020.html +file path=usr/share/doc/ocaml/htmlman/manual021.html +file path=usr/share/doc/ocaml/htmlman/manual022.html +file path=usr/share/doc/ocaml/htmlman/manual023.html +file path=usr/share/doc/ocaml/htmlman/manual024.html +file path=usr/share/doc/ocaml/htmlman/manual025.html +file path=usr/share/doc/ocaml/htmlman/manual026.html +file path=usr/share/doc/ocaml/htmlman/manual027.html +file path=usr/share/doc/ocaml/htmlman/manual028.html +file path=usr/share/doc/ocaml/htmlman/manual029.html +file path=usr/share/doc/ocaml/htmlman/manual030.html +file path=usr/share/doc/ocaml/htmlman/manual031.html +file path=usr/share/doc/ocaml/htmlman/manual032.html +file path=usr/share/doc/ocaml/htmlman/manual033.html +file path=usr/share/doc/ocaml/htmlman/manual034.html +file path=usr/share/doc/ocaml/htmlman/manual035.html +file path=usr/share/doc/ocaml/htmlman/manual036.html +file path=usr/share/doc/ocaml/htmlman/manual037.html +file path=usr/share/doc/ocaml/htmlman/manual038.html +file path=usr/share/doc/ocaml/htmlman/manual039.html +file path=usr/share/doc/ocaml/htmlman/manual040.html +file path=usr/share/doc/ocaml/htmlman/manual041.html +file path=usr/share/doc/ocaml/htmlman/manual042.html +file path=usr/share/doc/ocaml/htmlman/manual043.html +file path=usr/share/doc/ocaml/htmlman/manual044.html +file path=usr/share/doc/ocaml/htmlman/next_motif.gif +file path=usr/share/doc/ocaml/htmlman/patterns.html +file path=usr/share/doc/ocaml/htmlman/previous_motif.gif +file path=usr/share/doc/ocaml/htmlman/types.html +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/Makefile +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/Makefile.nt +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/addition.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/eyes.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/fileinput.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/fileopen.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/helloworld.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/images/CamlBook.gif +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/images/Lambda2.back.gif +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/images/dojoji.back.gif +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/jptest.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/mytext.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/socketinput.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/taddition.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/tetris.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/text.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_camltk/winskel.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/Lambda2.back.gif +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/Makefile +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/Makefile.nt +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/README +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/calc.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/clock.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/demo.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/eyes.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/hello.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/hello.tcl +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/lang.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/taquin.ml +file path=usr/share/doc/ocaml/otherlibs/labltk/examples_labltk/tetris.ml +file path=usr/share/doc/ocaml/refman.pdf +file path=usr/share/emacs/site-lisp/caml-compat.el +file path=usr/share/emacs/site-lisp/caml-emacs.el +file path=usr/share/emacs/site-lisp/caml-emacs.elc +file path=usr/share/emacs/site-lisp/caml-font.el +file path=usr/share/emacs/site-lisp/caml-help.el +file path=usr/share/emacs/site-lisp/caml-help.elc +file path=usr/share/emacs/site-lisp/caml-hilit.el +file path=usr/share/emacs/site-lisp/caml-types.el +file path=usr/share/emacs/site-lisp/caml-types.elc +file path=usr/share/emacs/site-lisp/caml-xemacs.el +file path=usr/share/emacs/site-lisp/caml-xemacs.elc +file path=usr/share/emacs/site-lisp/caml.el +file path=usr/share/emacs/site-lisp/caml.elc +file path=usr/share/emacs/site-lisp/camldebug.el +file path=usr/share/emacs/site-lisp/camldebug.elc +file path=usr/share/emacs/site-lisp/inf-caml.el +file path=usr/share/emacs/site-lisp/inf-caml.elc +file path=usr/share/info/ocaml.info-1.gz +file path=usr/share/info/ocaml.info-10.gz +file path=usr/share/info/ocaml.info-11.gz +file path=usr/share/info/ocaml.info-12.gz +file path=usr/share/info/ocaml.info-13.gz +file path=usr/share/info/ocaml.info-14.gz +file path=usr/share/info/ocaml.info-15.gz +file path=usr/share/info/ocaml.info-16.gz +file path=usr/share/info/ocaml.info-17.gz +file path=usr/share/info/ocaml.info-18.gz +file path=usr/share/info/ocaml.info-19.gz +file path=usr/share/info/ocaml.info-2.gz +file path=usr/share/info/ocaml.info-20.gz +file path=usr/share/info/ocaml.info-3.gz +file path=usr/share/info/ocaml.info-4.gz +file path=usr/share/info/ocaml.info-5.gz +file path=usr/share/info/ocaml.info-6.gz +file path=usr/share/info/ocaml.info-7.gz +file path=usr/share/info/ocaml.info-8.gz +file path=usr/share/info/ocaml.info-9.gz +file path=usr/share/info/ocaml.info.gz +file path=usr/share/man/man1/ocaml.1 +file path=usr/share/man/man1/ocamlbuild.1 +file path=usr/share/man/man1/ocamlc.1 +file path=usr/share/man/man1/ocamlc.opt.1 +file path=usr/share/man/man1/ocamlcp.1 +file path=usr/share/man/man1/ocamldebug.1 +file path=usr/share/man/man1/ocamldep.1 +file path=usr/share/man/man1/ocamldoc.1 +file path=usr/share/man/man1/ocamllex.1 +file path=usr/share/man/man1/ocamlmktop.1 +file path=usr/share/man/man1/ocamlopt.1 +file path=usr/share/man/man1/ocamlopt.opt.1 +file path=usr/share/man/man1/ocamlprof.1 +file path=usr/share/man/man1/ocamlrun.1 +file path=usr/share/man/man1/ocamlyacc.1 +file path=usr/share/man/man3/Arg.3o +file path=usr/share/man/man3/Array.3o +file path=usr/share/man/man3/ArrayLabels.3o +file path=usr/share/man/man3/Bigarray.3o +file path=usr/share/man/man3/Bigarray.Array1.3o +file path=usr/share/man/man3/Bigarray.Array2.3o +file path=usr/share/man/man3/Bigarray.Array3.3o +file path=usr/share/man/man3/Bigarray.Genarray.3o +file path=usr/share/man/man3/Buffer.3o +file path=usr/share/man/man3/Callback.3o +file path=usr/share/man/man3/CamlinternalLazy.3o +file path=usr/share/man/man3/CamlinternalMod.3o +file path=usr/share/man/man3/CamlinternalOO.3o +file path=usr/share/man/man3/Char.3o +file path=usr/share/man/man3/Complex.3o +file path=usr/share/man/man3/Digest.3o +file path=usr/share/man/man3/Filename.3o +file path=usr/share/man/man3/Format.3o +file path=usr/share/man/man3/Gc.3o +file path=usr/share/man/man3/Genlex.3o +file path=usr/share/man/man3/Hashtbl.3o +file path=usr/share/man/man3/Hashtbl.HashedType.3o +file path=usr/share/man/man3/Hashtbl.Make.3o +file path=usr/share/man/man3/Hashtbl.S.3o +file path=usr/share/man/man3/Int32.3o +file path=usr/share/man/man3/Int64.3o +file path=usr/share/man/man3/Lazy.3o +file path=usr/share/man/man3/Lexing.3o +file path=usr/share/man/man3/List.3o +file path=usr/share/man/man3/ListLabels.3o +file path=usr/share/man/man3/Map.3o +file path=usr/share/man/man3/Map.Make.3o +file path=usr/share/man/man3/Map.OrderedType.3o +file path=usr/share/man/man3/Map.S.3o +file path=usr/share/man/man3/Marshal.3o +file path=usr/share/man/man3/MoreLabels.3o +file path=usr/share/man/man3/MoreLabels.Hashtbl.3o +file path=usr/share/man/man3/MoreLabels.Hashtbl.HashedType.3o +file path=usr/share/man/man3/MoreLabels.Hashtbl.Make.3o +file path=usr/share/man/man3/MoreLabels.Hashtbl.S.3o +file path=usr/share/man/man3/MoreLabels.Map.3o +file path=usr/share/man/man3/MoreLabels.Map.Make.3o +file path=usr/share/man/man3/MoreLabels.Map.OrderedType.3o +file path=usr/share/man/man3/MoreLabels.Map.S.3o +file path=usr/share/man/man3/MoreLabels.Set.3o +file path=usr/share/man/man3/MoreLabels.Set.Make.3o +file path=usr/share/man/man3/MoreLabels.Set.OrderedType.3o +file path=usr/share/man/man3/MoreLabels.Set.S.3o +file path=usr/share/man/man3/Nativeint.3o +file path=usr/share/man/man3/Num.3o +file path=usr/share/man/man3/Obj.3o +file path=usr/share/man/man3/Oo.3o +file path=usr/share/man/man3/Parsing.3o +file path=usr/share/man/man3/Pervasives.3o +file path=usr/share/man/man3/Pervasives.LargeFile.3o +file path=usr/share/man/man3/Printexc.3o +file path=usr/share/man/man3/Printf.3o +file path=usr/share/man/man3/Queue.3o +file path=usr/share/man/man3/Random.3o +file path=usr/share/man/man3/Random.State.3o +file path=usr/share/man/man3/Scanf.3o +file path=usr/share/man/man3/Scanf.Scanning.3o +file path=usr/share/man/man3/Set.3o +file path=usr/share/man/man3/Set.Make.3o +file path=usr/share/man/man3/Set.OrderedType.3o +file path=usr/share/man/man3/Set.S.3o +file path=usr/share/man/man3/Sort.3o +file path=usr/share/man/man3/Stack.3o +file path=usr/share/man/man3/StdLabels.3o +file path=usr/share/man/man3/StdLabels.Array.3o +file path=usr/share/man/man3/StdLabels.List.3o +file path=usr/share/man/man3/StdLabels.String.3o +file path=usr/share/man/man3/Str.3o +file path=usr/share/man/man3/Stream.3o +file path=usr/share/man/man3/String.3o +file path=usr/share/man/man3/StringLabels.3o +file path=usr/share/man/man3/Sys.3o +file path=usr/share/man/man3/Unix.3o +file path=usr/share/man/man3/Unix.LargeFile.3o +file path=usr/share/man/man3/Weak.3o +file path=usr/share/man/man3/Weak.Make.3o +file path=usr/share/man/man3/Weak.S.3o +# +license LICENSE license="QPLv1, GPLv2" + +# ocaml was previously in the 'desktop' consolidation. This optional +# dependency is here to facilitate the safe transfer of the package +# to the 'userland' consolidation. +depend type=optional \ + fmri=consolidation/desktop/[email protected]
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/ocaml/patches/ocaml-3.11.0-ppc64.patch Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,2089 @@ + +Patch from Fedora spec-file to add powerpc support. This patch was rejected by +upstream. This may not be needed on Solaris, but keeping it for consistency +with the RHEL package. +https://sympa.inria.fr/sympa/arc/caml-list/2007-10/msg00502.html + +diff -uNr ocaml-3.10.1/asmcomp/power64/arch.ml ocaml-3.10.1.ppc64/asmcomp/power64/arch.ml +--- ocaml-3.10.1/asmcomp/power64/arch.ml 1969-12-31 19:00:00.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmcomp/power64/arch.ml 2008-02-29 08:37:45.000000000 -0500 +@@ -0,0 +1,84 @@ ++(***********************************************************************) ++(* *) ++(* Objective Caml *) ++(* *) ++(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) ++(* *) ++(* Copyright 1996 Institut National de Recherche en Informatique et *) ++(* en Automatique. All rights reserved. This file is distributed *) ++(* under the terms of the Q Public License version 1.0. *) ++(* *) ++(***********************************************************************) ++ ++(* $Id: arch.ml,v 1.11 2004/06/19 16:13:32 xleroy Exp $ *) ++ ++(* Specific operations for the PowerPC processor *) ++ ++open Misc ++open Format ++ ++(* Machine-specific command-line options *) ++ ++let command_line_options = [] ++ ++(* Specific operations *) ++ ++type specific_operation = ++ Imultaddf (* multiply and add *) ++ | Imultsubf (* multiply and subtract *) ++ | Ialloc_far of int (* allocation in large functions *) ++ ++(* Addressing modes *) ++ ++type addressing_mode = ++ Ibased of string * int (* symbol + displ *) ++ | Iindexed of int (* reg + displ *) ++ | Iindexed2 (* reg + reg *) ++ ++(* Sizes, endianness *) ++ ++let big_endian = true ++ ++let size_addr = 8 ++let size_int = 8 ++let size_float = 8 ++ ++(* Operations on addressing modes *) ++ ++let identity_addressing = Iindexed 0 ++ ++let offset_addressing addr delta = ++ match addr with ++ Ibased(s, n) -> Ibased(s, n + delta) ++ | Iindexed n -> Iindexed(n + delta) ++ | Iindexed2 -> assert false ++ ++let num_args_addressing = function ++ Ibased(s, n) -> 0 ++ | Iindexed n -> 1 ++ | Iindexed2 -> 2 ++ ++(* Printing operations and addressing modes *) ++ ++let print_addressing printreg addr ppf arg = ++ match addr with ++ | Ibased(s, n) -> ++ let idx = if n <> 0 then Printf.sprintf " + %i" n else "" in ++ fprintf ppf "\"%s\"%s" s idx ++ | Iindexed n -> ++ let idx = if n <> 0 then Printf.sprintf " + %i" n else "" in ++ fprintf ppf "%a%s" printreg arg.(0) idx ++ | Iindexed2 -> ++ fprintf ppf "%a + %a" printreg arg.(0) printreg arg.(1) ++ ++let print_specific_operation printreg op ppf arg = ++ match op with ++ | Imultaddf -> ++ fprintf ppf "%a *f %a +f %a" ++ printreg arg.(0) printreg arg.(1) printreg arg.(2) ++ | Imultsubf -> ++ fprintf ppf "%a *f %a -f %a" ++ printreg arg.(0) printreg arg.(1) printreg arg.(2) ++ | Ialloc_far n -> ++ fprintf ppf "alloc_far %d" n ++ +diff -uNr ocaml-3.10.1/asmcomp/power64/emit.mlp ocaml-3.10.1.ppc64/asmcomp/power64/emit.mlp +--- ocaml-3.10.1/asmcomp/power64/emit.mlp 1969-12-31 19:00:00.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmcomp/power64/emit.mlp 2008-02-29 08:37:45.000000000 -0500 +@@ -0,0 +1,989 @@ ++(***********************************************************************) ++(* *) ++(* Objective Caml *) ++(* *) ++(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) ++(* *) ++(* Copyright 1996 Institut National de Recherche en Informatique et *) ++(* en Automatique. All rights reserved. This file is distributed *) ++(* under the terms of the Q Public License version 1.0. *) ++(* *) ++(***********************************************************************) ++ ++(* $Id: emit.mlp,v 1.21 2004/06/19 17:39:34 xleroy Exp $ *) ++ ++(* Emission of PowerPC assembly code *) ++ ++module StringSet = Set.Make(struct type t = string let compare = compare end) ++ ++open Location ++open Misc ++open Cmm ++open Arch ++open Proc ++open Reg ++open Mach ++open Linearize ++open Emitaux ++ ++(* Layout of the stack. The stack is kept 16-aligned. *) ++ ++let stack_size_lbl = ref 0 ++let stack_slot_lbl = ref 0 ++let stack_args_size = ref 0 ++let stack_traps_size = ref 0 ++ ++(* We have a stack frame of our own if we call other functions (including ++ use of exceptions, or if we need more than the red zone *) ++let has_stack_frame () = ++ if !contains_calls or (num_stack_slots.(0) + num_stack_slots.(1)) > (288-16)/8 then ++ true ++ else ++ false ++ ++let frame_size_sans_args () = ++ let size = 8 * num_stack_slots.(0) + 8 * num_stack_slots.(1) + 48 in ++ Misc.align size 16 ++ ++let slot_offset loc cls = ++ match loc with ++ Local n -> ++ if cls = 0 ++ then (!stack_slot_lbl, num_stack_slots.(1) * 8 + n * 8) ++ else (!stack_slot_lbl, n * 8) ++ | Incoming n -> ((if has_stack_frame() then !stack_size_lbl else 0), 48 + n) ++ | Outgoing n -> (0, n) ++ ++(* Output a symbol *) ++ ++let emit_symbol = ++ match Config.system with ++ | "elf" | "bsd" -> (fun s -> Emitaux.emit_symbol '.' s) ++ | "rhapsody" -> (fun s -> emit_char '_'; Emitaux.emit_symbol '$' s) ++ | _ -> assert false ++ ++(* Output a label *) ++ ++let label_prefix = ++ match Config.system with ++ | "elf" | "bsd" -> ".L" ++ | "rhapsody" -> "L" ++ | _ -> assert false ++ ++let emit_label lbl = ++ emit_string label_prefix; emit_int lbl ++ ++(* Section switching *) ++ ++let toc_space = ++ match Config.system with ++ | "elf" | "bsd" -> " .section \".toc\",\"aw\"\n" ++ | "rhapsody" -> " .toc\n" ++ | _ -> assert false ++ ++let data_space = ++ match Config.system with ++ | "elf" | "bsd" -> " .section \".data\"\n" ++ | "rhapsody" -> " .data\n" ++ | _ -> assert false ++ ++let code_space = ++ match Config.system with ++ | "elf" | "bsd" -> " .section \".text\"\n" ++ | "rhapsody" -> " .text\n" ++ | _ -> assert false ++ ++let rodata_space = ++ match Config.system with ++ | "elf" | "bsd" -> " .section \".rodata\"\n" ++ | "rhapsody" -> " .const\n" ++ | _ -> assert false ++ ++(* Output a pseudo-register *) ++ ++let emit_reg r = ++ match r.loc with ++ Reg r -> emit_string (register_name r) ++ | _ -> fatal_error "Emit.emit_reg" ++ ++let use_full_regnames = ++ Config.system = "rhapsody" ++ ++let emit_gpr r = ++ if use_full_regnames then emit_char 'r'; ++ emit_int r ++ ++let emit_fpr r = ++ if use_full_regnames then emit_char 'f'; ++ emit_int r ++ ++let emit_ccr r = ++ if use_full_regnames then emit_string "cr"; ++ emit_int r ++ ++(* Output a stack reference *) ++ ++let emit_stack r = ++ match r.loc with ++ Stack s -> ++ let lbl, ofs = slot_offset s (register_class r) in ++ if lbl > 0 then ++ `{emit_label lbl}+`; ++ `{emit_int ofs}({emit_gpr 1})` ++ | _ -> fatal_error "Emit.emit_stack" ++ ++(* Split a 32-bit integer constants in two 16-bit halves *) ++ ++let low n = n land 0xFFFF ++let high n = n asr 16 ++ ++let nativelow n = Nativeint.to_int n land 0xFFFF ++let nativehigh n = Nativeint.to_int (Nativeint.shift_right n 16) ++ ++let is_immediate n = ++ n <= 32767 && n >= -32768 ++ ++let is_native_immediate n = ++ n <= 32767n && n >= -32768n ++ ++ ++type tocentry = ++ TocSymOfs of (string * int) ++ | TocLabel of int ++ | TocInt of nativeint ++ | TocFloat of string ++ ++(* List of all labels in tocref (reverse order) *) ++let tocref_entries = ref [] ++ ++(* Output a TOC reference *) ++ ++let emit_symbol_offset (s, d) = ++ emit_symbol s; ++ if d > 0 then `+`; ++ if d <> 0 then emit_int d ++ ++let emit_tocentry entry = ++ match entry with ++ TocSymOfs(s,d) -> emit_symbol_offset(s,d) ++ | TocInt i -> emit_nativeint i ++ | TocFloat f -> emit_string f ++ | TocLabel lbl -> emit_label lbl ++ ++ let rec tocref_label = function ++ ( [] , content ) -> ++ let lbl = new_label() in ++ tocref_entries := (lbl, content) :: !tocref_entries; ++ lbl ++ | ( (lbl, o_content) :: lst, content) -> ++ if content = o_content then ++ lbl ++ else ++ tocref_label (lst, content) ++ ++let emit_tocref entry = ++ let lbl = tocref_label (!tocref_entries,entry) in ++ emit_label lbl; emit_string "@toc(2) #"; emit_tocentry entry ++ ++ ++(* Output a load or store operation *) ++ ++let valid_offset instr ofs = ++ ofs land 3 = 0 || (instr <> "ld" && instr <> "std") ++ ++let emit_load_store instr addressing_mode addr n arg = ++ match addressing_mode with ++ Ibased(s, d) -> ++ let dd = (d + 0x8000) in (* We can only offset by -0x8000 .. +0x7fff *) ++ let a = (dd land -0x10000) in ++ let b = (dd land 0xffff) - 0x8000 in ++ ` ld {emit_gpr 11}, {emit_tocref (TocSymOfs (s,a))}\n`; ++ ` {emit_string instr} {emit_reg arg}, {emit_int b}({emit_gpr 11})\n` ++ | Iindexed ofs -> ++ if is_immediate ofs && valid_offset instr ofs then ++ ` {emit_string instr} {emit_reg arg}, {emit_int ofs}({emit_reg addr.(n)})\n` ++ else begin ++ ` lis {emit_gpr 0}, {emit_int(high ofs)}\n`; ++ if low ofs <> 0 then ++ ` ori {emit_gpr 0}, {emit_gpr 0}, {emit_int(low ofs)}\n`; ++ ` {emit_string instr}x {emit_reg arg}, {emit_reg addr.(n)}, {emit_gpr 0}\n` ++ end ++ | Iindexed2 -> ++ ` {emit_string instr}x {emit_reg arg}, {emit_reg addr.(n)}, {emit_reg addr.(n+1)}\n` ++ ++(* After a comparison, extract the result as 0 or 1 *) ++ ++let emit_set_comp cmp res = ++ ` mfcr {emit_gpr 0}\n`; ++ let bitnum = ++ match cmp with ++ Ceq | Cne -> 2 ++ | Cgt | Cle -> 1 ++ | Clt | Cge -> 0 in ++` rlwinm {emit_reg res}, {emit_gpr 0}, {emit_int(bitnum+1)}, 31, 31\n`; ++ begin match cmp with ++ Cne | Cle | Cge -> ` xori {emit_reg res}, {emit_reg res}, 1\n` ++ | _ -> () ++ end ++ ++(* Record live pointers at call points *) ++ ++type frame_descr = ++ { fd_lbl: int; (* Return address *) ++ fd_frame_size_lbl: int; (* Size of stack frame *) ++ fd_live_offset: (int * int) list } (* Offsets/regs of live addresses *) ++ ++let frame_descriptors = ref([] : frame_descr list) ++ ++let record_frame live = ++ let lbl = new_label() in ++ let live_offset = ref [] in ++ Reg.Set.iter ++ (function ++ {typ = Addr; loc = Reg r} -> ++ live_offset := (0, (r lsl 1) + 1) :: !live_offset ++ | {typ = Addr; loc = Stack s} as reg -> ++ live_offset := slot_offset s (register_class reg) :: !live_offset ++ | _ -> ()) ++ live; ++ frame_descriptors := ++ { fd_lbl = lbl; ++ fd_frame_size_lbl = !stack_size_lbl; (* frame_size *) ++ fd_live_offset = !live_offset } :: !frame_descriptors; ++ `{emit_label lbl}:\n` ++ ++let emit_frame fd = ++ ` .quad {emit_label fd.fd_lbl} + 4\n`; ++ ` .short {emit_label fd.fd_frame_size_lbl}\n`; ++ ` .short {emit_int (List.length fd.fd_live_offset)}\n`; ++ List.iter ++ (fun (lbl,n) -> ++ ` .short `; ++ if lbl > 0 then `{emit_label lbl}+`; ++ `{emit_int n}\n`) ++ fd.fd_live_offset; ++ ` .align 3\n` ++ ++(* Record external C functions to be called in a position-independent way ++ (for MacOSX) *) ++ ++let pic_externals = (Config.system = "rhapsody") ++ ++let external_functions = ref StringSet.empty ++ ++let emit_external s = ++ ` .non_lazy_symbol_pointer\n`; ++ `L{emit_symbol s}$non_lazy_ptr:\n`; ++ ` .indirect_symbol {emit_symbol s}\n`; ++ ` .quad 0\n` ++ ++(* Names for conditional branches after comparisons *) ++ ++let branch_for_comparison = function ++ Ceq -> "beq" | Cne -> "bne" ++ | Cle -> "ble" | Cgt -> "bgt" ++ | Cge -> "bge" | Clt -> "blt" ++ ++let name_for_int_comparison = function ++ Isigned cmp -> ("cmpd", branch_for_comparison cmp) ++ | Iunsigned cmp -> ("cmpld", branch_for_comparison cmp) ++ ++(* Names for various instructions *) ++ ++let name_for_intop = function ++ Iadd -> "add" ++ | Imul -> "mulld" ++ | Idiv -> "divd" ++ | Iand -> "and" ++ | Ior -> "or" ++ | Ixor -> "xor" ++ | Ilsl -> "sld" ++ | Ilsr -> "srd" ++ | Iasr -> "srad" ++ | _ -> Misc.fatal_error "Emit.Intop" ++ ++let name_for_intop_imm = function ++ Iadd -> "addi" ++ | Imul -> "mulli" ++ | Iand -> "andi." ++ | Ior -> "ori" ++ | Ixor -> "xori" ++ | Ilsl -> "sldi" ++ | Ilsr -> "srdi" ++ | Iasr -> "sradi" ++ | _ -> Misc.fatal_error "Emit.Intop_imm" ++ ++let name_for_floatop1 = function ++ Inegf -> "fneg" ++ | Iabsf -> "fabs" ++ | _ -> Misc.fatal_error "Emit.Iopf1" ++ ++let name_for_floatop2 = function ++ Iaddf -> "fadd" ++ | Isubf -> "fsub" ++ | Imulf -> "fmul" ++ | Idivf -> "fdiv" ++ | _ -> Misc.fatal_error "Emit.Iopf2" ++ ++let name_for_specific = function ++ Imultaddf -> "fmadd" ++ | Imultsubf -> "fmsub" ++ | _ -> Misc.fatal_error "Emit.Ispecific" ++ ++(* Name of current function *) ++let function_name = ref "" ++(* Entry point for tail recursive calls *) ++let tailrec_entry_point = ref 0 ++(* Names of functions defined in the current file *) ++let defined_functions = ref StringSet.empty ++(* Label of glue code for calling the GC *) ++let call_gc_label = ref 0 ++(* Label of jump table *) ++let lbl_jumptbl = ref 0 ++(* List of all labels in jumptable (reverse order) *) ++let jumptbl_entries = ref [] ++(* Number of jumptable entries *) ++let num_jumptbl_entries = ref 0 ++ ++(* Fixup conditional branches that exceed hardware allowed range *) ++ ++let load_store_size = function ++ Ibased(s, d) -> 2 ++ | Iindexed ofs -> if is_immediate ofs then 1 else 3 ++ | Iindexed2 -> 1 ++ ++let instr_size = function ++ Lend -> 0 ++ | Lop(Imove | Ispill | Ireload) -> 1 ++ | Lop(Iconst_int n) -> if is_native_immediate n then 1 else 2 ++ | Lop(Iconst_float s) -> 2 ++ | Lop(Iconst_symbol s) -> 2 ++ | Lop(Icall_ind) -> 6 ++ | Lop(Icall_imm s) -> 7 ++ | Lop(Itailcall_ind) -> if !contains_calls then 7 else if has_stack_frame() then 5 else 4 ++ | Lop(Itailcall_imm s) -> if s = !function_name then 1 else ++ if !contains_calls then 8 else ++ if has_stack_frame() then 6 else 5 ++ | Lop(Iextcall(s, true)) -> 8 ++ | Lop(Iextcall(s, false)) -> 7 ++ | Lop(Istackoffset n) -> 0 ++ | Lop(Iload(chunk, addr)) -> ++ if chunk = Byte_signed ++ then load_store_size addr + 1 ++ else load_store_size addr ++ | Lop(Istore(chunk, addr)) -> load_store_size addr ++ | Lop(Ialloc n) -> 4 ++ | Lop(Ispecific(Ialloc_far n)) -> 5 ++ | Lop(Iintop Imod) -> 3 ++ | Lop(Iintop(Icomp cmp)) -> 4 ++ | Lop(Iintop op) -> 1 ++ | Lop(Iintop_imm(Idiv, n)) -> 2 ++ | Lop(Iintop_imm(Imod, n)) -> 4 ++ | Lop(Iintop_imm(Icomp cmp, n)) -> 4 ++ | Lop(Iintop_imm(op, n)) -> 1 ++ | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 ++ | Lop(Ifloatofint) -> 3 ++ | Lop(Iintoffloat) -> 3 ++ | Lop(Ispecific sop) -> 1 ++ | Lreloadretaddr -> 2 ++ | Lreturn -> if has_stack_frame() then 2 else 1 ++ | Llabel lbl -> 0 ++ | Lbranch lbl -> 1 ++ | Lcondbranch(tst, lbl) -> 2 ++ | Lcondbranch3(lbl0, lbl1, lbl2) -> ++ 1 + (if lbl0 = None then 0 else 1) ++ + (if lbl1 = None then 0 else 1) ++ + (if lbl2 = None then 0 else 1) ++ | Lswitch jumptbl -> 7 ++ | Lsetuptrap lbl -> 1 ++ | Lpushtrap -> 7 ++ | Lpoptrap -> 1 ++ | Lraise -> 6 ++ ++let label_map code = ++ let map = Hashtbl.create 37 in ++ let rec fill_map pc instr = ++ match instr.desc with ++ Lend -> (pc, map) ++ | Llabel lbl -> Hashtbl.add map lbl pc; fill_map pc instr.next ++ | op -> fill_map (pc + instr_size op) instr.next ++ in fill_map 0 code ++ ++let max_branch_offset = 8180 ++(* 14-bit signed offset in words. Remember to cut some slack ++ for multi-word instructions where the branch can be anywhere in ++ the middle. 12 words of slack is plenty. *) ++ ++let branch_overflows map pc_branch lbl_dest = ++ let pc_dest = Hashtbl.find map lbl_dest in ++ let delta = pc_dest - (pc_branch + 1) in ++ delta <= -max_branch_offset || delta >= max_branch_offset ++ ++let opt_branch_overflows map pc_branch opt_lbl_dest = ++ match opt_lbl_dest with ++ None -> false ++ | Some lbl_dest -> branch_overflows map pc_branch lbl_dest ++ ++let fixup_branches codesize map code = ++ let expand_optbranch lbl n arg next = ++ match lbl with ++ None -> next ++ | Some l -> ++ instr_cons (Lcondbranch(Iinttest_imm(Isigned Ceq, n), l)) ++ arg [||] next in ++ let rec fixup did_fix pc instr = ++ match instr.desc with ++ Lend -> did_fix ++ | Lcondbranch(test, lbl) when branch_overflows map pc lbl -> ++ let lbl2 = new_label() in ++ let cont = ++ instr_cons (Lbranch lbl) [||] [||] ++ (instr_cons (Llabel lbl2) [||] [||] instr.next) in ++ instr.desc <- Lcondbranch(invert_test test, lbl2); ++ instr.next <- cont; ++ fixup true (pc + 2) instr.next ++ | Lcondbranch3(lbl0, lbl1, lbl2) ++ when opt_branch_overflows map pc lbl0 ++ || opt_branch_overflows map pc lbl1 ++ || opt_branch_overflows map pc lbl2 -> ++ let cont = ++ expand_optbranch lbl0 0 instr.arg ++ (expand_optbranch lbl1 1 instr.arg ++ (expand_optbranch lbl2 2 instr.arg instr.next)) in ++ instr.desc <- cont.desc; ++ instr.next <- cont.next; ++ fixup true pc instr ++ | Lop(Ialloc n) when codesize - pc >= max_branch_offset -> ++ instr.desc <- Lop(Ispecific(Ialloc_far n)); ++ fixup true (pc + 4) instr.next ++ | op -> ++ fixup did_fix (pc + instr_size op) instr.next ++ in fixup false 0 code ++ ++(* Iterate branch expansion till all conditional branches are OK *) ++ ++let rec branch_normalization code = ++ let (codesize, map) = label_map code in ++ if codesize >= max_branch_offset && fixup_branches codesize map code ++ then branch_normalization code ++ else () ++ ++ ++(* Output the assembly code for an instruction *) ++ ++let rec emit_instr i dslot = ++ match i.desc with ++ Lend -> () ++ | Lop(Imove | Ispill | Ireload) -> ++ let src = i.arg.(0) and dst = i.res.(0) in ++ if src.loc <> dst.loc then begin ++ match (src, dst) with ++ {loc = Reg rs; typ = (Int | Addr)}, {loc = Reg rd} -> ++ ` mr {emit_reg dst}, {emit_reg src}\n` ++ | {loc = Reg rs; typ = Float}, {loc = Reg rd; typ = Float} -> ++ ` fmr {emit_reg dst}, {emit_reg src}\n` ++ | {loc = Reg rs; typ = (Int | Addr)}, {loc = Stack sd} -> ++ ` std {emit_reg src}, {emit_stack dst}\n` ++ | {loc = Reg rs; typ = Float}, {loc = Stack sd} -> ++ ` stfd {emit_reg src}, {emit_stack dst}\n` ++ | {loc = Stack ss; typ = (Int | Addr)}, {loc = Reg rd} -> ++ ` ld {emit_reg dst}, {emit_stack src}\n` ++ | {loc = Stack ss; typ = Float}, {loc = Reg rd} -> ++ ` lfd {emit_reg dst}, {emit_stack src}\n` ++ | (_, _) -> ++ fatal_error "Emit: Imove" ++ end ++ | Lop(Iconst_int n) -> ++ if is_native_immediate n then ++ ` li {emit_reg i.res.(0)}, {emit_nativeint n}\n` ++ else if n >= -0x8000_0000n && n <= 0x7FFF_FFFFn then begin ++ ` lis {emit_reg i.res.(0)}, {emit_int(nativehigh n)}\n`; ++ if nativelow n <> 0 then ++ ` ori {emit_reg i.res.(0)}, {emit_reg i.res.(0)}, {emit_int(nativelow n)}\n` ++ end else begin ++ ` ld {emit_reg i.res.(0)}, {emit_tocref (TocInt n)}\n` ++ end ++ | Lop(Iconst_float s) -> ++ ` lfd {emit_reg i.res.(0)}, {emit_tocref (TocFloat s)}\n` ++ | Lop(Iconst_symbol s) -> ++ ` ld {emit_reg i.res.(0)}, {emit_tocref (TocSymOfs (s,0))}\n` ++ | Lop(Icall_ind) -> ++ ` std {emit_gpr 2},40({emit_gpr 1})\n`; ++ ` ld {emit_gpr 2}, 8({emit_reg i.arg.(0)})\n`; ++ ` ld {emit_reg i.arg.(0)}, 0({emit_reg i.arg.(0)})\n`; ++ ` mtctr {emit_reg i.arg.(0)}\n`; ++ record_frame i.live; ++ ` bctrl\n`; ++ ` ld {emit_gpr 2},40({emit_gpr 1})\n` ++ | Lop(Icall_imm s) -> ++ ` ld {emit_gpr 11}, {emit_tocref (TocSymOfs (s,0))}\n`; ++ ` std {emit_gpr 2},40({emit_gpr 1})\n`; ++ ` ld {emit_gpr 2}, 8({emit_gpr 11})\n`; ++ ` ld {emit_gpr 11}, 0({emit_gpr 11})\n`; ++ ` mtctr {emit_gpr 11}\n`; ++ record_frame i.live; ++ ` bctrl\n`; ++ ` ld {emit_gpr 2},40({emit_gpr 1})\n` ++ | Lop(Itailcall_ind) -> ++ ` ld {emit_gpr 2}, 8({emit_reg i.arg.(0)})\n`; ++ ` ld {emit_reg i.arg.(0)}, 0({emit_reg i.arg.(0)})\n`; ++ ` mtctr {emit_reg i.arg.(0)}\n`; ++ if has_stack_frame() then ++ ` ld {emit_gpr 1}, 0({emit_gpr 1})\n`; ++ if !contains_calls then begin ++ ` ld {emit_gpr 11}, 16({emit_gpr 1})\n`; ++ ` mtlr {emit_gpr 11}\n` ++ end; ++ ` bctr\n` ++ | Lop(Itailcall_imm s) -> ++ if s = !function_name then ++ ` b {emit_label !tailrec_entry_point}\n` ++ else begin ++ if has_stack_frame() then ++ ` ld {emit_gpr 1}, 0({emit_gpr 1})\n`; ++ if !contains_calls then begin ++ ` ld {emit_gpr 11}, 16({emit_gpr 1})\n`; ++ ` mtlr {emit_gpr 11}\n` ++ end; ++ ` ld {emit_gpr 11}, {emit_tocref (TocSymOfs (s,0))}\n`; ++ ` ld {emit_gpr 2}, 8({emit_gpr 11})\n`; ++ ` ld {emit_gpr 11}, 0({emit_gpr 11})\n`; ++ ` mtctr {emit_gpr 11}\n`; ++ ` bctr\n` ++ end ++ | Lop(Iextcall(s, alloc)) -> ++ if alloc then begin ++ ` ld {emit_gpr 11}, {emit_tocref (TocSymOfs (s,0))}\n`; ++ ` ld {emit_gpr 12}, {emit_tocref (TocSymOfs ("caml_c_call",0))}\n`; ++ end else ++ ` ld {emit_gpr 12}, {emit_tocref (TocSymOfs (s,0))}\n`; ++ ` std {emit_gpr 2}, 40({emit_gpr 1})\n`; ++ ` ld {emit_gpr 2}, 8({emit_gpr 12})\n`; ++ ` ld {emit_gpr 12}, 0({emit_gpr 12})\n`; ++ ` mtctr {emit_gpr 12}\n`; ++ if alloc then record_frame i.live; ++ ` bctrl\n`; ++ ` ld {emit_gpr 2}, 40({emit_gpr 1})\n` ++ | Lop(Istackoffset n) -> ++ if n > !stack_args_size then ++ stack_args_size := n ++ | Lop(Iload(chunk, addr)) -> ++ let loadinstr = ++ match chunk with ++ Byte_unsigned -> "lbz" ++ | Byte_signed -> "lbz" ++ | Sixteen_unsigned -> "lhz" ++ | Sixteen_signed -> "lha" ++ | Thirtytwo_unsigned -> "lwz" ++ | Thirtytwo_signed -> "lwa" ++ | Word -> "ld" ++ | Single -> "lfs" ++ | Double | Double_u -> "lfd" in ++ emit_load_store loadinstr addr i.arg 0 i.res.(0); ++ if chunk = Byte_signed then ++ ` extsb {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` ++ | Lop(Istore(chunk, addr)) -> ++ let storeinstr = ++ match chunk with ++ Byte_unsigned | Byte_signed -> "stb" ++ | Sixteen_unsigned | Sixteen_signed -> "sth" ++ | Thirtytwo_unsigned | Thirtytwo_signed -> "stw" ++ | Word -> "std" ++ | Single -> "stfs" ++ | Double | Double_u -> "stfd" in ++ emit_load_store storeinstr addr i.arg 1 i.arg.(0) ++ | Lop(Ialloc n) -> ++ if !call_gc_label = 0 then call_gc_label := new_label(); ++ ` addi {emit_gpr 31}, {emit_gpr 31}, {emit_int(-n)}\n`; ++ ` cmpld {emit_gpr 31}, {emit_gpr 30}\n`; ++ ` addi {emit_reg i.res.(0)}, {emit_gpr 31}, 8\n`; ++ record_frame i.live; ++ ` bltl {emit_label !call_gc_label}\n` (* Must be 4 insns to restart *) ++ | Lop(Ispecific(Ialloc_far n)) -> ++ if !call_gc_label = 0 then call_gc_label := new_label(); ++ let lbl = new_label() in ++ ` addi {emit_gpr 31}, {emit_gpr 31}, {emit_int(-n)}\n`; ++ ` cmpld {emit_gpr 31}, {emit_gpr 30}\n`; ++ ` bge {emit_label lbl}\n`; ++ record_frame i.live; ++ ` bl {emit_label !call_gc_label}\n`; (* Must be 4 insns to restart *) ++ `{emit_label lbl}: addi {emit_reg i.res.(0)}, {emit_gpr 31}, 4\n` ++ | Lop(Iintop Isub) -> (* subfc has swapped arguments *) ++ ` subfc {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n` ++ | Lop(Iintop Imod) -> ++ ` divd {emit_gpr 0}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ++ ` mulld {emit_gpr 0}, {emit_gpr 0}, {emit_reg i.arg.(1)}\n`; ++ ` subfc {emit_reg i.res.(0)}, {emit_gpr 0}, {emit_reg i.arg.(0)}\n` ++ | Lop(Iintop(Icomp cmp)) -> ++ begin match cmp with ++ Isigned c -> ++ ` cmpd {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ++ emit_set_comp c i.res.(0) ++ | Iunsigned c -> ++ ` cmpld {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ++ emit_set_comp c i.res.(0) ++ end ++ | Lop(Iintop Icheckbound) -> ++ ` tdlle {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` ++ | Lop(Iintop op) -> ++ let instr = name_for_intop op in ++ ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` ++ | Lop(Iintop_imm(Isub, n)) -> ++ ` addi {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_int(-n)}\n` ++ | Lop(Iintop_imm(Idiv, n)) -> (* n is guaranteed to be a power of 2 *) ++ let l = Misc.log2 n in ++ ` sradi {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_int l}\n`; ++ ` addze {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` ++ | Lop(Iintop_imm(Imod, n)) -> (* n is guaranteed to be a power of 2 *) ++ let l = Misc.log2 n in ++ ` sradi {emit_gpr 0}, {emit_reg i.arg.(0)}, {emit_int l}\n`; ++ ` addze {emit_gpr 0}, {emit_gpr 0}\n`; ++ ` sldi {emit_gpr 0}, {emit_gpr 0}, {emit_int l}\n`; ++ ` subfc {emit_reg i.res.(0)}, {emit_gpr 0}, {emit_reg i.arg.(0)}\n` ++ | Lop(Iintop_imm(Icomp cmp, n)) -> ++ begin match cmp with ++ Isigned c -> ++ ` cmpdi {emit_reg i.arg.(0)}, {emit_int n}\n`; ++ emit_set_comp c i.res.(0) ++ | Iunsigned c -> ++ ` cmpldi {emit_reg i.arg.(0)}, {emit_int n}\n`; ++ emit_set_comp c i.res.(0) ++ end ++ | Lop(Iintop_imm(Icheckbound, n)) -> ++ ` tdllei {emit_reg i.arg.(0)}, {emit_int n}\n` ++ | Lop(Iintop_imm(op, n)) -> ++ let instr = name_for_intop_imm op in ++ ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_int n}\n` ++ | Lop(Inegf | Iabsf as op) -> ++ let instr = name_for_floatop1 op in ++ ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}\n` ++ | Lop(Iaddf | Isubf | Imulf | Idivf as op) -> ++ let instr = name_for_floatop2 op in ++ ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` ++ | Lop(Ifloatofint) -> ++ let ofs = if has_stack_frame() then 16 else 8 * (2 + num_stack_slots.(0) + num_stack_slots.(1)) in ++ ` std {emit_reg i.arg.(0)}, -{emit_int ofs}({emit_gpr 1})\n`; ++ ` lfd {emit_reg i.res.(0)}, -{emit_int ofs}({emit_gpr 1})\n`; ++ ` fcfid {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` ++ | Lop(Iintoffloat) -> ++ let ofs = if has_stack_frame() then 16 else 8 * (2 + num_stack_slots.(0) + num_stack_slots.(1)) in ++ ` fctidz {emit_fpr 0}, {emit_reg i.arg.(0)}\n`; ++ ` stfd {emit_fpr 0}, -{emit_int ofs}({emit_gpr 1})\n`; ++ ` ld {emit_reg i.res.(0)}, -{emit_int ofs}({emit_gpr 1})\n` ++ | Lop(Ispecific sop) -> ++ let instr = name_for_specific sop in ++ ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n` ++ | Lreloadretaddr -> ++ if has_stack_frame() then begin ++ ` ld {emit_gpr 11}, {emit_label !stack_size_lbl}+16({emit_gpr 1})\n`; ++ ` mtlr {emit_gpr 11}\n` ++ end ++ | Lreturn -> ++ if has_stack_frame() then ++ ` ld {emit_gpr 1}, 0({emit_gpr 1})\n`; ++ ` blr\n` ++ | Llabel lbl -> ++ `{emit_label lbl}:\n` ++ | Lbranch lbl -> ++ ` b {emit_label lbl}\n` ++ | Lcondbranch(tst, lbl) -> ++ begin match tst with ++ Itruetest -> ++ ` cmpdi {emit_reg i.arg.(0)}, 0\n`; ++ emit_delay dslot; ++ ` bne {emit_label lbl}\n` ++ | Ifalsetest -> ++ ` cmpdi {emit_reg i.arg.(0)}, 0\n`; ++ emit_delay dslot; ++ ` beq {emit_label lbl}\n` ++ | Iinttest cmp -> ++ let (comp, branch) = name_for_int_comparison cmp in ++ ` {emit_string comp} {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ++ emit_delay dslot; ++ ` {emit_string branch} {emit_label lbl}\n` ++ | Iinttest_imm(cmp, n) -> ++ let (comp, branch) = name_for_int_comparison cmp in ++ ` {emit_string comp}i {emit_reg i.arg.(0)}, {emit_int n}\n`; ++ emit_delay dslot; ++ ` {emit_string branch} {emit_label lbl}\n` ++ | Ifloattest(cmp, neg) -> ++ ` fcmpu {emit_ccr 0}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ++ (* bit 0 = lt, bit 1 = gt, bit 2 = eq *) ++ let (bitnum, negtst) = ++ match cmp with ++ Ceq -> (2, neg) ++ | Cne -> (2, not neg) ++ | Cle -> ` cror 3, 0, 2\n`; (* lt or eq *) ++ (3, neg) ++ | Cgt -> (1, neg) ++ | Cge -> ` cror 3, 1, 2\n`; (* gt or eq *) ++ (3, neg) ++ | Clt -> (0, neg) in ++ emit_delay dslot; ++ if negtst ++ then ` bf {emit_int bitnum}, {emit_label lbl}\n` ++ else ` bt {emit_int bitnum}, {emit_label lbl}\n` ++ | Ioddtest -> ++ ` andi. {emit_gpr 0}, {emit_reg i.arg.(0)}, 1\n`; ++ emit_delay dslot; ++ ` bne {emit_label lbl}\n` ++ | Ieventest -> ++ ` andi. {emit_gpr 0}, {emit_reg i.arg.(0)}, 1\n`; ++ emit_delay dslot; ++ ` beq {emit_label lbl}\n` ++ end ++ | Lcondbranch3(lbl0, lbl1, lbl2) -> ++ ` cmpdi {emit_reg i.arg.(0)}, 1\n`; ++ emit_delay dslot; ++ begin match lbl0 with ++ None -> () ++ | Some lbl -> ` blt {emit_label lbl}\n` ++ end; ++ begin match lbl1 with ++ None -> () ++ | Some lbl -> ` beq {emit_label lbl}\n` ++ end; ++ begin match lbl2 with ++ None -> () ++ | Some lbl -> ` bgt {emit_label lbl}\n` ++ end ++ | Lswitch jumptbl -> ++ if !lbl_jumptbl = 0 then lbl_jumptbl := new_label(); ++ ` ld {emit_gpr 11}, {emit_tocref (TocLabel !lbl_jumptbl)}\n`; ++ ` addi {emit_gpr 0}, {emit_reg i.arg.(0)}, {emit_int !num_jumptbl_entries}\n`; ++ ` sldi {emit_gpr 0}, {emit_gpr 0}, 2\n`; ++ ` lwax {emit_gpr 0}, {emit_gpr 11}, {emit_gpr 0}\n`; ++ ` add {emit_gpr 0}, {emit_gpr 11}, {emit_gpr 0}\n`; ++ ` mtctr {emit_gpr 0}\n`; ++ ` bctr\n`; ++ for i = 0 to Array.length jumptbl - 1 do ++ jumptbl_entries := jumptbl.(i) :: !jumptbl_entries; ++ incr num_jumptbl_entries ++ done ++ | Lsetuptrap lbl -> ++ ` bl {emit_label lbl}\n`; ++ | Lpushtrap -> ++ stack_traps_size := !stack_traps_size + 32; ++ ` addi {emit_gpr 11}, {emit_gpr 1}, {emit_label !stack_size_lbl}-{emit_int !stack_traps_size}\n`; ++ ` mflr {emit_gpr 0}\n`; ++ ` std {emit_gpr 29}, 0({emit_gpr 11})\n`; ++ ` std {emit_gpr 0}, 8({emit_gpr 11})\n`; ++ ` std {emit_gpr 1}, 16({emit_gpr 11})\n`; ++ ` std {emit_gpr 2}, 24({emit_gpr 11})\n`; ++ ` mr {emit_gpr 29}, {emit_gpr 11}\n` ++ | Lpoptrap -> ++ ` ld {emit_gpr 29}, 0({emit_gpr 29})\n` ++ | Lraise -> ++ ` ld {emit_gpr 0}, 8({emit_gpr 29})\n`; ++ ` ld {emit_gpr 1}, 16({emit_gpr 29})\n`; ++ ` ld {emit_gpr 2}, 24({emit_gpr 29})\n`; ++ ` mtlr {emit_gpr 0}\n`; ++ ` ld {emit_gpr 29}, 0({emit_gpr 29})\n`; ++ ` blr\n` ++ ++and emit_delay = function ++ None -> () ++ | Some i -> emit_instr i None ++ ++(* Checks if a pseudo-instruction expands to instructions ++ that do not branch and do not affect CR0 nor R12. *) ++ ++let is_simple_instr i = ++ match i.desc with ++ Lop op -> ++ begin match op with ++ Icall_imm _ | Icall_ind | Itailcall_imm _ | Itailcall_ind | ++ Iextcall(_, _) -> false ++ | Ialloc(_) -> false ++ | Iintop(Icomp _) -> false ++ | Iintop_imm(Iand, _) -> false ++ | Iintop_imm(Icomp _, _) -> false ++ | _ -> true ++ end ++ | Lreloadretaddr -> true ++ | _ -> false ++ ++let no_interference res arg = ++ try ++ for i = 0 to Array.length arg - 1 do ++ for j = 0 to Array.length res - 1 do ++ if arg.(i).loc = res.(j).loc then raise Exit ++ done ++ done; ++ true ++ with Exit -> ++ false ++ ++(* Emit a sequence of instructions, trying to fill delay slots for branches *) ++ ++let rec emit_all i = ++ match i with ++ {desc = Lend} -> () ++ | {next = {desc = (Lcondbranch(_, _) | Lcondbranch3(_, _, _))}} ++ when is_simple_instr i & no_interference i.res i.next.arg -> ++ emit_instr i.next (Some i); ++ emit_all i.next.next ++ | _ -> ++ emit_instr i None; ++ emit_all i.next ++ ++(* Emission of a function declaration *) ++ ++let fundecl fundecl = ++ function_name := fundecl.fun_name; ++ defined_functions := StringSet.add fundecl.fun_name !defined_functions; ++ tailrec_entry_point := new_label(); ++ if has_stack_frame() then ++ stack_size_lbl := new_label(); ++ stack_slot_lbl := new_label(); ++ stack_args_size := 0; ++ stack_traps_size := 0; ++ call_gc_label := 0; ++ ` .globl {emit_symbol fundecl.fun_name}\n`; ++ begin match Config.system with ++ | "elf" | "bsd" -> ++ ` .section \".opd\",\"aw\"\n`; ++ ` .align 3\n`; ++ ` .type {emit_symbol fundecl.fun_name}, @function\n`; ++ `{emit_symbol fundecl.fun_name}:\n`; ++ ` .quad .L.{emit_symbol fundecl.fun_name},.TOC.@tocbase\n`; ++ ` .previous\n`; ++ ` .align 2\n`; ++ emit_string code_space; ++ `.L.{emit_symbol fundecl.fun_name}:\n` ++ | _ -> ++ ` .align 2\n`; ++ emit_string code_space; ++ `{emit_symbol fundecl.fun_name}:\n` ++ end; ++ if !contains_calls then begin ++ ` mflr {emit_gpr 0}\n`; ++ ` std {emit_gpr 0}, 16({emit_gpr 1})\n` ++ end; ++ if has_stack_frame() then ++ ` stdu {emit_gpr 1}, -{emit_label !stack_size_lbl}({emit_gpr 1})\n`; ++ `{emit_label !tailrec_entry_point}:\n`; ++ branch_normalization fundecl.fun_body; ++ emit_all fundecl.fun_body; ++ ` .size .L.{emit_symbol fundecl.fun_name}, . - .L.{emit_symbol fundecl.fun_name}\n`; ++ if has_stack_frame() then begin ++ ` .set {emit_label !stack_size_lbl},{emit_int (frame_size_sans_args() + !stack_args_size + !stack_traps_size)} # stack size including traps\n`; ++ ` .set {emit_label !stack_slot_lbl},{emit_int (48 + !stack_args_size)} # stack slot offset\n` ++ end else (* leave 8 bytes for float <-> conversions *) ++ ` .set {emit_label !stack_slot_lbl},{emit_int (40-frame_size_sans_args())} # stack slot offset (negative)\n`; ++ ++ (* Emit the glue code to call the GC *) ++ if !call_gc_label > 0 then begin ++ `{emit_label !call_gc_label}:\n`; ++ ` ld {emit_gpr 12}, {emit_tocref (TocSymOfs ("caml_call_gc",0))}\n`; ++ ` ld {emit_gpr 12}, 0({emit_gpr 12})\n`; ++ ` mtctr {emit_gpr 12}\n`; ++ ` bctr\n`; ++ end ++ ++(* Emission of data *) ++ ++let declare_global_data s = ++ ` .globl {emit_symbol s}\n`; ++ if Config.system = "elf" || Config.system = "bsd" then ++ ` .type {emit_symbol s}, @object\n` ++ ++let emit_item = function ++ Cglobal_symbol s -> ++ declare_global_data s ++ | Cdefine_symbol s -> ++ `{emit_symbol s}:\n`; ++ | Cdefine_label lbl -> ++ `{emit_label (lbl + 100000)}:\n` ++ | Cint8 n -> ++ ` .byte {emit_int n}\n` ++ | Cint16 n -> ++ ` .short {emit_int n}\n` ++ | Cint32 n -> ++ ` .long {emit_nativeint n}\n` ++ | Cint n -> ++ ` .quad {emit_nativeint n}\n` ++ | Csingle f -> ++ ` .float 0d{emit_string f}\n` ++ | Cdouble f -> ++ ` .double 0d{emit_string f}\n` ++ | Csymbol_address s -> ++ ` .quad {emit_symbol s}\n` ++ | Clabel_address lbl -> ++ ` .quad {emit_label (lbl + 100000)}\n` ++ | Cstring s -> ++ emit_bytes_directive " .byte " s ++ | Cskip n -> ++ if n > 0 then ` .space {emit_int n}\n` ++ | Calign n -> ++ ` .align {emit_int (Misc.log2 n)}\n` ++ ++let data l = ++ emit_string data_space; ++ List.iter emit_item l ++ ++(* Beginning / end of an assembly file *) ++ ++let begin_assembly() = ++ defined_functions := StringSet.empty; ++ external_functions := StringSet.empty; ++ tocref_entries := []; ++ num_jumptbl_entries := 0; ++ jumptbl_entries := []; ++ lbl_jumptbl := 0; ++ (* Emit the beginning of the segments *) ++ let lbl_begin = Compilenv.make_symbol (Some "data_begin") in ++ emit_string data_space; ++ declare_global_data lbl_begin; ++ `{emit_symbol lbl_begin}:\n`; ++ let lbl_begin = Compilenv.make_symbol (Some "code_begin") in ++ emit_string code_space; ++ declare_global_data lbl_begin; ++ `{emit_symbol lbl_begin}:\n` ++ ++let end_assembly() = ++ (* Emit the jump table *) ++ if !num_jumptbl_entries > 0 then begin ++ emit_string code_space; ++ `{emit_label !lbl_jumptbl}:\n`; ++ List.iter ++ (fun lbl -> ` .long {emit_label lbl} - {emit_label !lbl_jumptbl}\n`) ++ (List.rev !jumptbl_entries); ++ jumptbl_entries := [] ++ end; ++ if !tocref_entries <> [] then begin ++ emit_string toc_space; ++ List.iter ++ (fun (lbl, entry) -> ++ `{emit_label lbl}:\n`; ++ match entry with ++ TocFloat f -> ++ ` .double {emit_tocentry entry}\n` ++ | _ -> ++ ` .tc {emit_label lbl}[TC],{emit_tocentry entry}\n` ++ ) ++ !tocref_entries; ++ tocref_entries := [] ++ end; ++ if pic_externals then ++ (* Emit the pointers to external functions *) ++ StringSet.iter emit_external !external_functions; ++ (* Emit the end of the segments *) ++ emit_string code_space; ++ let lbl_end = Compilenv.make_symbol (Some "code_end") in ++ declare_global_data lbl_end; ++ `{emit_symbol lbl_end}:\n`; ++ ` .long 0\n`; ++ emit_string data_space; ++ let lbl_end = Compilenv.make_symbol (Some "data_end") in ++ declare_global_data lbl_end; ++ `{emit_symbol lbl_end}:\n`; ++ ` .quad 0\n`; ++ (* Emit the frame descriptors *) ++ emit_string rodata_space; ++ let lbl = Compilenv.make_symbol (Some "frametable") in ++ declare_global_data lbl; ++ `{emit_symbol lbl}:\n`; ++ ` .quad {emit_int (List.length !frame_descriptors)}\n`; ++ List.iter emit_frame !frame_descriptors; ++ frame_descriptors := [] +diff -uNr ocaml-3.10.1/asmcomp/power64/proc.ml ocaml-3.10.1.ppc64/asmcomp/power64/proc.ml +--- ocaml-3.10.1/asmcomp/power64/proc.ml 1969-12-31 19:00:00.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmcomp/power64/proc.ml 2008-02-29 08:37:45.000000000 -0500 +@@ -0,0 +1,245 @@ ++(***********************************************************************) ++(* *) ++(* Objective Caml *) ++(* *) ++(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) ++(* *) ++(* Copyright 1996 Institut National de Recherche en Informatique et *) ++(* en Automatique. All rights reserved. This file is distributed *) ++(* under the terms of the Q Public License version 1.0. *) ++(* *) ++(***********************************************************************) ++ ++(* $Id: proc.ml,v 1.12 2004/06/19 17:39:35 xleroy Exp $ *) ++ ++(* Description of the Power PC *) ++ ++open Misc ++open Cmm ++open Reg ++open Arch ++open Mach ++ ++(* Instruction selection *) ++ ++let word_addressed = false ++ ++(* Registers available for register allocation *) ++ ++(* Integer register map: ++ 0 temporary, null register for some operations ++ 1 stack pointer ++ 2 pointer to table of contents ++ 3 - 10 function arguments and results ++ 11 - 12 temporaries ++ 13 pointer to small data area ++ 14 - 28 general purpose, preserved by C ++ 29 trap pointer ++ 30 allocation limit ++ 31 allocation pointer ++ Floating-point register map: ++ 0 temporary ++ 1 - 13 function arguments and results ++ 14 - 31 general purpose, preserved by C ++*) ++ ++let int_reg_name = ++ if Config.system = "rhapsody" then ++ [| "r3"; "r4"; "r5"; "r6"; "r7"; "r8"; "r9"; "r10"; ++ "r14"; "r15"; "r16"; "r17"; "r18"; "r19"; "r20"; "r21"; ++ "r22"; "r23"; "r24"; "r25"; "r26"; "r27"; "r28" |] ++ else ++ [| "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; ++ "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; ++ "22"; "23"; "24"; "25"; "26"; "27"; "28" |] ++ ++let float_reg_name = ++ if Config.system = "rhapsody" then ++ [| "f1"; "f2"; "f3"; "f4"; "f5"; "f6"; "f7"; "f8"; ++ "f9"; "f10"; "f11"; "f12"; "f13"; "f14"; "f15"; "f16"; ++ "f17"; "f18"; "f19"; "f20"; "f21"; "f22"; "f23"; "f24"; ++ "f25"; "f26"; "f27"; "f28"; "f29"; "f30"; "f31" |] ++ else ++ [| "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; ++ "9"; "10"; "11"; "12"; "13"; "14"; "15"; "16"; ++ "17"; "18"; "19"; "20"; "21"; "22"; "23"; "24"; ++ "25"; "26"; "27"; "28"; "29"; "30"; "31" |] ++ ++let num_register_classes = 2 ++ ++let register_class r = ++ match r.typ with ++ Int -> 0 ++ | Addr -> 0 ++ | Float -> 1 ++ ++let num_available_registers = [| 23; 31 |] ++ ++let first_available_register = [| 0; 100 |] ++ ++let register_name r = ++ if r < 100 then int_reg_name.(r) else float_reg_name.(r - 100) ++ ++let rotate_registers = true ++ ++(* Representation of hard registers by pseudo-registers *) ++ ++let hard_int_reg = ++ let v = Array.create 23 Reg.dummy in ++ for i = 0 to 22 do v.(i) <- Reg.at_location Int (Reg i) done; v ++ ++let hard_float_reg = ++ let v = Array.create 31 Reg.dummy in ++ for i = 0 to 30 do v.(i) <- Reg.at_location Float (Reg(100 + i)) done; v ++ ++let all_phys_regs = ++ Array.append hard_int_reg hard_float_reg ++ ++let phys_reg n = ++ if n < 100 then hard_int_reg.(n) else hard_float_reg.(n - 100) ++ ++let stack_slot slot ty = ++ Reg.at_location ty (Stack slot) ++ ++(* Calling conventions *) ++ ++let calling_conventions ++ first_int last_int first_float last_float make_stack stack_ofs arg = ++ let loc = Array.create (Array.length arg) Reg.dummy in ++ let int = ref first_int in ++ let float = ref first_float in ++ let ofs = ref stack_ofs in ++ for i = 0 to Array.length arg - 1 do ++ match arg.(i).typ with ++ Int | Addr as ty -> ++ if !int <= last_int then begin ++ loc.(i) <- phys_reg !int; ++ incr int ++ end else begin ++ loc.(i) <- stack_slot (make_stack !ofs) ty; ++ end; ++ ofs := !ofs + 8 ++ | Float -> ++ if !float <= last_float then begin ++ loc.(i) <- phys_reg !float; ++ incr float ++ end else begin ++ loc.(i) <- stack_slot (make_stack !ofs) Float; ++ end; ++ ofs := !ofs + 8 ++ done; ++ (loc, Misc.align !ofs 16) ++ (* Keep stack 16-aligned. *) ++ ++let incoming ofs = Incoming ofs ++let outgoing ofs = Outgoing ofs ++let not_supported ofs = fatal_error "Proc.loc_results: cannot call" ++ ++let loc_arguments arg = ++ calling_conventions 0 7 100 112 outgoing 48 arg ++let loc_parameters arg = ++ let (loc, ofs) = calling_conventions 0 7 100 112 incoming 0 arg in loc ++let loc_results res = ++ let (loc, ofs) = calling_conventions 0 7 100 112 not_supported 0 res in loc ++ ++(* C calling conventions under PowerOpen: ++ use GPR 3-10 and FPR 1-13 just like ML calling ++ conventions, but always reserve stack space for all arguments. ++ Also, using a float register automatically reserves two int registers ++ (in 32-bit mode) or one int register (in 64-bit mode). ++ (If we were to call a non-prototyped C function, each float argument ++ would have to go both in a float reg and in the matching pair ++ of integer regs.) ++ ++ C calling conventions under SVR4: ++ use GPR 3-10 and FPR 1-8 just like ML calling conventions. ++ Using a float register does not affect the int registers. ++ Always reserve 8 bytes at bottom of stack, plus whatever is needed ++ to hold the overflow arguments. *) ++ ++let poweropen_external_conventions first_int last_int ++ first_float last_float arg = ++ let loc = Array.create (Array.length arg) Reg.dummy in ++ let int = ref first_int in ++ let float = ref first_float in ++ let ofs = ref 112 in ++ for i = 0 to Array.length arg - 1 do ++ match arg.(i).typ with ++ Int | Addr as ty -> ++ if !int <= last_int then begin ++ loc.(i) <- phys_reg !int; ++ incr int ++ end else begin ++ loc.(i) <- stack_slot (Outgoing !ofs) ty; ++ ofs := !ofs + size_int ++ end ++ | Float -> ++ if !float <= last_float then begin ++ loc.(i) <- phys_reg !float; ++ incr float ++ end else begin ++ loc.(i) <- stack_slot (Outgoing !ofs) Float; ++ ofs := !ofs + size_float ++ end; ++ int := !int + 1 ++ done; ++ (loc, Misc.align !ofs 16) (* Keep stack 16-aligned *) ++ ++let loc_external_arguments = ++ match Config.system with ++ | "rhapsody" -> poweropen_external_conventions 0 7 100 112 ++ | "elf" | "bsd" -> calling_conventions 0 7 100 107 outgoing 8 ++ | _ -> assert false ++ ++let extcall_use_push = false ++ ++(* Results are in GPR 3 and FPR 1 *) ++ ++let loc_external_results res = ++ let (loc, ofs) = calling_conventions 0 0 100 100 not_supported 0 res in loc ++ ++(* Exceptions are in GPR 3 *) ++ ++let loc_exn_bucket = phys_reg 0 ++ ++(* Registers destroyed by operations *) ++ ++let destroyed_at_c_call = ++ Array.of_list(List.map phys_reg ++ [0; 1; 2; 3; 4; 5; 6; 7; ++ 100; 101; 102; 103; 104; 105; 106; 107; 108; 109; 110; 111; 112]) ++ ++let destroyed_at_oper = function ++ Iop(Icall_ind | Icall_imm _ | Iextcall(_, true)) -> all_phys_regs ++ | Iop(Iextcall(_, false)) -> destroyed_at_c_call ++ | _ -> [||] ++ ++let destroyed_at_raise = all_phys_regs ++ ++(* Maximal register pressure *) ++ ++let safe_register_pressure = function ++ Iextcall(_, _) -> 15 ++ | _ -> 23 ++ ++let max_register_pressure = function ++ Iextcall(_, _) -> [| 15; 18 |] ++ | _ -> [| 23; 30 |] ++ ++(* Layout of the stack *) ++ ++let num_stack_slots = [| 0; 0 |] ++let contains_calls = ref false ++ ++(* Calling the assembler *) ++ ++let assemble_file infile outfile = ++ let infile = Filename.quote infile ++ and outfile = Filename.quote outfile in ++ match Config.system with ++ | "elf" -> ++ Ccomp.command ("as -u -m ppc64 -o " ^ outfile ^ " " ^ infile) ++ | _ -> assert false ++ ++open Clflags;; ++open Config;; +diff -uNr ocaml-3.10.1/asmcomp/power64/reload.ml ocaml-3.10.1.ppc64/asmcomp/power64/reload.ml +--- ocaml-3.10.1/asmcomp/power64/reload.ml 1969-12-31 19:00:00.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmcomp/power64/reload.ml 2008-02-29 08:37:45.000000000 -0500 +@@ -0,0 +1,18 @@ ++(***********************************************************************) ++(* *) ++(* Objective Caml *) ++(* *) ++(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) ++(* *) ++(* Copyright 1996 Institut National de Recherche en Informatique et *) ++(* en Automatique. All rights reserved. This file is distributed *) ++(* under the terms of the Q Public License version 1.0. *) ++(* *) ++(***********************************************************************) ++ ++(* $Id: reload.ml,v 1.3 1999/11/17 18:56:46 xleroy Exp $ *) ++ ++(* Reloading for the PowerPC *) ++ ++let fundecl f = ++ (new Reloadgen.reload_generic)#fundecl f +diff -uNr ocaml-3.10.1/asmcomp/power64/scheduling.ml ocaml-3.10.1.ppc64/asmcomp/power64/scheduling.ml +--- ocaml-3.10.1/asmcomp/power64/scheduling.ml 1969-12-31 19:00:00.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmcomp/power64/scheduling.ml 2008-02-29 08:37:45.000000000 -0500 +@@ -0,0 +1,66 @@ ++(***********************************************************************) ++(* *) ++(* Objective Caml *) ++(* *) ++(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) ++(* *) ++(* Copyright 1996 Institut National de Recherche en Informatique et *) ++(* en Automatique. All rights reserved. This file is distributed *) ++(* under the terms of the Q Public License version 1.0. *) ++(* *) ++(***********************************************************************) ++ ++(* $Id: scheduling.ml,v 1.6 2004/06/19 16:13:33 xleroy Exp $ *) ++ ++(* Instruction scheduling for the Power PC *) ++ ++open Arch ++open Mach ++ ++class scheduler = object ++ ++inherit Schedgen.scheduler_generic ++ ++(* Latencies (in cycles). Based roughly on the "common model". *) ++ ++method oper_latency = function ++ Ireload -> 2 ++ | Iload(_, _) -> 2 ++ | Iconst_float _ -> 2 (* turned into a load *) ++ | Iconst_symbol _ -> 1 ++ | Iintop Imul -> 9 ++ | Iintop_imm(Imul, _) -> 5 ++ | Iintop(Idiv | Imod) -> 36 ++ | Iaddf | Isubf -> 4 ++ | Imulf -> 5 ++ | Idivf -> 33 ++ | Ispecific(Imultaddf | Imultsubf) -> 5 ++ | _ -> 1 ++ ++method reload_retaddr_latency = 12 ++ (* If we can have that many cycles between the reloadretaddr and the ++ return, we can expect that the blr branch will be completely folded. *) ++ ++(* Issue cycles. Rough approximations. *) ++ ++method oper_issue_cycles = function ++ Iconst_float _ | Iconst_symbol _ -> 2 ++ | Iload(_, Ibased(_, _)) -> 2 ++ | Istore(_, Ibased(_, _)) -> 2 ++ | Ialloc _ -> 4 ++ | Iintop(Imod) -> 40 (* assuming full stall *) ++ | Iintop(Icomp _) -> 4 ++ | Iintop_imm(Idiv, _) -> 2 ++ | Iintop_imm(Imod, _) -> 4 ++ | Iintop_imm(Icomp _, _) -> 4 ++ | Ifloatofint -> 9 ++ | Iintoffloat -> 4 ++ | _ -> 1 ++ ++method reload_retaddr_issue_cycles = 3 ++ (* load then stalling mtlr *) ++ ++end ++ ++let fundecl f = (new scheduler)#schedule_fundecl f ++ +diff -uNr ocaml-3.10.1/asmcomp/power64/selection.ml ocaml-3.10.1.ppc64/asmcomp/power64/selection.ml +--- ocaml-3.10.1/asmcomp/power64/selection.ml 1969-12-31 19:00:00.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmcomp/power64/selection.ml 2008-02-29 08:37:45.000000000 -0500 +@@ -0,0 +1,103 @@ ++(***********************************************************************) ++(* *) ++(* Objective Caml *) ++(* *) ++(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) ++(* *) ++(* Copyright 1997 Institut National de Recherche en Informatique et *) ++(* en Automatique. All rights reserved. This file is distributed *) ++(* under the terms of the Q Public License version 1.0. *) ++(* *) ++(***********************************************************************) ++ ++(* $Id: selection.ml,v 1.6 2004/06/19 16:13:33 xleroy Exp $ *) ++ ++(* Instruction selection for the Power PC processor *) ++ ++open Misc ++open Cmm ++open Reg ++open Arch ++open Mach ++ ++(* Recognition of addressing modes *) ++ ++type addressing_expr = ++ Asymbol of string ++ | Alinear of expression ++ | Aadd of expression * expression ++ ++let rec select_addr = function ++ Cconst_symbol s -> ++ (Asymbol s, 0) ++ | Cop((Caddi | Cadda), [arg; Cconst_int m]) -> ++ let (a, n) = select_addr arg in (a, n + m) ++ | Cop((Caddi | Cadda), [Cconst_int m; arg]) -> ++ let (a, n) = select_addr arg in (a, n + m) ++ | Cop((Caddi | Cadda), [arg1; arg2]) -> ++ begin match (select_addr arg1, select_addr arg2) with ++ ((Alinear e1, n1), (Alinear e2, n2)) -> ++ (Aadd(e1, e2), n1 + n2) ++ | _ -> ++ (Aadd(arg1, arg2), 0) ++ end ++ | exp -> ++ (Alinear exp, 0) ++ ++(* Instruction selection *) ++ ++class selector = object (self) ++ ++inherit Selectgen.selector_generic as super ++ ++method is_immediate n = (n <= 32767) && (n >= -32768) ++ ++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) -> ++ if d = 0 ++ then (Iindexed2, Ctuple[e1; e2]) ++ else (Iindexed d, Cop(Cadda, [e1; e2])) ++ ++method select_operation op args = ++ match (op, args) with ++ (* Prevent the recognition of (x / cst) and (x % cst) when cst is not ++ a power of 2, which do not correspond to an instruction. *) ++ (Cdivi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> ++ (Iintop_imm(Idiv, n), [arg]) ++ | (Cdivi, _) -> ++ (Iintop Idiv, args) ++ | (Cmodi, [arg; Cconst_int n]) when n = 1 lsl (Misc.log2 n) -> ++ (Iintop_imm(Imod, n), [arg]) ++ | (Cmodi, _) -> ++ (Iintop Imod, args) ++ (* The and, or and xor instructions have a different range of immediate ++ operands than the other instructions *) ++ | (Cand, _) -> self#select_logical Iand args ++ | (Cor, _) -> self#select_logical Ior args ++ | (Cxor, _) -> self#select_logical Ixor args ++ (* Recognize mult-add and mult-sub instructions *) ++ | (Caddf, [Cop(Cmulf, [arg1; arg2]); arg3]) -> ++ (Ispecific Imultaddf, [arg1; arg2; arg3]) ++ | (Caddf, [arg3; Cop(Cmulf, [arg1; arg2])]) -> ++ (Ispecific Imultaddf, [arg1; arg2; arg3]) ++ | (Csubf, [Cop(Cmulf, [arg1; arg2]); arg3]) -> ++ (Ispecific Imultsubf, [arg1; arg2; arg3]) ++ | _ -> ++ super#select_operation op args ++ ++method select_logical op = function ++ [arg; Cconst_int n] when n >= 0 && n <= 0xFFFF -> ++ (Iintop_imm(op, n), [arg]) ++ | [Cconst_int n; arg] when n >= 0 && n <= 0xFFFF -> ++ (Iintop_imm(op, n), [arg]) ++ | args -> ++ (Iintop op, args) ++ ++end ++ ++let fundecl f = (new selector)#emit_fundecl f +diff -uNr ocaml-3.10.1/asmrun/Makefile ocaml-3.10.1.ppc64/asmrun/Makefile +--- ocaml-3.10.1/asmrun/Makefile 2007-02-23 04:29:45.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmrun/Makefile 2008-02-29 08:37:45.000000000 -0500 +@@ -74,6 +74,12 @@ + power.p.o: power-$(SYSTEM).o + cp power-$(SYSTEM).o power.p.o + ++power64.o: power64-$(SYSTEM).o ++ cp power64-$(SYSTEM).o power64.o ++ ++power64.p.o: power64-$(SYSTEM).o ++ cp power64-$(SYSTEM).o power64.p.o ++ + main.c: ../byterun/main.c + ln -s ../byterun/main.c main.c + misc.c: ../byterun/misc.c +diff -uNr ocaml-3.10.1/asmrun/power64-elf.S ocaml-3.10.1.ppc64/asmrun/power64-elf.S +--- ocaml-3.10.1/asmrun/power64-elf.S 1969-12-31 19:00:00.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmrun/power64-elf.S 2008-02-29 08:37:45.000000000 -0500 +@@ -0,0 +1,486 @@ ++/*********************************************************************/ ++/* */ ++/* Objective Caml */ ++/* */ ++/* Xavier Leroy, projet Cristal, INRIA Rocquencourt */ ++/* */ ++/* Copyright 1996 Institut National de Recherche en Informatique et */ ++/* en Automatique. All rights reserved. This file is distributed */ ++/* under the terms of the GNU Library General Public License, with */ ++/* the special exception on linking described in file ../LICENSE. */ ++/* */ ++/*********************************************************************/ ++ ++/* $Id: power-elf.S,v 1.18 2004/01/03 12:51:19 doligez Exp $ */ ++ ++#define Addrglobal(reg,glob) \ ++ addis reg, 0, glob@ha; \ ++ addi reg, reg, glob@l ++#define Loadglobal(reg,glob,tmp) \ ++ addis tmp, 0, glob@ha; \ ++ ld reg, glob@l(tmp) ++#define Storeglobal(reg,glob,tmp) \ ++ addis tmp, 0, glob@ha; \ ++ std reg, glob@l(tmp) ++ ++ .section ".text" ++ ++/* Invoke the garbage collector. */ ++ ++ .globl caml_call_gc ++ .type caml_call_gc, @function ++ .section ".opd","aw" ++ .align 3 ++caml_call_gc: ++ .quad .L.caml_call_gc,.TOC.@tocbase ++ .previous ++ .align 2 ++.L.caml_call_gc: ++ /* Set up stack frame */ ++ mflr 0 ++ std 0, 16(1) ++ /* Record return address into Caml code */ ++ Storeglobal(0, caml_last_return_address, 11) ++ /* Record lowest stack address */ ++ Storeglobal(1, caml_bottom_of_stack, 11) ++ /* 0x220 = 8*32 (int regs) + 8*32 (float regs) + 48 (stack frame) */ ++ stdu 1, -0x230(1) ++ /* Record pointer to register array */ ++ addi 0, 1, 8*32 + 48 ++ Storeglobal(0, caml_gc_regs, 11) ++ /* Save current allocation pointer for debugging purposes */ ++ Storeglobal(31, caml_young_ptr, 11) ++ /* Save exception pointer (if e.g. a sighandler raises) */ ++ Storeglobal(29, caml_exception_pointer, 11) ++ /* Save all registers used by the code generator */ ++ addi 11, 1, 8*32 + 48 - 8 ++ stdu 3, 8(11) ++ stdu 4, 8(11) ++ stdu 5, 8(11) ++ stdu 6, 8(11) ++ stdu 7, 8(11) ++ stdu 8, 8(11) ++ stdu 9, 8(11) ++ stdu 10, 8(11) ++ stdu 14, 8(11) ++ stdu 15, 8(11) ++ stdu 16, 8(11) ++ stdu 17, 8(11) ++ stdu 18, 8(11) ++ stdu 19, 8(11) ++ stdu 20, 8(11) ++ stdu 21, 8(11) ++ stdu 22, 8(11) ++ stdu 23, 8(11) ++ stdu 24, 8(11) ++ stdu 25, 8(11) ++ stdu 26, 8(11) ++ stdu 27, 8(11) ++ stdu 28, 8(11) ++ addi 11, 1, 48 - 8 ++ stfdu 1, 8(11) ++ stfdu 2, 8(11) ++ stfdu 3, 8(11) ++ stfdu 4, 8(11) ++ stfdu 5, 8(11) ++ stfdu 6, 8(11) ++ stfdu 7, 8(11) ++ stfdu 8, 8(11) ++ stfdu 9, 8(11) ++ stfdu 10, 8(11) ++ stfdu 11, 8(11) ++ stfdu 12, 8(11) ++ stfdu 13, 8(11) ++ stfdu 14, 8(11) ++ stfdu 15, 8(11) ++ stfdu 16, 8(11) ++ stfdu 17, 8(11) ++ stfdu 18, 8(11) ++ stfdu 19, 8(11) ++ stfdu 20, 8(11) ++ stfdu 21, 8(11) ++ stfdu 22, 8(11) ++ stfdu 23, 8(11) ++ stfdu 24, 8(11) ++ stfdu 25, 8(11) ++ stfdu 26, 8(11) ++ stfdu 27, 8(11) ++ stfdu 28, 8(11) ++ stfdu 29, 8(11) ++ stfdu 30, 8(11) ++ stfdu 31, 8(11) ++ /* Call the GC */ ++ std 2,40(1) ++ Addrglobal(11, caml_garbage_collection) ++ ld 2,8(11) ++ ld 11,0(11) ++ mtlr 11 ++ blrl ++ ld 2,40(1) ++ /* Reload new allocation pointer and allocation limit */ ++ Loadglobal(31, caml_young_ptr, 11) ++ Loadglobal(30, caml_young_limit, 11) ++ /* Restore all regs used by the code generator */ ++ addi 11, 1, 8*32 + 48 - 8 ++ ldu 3, 8(11) ++ ldu 4, 8(11) ++ ldu 5, 8(11) ++ ldu 6, 8(11) ++ ldu 7, 8(11) ++ ldu 8, 8(11) ++ ldu 9, 8(11) ++ ldu 10, 8(11) ++ ldu 14, 8(11) ++ ldu 15, 8(11) ++ ldu 16, 8(11) ++ ldu 17, 8(11) ++ ldu 18, 8(11) ++ ldu 19, 8(11) ++ ldu 20, 8(11) ++ ldu 21, 8(11) ++ ldu 22, 8(11) ++ ldu 23, 8(11) ++ ldu 24, 8(11) ++ ldu 25, 8(11) ++ ldu 26, 8(11) ++ ldu 27, 8(11) ++ ldu 28, 8(11) ++ addi 11, 1, 48 - 8 ++ lfdu 1, 8(11) ++ lfdu 2, 8(11) ++ lfdu 3, 8(11) ++ lfdu 4, 8(11) ++ lfdu 5, 8(11) ++ lfdu 6, 8(11) ++ lfdu 7, 8(11) ++ lfdu 8, 8(11) ++ lfdu 9, 8(11) ++ lfdu 10, 8(11) ++ lfdu 11, 8(11) ++ lfdu 12, 8(11) ++ lfdu 13, 8(11) ++ lfdu 14, 8(11) ++ lfdu 15, 8(11) ++ lfdu 16, 8(11) ++ lfdu 17, 8(11) ++ lfdu 18, 8(11) ++ lfdu 19, 8(11) ++ lfdu 20, 8(11) ++ lfdu 21, 8(11) ++ lfdu 22, 8(11) ++ lfdu 23, 8(11) ++ lfdu 24, 8(11) ++ lfdu 25, 8(11) ++ lfdu 26, 8(11) ++ lfdu 27, 8(11) ++ lfdu 28, 8(11) ++ lfdu 29, 8(11) ++ lfdu 30, 8(11) ++ lfdu 31, 8(11) ++ /* Return to caller, restarting the allocation */ ++ Loadglobal(0, caml_last_return_address, 11) ++ addic 0, 0, -16 /* Restart the allocation (4 instructions) */ ++ mtlr 0 ++ /* Say we are back into Caml code */ ++ li 12, 0 ++ Storeglobal(12, caml_last_return_address, 11) ++ /* Deallocate stack frame */ ++ ld 1, 0(1) ++ /* Return */ ++ blr ++ .size .L.caml_call_gc,.-.L.caml_call_gc ++ ++/* Call a C function from Caml */ ++ ++ .globl caml_c_call ++ .type caml_c_call, @function ++ .section ".opd","aw" ++ .align 3 ++caml_c_call: ++ .quad .L.caml_c_call,.TOC.@tocbase ++ .previous ++ .align 2 ++.L.caml_c_call: ++ .cfi_startproc ++ /* Save return address */ ++ mflr 25 ++ .cfi_register lr,25 ++ /* Get ready to call C function (address in 11) */ ++ ld 2, 8(11) ++ ld 11,0(11) ++ mtlr 11 ++ /* Record lowest stack address and return address */ ++ Storeglobal(1, caml_bottom_of_stack, 12) ++ Storeglobal(25, caml_last_return_address, 12) ++ /* Make the exception handler and alloc ptr available to the C code */ ++ Storeglobal(31, caml_young_ptr, 11) ++ Storeglobal(29, caml_exception_pointer, 11) ++ /* Call the function (address in link register) */ ++ blrl ++ /* Restore return address (in 25, preserved by the C function) */ ++ mtlr 25 ++ /* Reload allocation pointer and allocation limit*/ ++ Loadglobal(31, caml_young_ptr, 11) ++ Loadglobal(30, caml_young_limit, 11) ++ /* Say we are back into Caml code */ ++ li 12, 0 ++ Storeglobal(12, caml_last_return_address, 11) ++ /* Return to caller */ ++ blr ++ .cfi_endproc ++ .size .L.caml_c_call,.-.L.caml_c_call ++ ++/* Raise an exception from C */ ++ ++ .globl caml_raise_exception ++ .type caml_raise_exception, @function ++ .section ".opd","aw" ++ .align 3 ++caml_raise_exception: ++ .quad .L.caml_raise_exception,.TOC.@tocbase ++ .previous ++ .align 2 ++.L.caml_raise_exception: ++ /* Reload Caml global registers */ ++ Loadglobal(29, caml_exception_pointer, 11) ++ Loadglobal(31, caml_young_ptr, 11) ++ Loadglobal(30, caml_young_limit, 11) ++ /* Say we are back into Caml code */ ++ li 0, 0 ++ Storeglobal(0, caml_last_return_address, 11) ++ /* Pop trap frame */ ++ ld 0, 8(29) ++ ld 1, 16(29) ++ mtlr 0 ++ ld 2, 24(29) ++ ld 29, 0(29) ++ /* Branch to handler */ ++ blr ++ .size .L.caml_raise_exception,.-.L.caml_raise_exception ++ ++/* Start the Caml program */ ++ ++ .globl caml_start_program ++ .type caml_start_program, @function ++ .section ".opd","aw" ++ .align 3 ++caml_start_program: ++ .quad .L.caml_start_program,.TOC.@tocbase ++ .previous ++ .align 2 ++.L.caml_start_program: ++ Addrglobal(12, caml_program) ++ ++/* Code shared between caml_start_program and caml_callback */ ++.L102: ++ /* Allocate and link stack frame */ ++ mflr 0 ++ std 0, 16(1) ++ stdu 1, -0x190(1) /* 48 + 8*36(regs) + 32(callback) + 32(exc) */ ++ /* Save return address */ ++ /* Save all callee-save registers */ ++ /* GPR 14 ... GPR 31 then FPR 14 ... FPR 31 starting at sp+16 */ ++ addi 11, 1, 48-8 ++ stdu 14, 8(11) ++ stdu 15, 8(11) ++ stdu 16, 8(11) ++ stdu 17, 8(11) ++ stdu 18, 8(11) ++ stdu 19, 8(11) ++ stdu 20, 8(11) ++ stdu 21, 8(11) ++ stdu 22, 8(11) ++ stdu 23, 8(11) ++ stdu 24, 8(11) ++ stdu 25, 8(11) ++ stdu 26, 8(11) ++ stdu 27, 8(11) ++ stdu 28, 8(11) ++ stdu 29, 8(11) ++ stdu 30, 8(11) ++ stdu 31, 8(11) ++ stfdu 14, 8(11) ++ stfdu 15, 8(11) ++ stfdu 16, 8(11) ++ stfdu 17, 8(11) ++ stfdu 18, 8(11) ++ stfdu 19, 8(11) ++ stfdu 20, 8(11) ++ stfdu 21, 8(11) ++ stfdu 22, 8(11) ++ stfdu 23, 8(11) ++ stfdu 24, 8(11) ++ stfdu 25, 8(11) ++ stfdu 26, 8(11) ++ stfdu 27, 8(11) ++ stfdu 28, 8(11) ++ stfdu 29, 8(11) ++ stfdu 30, 8(11) ++ stfdu 31, 8(11) ++ /* Set up a callback link */ ++ Loadglobal(9, caml_bottom_of_stack, 11) ++ Loadglobal(10, caml_last_return_address, 11) ++ Loadglobal(11, caml_gc_regs, 11) ++ std 9, 0x150(1) ++ std 10, 0x158(1) ++ std 11, 0x160(1) ++ /* Build an exception handler to catch exceptions escaping out of Caml */ ++ bl .L103 ++ b .L104 ++.L103: ++ mflr 0 ++ addi 29, 1, 0x170 /* Alignment */ ++ std 0, 8(29) ++ std 1, 16(29) ++ std 2, 24(29) ++ Loadglobal(11, caml_exception_pointer, 11) ++ std 11, 0(29) ++ /* Reload allocation pointers */ ++ Loadglobal(31, caml_young_ptr, 11) ++ Loadglobal(30, caml_young_limit, 11) ++ /* Say we are back into Caml code */ ++ li 0, 0 ++ Storeglobal(0, caml_last_return_address, 11) ++ /* Call the Caml code */ ++ std 2,40(1) ++ ld 2,8(12) ++ ld 12,0(12) ++ mtlr 12 ++.L105: ++ blrl ++ ld 2,40(1) ++ /* Pop the trap frame, restoring caml_exception_pointer */ ++ ld 9, 0x170(1) ++ Storeglobal(9, caml_exception_pointer, 11) ++ /* Pop the callback link, restoring the global variables */ ++.L106: ++ ld 9, 0x150(1) ++ ld 10, 0x158(1) ++ ld 11, 0x160(1) ++ Storeglobal(9, caml_bottom_of_stack, 12) ++ Storeglobal(10, caml_last_return_address, 12) ++ Storeglobal(11, caml_gc_regs, 12) ++ /* Update allocation pointer */ ++ Storeglobal(31, caml_young_ptr, 11) ++ /* Restore callee-save registers */ ++ addi 11, 1, 48-8 ++ ldu 14, 8(11) ++ ldu 15, 8(11) ++ ldu 16, 8(11) ++ ldu 17, 8(11) ++ ldu 18, 8(11) ++ ldu 19, 8(11) ++ ldu 20, 8(11) ++ ldu 21, 8(11) ++ ldu 22, 8(11) ++ ldu 23, 8(11) ++ ldu 24, 8(11) ++ ldu 25, 8(11) ++ ldu 26, 8(11) ++ ldu 27, 8(11) ++ ldu 28, 8(11) ++ ldu 29, 8(11) ++ ldu 30, 8(11) ++ ldu 31, 8(11) ++ lfdu 14, 8(11) ++ lfdu 15, 8(11) ++ lfdu 16, 8(11) ++ lfdu 17, 8(11) ++ lfdu 18, 8(11) ++ lfdu 19, 8(11) ++ lfdu 20, 8(11) ++ lfdu 21, 8(11) ++ lfdu 22, 8(11) ++ lfdu 23, 8(11) ++ lfdu 24, 8(11) ++ lfdu 25, 8(11) ++ lfdu 26, 8(11) ++ lfdu 27, 8(11) ++ lfdu 28, 8(11) ++ lfdu 29, 8(11) ++ lfdu 30, 8(11) ++ lfdu 31, 8(11) ++ /* Return */ ++ ld 1,0(1) ++ /* Reload return address */ ++ ld 0, 16(1) ++ mtlr 0 ++ blr ++ ++ /* The trap handler: */ ++.L104: ++ /* Update caml_exception_pointer */ ++ Storeglobal(29, caml_exception_pointer, 11) ++ /* Encode exception bucket as an exception result and return it */ ++ ori 3, 3, 2 ++ b .L106 ++ .size .L.caml_start_program,.-.L.caml_start_program ++ ++/* Callback from C to Caml */ ++ ++ .globl caml_callback_exn ++ .type caml_callback_exn, @function ++ .section ".opd","aw" ++ .align 3 ++caml_callback_exn: ++ .quad .L.caml_callback_exn,.TOC.@tocbase ++ .previous ++ .align 2 ++.L.caml_callback_exn: ++ /* Initial shuffling of arguments */ ++ mr 0, 3 /* Closure */ ++ mr 3, 4 /* Argument */ ++ mr 4, 0 ++ ld 12, 0(4) /* Code pointer */ ++ b .L102 ++ .size .L.caml_callback_exn,.-.L.caml_callback_exn ++ ++ ++ .globl caml_callback2_exn ++ .type caml_callback2_exn, @function ++ .section ".opd","aw" ++ .align 3 ++caml_callback2_exn: ++ .quad .L.caml_callback2_exn,.TOC.@tocbase ++ .previous ++ .align 2 ++.L.caml_callback2_exn: ++ mr 0, 3 /* Closure */ ++ mr 3, 4 /* First argument */ ++ mr 4, 5 /* Second argument */ ++ mr 5, 0 ++ Addrglobal(12, caml_apply2) ++ b .L102 ++ .size .L.caml_callback2_exn,.-.L.caml_callback2_exn ++ ++ ++ .globl caml_callback3_exn ++ .type caml_callback3_exn, @function ++ .section ".opd","aw" ++ .align 3 ++caml_callback3_exn: ++ .quad .L.caml_callback3_exn,.TOC.@tocbase ++ .previous ++ .align 2 ++.L.caml_callback3_exn: ++ mr 0, 3 /* Closure */ ++ mr 3, 4 /* First argument */ ++ mr 4, 5 /* Second argument */ ++ mr 5, 6 /* Third argument */ ++ mr 6, 0 ++ Addrglobal(12, caml_apply3) ++ b .L102 ++ .size .L.caml_callback3_exn,.-.L.caml_callback3_exn ++ ++/* Frame table */ ++ ++ .section ".data" ++ .globl caml_system__frametable ++ .type caml_system__frametable, @object ++caml_system__frametable: ++ .quad 1 /* one descriptor */ ++ .quad .L105 + 4 /* return address into callback */ ++ .short -1 /* negative size count => use callback link */ ++ .short 0 /* no roots here */ ++ .align 3 ++ +diff -uNr ocaml-3.10.1/asmrun/stack.h ocaml-3.10.1.ppc64/asmrun/stack.h +--- ocaml-3.10.1/asmrun/stack.h 2007-02-15 13:35:20.000000000 -0500 ++++ ocaml-3.10.1.ppc64/asmrun/stack.h 2008-02-29 08:37:45.000000000 -0500 +@@ -65,6 +65,15 @@ + #define Callback_link(sp) ((struct caml_context *)((sp) + Trap_frame_size)) + #endif + ++#ifdef TARGET_power64 ++#define Saved_return_address(sp) *((intnat *)((sp) +16)) ++#define Already_scanned(sp, retaddr) ((retaddr) & 1) ++#define Mark_scanned(sp, retaddr) (Saved_return_address(sp) = (retaddr) | 1) ++#define Mask_already_scanned(retaddr) ((retaddr) & ~1) ++#define Trap_frame_size 0x150 ++#define Callback_link(sp) ((struct caml_context *)((sp) + Trap_frame_size)) ++#endif ++ + #ifdef TARGET_m68k + #define Saved_return_address(sp) *((intnat *)((sp) - 4)) + #define Callback_link(sp) ((struct caml_context *)((sp) + 8)) +diff -uNr ocaml-3.11.0+beta1/configure ocaml-3.11.0+beta1.ppc64/configure +--- ocaml-3.11.0+beta1/configure.ppc64 2008-11-18 15:46:57.000000000 +0000 ++++ ocaml-3.11.0+beta1/configure 2008-11-18 15:49:19.000000000 +0000 +@@ -632,6 +632,7 @@ + hppa2.0*-*-hpux*) arch=hppa; system=hpux;; + hppa*-*-linux*) arch=hppa; system=linux;; + hppa*-*-gnu*) arch=hppa; system=gnu;; ++ powerpc64-*-linux*) arch=power64; model=ppc64; system=elf;; + powerpc*-*-linux*) arch=power; model=ppc; system=elf;; + powerpc-*-netbsd*) arch=power; model=ppc; system=elf;; + powerpc-*-rhapsody*) arch=power; model=ppc; system=rhapsody;; +@@ -655,7 +656,7 @@ + + if $arch64; then + case "$arch,$model" in +- sparc,default|mips,default|hppa,default|power,ppc) ++ sparc,default|mips,default|hppa,default) + arch=none; model=default; system=unknown;; + esac + fi +@@ -712,6 +713,8 @@ + aspp='as -n32 -O2';; + power,*,elf) as='as -u -m ppc' + aspp='gcc -c';; ++ power64,*,elf) as='as -u -m ppc64' ++ aspp='gcc -c';; + power,*,bsd) as='as' + aspp='gcc -c';; + power,*,rhapsody) as="as -arch $model"
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/ocaml/patches/ocaml-solaris-build.patch Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,17 @@ + +Patch from Desktop team that fixes a NFS issue. +http://caml.inria.fr/mantis/view.php?id=4663 + +diff -urN ocaml-3.11.2/byterun/io.c ocaml-3.11.2.new/byterun/io.c +--- ocaml-3.11.2/byterun/io.c 2011-04-07 13:41:41.040436216 +0800 ++++ ocaml-3.11.2.new/byterun/io.c 2011-04-07 13:42:50.119747390 +0800 +@@ -479,6 +479,9 @@ + struct channel * channel = Channel(vchannel); + if (channel->fd != -1){ + result = close(channel->fd); ++ /* Work around an NFS issue that causes close() to fails with EINVAL */ ++ if ((result < 0) && (errno == EINVAL)) ++ result = 0; + channel->fd = -1; + }else{ + result = 0;
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/components/ocaml/patches/ocaml-user-cflags.patch Wed Aug 21 14:33:32 2013 -0700 @@ -0,0 +1,25 @@ + +Patch allows UL_LDFLAGS set in Makefile to be passed along to ocaml. + +--- ocaml-3.11.2/configure-orig 2013-06-27 21:29:22.692330246 -0500 ++++ ocaml-3.11.2/configure 2013-06-27 21:29:38.111921104 -0500 +@@ -1534,6 +1534,10 @@ esac + bytecccompopts="$bytecccompopts $CFLAGS" + nativecccompopts="$nativecccompopts $CFLAGS" + ++# Allow user defined C Compiler flags ++bytecccompopts="$bytecccompopts $CFLAGS" ++nativecccompopts="$nativecccompopts $CFLAGS" ++ + # Finish generated files + + cclibs="$cclibs $mathlib" +@@ -1541,7 +1545,7 @@ cclibs="$cclibs $mathlib" + echo "BYTECC=$bytecc" >> Makefile + echo "BYTECCCOMPOPTS=$bytecccompopts" >> Makefile + echo "BYTECCLINKOPTS=$bytecclinkopts" >> Makefile +-echo "BYTECCLIBS=$cclibs $dllib $curseslibs $pthread_link" >> Makefile ++echo "BYTECCLIBS=$cclibs $dllib $curseslibs $pthread_link $UL_LDFLAGS" >> Makefile + echo "BYTECCRPATH=$byteccrpath" >> Makefile + echo "EXE=$exe" >> Makefile + echo "SUPPORTS_SHARED_LIBRARIES=$shared_libraries_supported" >> Makefile