Convert top-level *.rst files to markdown.
These files don't use any Sphinx has that Markdown lacks, and Markdown is more widely used and easier to edit.
This commit is contained in:
143
README.rst
143
README.rst
@@ -1,143 +0,0 @@
|
||||
========================
|
||||
Cranelift Code Generator
|
||||
========================
|
||||
|
||||
Cranelift is a low-level retargetable code generator. It translates a `target-independent
|
||||
intermediate representation <https://cranelift.readthedocs.io/en/latest/langref.html>`_ into executable
|
||||
machine code.
|
||||
|
||||
.. image:: https://readthedocs.org/projects/cranelift/badge/?version=latest
|
||||
:target: https://cranelift.readthedocs.io/en/latest/?badge=latest
|
||||
:alt: Documentation Status
|
||||
|
||||
.. image:: https://travis-ci.org/CraneStation/cranelift.svg?branch=master
|
||||
:target: https://travis-ci.org/CraneStation/cranelift
|
||||
:alt: Build Status
|
||||
|
||||
.. image:: https://badges.gitter.im/CraneStation/CraneStation.svg
|
||||
:target: https://gitter.im/CraneStation/Lobby/~chat
|
||||
:alt: Gitter chat
|
||||
|
||||
For more information, see `the documentation
|
||||
<https://cranelift.readthedocs.io/en/latest/?badge=latest>`_.
|
||||
|
||||
Status
|
||||
------
|
||||
|
||||
Cranelift currently supports enough functionality to run a wide variety of
|
||||
programs, including all the functionality needed to execute WebAssembly MVP
|
||||
functions, although it needs to be used within an external WebAssembly
|
||||
embedding to be part of a complete WebAssembly implementation.
|
||||
|
||||
The x86-64 backend is currently the most complete and stable; other
|
||||
architectures are in various stages of development. Cranelift currently supports
|
||||
the System V AMD64 ABI calling convention used on many platforms, but does not
|
||||
yet support the Windows x64 calling convention. The performance of code
|
||||
produced by Cranelift is not yet impressive, though we have plans to fix that.
|
||||
|
||||
The core codegen crates have minimal dependencies, support
|
||||
`no_std <#building-with-no-std>`_ mode, and do not require any host
|
||||
floating-point support.
|
||||
|
||||
Cranelift does not yet perform mitigations for Spectre or related security
|
||||
issues, though it may do so in the future. It does not currently make any
|
||||
security-relevant instruction timing guarantees. It has seen a fair amount
|
||||
of testing and fuzzing, although more work is needed before it would be
|
||||
ready for a production use case.
|
||||
|
||||
Cranelift's APIs are not yet stable.
|
||||
|
||||
Cranelift currently supports Rust 1.22.1 and later. We intend to always support
|
||||
the latest *stable* Rust. And, we currently support the version of Rust in the
|
||||
latest Ubuntu LTS, although whether we will always do so is not yet determined.
|
||||
Cranelift requires Python 2.7 or Python 3 to build.
|
||||
|
||||
Planned uses
|
||||
------------
|
||||
|
||||
Cranelift is designed to be a code generator for WebAssembly, but it is general
|
||||
enough to be useful elsewhere too. The initial planned uses that affected its
|
||||
design are:
|
||||
|
||||
1. `WebAssembly compiler for the SpiderMonkey engine in Firefox
|
||||
<spidermonkey.rst#phase-1-webassembly>`_.
|
||||
2. `Backend for the IonMonkey JavaScript JIT compiler in Firefox
|
||||
<spidermonkey.rst#phase-2-ionmonkey>`_.
|
||||
3. `Debug build backend for the Rust compiler <rustc.rst>`_.
|
||||
|
||||
Building Cranelift
|
||||
------------------
|
||||
|
||||
Cranelift uses a `conventional Cargo build process
|
||||
<https://doc.rust-lang.org/cargo/guide/working-on-an-existing-project.html>`_.
|
||||
|
||||
Cranelift consists of a collection of crates, and uses a `Cargo Workspace
|
||||
<https://doc.rust-lang.org/book/second-edition/ch14-03-cargo-workspaces.html>`_,
|
||||
so for some cargo commands, such as
|
||||
``cargo test``, the ``--all`` is needed to tell cargo to visit all
|
||||
of the crates.
|
||||
|
||||
``test-all.sh`` at the top level is a script which runs all the cargo
|
||||
tests and also performs code format, lint, and documentation checks.
|
||||
|
||||
Building with `no_std`
|
||||
----------------------
|
||||
|
||||
The following crates support `no_std`:
|
||||
- `cranelift-entity`
|
||||
- `cranelift-codegen`
|
||||
- `cranelift-frontend`
|
||||
- `cranelift-native`
|
||||
- `cranelift-wasm`
|
||||
- `cranelift-module`
|
||||
- `cranelift-simplejit`
|
||||
- `cranelift`
|
||||
|
||||
To use `no_std` mode, disable the `std` feature and enable the `core` feature.
|
||||
This currently requires nightly rust.
|
||||
|
||||
For example, to build `cranelift-codegen`:
|
||||
|
||||
.. code-block:: sh
|
||||
|
||||
cd lib/codegen
|
||||
cargo build --no-default-features --features core
|
||||
|
||||
Or, when using `cranelift-codegen` as a dependency (in Cargo.toml):
|
||||
|
||||
.. code-block::
|
||||
|
||||
[dependency.cranelift-codegen]
|
||||
...
|
||||
default-features = false
|
||||
features = ["core"]
|
||||
|
||||
`no_std` support is currently "best effort". We won't try to break it, and
|
||||
we'll accept patches fixing problems, however we don't expect all developers to
|
||||
build and test `no_std` when submitting patches. Accordingly, the
|
||||
`./test-all.sh` script does not test `no_std`.
|
||||
|
||||
There is a separate `./test-no_std.sh` script that tests the `no_std`
|
||||
support in packages which support it.
|
||||
|
||||
It's important to note that cranelift still needs liballoc to compile.
|
||||
Thus, whatever environment is used must implement an allocator.
|
||||
|
||||
Also, to allow the use of HashMaps with `no_std`, an external crate called
|
||||
`hashmap_core` is pulled in (via the `core` feature). This is mostly the same
|
||||
as `std::collections::HashMap`, except that it doesn't have DOS protection.
|
||||
Just something to think about.
|
||||
|
||||
Building the documentation
|
||||
--------------------------
|
||||
|
||||
To build the Cranelift documentation, you need the `Sphinx documentation
|
||||
generator <https://www.sphinx-doc.org/>`_::
|
||||
|
||||
$ pip install sphinx sphinx-autobuild sphinx_rtd_theme
|
||||
$ cd cranelift/docs
|
||||
$ make html
|
||||
$ open _build/html/index.html
|
||||
|
||||
We don't support Sphinx versions before 1.4 since the format of index tuples
|
||||
has changed.
|
||||
137
cranelift/README.md
Normal file
137
cranelift/README.md
Normal file
@@ -0,0 +1,137 @@
|
||||
Cranelift Code Generator
|
||||
========================
|
||||
|
||||
Cranelift is a low-level retargetable code generator. It translates a
|
||||
[target-independent intermediate
|
||||
representation](https://cranelift.readthedocs.io/en/latest/langref.html)
|
||||
into executable machine code.
|
||||
|
||||
[](https://cranelift.readthedocs.io/en/latest/?badge=latest)
|
||||
[](https://travis-ci.org/CraneStation/cranelift)
|
||||
[](https://gitter.im/CraneStation/Lobby/~chat)
|
||||
|
||||
For more information, see [the
|
||||
documentation](https://cranelift.readthedocs.io/en/latest/?badge=latest).
|
||||
|
||||
Status
|
||||
------
|
||||
|
||||
Cranelift currently supports enough functionality to run a wide variety
|
||||
of programs, including all the functionality needed to execute
|
||||
WebAssembly MVP functions, although it needs to be used within an
|
||||
external WebAssembly embedding to be part of a complete WebAssembly
|
||||
implementation.
|
||||
|
||||
The x86-64 backend is currently the most complete and stable; other
|
||||
architectures are in various stages of development. Cranelift currently
|
||||
supports the System V AMD64 ABI calling convention used on many
|
||||
platforms, but does not yet support the Windows x64 calling convention.
|
||||
The performance of code produced by Cranelift is not yet impressive,
|
||||
though we have plans to fix that.
|
||||
|
||||
The core codegen crates have minimal dependencies, support
|
||||
[no\_std](#building-with-no-std) mode, and do not require any host
|
||||
floating-point support.
|
||||
|
||||
Cranelift does not yet perform mitigations for Spectre or related
|
||||
security issues, though it may do so in the future. It does not
|
||||
currently make any security-relevant instruction timing guarantees. It
|
||||
has seen a fair amount of testing and fuzzing, although more work is
|
||||
needed before it would be ready for a production use case.
|
||||
|
||||
Cranelift's APIs are not yet stable.
|
||||
|
||||
Cranelift currently supports Rust 1.22.1 and later. We intend to always
|
||||
support the latest *stable* Rust. And, we currently support the version
|
||||
of Rust in the latest Ubuntu LTS, although whether we will always do so
|
||||
is not yet determined. Cranelift requires Python 2.7 or Python 3 to
|
||||
build.
|
||||
|
||||
Planned uses
|
||||
------------
|
||||
|
||||
Cranelift is designed to be a code generator for WebAssembly, but it is
|
||||
general enough to be useful elsewhere too. The initial planned uses that
|
||||
affected its design are:
|
||||
|
||||
1. [WebAssembly compiler for the SpiderMonkey engine in
|
||||
Firefox](spidermonkey.md#phase-1-webassembly).
|
||||
2. [Backend for the IonMonkey JavaScript JIT compiler in
|
||||
Firefox](spidermonkey.md#phase-2-ionmonkey).
|
||||
3. [Debug build backend for the Rust compiler](rustc.md).
|
||||
|
||||
Building Cranelift
|
||||
------------------
|
||||
|
||||
Cranelift uses a [conventional Cargo build
|
||||
process](https://doc.rust-lang.org/cargo/guide/working-on-an-existing-project.html).
|
||||
|
||||
Cranelift consists of a collection of crates, and uses a [Cargo
|
||||
Workspace](https://doc.rust-lang.org/book/second-edition/ch14-03-cargo-workspaces.html),
|
||||
so for some cargo commands, such as `cargo test`, the `--all` is needed
|
||||
to tell cargo to visit all of the crates.
|
||||
|
||||
`test-all.sh` at the top level is a script which runs all the cargo
|
||||
tests and also performs code format, lint, and documentation checks.
|
||||
|
||||
Building with no\_std
|
||||
---------------------
|
||||
|
||||
The following crates support \`no\_std\`:
|
||||
- cranelift-entity
|
||||
- cranelift-codegen
|
||||
- cranelift-frontend
|
||||
- cranelift-native
|
||||
- cranelift-wasm
|
||||
- cranelift-module
|
||||
- cranelift-simplejit
|
||||
- cranelift
|
||||
|
||||
To use no\_std mode, disable the std feature and enable the core
|
||||
feature. This currently requires nightly rust.
|
||||
|
||||
For example, to build \`cranelift-codegen\`:
|
||||
|
||||
``` {.sourceCode .sh}
|
||||
cd lib/codegen
|
||||
cargo build --no-default-features --features core
|
||||
```
|
||||
|
||||
Or, when using cranelift-codegen as a dependency (in Cargo.toml):
|
||||
|
||||
``` {.sourceCode .}
|
||||
[dependency.cranelift-codegen]
|
||||
...
|
||||
default-features = false
|
||||
features = ["core"]
|
||||
```
|
||||
|
||||
no\_std support is currently "best effort". We won't try to break it,
|
||||
and we'll accept patches fixing problems, however we don't expect all
|
||||
developers to build and test no\_std when submitting patches.
|
||||
Accordingly, the ./test-all.sh script does not test no\_std.
|
||||
|
||||
There is a separate ./test-no\_std.sh script that tests the no\_std
|
||||
support in packages which support it.
|
||||
|
||||
It's important to note that cranelift still needs liballoc to compile.
|
||||
Thus, whatever environment is used must implement an allocator.
|
||||
|
||||
Also, to allow the use of HashMaps with no\_std, an external crate
|
||||
called hashmap\_core is pulled in (via the core feature). This is mostly
|
||||
the same as std::collections::HashMap, except that it doesn't have DOS
|
||||
protection. Just something to think about.
|
||||
|
||||
Building the documentation
|
||||
--------------------------
|
||||
|
||||
To build the Cranelift documentation, you need the [Sphinx documentation
|
||||
generator](https://www.sphinx-doc.org/):
|
||||
|
||||
$ pip install sphinx sphinx-autobuild sphinx_rtd_theme
|
||||
$ cd cranelift/docs
|
||||
$ make html
|
||||
$ open _build/html/index.html
|
||||
|
||||
We don't support Sphinx versions before 1.4 since the format of index
|
||||
tuples has changed.
|
||||
69
cranelift/rustc.md
Normal file
69
cranelift/rustc.md
Normal file
@@ -0,0 +1,69 @@
|
||||
Cranelift in Rustc
|
||||
==================
|
||||
|
||||
One goal for Cranelift is to be usable as a backend suitable for
|
||||
compiling Rust in debug mode. This mode doesn't require a lot of
|
||||
mid-level optimization, and it does want very fast compile times, and
|
||||
this matches up fairly well with what we expect Cranelift's initial
|
||||
strengths and weaknesses will be. Cranelift is being designed to take
|
||||
aggressive advantage of multiple cores, and to be very efficient with
|
||||
its use of memory.
|
||||
|
||||
Another goal is a "pretty good" backend. The idea here is to do the work
|
||||
to get MIR-level inlining enabled, do some basic optimizations in
|
||||
Cranelift to capture the low-hanging fruit, and then use that along with
|
||||
good low-level optimizations to produce code which has a chance of being
|
||||
decently fast, with quite fast compile times. It obviously wouldn't
|
||||
compete with LLVM-based release builds in terms of optimization, but for
|
||||
some users, completely unoptimized code is too slow to test with, so a
|
||||
"pretty good" mode might be good enough.
|
||||
|
||||
There's plenty of work to do to achieve these goals, and if achieve
|
||||
them, we'll have enabled a Rust compiler written entirely in Rust, and
|
||||
enabled faster Rust compile times for important use cases.
|
||||
|
||||
With all that said, there is a potential goal beyond that, which is to
|
||||
build a full optimizing release-capable backend. We can't predict how
|
||||
far Cranelift will go yet, but we do have some crazy ideas about what
|
||||
such a thing might look like, including:
|
||||
|
||||
- Take advantage of Rust language properties in the optimizer. With
|
||||
LLVM, Rust is able to use annotations to describe some of its
|
||||
aliasing guarantees, however the annotations are awkward and
|
||||
limited. An optimizer that can represent the core aliasing
|
||||
relationships that Rust provides directly has the potential to be
|
||||
very powerful without the need for complex alias analysis logic.
|
||||
Unsafe blocks are an interesting challenge, however in many simple
|
||||
cases, like Vec, it may be possible to recover what the optimizer
|
||||
needs to know.
|
||||
- Design for superoptimization. Traditionally, compiler development
|
||||
teams have spent many years of manual effort to identify patterns of
|
||||
code that can be matched and replaced. Superoptimizers have been
|
||||
contributing some to this effort, but in the future, we may be able
|
||||
to reverse roles. Superoptimizers will do the bulk of the work, and
|
||||
humans will contribute specialized optimizations that
|
||||
superoptimizers miss. This has the potential to take a new optimizer
|
||||
from scratch to diminishing-returns territory with much less manual
|
||||
effort.
|
||||
- Build an optimizer IR without the constraints of fast-debug-build
|
||||
compilation. Cranelift's base IR is focused on Codegen, so a
|
||||
full-strength optimizer would either use an IR layer on top of it
|
||||
(possibly using Cranelift's flexible EntityMap system), or possibly
|
||||
an independent IR that could be translated to/from the base IR.
|
||||
Either way, this overall architecture would keep the optimizer out
|
||||
of the way of the non-optimizing build path, which keeps that path
|
||||
fast and simple, and gives the optimizer more flexibility. If we
|
||||
then want to base the IR on a powerful data structure like the Value
|
||||
State Dependence Graph (VSDG), we can do so with fewer compromises.
|
||||
|
||||
And, these ideas build on each other. For example, one of the challenges
|
||||
for dependence-graph-oriented IRs like the VSDG is getting good enough
|
||||
memory dependence information. But if we can get high-quality aliasing
|
||||
information directly from the Rust front-end, we should be in great
|
||||
shape. As another example, it's often harder for superoptimizers to
|
||||
reason about control flow than expression graphs. But, graph-oriented
|
||||
IRs like the VSDG represent control flow as control dependencies. It's
|
||||
difficult to say how powerful this combination will be until we try it,
|
||||
but if nothing else, it should be very convenient to express
|
||||
pattern-matching over a single graph that includes both data and control
|
||||
dependencies.
|
||||
40
cranelift/spidermonkey.md
Normal file
40
cranelift/spidermonkey.md
Normal file
@@ -0,0 +1,40 @@
|
||||
Cranelift in SpiderMonkey
|
||||
=========================
|
||||
|
||||
[SpiderMonkey](https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey)
|
||||
is the JavaScript and WebAssembly engine in Firefox. Cranelift is
|
||||
designed to be used in SpiderMonkey with the goal of enabling better
|
||||
code generation for ARM's 32-bit and 64-bit architectures, and building
|
||||
a framework for improved low-level code optimizations in the future.
|
||||
|
||||
Phase 1: WebAssembly
|
||||
--------------------
|
||||
|
||||
SpiderMonkey currently has two WebAssembly compilers: The tier 1
|
||||
baseline compiler (not shown below) and the tier 2 compiler using the
|
||||
IonMonkey JavaScript compiler's optimizations and register allocation.
|
||||
|
||||

|
||||
|
||||
In phase 1, Cranelift aims to replace the IonMonkey-based tier 2
|
||||
compiler for WebAssembly only. It will still be orchestrated by the
|
||||
BaldrMonkey engine and compile WebAssembly modules on multiple threads.
|
||||
Cranelift translates binary wasm functions directly into its own
|
||||
intermediate representation, and it generates binary machine code
|
||||
without depending on SpiderMonkey's macro assembler.
|
||||
|
||||
Phase 2: IonMonkey
|
||||
------------------
|
||||
|
||||
The IonMonkey JIT compiler is designed to compile JavaScript code. It
|
||||
uses two separate intermediate representations to do that:
|
||||
|
||||
- MIR is used for optimizations that are specific to JavaScript JIT
|
||||
compilation. It has good support for JS types and the special tricks
|
||||
needed to make JS fast.
|
||||
- LIR is used for register allocation.
|
||||
|
||||

|
||||
|
||||
Cranelift has its own register allocator, so the LIR representation can
|
||||
be skipped when using Cranelift as a backend for IonMonkey.
|
||||
64
rustc.rst
64
rustc.rst
@@ -1,64 +0,0 @@
|
||||
==================
|
||||
Cranelift in Rustc
|
||||
==================
|
||||
|
||||
One goal for Cranelift is to be usable as a backend suitable for compiling Rust
|
||||
in debug mode. This mode doesn't require a lot of mid-level optimization, and it
|
||||
does want very fast compile times, and this matches up fairly well with what we
|
||||
expect Cranelift's initial strengths and weaknesses will be. Cranelift is being
|
||||
designed to take aggressive advantage of multiple cores, and to be very efficient
|
||||
with its use of memory.
|
||||
|
||||
Another goal is a "pretty good" backend. The idea here is to do the work to get
|
||||
MIR-level inlining enabled, do some basic optimizations in Cranelift to capture the
|
||||
low-hanging fruit, and then use that along with good low-level optimizations to
|
||||
produce code which has a chance of being decently fast, with quite fast compile
|
||||
times. It obviously wouldn't compete with LLVM-based release builds in terms of
|
||||
optimization, but for some users, completely unoptimized code is too slow to test
|
||||
with, so a "pretty good" mode might be good enough.
|
||||
|
||||
There's plenty of work to do to achieve these goals, and if achieve them, we'll have
|
||||
enabled a Rust compiler written entirely in Rust, and enabled faster Rust compile
|
||||
times for important use cases.
|
||||
|
||||
With all that said, there is a potential goal beyond that, which is to build a
|
||||
full optimizing release-capable backend. We can't predict how far Cranelift will go
|
||||
yet, but we do have some crazy ideas about what such a thing might look like,
|
||||
including:
|
||||
|
||||
- Take advantage of Rust language properties in the optimizer. With LLVM, Rust is
|
||||
able to use annotations to describe some of its aliasing guarantees, however the
|
||||
annotations are awkward and limited. An optimizer that can represent the core
|
||||
aliasing relationships that Rust provides directly has the potential to be very
|
||||
powerful without the need for complex alias analysis logic. Unsafe blocks are an
|
||||
interesting challenge, however in many simple cases, like Vec, it may be possible
|
||||
to recover what the optimizer needs to know.
|
||||
|
||||
- Design for superoptimization. Traditionally, compiler development teams have
|
||||
spent many years of manual effort to identify patterns of code that can be
|
||||
matched and replaced. Superoptimizers have been contributing some to this
|
||||
effort, but in the future, we may be able to reverse roles.
|
||||
Superoptimizers will do the bulk of the work, and humans will contribute
|
||||
specialized optimizations that superoptimizers miss. This has the potential to
|
||||
take a new optimizer from scratch to diminishing-returns territory with much
|
||||
less manual effort.
|
||||
|
||||
- Build an optimizer IR without the constraints of fast-debug-build compilation.
|
||||
Cranelift's base IR is focused on Codegen, so a full-strength optimizer would either
|
||||
use an IR layer on top of it (possibly using Cranelift's flexible EntityMap system),
|
||||
or possibly an independent IR that could be translated to/from the base IR. Either
|
||||
way, this overall architecture would keep the optimizer out of the way of the
|
||||
non-optimizing build path, which keeps that path fast and simple, and gives the
|
||||
optimizer more flexibility. If we then want to base the IR on a powerful data
|
||||
structure like the Value State Dependence Graph (VSDG), we can do so with fewer
|
||||
compromises.
|
||||
|
||||
And, these ideas build on each other. For example, one of the challenges for
|
||||
dependence-graph-oriented IRs like the VSDG is getting good enough memory dependence
|
||||
information. But if we can get high-quality aliasing information directly from the
|
||||
Rust front-end, we should be in great shape. As another example, it's often harder
|
||||
for superoptimizers to reason about control flow than expression graphs. But,
|
||||
graph-oriented IRs like the VSDG represent control flow as control dependencies.
|
||||
It's difficult to say how powerful this combination will be until we try it, but
|
||||
if nothing else, it should be very convenient to express pattern-matching over a
|
||||
single graph that includes both data and control dependencies.
|
||||
@@ -1,44 +0,0 @@
|
||||
=========================
|
||||
Cranelift in SpiderMonkey
|
||||
=========================
|
||||
|
||||
`SpiderMonkey <https://developer.mozilla.org/en-US/docs/Mozilla/Projects/SpiderMonkey>`_ is the
|
||||
JavaScript and WebAssembly engine in Firefox. Cranelift is designed to be used in SpiderMonkey with
|
||||
the goal of enabling better code generation for ARM's 32-bit and 64-bit architectures, and building
|
||||
a framework for improved low-level code optimizations in the future.
|
||||
|
||||
Phase 1: WebAssembly
|
||||
--------------------
|
||||
|
||||
SpiderMonkey currently has two WebAssembly compilers: The tier 1 baseline compiler (not shown
|
||||
below) and the tier 2 compiler using the IonMonkey JavaScript compiler's optimizations and register
|
||||
allocation.
|
||||
|
||||
.. image:: media/spidermonkey1.png
|
||||
:align: center
|
||||
:width: 80%
|
||||
:alt: Cranelift in SpiderMonkey phase 1
|
||||
|
||||
In phase 1, Cranelift aims to replace the IonMonkey-based tier 2 compiler for WebAssembly only. It
|
||||
will still be orchestrated by the BaldrMonkey engine and compile WebAssembly modules on multiple
|
||||
threads. Cranelift translates binary wasm functions directly into its own intermediate
|
||||
representation, and it generates binary machine code without depending on SpiderMonkey's macro
|
||||
assembler.
|
||||
|
||||
Phase 2: IonMonkey
|
||||
------------------
|
||||
|
||||
The IonMonkey JIT compiler is designed to compile JavaScript code. It uses two separate
|
||||
intermediate representations to do that:
|
||||
|
||||
- MIR is used for optimizations that are specific to JavaScript JIT compilation. It has good
|
||||
support for JS types and the special tricks needed to make JS fast.
|
||||
- LIR is used for register allocation.
|
||||
|
||||
.. image:: media/spidermonkey2.png
|
||||
:align: center
|
||||
:width: 80%
|
||||
:alt: Cranelift in SpiderMonkey phase 2
|
||||
|
||||
Cranelift has its own register allocator, so the LIR representation can be skipped when using
|
||||
Cranelift as a backend for IonMonkey.
|
||||
Reference in New Issue
Block a user