17262870 Migrate ocaml to Userland
authorBrian Cameron <brian.cameron@oracle.com>
Wed, 21 Aug 2013 14:33:32 -0700
changeset 1450 02791a89ea4f
parent 1449 d430caca2495
child 1451 83c10cf4601d
17262870 Migrate ocaml to Userland
components/meta-packages/history/SUNWocaml.p5m
components/ocaml/Makefile
components/ocaml/files/ocamlbyteinfo.ml
components/ocaml/files/ocamlplugininfo.ml
components/ocaml/ocaml.p5m
components/ocaml/patches/ocaml-3.11.0-ppc64.patch
components/ocaml/patches/ocaml-solaris-build.patch
components/ocaml/patches/ocaml-user-cflags.patch
components/ocaml/resolve.deps
--- /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: %[email protected]" name;
+  printf "CRC of implementation: %[email protected]" (Digest.to_hex crc);
+  printf "@[<hov 2>Globals defined:";
+  List.iter (fun s -> printf "@ %s" s) defines;
+  printf "@]@.";
+  printf "@[<v 2>Interfaces imported:%[email protected]]@." pr_imports cmi;
+  printf "@[<v 2>Implementations imported:%[email protected]]@." 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/[email protected]$(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
[email protected]@ -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
[email protected]@ -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},[email protected]\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
[email protected]@ -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
[email protected]@ -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
[email protected]@ -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
[email protected]@ -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
[email protected]@ -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
[email protected]@ -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, [email protected]; \
++        addi    reg, reg, [email protected]
++#define Loadglobal(reg,glob,tmp) \
++        addis   tmp, 0, [email protected]; \
++        ld     reg, [email protected](tmp)
++#define Storeglobal(reg,glob,tmp) \
++        addis   tmp, 0, [email protected]; \
++        std     reg, [email protected](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,[email protected]
++	.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,[email protected]
++	.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,[email protected]
++	.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,[email protected]
++	.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,[email protected]
++	.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,[email protected]
++	.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,[email protected]
++	.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
[email protected]@ -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
[email protected]@ -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;;
[email protected]@ -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
[email protected]@ -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
[email protected]@ -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
[email protected]@ -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"
[email protected]@ -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
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/components/ocaml/resolve.deps	Wed Aug 21 14:33:32 2013 -0700
@@ -0,0 +1,6 @@
+runtime/tcl-8
+runtime/tk-8
+shell/ksh93
+system/library
+system/library/math
+x11/library/libx11