Stream: cranelift

Topic: executing cranelift


view this post on Zulip Daniel Macovei (Jun 01 2022 at 21:45):

I'd like to play around with some ideas by attempting to target cranelift IR from wat/wasm. Is there a good cranelift runtime that I can use to confirm that my compilations are correct?

view this post on Zulip Chris Fallin (Jun 01 2022 at 21:52):

Hi @Daniel Macovei -- can you clarify what you mean by "Cranelift runtime"? There are a number of runtimes whose associated code generators use Cranelift, but Cranelift itself is not a runtime, and the IR is agnostic to a lot of the decisions that a runtime normally makes; so typically you will write software that generates CLIF, and tailor that CLIF to interface with your own runtime

view this post on Zulip Chris Fallin (Jun 01 2022 at 21:52):

there is Wasmtime, which is a WebAssembly runtime, and it uses Cranelift to compile Wasm to machine code by way of CLIF. But it only accepts Wasm as input, not CLIF

view this post on Zulip Daniel Macovei (Jun 01 2022 at 22:22):

Well I guess I started writing my own compiler in js that converts wat to wasm. I was thinking that a next fun thing to do would be to write something that would execute the wasm too. I guess from my reading that I thought that I good first step might be to target CLIF, but wasn't sure what the best way would be to check that I was generating it correctly. So are you saying that typically people know that they're generating it correctly by then targeting a specific hardware from their CLIF?

view this post on Zulip Adrian Sampson (Jun 01 2022 at 22:33):

(Not an expert but) I think the "normal" way is that people link to the Cranelift library and generate the IR in memory, right there—compiling from that to native code using the cranelift_jit or cranelift_module crates. As opposed to generating a text file with CLIF code and then, later, invoking a separate tool to translate that the rest of the way to native code.

view this post on Zulip Chris Fallin (Jun 01 2022 at 22:33):

Ah, OK, so I think there's a bit of X-Y problem going on here. At a top level, what you are trying to do is write a Wasm compiler+runtime. You're targeting CLIF, and you want to run that CLIF somehow to see if execution is correct. Is that right?

To answer the specific question first, folks typically test compilers that target Cranelift IR by compiling to native code, and running some test suite.

More generally, though, and I think where some of my confusion is coming from: CLIF isn't really intended to be a "target" in the same way that Wasm bytecode is. The only real use of CLIF currently is to drive Cranelift to produce machine code for one of our supported targets (x86_64, aarch64, s390x). There is a nascent "CLIF interpreter" that supports a few opcodes, but nothing that would really be useful for true testing; it doesn't even really support memory (and it's not clear what it would mean to do so, since CLIF operates at a machine-code-semantics level).

Moreover, CLIF doesn't define any of the ways to interact with the outside world, etc. A user of Cranelift generates CLIF that specifically accesses data structures, and calls functions, provided by their runtime, whatever that is, in the context of a process running native code.

Onto the topic of writing a Wasm compiler using Cranelift: it sounds like you are wanting to do it by generating CLIF. That's totally workable; but what you'll need to do is invoke Cranelift to produce machine code, then write a runtime that the machine code interfaces with (in C/C++/Rust or some other natively-compiled language). Or you could use cranelift-wasm, a frontend to the core cranelift-codegen that does the Wasm-to-CLIF translation for you, but with runtime-specific details provided by you. Or ultimately use Wasmtime to run the Wasm. If the goal is learning, the first two do sound like interesting projects, and you have the benefit of the existing Wasmtime+Cranelift stack to compare and test against.

Hopefully that helps? Happy to explain any of the above more if needed!

view this post on Zulip Daniel Macovei (Jun 01 2022 at 23:02):

Ok cool I guess I have some thinking to do... I'm working on an M1 so I guess I might have to use llvm instead of cranelift then?

view this post on Zulip Chris Fallin (Jun 01 2022 at 23:07):

@Daniel Macovei no, Cranelift works great on an M1 (I do a lot of my development on one) -- that's aarch64 in the target list above

view this post on Zulip Chris Fallin (Jun 01 2022 at 23:07):

we support: macOS, Windows, Linux on x86-64; macOS, Linux on aarch64; and Linux on s390x

view this post on Zulip Daniel Macovei (Jun 01 2022 at 23:12):

So I'm thinking then that I'm more interested in the first one (generating CLIF from wasm) and then using cranelift to produce machine code

view this post on Zulip Daniel Macovei (Jun 01 2022 at 23:25):

having difficulty building or installing in wasmtime or cranelift. getting the following. any tips? Screen-Shot-2022-06-01-at-6.20.38-PM.png

view this post on Zulip Daniel Macovei (Jun 01 2022 at 23:25):

idk if this is the right place to be asking for this kindof help... sorry if not

view this post on Zulip Chris Fallin (Jun 01 2022 at 23:31):

You're missing the git submodules -- git submodule update --init --recursive

view this post on Zulip Chris Fallin (Jun 01 2022 at 23:32):

https://docs.wasmtime.dev/contributing-building.html might be helpful (includes the above and more details)

view this post on Zulip Daniel Macovei (Jun 02 2022 at 01:09):

Thanks I'll check that out


Last updated: Dec 23 2024 at 12:05 UTC