From c9125e8a13bf29bfbf1f0a9e1f64a669200adaff Mon Sep 17 00:00:00 2001 From: Andrew Brown Date: Tue, 10 Dec 2024 15:51:48 -0800 Subject: [PATCH] Add "A Cranelift Assembler" [Rendered](https://github.com/abrown/bytecodealliance-rfcs/blob/cranelift-assembler/accepted/cranelift-assembler.md) --- accepted/cranelift-assembler-format.png | Bin 0 -> 46560 bytes accepted/cranelift-assembler-instruction.png | Bin 0 -> 58675 bytes accepted/cranelift-assembler.md | 368 +++++++++++++++++++ 3 files changed, 368 insertions(+) create mode 100644 accepted/cranelift-assembler-format.png create mode 100644 accepted/cranelift-assembler-instruction.png create mode 100644 accepted/cranelift-assembler.md diff --git a/accepted/cranelift-assembler-format.png b/accepted/cranelift-assembler-format.png new file mode 100644 index 0000000000000000000000000000000000000000..7544d98907a49b34adfa78a7ff5173d561ab5ed9 GIT binary patch literal 46560 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 Why are we doing this? What use cases does it support? What is the expected outcome? + +The current assembler functionality in `cranelift-codegen` has served the project well but can be +improved. Much of the the following stems from experience contributing to the x64 backend; this RFC +is a request for other backend maintainers to discuss the following observations on the status quo: + +- the __"category" approach is error-prone__: in x64 at least, it is possible for a developer to + create an invalid machine instruction by mistake. Because our `MInst` "categories" can emit many + opcodes, we tried to create `enum`s to limit which opcodes fit the category; unfortunately, this + is not consistently applied everywhere. We try hard to not create these invalid states during + lowering and check this via fuzzing, but it would be better to avoid possible compile-time crashes + or miscompilations entirely. +- the __"category" approach is leaky__: though it is tempting to group machine instructions + together, the reality of ISA design breaks through. Adding new instructions is difficult because + new instructions do not fit neatly in existing categories. This leads to adding new categories + (103 of them in the x64 backend!), some of which represent _groups of instructions_, others that + represent _a specific instruction_, and still others that represent specific _sequences of + instructions_. This proposal argues that these "categories," though helpful initially, would be + better replaced by concrete instructions and instruction sequences. +- looking at ISLE rules, it is __unclear what machine code will be emitted__: because most concrete + instructions are hidden away behind "categories," it can be difficult to figure out what concrete + instructions will be used. It is possible to figure this out by writing a CLIF test and massaging + the printed output or by writing an end-to-end Wasm test and dumping the emitted assembly, but a + more direct approach is to materialize lowering decisions in the ISLE files where these decisions + are alreay made (and where a developer would naturally want to make changes!). +- we __miss optimization opportunities__: because the concrete machine instructions are hidden away + behind "categories," it is hard to know what is available and use it at lowering time. For + example, while prototyping this proposal, listing out the available ALU instructions showed that + operations patterns like `sextend((x, y))` and `store(a, (load(a), ...))` have natural + lowerings that we do not consider in ISLE, but could (or not: I'm just arguing that having all the + assembly options, or at least more options, improves the situation). + +The above argues for moving away from `MInst` "categories" due to the problems they cause — +negative motivation. There are other positive motivations to move to using concrete machine +instructions: + +- __ease development of new ISA features__: Intel CPUs will soon have support for AVX10 and APX. As + I (@abrown) evaluated how to add these to Cranelift's x64 backend, it seemed easier to add them as + separate instructions than retrofitting them into the current "category" infrastructure. By my + rough estimates, I believe Cranelift can emit around 800 concrete x64 instructions: 500 vector and + 300 scalar. It seems likely that we would want to have the option emit those 500 vector + instructions with new versions using AVX10 (retaining existing SSE, VEX, and EVEX versions) as + well as emitting 300 new versions using REX2 prefixes (allowing access to 32 registers). We may + also want 300 new scalar versions using new EVEX forms in APX that allow three-operand form + (write, read, read). All of this new functionality pointed towards a new assembler infrastructure. +- __safer machine code emission__: though I mentioned that "categories" were error-prone above, this + proposal would not only improve that but also open other opportunities for safer compilation. + We've heard that being able to "talk about" concrete instructions may help verification efforts. + And in the prototype I will describe below, I will show that we can fuzz the assembler itself. + This helps us to more thoroughly cover the backend emission portion of the compiler toolchain. +- provide a __reusable assembler__: there are plenty of perfectly-fine assemblers in the wild (see + [Why a new assembler?]) but, regardless, splitting out Cranelift's assembler functionality into + its own crate may be beneficial. For one, I've heard it could make Winch compilation easier + — an example of internal reuse. But also, a separate crate opens the possibility (dubiously) + that external developers may use it elsewhere and contribute back to it. + +[AVX10]: https://www.intel.com/content/www/us/en/content-details/828964 +[APX]: https://www.intel.com/content/www/us/en/content-details/836198 + +# Proposal +[proposal]: #proposal + +> The meat of the RFC. Explain the proposal in sufficient detail to support building consensus +> around the primary design questions and how they affect stakeholders. The fine details of a design +> will be finalized during implementation review. + +The proposed assembler infrastructure will: + +1. define concrete machine instructions in a DSL +2. generate Rust and ISLE code to encode, print, register-allocate and feature-match +3. fuzz all possible machine instructions, checking they are valid against a known-good disassembler +4. integrate into `cranelift-codegen` over time, gradually replacing the existing "category" + infrastructure + +The following details come from an end-to-end prototype of this design implementing the `AND` +instruction for `cranelift-codegen`'s x64 backend ([`abrown#assembler-collaborate`]) + +[`abrown#assembler-collaborate`]: https://github.com/bytecodealliance/wasmtime/compare/main...abrown:wasmtime:assembler-collaborate + +### DSL +[DSL]: #dsl + +We describe the assembler instructions using single lines in a domain-specific language (DSL) +written in Rust. The goal here is brevity and transference from the developer manual — ideally +one could look at the manual, look at the DSL, and visually check equivalence. + +The Intel [manual] (and others, like Felix Cloutier's excellent HTML [transformation]) rely on an instruction table that describes the instruction name, opcode, feature set, etc. + +[manual]: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html +[transformation]: https://www.felixcloutier.com/x86 + +![Instruction Table](./cranelift-assembler-instruction.png) + +The "Op/En" column refers to a secondary table that the manual calls the "Instruction Operand +Encoding" table but we will refer to as a __format__ table: + +![Format (Encoding) Table](./cranelift-assembler-format.png) + +Our DSL merges those tables into single lines: + +```rust +inst("andb", fmt("I", [rw(al), r(imm8)]), rex(0x24).ib(), None), +inst("andw", fmt("I", [rw(ax), r(imm16)]), rex(0x25).prefix(_66).iw(), None), +inst("andl", fmt("I", [rw(eax), r(imm32)]), rex(0x25).id(), None), +inst("andq", fmt("I_SXLQ", [rw(rax), sxq(imm32)]), rex(0x25).w().id(), None), +... +inst("andb", fmt("RM", [rw(r8), r(rm8)]), rex(0x22).r(), None), +inst("andb", fmt("RM_SXBQ", [rw(r8), r(rm8)]), rex(0x22).w().r(), None), +inst("andw", fmt("RM", [rw(r16), r(rm16)]), rex(0x23).prefix(_66).r(), None), +inst("andl", fmt("RM", [rw(r32), r(rm32)]), rex(0x23).r(), None), +inst("andq", fmt("RM", [rw(r64), r(rm64)]), rex(0x23).w().r(), None), +``` + +Some explanation: +- an `inst` is built up from an __instruction mnemonic__, a __format__ (`fmt`), an __encoding__ + (`rex` here), and CPUID __features__ (`None` here) +- the __format__ describes the instruction operands precisely and has a __format name__ +- the __encoding__ describes how to emit the machine code and eventually would have `vex` and `evex` + constructors +- the __feature__ set will eventually allow one to write expressions like `AVX512_X | AVX512_Y` + +Note that this DSL will demand that instruction names be unique: but we used `andb` twice above! To +solve this, the DSL concatenates the __instruction mnemonic__ and the __format name__. E.g., we +would refer to the first instruction above as `Inst::andb_i`. Unfortunately, this plan is almost, +but not quite, sufficient for uniqueness; we manually append descriptors like `SXBQ` where the +table-provided names are simply not specific enough. Perhaps we could auto-append this suffix in the +future, but we want it to be quite clear what instruction name will be generated in the next step. + +### Generation +[Generation]: #generation + +Using the instructions defined in the DSL, we generate Rust and ISLE code. This generated code is +able to: +- encode an instruction +- display an instruction +- check CPUID features (TODO) +- interface with register allocation +- interface with ISLE lowering (TODO) + +For example, x64 has an `andl` operation that modifies a 32-bit register-or-memory operand by +AND-ing it with a sign-extended 8-bit immediate. Using the manual's format table, we append the `mi` +suffix; then we additionally append `sxbl` to communicate the sign-extension. The definition looks +like this: + +```rust +inst("andl", fmt("MI_SXBL", [rw(rm32), sxl(imm8)]), rex(0x83).digit(4).ib(), None), +``` + +When we generate Rust code from the DSL, the assembler creates the following: + +```rust +/// `andl: MI_SXBL(rm32[rw], imm8[sxl]) => 0x83 /4 ib` +#[derive(arbitrary::Arbitrary, Clone, Debug)] +pub struct andl_mi_sxbl { + pub rm32: GprMem, + pub imm8: Imm8, +} +impl andl_mi_sxbl { + pub fn encode(&self, buf: &mut impl CodeSink, off: &impl KnownOffsetTable) { ... } + pub fn matches(&self, features: TODO) { ... } + pub fn regalloc(&mut self, visitor: &mut impl RegallocVisitor) { + self.rm32.read_write(visitor); // cranelift/assembler/meta/src/generate/inst.rs:130 + } +} +impl std::fmt::Display for andl_mi_sxbl { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + let rm32 = self.rm32.to_string(Size::Doubleword); // cranelift/assembler/meta/src/generate/inst.rs:149 + let imm8 = self.imm8.to_string(Extension::SignExtendLong); // cranelift/assembler/meta/src/generate/inst.rs:149 + write!(f, "andl {imm8}, {rm32}") // cranelift/assembler/meta/src/generate/inst.rs:154 + } +} +``` + +Note how, unlike in the current `Inst` implementation, the types of `andl_mi_sxbl` prevent +accidental misuse: we can only create this instruction in a correct state. Beyond construction, the +actual implementation of `encode` is already tested: to a large degree, the prototype reuses the +pre-existing assembler logic in `cranelift-codegen`. To complete the bridge from `cranelift-codegen` +to this new assembler, various traits like `CodeSink`, `KnownOffsetTable`, and `RegallocVisitor` +adapt between what currently exists and the more restrictive assembler. And, for troubleshooting, +generated code is commented with the location it was generated from. + +The generator also creates one large `enum Inst` to comprehend all defined instructions. Functions +for encoding, matching, pretty-printing, etc., all proxy on to their previously generated versions +(only pretty-printing shown here): + +```rust +pub enum Inst { + andl_mi_sxbl(andl_mi_sxbl), + ... +} +impl std::fmt::Display for Inst { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + Self::andl_mi_sxbl(i) => write!(f, "{i}"), // cranelift/assembler/meta/src/generate/inst.rs:43 + ... + } + } +} +``` + +One final piece to this is the generation of ISLE helpers to ease with integration (see +[Integration] below). This is still a work in progress in the [`abrown#assembler-collaborate`] +prototype, but one can imagine a `assembler.isle` file containing definitions like: + +``` +(decl x64_andl_mi_sxbl (AssemblerGprMem AssemblerImm8) AssemblerGprMem) +(rule (x64_andl_mi_sxbl rm32 imm8) + (let ((_ Unit (emit (MInst.External (assemble_x64_andl_mi_sxbl rm32 imm8))))) + rm32)) +(decl assemble_x64_andl_mi_sxbl (AssemblerGprMem AssemblerImm8) AssemblerInst) +(extern constructor assemble_x64_andl_mi_sxbl assemble_x64_andl_mi_sxbl) +``` + +These make it possible to use the instruction during lowering. Additional Rust code like +`assemble_x64_andl_mi_sxlbl` must also be generated into some macro, e.g., `isle_assembler_methods!` +to be included in the `impl Context` for the x64 backend in `cranelift-codegen`. + +### Fuzzing +[Fuzzing]: #fuzzing + +Once we generate all of the above, we can check that our assembler only creates correct instructions +using fuzzing. In the [Generation] section above, you may have noticed that generated code is +derives the `Arbitrary` trait. This allows a fuzz oracle to generate single instructions with random +operands and check their correctness against an existing disassembler. + +For now, we check the assembler against `capstone`. In the future, for x64, using a more official +disassembler such as [XED] could be an option (it would have all the latest instructions, it is more +"official"). Each fuzz test generates a random instruction, assembles it with our new assembler, +disassembles it with the known-good disassembler, checks that only a single instruction is present, +and checks that the disassembled strings match. + +```rust +pub fn roundtrip(inst: &Inst) { + let assembled = assemble(inst); // Using our new assembler. + let expected = disassemble(&assembled); // Using known-good disassembler, e.g., capstone. + let expected = expected.split_once(' ').unwrap().1; + let actual = inst.to_string(); + assert_eq!(expected, &actual); +} +``` + +[XED]: https://github.com/intelxed/xed + +Despite opportunities for optimization, fuzzing the assembler quickly finds bugs either in the +assembled machine code or in our pretty-printed disassembly. E.g., running for a bit over two +minutes can chew through 280 million variants: + +``` +#285355851: cov: 644 ft: 679 corp: 94 exec/s 174542 oom/timeout/crash: 0/0/0 time: 140s job: 58 dft_time: 0 +``` + +This fuzzing layer decreases the probability that Cranelift generates incorrect machine code and +gives us a way to measure that separate from the end-to-end compilation fuzzing. + +### Integration +[Integration]: #integration + +The [Generation] section describes how the assembler generates ISLE definitions for each instruction +(e.g., `(decl x64_andl_mi_sxbl ...)`); to integrate these definitions in Cranelift seamlessly, let's +walk through the most delicate part of this proposal. The following steps outline a piece-by-piece +and over-time replacement of the current `cranelift-codegen` assembly logic with that of +`cranelift-assembler-*`. For clarity, any assembler types will use the prefix `Assembler*` in +`cranelift-codegen`. + +1. Create a new `(External (inst AssemblerInst))` variant in ISLE's `MInst` enumeration: for + backends that want to adopt the new assembler infrastructure, the `External` variant shows that + the work of encoding, register-allocating, pretty-printing, etc., is being done elsewhere, not in + `cranelift-codegen`. +2. Create mapping functions from `cranelift-codegen`'s current types (e.g., `GprMemImm`) to the + assembler's more restrictive types (e.g., `AssemblerGpr` or `AssemblerImm8`). These mappings are + likely to involve extra conversion work that may temporarily slow down compilation; this proposal + expects later analysis and optimization to fix this. (E.g., adding the `External` variant bumps + up the `MInst` size from 40 bytes to 48 bytes which should have _some_ instruction cache + effects). +3. Over time, replace lowering rules in ISLE that use the current logic `(rule (lower ...))` to use + the new `External` instructions. As this happens, we will stumble over the various + inconsistencies in the current "category" paradigm; e.g., some `NInst` variants are actually + _sequences_ of instructions. We anticipate this piece-by-piece transformation may require new + abstractions, e.g., `ExternalSequence`. +4. Eventually, all lowering of CLIF to machine instructions will use `cranelift-assembler-*` at + which point we can remove the `External` variant and any assembler logic from + `cranelift-codegen`. + +This high-level plan should replace the "category" instructions with concrete machine lowerings, but +it does not foresee _all_ issues along the way. The prototype does, however, already highlight two +potential issues that we raise here for discussion sake: + +- __abstraction leaks__: to lower from CLIF — a high-level SSA IR — to low-level machine + code we truly must "lower" from one abstraction level to another. E.g., @cfallin and @abrown have + already identified that `cranelift-codegen`'s decision to add a non-existent but necessary output + operand to x64 instructions causes problems for the current `cranelift-assembler-*` prototype + (though we're working on this). This proposal would argue that, for sanity's sake, we should avoid + leakage of this kind of `codegen`-necessary logic into the assembler, if at all possible. +- __verbosity__: the assembler also materializes all the possible machine instructions, something + that `cranelift-codegen` did not do; one benefit of `cranelift-codegen` in this sense is that it + hid some of this detail behind the `MInst` "categories." As the assembler brings this to light, + one possibility is that the lowering ISLE becomes very verbose (i.e., one line per machine + instruction totals roughly 20 lines for CLIF's `band`). @abrown's predilection is to surface this, + @cfallin would prefer to hide it. One approach is to generate extra ISLE helpers that group + together common patterns; the `*.isle` files would be available somewhere but not in tree. Another + option would be to extend ISLE with macro-like functionality. Feedback is welcome on this point! + +# Rationale and alternatives +[rationale-and-alternatives]: #rationale-and-alternatives + +> What other designs have been considered and what is the rationale for choosing the one proposed? + +### Why a new assembler? +[Why a new assembler?]: #why-a-new-assembler + +One good argument against this proposal is that it reinvents the wheel. Surely a new assembler need +not be written when so many battle-tested assemblers already exist? + +This proposal does not advocate creating a new assembler, though. It would appear so because new +crates appear, `cranelift-assembler-*`, but truly this assembler was already in existence inside +`cranelift-codegen`. By separating what was already there, this proposal promises better testing, +better verification integration, possible reuse, etc. + +In designing the prototype, I (@abrown) evaluated whether an already-existing assembler could be +slotted in here instead of moving the existing `cranelift-codegen` logic. My opinion is that the +difficult part is the [Integration] bits and that using an existing assembler (e.g., [XED]) does not +help with that. In fact, having control over the generated code made it easier to adapt to +Cranelift's peculiarities quickly. + +### Why not keep the status quo? +[Why not keep the status quo]: #why-not-keep-the-status-quo + +The prototype is based on x64 and the irregularities of that ISA may make it ideal for this kind of +project. Will other backends want to follow a similar path? It's unclear whether other backends want +to (or should) follow the split made by this proposal. + +In favor of moving to this proposal, backends like aarch64 have also gained many `MInst` "category" +variants; they may benefit from this kind of split. Arguing against, though: this could be work that +other backend maintainers don't want to take on. This seems like a good topic for discussion — +feel free to comment on this! + +One practical point from experience prototyping is that, while it seems clearly possible to generate +assembler instructions for other ISAs, the details of how to emit, pretty-print, etc. could be quite +different. This means the generation code is not a build-once-for-any-ISA affair. It may make sense +to separately finish out the `cranelift-assembler-x64` work before trying to generalize to other +ISAs. + +# Open questions +[open-questions]: #open-questions + +> - What parts of the design do you expect to resolve through the RFC process before this gets +> merged? +> - What parts of the design do you expect to resolve through implementation after the RFC is +> accepted? + +- How should we handle the additional verbosity that comes from materializing all the machine code + instructions? +- Which backends want to migrate to this proposal? Should we plan to migrate all backends to this + proposal?