[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Mirage/kFreeBSD Compiler Patches

Hi there,

Anil requested me to show the OCaml compiler patches I am currently relying
on for the kFreeBSD backend -- in the hope that they could be merged into the
upstream and therefore making the work with this backend easier.  I have
recently updated the backend to use the 4.01.0beta1 version of the OCaml
compiler (and run-time system).

The patches are as follows, including some commentary:

Synopsis: Add support for explicitly disabling PIC code generation to

The FreeBSD kernel does not support loading modules that contain symbols with
certain ELF relocation types that would allow the OCaml compiler to emit
position-independent code, e.g. R_X86_64_GOTPCREL, R_X86_32, and
R_X86_64_PLT32.  Hence this must be disabled with the -fno-PIC flag when
targeting applications for the Mirage/kFreeBSD backend.

However, this is turned on by default, so it would be required to modify all
the build files for all the dependant OPAM packages to include this setting.
Fortunately, OCaml 4.01 introduces a new environment variable, OCAMLPARAM,
whose value is parsed for environment compiler settings, and therefore it
makes possible to turn PIC generation off, independently of what was
requested at invocation.

Here, this feature has been extended with an additional option, "nopic" which
turns PIC generation off by default on amd64 (and arm) platforms.

Mergeable: Probably yes, harmless by default.  Albeit it may change the
default behavior of emitting PIC on arm.  (The arm port does not seem to
have PIC on by default, but supports it.)

Synopis: Allow extra libraries to be cleaned/installed separately.

This is only a minor technical addition to the compiler's Makefile which
makes possible to reinstall the standard compiler libraries without reinstall
all the compiler files.

This is used with the previous patch primarily, when the compiler libraries
have to be built without PIC.  However, for the Mirage/kFreeBSD
(cross-)compiler, first I build and install the regular compiler to have all
the dynamically-linked version of those libraries and a working version of
Camlp4.  Technically, in this order:

- Build & install the compiler, with PIC, Camlp4, and shared libraries.
- Rebuild & reinstall the stdlib without PIC.
- Rebuild & reinstall the "otherlibs" (bigarray, str, etc.) without PIC.
- Remove the module for Dynlink to disable building packages with shared
  libraries (as some build systems check for this).

This procedure is required because some of packages have certain implicit
expectations from the installed compiler, such as presence of shared
libraries (even if the package itself will not use them at the end).

Mergeable: Yes.

Synopsis: Add fixed-point arithmetic support for doubles, unroll
          floating-point primops.

This change introduces another OCAMLPARAM option, "fixedpt" which can tell
the OCaml compiler to generate (64-bit) floating-point constants with
fixed-point representation.  The value of "fixedpt" can tell how many bits are
reserved for the fractional part.  This is not used when building the
cross-compiler, it is only used when the building a Mirage applications.  That
is, the compiler itself always uses the standard OCaml run-time and
floating-point numbers, while the built kernel modules always use their
fixed-point counterparts.

Note that, in order to let these approaches to share the same API, I also had
to "unroll" the primitive floating-point operations into regular C function
calls in the native code generator.  This will probably make the
floating-point-based computations slower and, due to that the fixed-point
numbers currently store the fractional part in 16 bits, leads to loss in

Mergeable: No.  At least not this version.

Feel free to ask if I was unclear regarding something... :-)



Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.