blob: 21d74187eb5e86b619f1134b3f8d62249e96d2bf [file] [log] [blame]
Subzero - Fast code generator for PNaCl bitcode
===============================================
Building
--------
You must have LLVM trunk source code available and built. See
http://llvm.org/docs/GettingStarted.html#getting-started-quickly-a-summary for
guidance.
Set variables ``LLVM_SRC_PATH`` and ``LLVM_BIN_PATH`` to point to the
appropriate directories in the LLVM source and build directories. These can be
set as environment variables, or you can modify the top-level Makefile.
Run ``make`` at the top level to build the main target ``llvm2ice``.
``llvm2ice``
------------
The ``llvm2ice`` program uses the LLVM infrastructure to parse an LLVM bitcode
file and translate it into ICE. It then invokes ICE's translate method to lower
it to target-specific machine code, dumping the IR at various stages of the
translation.
The program can be run as follows::
../llvm2ice ./ir_samples/<file>.ll
../llvm2ice ./tests_lit/llvm2ice_tests/<file>.ll
At this time, ``llvm2ice`` accepts a few arguments:
``-help`` -- Show available arguments and possible values.
``-notranslate`` -- Suppress the ICE translation phase, which is useful if
ICE is missing some support.
``-target=<TARGET>`` -- Set the target architecture. The default is x8632.
Future targets include x8664, arm32, and arm64.
``-O<LEVEL>`` -- Set the optimization level. Valid levels are ``2``, ``1``,
``0``, ``-1``, and ``m1``. Levels ``-1`` and ``m1`` are synonyms, and
represent the minimum optimization and worst code quality, but fastest code
generation.
``-verbose=<list>`` -- Set verbosity flags. This argument allows a
comma-separated list of values. The default is ``none``, and the value
``inst,pred`` will roughly match the .ll bitcode file. Of particular use
are ``all`` and ``none``.
``-o <FILE>`` -- Set the assembly output file name. Default is stdout.
``-log <FILE>`` -- Set the file name for diagnostic output (whose level is
controlled by ``-verbose``). Default is stdout.
See ir_samples/README.rst for more details.
Running the test suite
----------------------
Subzero uses the LLVM ``lit`` testing tool for its test suite, which lives in
``tests_lit``. To execute the test suite, first build Subzero, and then run::
python <path_to_lit.py> -sv tests_lit
``path_to_lit`` is the direct path to the lit script in the LLVM source
(``$LLVM_SRC_PATH/utils/lit/lit.py``).
The above ``lit`` execution also needs the LLVM binary path in the
``LLVM_BIN_PATH`` env var.
Assuming the LLVM paths are set up, ``make check`` is a convenient way to run
the test suite.
Assembling ``llvm2ice`` output
------------------------------
Currently ``llvm2ice`` produces textual assembly code in a structure suitable
for input to ``llvm-mc`` and currently using "intel" assembly syntax. The first
line of output is a convenient comment indicating how to pipe the output to
``llvm-mc`` to produce object code.