MCPcopy Create free account
hub / github.com/bytecodealliance/wasmtime / generate_rust

Function generate_rust

cranelift/codegen/meta/src/pulley.rs:106–311  ·  view source on GitHub ↗
(filename: &str, out_dir: &Path)

Source from the content-addressed store, hash-verified

104}
105
106pub fn generate_rust(filename: &str, out_dir: &Path) -> Result<(), Error> {
107 let mut rust = String::new();
108
109 // Generate a pretty-printing method for debugging.
110 rust.push_str("pub fn print(inst: &RawInst) -> String {\n");
111 rust.push_str("match inst {\n");
112 for inst @ Inst { name, .. } in OPS.iter().chain(EXTENDED_OPS) {
113 if inst.skip() {
114 continue;
115 }
116
117 let mut pat = String::new();
118 let mut locals = String::new();
119 let mut format_string = String::new();
120 format_string.push_str(inst.snake_name);
121 for (i, op) in inst.operands().enumerate() {
122 match op {
123 Operand::Normal { name, ty } | Operand::Writable { name, ty } => {
124 pat.push_str(name);
125 pat.push_str(",");
126
127 if i > 0 {
128 format_string.push_str(",");
129 }
130
131 if ty == "UpperXRegSet" {
132 format_string.push_str(" {");
133 format_string.push_str(name);
134 format_string.push_str(":?}");
135 continue;
136 }
137
138 format_string.push_str(" {");
139 format_string.push_str(name);
140 format_string.push_str("}");
141 if ty.contains("Reg") {
142 if matches!(op, Operand::Writable { .. }) {
143 locals.push_str(&format!("let {name} = reg_name(*{name}.to_reg());\n"));
144 } else {
145 locals.push_str(&format!("let {name} = reg_name(**{name});\n"));
146 }
147 }
148 }
149 Operand::TrapCode { name, ty: _ } => {
150 pat.push_str(name);
151 pat.push_str(",");
152 format_string.push_str(&format!(" // trap={{{name}:?}}"));
153 }
154 Operand::Binop { src2, .. } => {
155 pat.push_str("dst, src1, src2,");
156 format_string.push_str(" {dst}, {src1}, {src2}");
157 locals.push_str(&format!("let dst = reg_name(*dst.to_reg());\n"));
158 locals.push_str(&format!("let src1 = reg_name(**src1);\n"));
159 if src2.contains("Reg") {
160 locals.push_str(&format!("let src2 = reg_name(**src2);\n"));
161 }
162 }
163 }

Callers

nothing calls this directly

Calls 12

OkFunction · 0.85
chainMethod · 0.80
newFunction · 0.50
writeFunction · 0.50
push_strMethod · 0.45
iterMethod · 0.45
skipMethod · 0.45
operandsMethod · 0.45
containsMethod · 0.45
pushMethod · 0.45
mapMethod · 0.45
joinMethod · 0.45

Tested by

no test coverage detected