This change substitutes the string based emission mechanism with
cranelift-codegen's x64 backend.
This change _does not_:
* Introduce new functionality in terms of supported instructions.
* Change the semantics of the assembler/macroassembler in terms of the logic to
emit instructions.
The most notable differences between this change and the previous version are:
* Handling of shared flags and ISA-specific flags, which for now are left with
the default value.
* Simplification of instruction emission per operand size: previously the
assembler defined different methods depending on the operand size (e.g. `mov`
for 64 bits, and `movl` for 32 bits). This change updates such approach so that
each assembler method takes an operand size as a parameter, reducing duplication
and making the code more concise and easier to integrate with the x64's `Inst` enum.
* Introduction of a disassembler for testing purposes.
As of this change, Winch generates the following code for the following test
programs:
```wat
(module
(export "main" (func $main))
(func $main (result i32)
(i32.const 10)
(i32.const 20)
i32.add
))
```
```asm
0: 55 push rbp
1: 48 89 e5 mov rbp, rsp
4: b8 0a 00 00 00 mov eax, 0xa
9: 83 c0 14 add eax, 0x14
c: 5d pop rbp
d: c3 ret
```
```wat
(module
(export "main" (func $main))
(func $main (result i32)
(local $foo i32)
(local $bar i32)
(i32.const 10)
(local.set $foo)
(i32.const 20)
(local.set $bar)
(local.get $foo)
(local.get $bar)
i32.add
))
```
```asm
0: 55 push rbp
1: 48 89 e5 mov rbp, rsp
4: 48 83 ec 08 sub rsp, 8
8: 48 c7 04 24 00 00 00 00 mov qword ptr [rsp], 0
10: b8 0a 00 00 00 mov eax, 0xa
15: 89 44 24 04 mov dword ptr [rsp + 4], eax
19: b8 14 00 00 00 mov eax, 0x14
1e: 89 04 24 mov dword ptr [rsp], eax
21: 8b 04 24 mov eax, dword ptr [rsp]
24: 8b 4c 24 04 mov ecx, dword ptr [rsp + 4]
28: 01 c1 add ecx, eax
2a: 48 89 c8 mov rax, rcx
2d: 48 83 c4 08 add rsp, 8
31: 5d pop rbp
32: c3 ret
```
```wat
(module
(export "main" (func $main))
(func $main (param i32) (param i32) (result i32)
(local.get 0)
(local.get 1)
i32.add
))
```
```asm
0: 55 push rbp
1: 48 89 e5 mov rbp, rsp
4: 48 83 ec 08 sub rsp, 8
8: 89 7c 24 04 mov dword ptr [rsp + 4], edi
c: 89 34 24 mov dword ptr [rsp], esi
f: 8b 04 24 mov eax, dword ptr [rsp]
12: 8b 4c 24 04 mov ecx, dword ptr [rsp + 4]
16: 01 c1 add ecx, eax
18: 48 89 c8 mov rax, rcx
1b: 48 83 c4 08 add rsp, 8
1f: 5d pop rbp
20: c3 ret
```
56 lines
1.7 KiB
TOML
56 lines
1.7 KiB
TOML
[package]
|
|
name = "cranelift-tools"
|
|
authors = ["The Cranelift Project Developers"]
|
|
version = "0.0.0"
|
|
description = "Binaries for testing the Cranelift libraries"
|
|
license = "Apache-2.0 WITH LLVM-exception"
|
|
documentation = "https://github.com/bytecodealliance/wasmtime/blob/main/cranelift/docs/index.md"
|
|
repository = "https://github.com/bytecodealliance/wasmtime"
|
|
publish = false
|
|
edition.workspace = true
|
|
|
|
[[bin]]
|
|
name = "clif-util"
|
|
path = "src/clif-util.rs"
|
|
|
|
[[test]]
|
|
name = "filetests"
|
|
path = "tests/filetests.rs"
|
|
harness = false
|
|
|
|
[dependencies]
|
|
cfg-if = "1.0"
|
|
cranelift-codegen = { workspace = true }
|
|
cranelift-entity = { workspace = true }
|
|
cranelift-interpreter = { workspace = true }
|
|
cranelift-reader = { workspace = true }
|
|
cranelift-frontend = { workspace = true }
|
|
cranelift-wasm = { workspace = true, optional = true }
|
|
cranelift-native = { workspace = true }
|
|
cranelift-filetests = { workspace = true }
|
|
cranelift-module = { workspace = true }
|
|
cranelift-object = { workspace = true }
|
|
cranelift-jit = { workspace = true }
|
|
cranelift-preopt = { workspace = true }
|
|
cranelift = { workspace = true }
|
|
filecheck = "0.5.0"
|
|
log = { workspace = true }
|
|
termcolor = "1.1.2"
|
|
capstone = { workspace = true, optional = true }
|
|
wat = { workspace = true, optional = true }
|
|
target-lexicon = { workspace = true, features = ["std"] }
|
|
pretty_env_logger = "0.4.0"
|
|
rayon = { version = "1", optional = true }
|
|
indicatif = "0.13.0"
|
|
thiserror = { workspace = true }
|
|
walkdir = "2.2"
|
|
anyhow = { workspace = true }
|
|
clap = { workspace = true }
|
|
|
|
[features]
|
|
default = ["disas", "wasm", "cranelift-codegen/all-arch", "cranelift-codegen/trace-log", "souper-harvest"]
|
|
disas = ["capstone"]
|
|
wasm = ["wat", "cranelift-wasm"]
|
|
souper-harvest = ["cranelift-codegen/souper-harvest", "rayon"]
|
|
all-arch = ["cranelift-codegen/all-arch"]
|