Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/pulley/tests/all/disas.rs
1691 views
1
//! Disassembly tests.
2
3
use pulley_interpreter::*;
4
5
fn encoded(ops: &[Op]) -> Vec<u8> {
6
let mut encoded = vec![];
7
for op in ops {
8
op.encode(&mut encoded);
9
}
10
log::trace!("encoded: {encoded:?}");
11
encoded
12
}
13
14
#[track_caller]
15
fn assert_disas_with_disassembler(dis: &mut disas::Disassembler<'_>, expected: &str) {
16
let expected = expected.trim();
17
eprintln!("=== expected ===\n{expected}");
18
19
decode::Decoder::decode_all(dis).expect("decoding should succeed");
20
21
let actual = dis.disas().trim();
22
eprintln!("=== actual ===\n{actual}");
23
24
assert_eq!(expected, actual);
25
}
26
27
#[track_caller]
28
fn assert_disas(ops: &[Op], expected: &str) {
29
let bytecode = encoded(ops);
30
assert_disas_with_disassembler(
31
&mut disas::Disassembler::new(&bytecode).hexdump(false),
32
expected,
33
);
34
}
35
36
#[test]
37
fn simple() {
38
assert_disas(
39
&[
40
// Prologue.
41
Op::PushFrame(PushFrame {}),
42
// Function body.
43
Op::Xadd32(Xadd32 {
44
operands: BinaryOperands {
45
dst: XReg::x0,
46
src1: XReg::x0,
47
src2: XReg::x1,
48
},
49
}),
50
// Epilogue.
51
Op::PopFrame(PopFrame {}),
52
Op::Ret(Ret {}),
53
],
54
r#"
55
0: push_frame
56
1: xadd32 x0, x0, x1
57
4: pop_frame
58
5: ret
59
"#,
60
);
61
}
62
63
#[test]
64
fn no_offsets() {
65
let bytecode = encoded(&[
66
// Prologue.
67
Op::PushFrame(PushFrame {}),
68
// Function body.
69
Op::Xadd32(Xadd32 {
70
operands: BinaryOperands {
71
dst: XReg::x0,
72
src1: XReg::x0,
73
src2: XReg::x1,
74
},
75
}),
76
// Epilogue.
77
Op::PopFrame(PopFrame {}),
78
Op::Ret(Ret {}),
79
]);
80
81
assert_disas_with_disassembler(
82
disas::Disassembler::new(&bytecode)
83
.offsets(false)
84
.hexdump(false),
85
r#"
86
push_frame
87
xadd32 x0, x0, x1
88
pop_frame
89
ret
90
"#,
91
);
92
}
93
94
#[test]
95
fn no_offsets_or_hexdump() {
96
let bytecode = encoded(&[
97
// Prologue.
98
Op::PushFrame(PushFrame {}),
99
// Function body.
100
Op::Xadd32(Xadd32 {
101
operands: BinaryOperands {
102
dst: XReg::x0,
103
src1: XReg::x0,
104
src2: XReg::x1,
105
},
106
}),
107
// Epilogue.
108
Op::PopFrame(PopFrame {}),
109
Op::Ret(Ret {}),
110
]);
111
112
assert_disas_with_disassembler(
113
disas::Disassembler::new(&bytecode)
114
.offsets(false)
115
.hexdump(false),
116
r#"
117
push_frame
118
xadd32 x0, x0, x1
119
pop_frame
120
ret
121
"#,
122
);
123
}
124
125
#[test]
126
fn disassemble_br_table() {
127
let mut bytecode = Vec::new();
128
PushFrame {}.encode(&mut bytecode);
129
BrTable32 {
130
idx: XReg::x1,
131
amt: 4,
132
}
133
.encode(&mut bytecode);
134
bytecode.extend_from_slice(&0_i32.to_le_bytes());
135
bytecode.extend_from_slice(&0_i32.to_le_bytes());
136
bytecode.extend_from_slice(&0_i32.to_le_bytes());
137
bytecode.extend_from_slice(&0_i32.to_le_bytes());
138
PopFrame {}.encode(&mut bytecode);
139
140
assert_disas_with_disassembler(
141
disas::Disassembler::new(&bytecode)
142
.hexdump(false)
143
.offsets(false),
144
r#"
145
push_frame
146
br_table32 x1, 4
147
0x0 // target = 0x7
148
0x0 // target = 0xb
149
0x0 // target = 0xf
150
0x0 // target = 0x13
151
pop_frame
152
"#,
153
);
154
}
155
156