Index: README.rst |
diff --git a/README.rst b/README.rst |
deleted file mode 100644 |
index 0257558a17fd0de0c4b8b3361ee92c51c5c33f58..0000000000000000000000000000000000000000 |
--- a/README.rst |
+++ /dev/null |
@@ -1,192 +0,0 @@ |
-Subzero - Fast code generator for PNaCl bitcode |
-=============================================== |
- |
-Design |
------- |
- |
-See the accompanying DESIGN.rst file for a more detailed technical overview of |
-Subzero. |
- |
-Building |
--------- |
- |
-Subzero is set up to be built within the Native Client tree. Follow the |
-`Developing PNaCl |
-<https://sites.google.com/a/chromium.org/dev/nativeclient/pnacl/developing-pnacl>`_ |
-instructions, in particular the section on building PNaCl sources. This will |
-prepare the necessary external headers and libraries that Subzero needs. |
-Checking out the Native Client project also gets the pre-built clang and LLVM |
-tools in ``native_client/../third_party/llvm-build/Release+Asserts/bin`` which |
-are used for building Subzero. |
- |
-The Subzero source is in ``native_client/toolchain_build/src/subzero``. From |
-within that directory, ``git checkout master && git pull`` to get the latest |
-version of Subzero source code. |
- |
-The Makefile is designed to be used as part of the higher level LLVM build |
-system. To build manually, use the ``Makefile.standalone``. There are several |
-build configurations from the command line:: |
- |
- make -f Makefile.standalone |
- make -f Makefile.standalone DEBUG=1 |
- make -f Makefile.standalone NOASSERT=1 |
- make -f Makefile.standalone DEBUG=1 NOASSERT=1 |
- make -f Makefile.standalone MINIMAL=1 |
- make -f Makefile.standalone ASAN=1 |
- make -f Makefile.standalone TSAN=1 |
- |
-``DEBUG=1`` builds without optimizations and is good when running the translator |
-inside a debugger. ``NOASSERT=1`` disables assertions and is the preferred |
-configuration for performance testing the translator. ``MINIMAL=1`` attempts to |
-minimize the size of the translator by compiling out everything unnecessary. |
-``ASAN=1`` enables AddressSanitizer, and ``TSAN=1`` enables ThreadSanitizer. |
- |
-The result of the ``make`` command is the target ``pnacl-sz`` in the current |
-directory. |
- |
-``pnacl-sz`` |
------------- |
- |
-The ``pnacl-sz`` program parses a pexe or an LLVM bitcode file and translates it |
-into ICE (Subzero's intermediate representation). It then invokes the ICE |
-translate method to lower it to target-specific machine code, optionally dumping |
-the intermediate representation at various stages of the translation. |
- |
-The program can be run as follows:: |
- |
- ../pnacl-sz ./path/to/<file>.pexe |
- ../pnacl-sz ./tests_lit/pnacl-sz_tests/<file>.ll |
- |
-At this time, ``pnacl-sz`` accepts a number of arguments, including the |
-following: |
- |
- ``-help`` -- Show available arguments and possible values. (Note: this |
- unfortunately also pulls in some LLVM-specific options that are reported but |
- that Subzero doesn't use.) |
- |
- ``-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. |
- |
- ``-filetype=obj|asm|iasm`` -- Select the output file type. ``obj`` is a |
- native ELF file, ``asm`` is a textual assembly file, and ``iasm`` is a |
- low-level textual assembly file demonstrating the integrated assembler. |
- |
- ``-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``, ``most``, 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. |
- |
- ``-timing`` -- Dump some pass timing information after translating the input |
- file. |
- |
-Running the test suite |
----------------------- |
- |
-Subzero uses the LLVM ``lit`` testing tool for part of its test suite, which |
-lives in ``tests_lit``. To execute the test suite, first build Subzero, and then |
-run:: |
- |
- make -f Makefile.standalone check-lit |
- |
-There is also a suite of cross tests in the ``crosstest`` directory. A cross |
-test takes a test bitcode file implementing some unit tests, and translates it |
-twice, once with Subzero and once with LLVM's known-good ``llc`` translator. |
-The Subzero-translated symbols are specially mangled to avoid multiple |
-definition errors from the linker. Both translated versions are linked together |
-with a driver program that calls each version of each unit test with a variety |
-of interesting inputs and compares the results for equality. The cross tests |
-are currently invoked by running:: |
- |
- make -f Makefile.standalone check-xtest |
- |
-Similar, there is a suite of unit tests:: |
- |
- make -f Makefile.standalone check-unit |
- |
-A convenient way to run the lit, cross, and unit tests is:: |
- |
- make -f Makefile.standalone check |
- |
-Assembling ``pnacl-sz`` output as needed |
----------------------------------------- |
- |
-``pnacl-sz`` can now produce a native ELF binary using ``-filetype=obj``. |
- |
-``pnacl-sz`` can also produce textual assembly code in a structure suitable for |
-input to ``llvm-mc``, using ``-filetype=asm`` or ``-filetype=iasm``. An object |
-file can then be produced using the command:: |
- |
- llvm-mc -triple=i686 -filetype=obj -o=MyObj.o |
- |
-Building a translated binary |
----------------------------- |
- |
-There is a helper script, ``pydir/szbuild.py``, that translates a finalized pexe |
-into a fully linked executable. Run it with ``-help`` for extensive |
-documentation. |
- |
-By default, ``szbuild.py`` builds an executable using only Subzero translation, |
-but it can also be used to produce hybrid Subzero/``llc`` binaries (``llc`` is |
-the name of the LLVM translator) for bisection-based debugging. In bisection |
-debugging mode, the pexe is translated using both Subzero and ``llc``, and the |
-resulting object files are combined into a single executable using symbol |
-weakening and other linker tricks to control which Subzero symbols and which |
-``llc`` symbols take precedence. This is controlled by the ``-include`` and |
-``-exclude`` arguments. These can be used to rapidly find a single function |
-that Subzero translates incorrectly leading to incorrect output. |
- |
-There is another helper script, ``pydir/szbuild_spec2k.py``, that runs |
-``szbuild.py`` on one or more components of the Spec2K suite. This assumes that |
-Spec2K is set up in the usual place in the Native Client tree, and the finalized |
-pexe files have been built. (Note: for working with Spec2K and other pexes, |
-it's helpful to finalize the pexe using ``--no-strip-syms``, to preserve the |
-original function and global variable names.) |
- |
-Status |
------- |
- |
-Subzero currently fully supports the x86-32 architecture, for both native and |
-Native Client sandboxing modes. The x86-64 architecture is also supported in |
-native mode only, and only for the x32 flavor due to the fact that pointers and |
-32-bit integers are indistinguishable in PNaCl bitcode. Sandboxing support for |
-x86-64 is in progress. ARM and MIPS support is in progress. Two optimization |
-levels, ``-Om1`` and ``-O2``, are implemented. |
- |
-The ``-Om1`` configuration is designed to be the simplest and fastest possible, |
-with a minimal set of passes and transformations. |
- |
-* Simple Phi lowering before target lowering, by generating temporaries and |
- adding assignments to the end of predecessor blocks. |
- |
-* Simple register allocation limited to pre-colored or infinite-weight |
- Variables. |
- |
-The ``-O2`` configuration is designed to use all optimizations available and |
-produce the best code. |
- |
-* Address mode inference to leverage the complex x86 addressing modes. |
- |
-* Compare/branch fusing based on liveness/last-use analysis. |
- |
-* Global, linear-scan register allocation. |
- |
-* Advanced phi lowering after target lowering and global register allocation, |
- via edge splitting, topological sorting of the parallel moves, and final local |
- register allocation. |
- |
-* Stack slot coalescing to reduce frame size. |
- |
-* Branch optimization to reduce the number of branches to the following block. |