Skip to content

Commit f758ca8

Browse files
committed
Add try_call_indirect lowering as well.
1 parent c6d6fad commit f758ca8

File tree

8 files changed

+496
-9
lines changed

8 files changed

+496
-9
lines changed

cranelift/codegen/src/ir/instructions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -595,7 +595,7 @@ impl InstructionData {
595595
..
596596
} => {
597597
let exdata = &exception_tables[exception];
598-
CallInfo::Indirect(exdata.signature(), args.as_slice(pool))
598+
CallInfo::Indirect(exdata.signature(), &args.as_slice(pool)[1..])
599599
}
600600
Self::Ternary {
601601
opcode: Opcode::StackSwitch,

cranelift/codegen/src/machinst/isle.rs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -908,13 +908,34 @@ macro_rules! isle_prelude_caller_methods {
908908

909909
fn gen_try_call_indirect(
910910
&mut self,
911-
_sig_ref: SigRef,
912-
_callee: Value,
913-
_et: ExceptionTable,
914-
_args: ValueSlice,
915-
_targets: &MachLabelSlice,
911+
sigref: SigRef,
912+
callee: Value,
913+
et: ExceptionTable,
914+
args: ValueSlice,
915+
targets: &MachLabelSlice,
916916
) -> () {
917-
todo!()
917+
let caller_conv = self.lower_ctx.abi().call_conv(self.lower_ctx.sigs());
918+
let sig = &self.lower_ctx.dfg().signatures[sigref];
919+
let num_rets = sig.returns.len();
920+
921+
let callee = self.put_in_reg(callee);
922+
923+
let caller = <$abicaller>::from_ptr(
924+
self.lower_ctx.sigs(),
925+
sigref,
926+
callee,
927+
IsTailCall::No,
928+
caller_conv,
929+
self.backend.flags().clone(),
930+
);
931+
932+
crate::machinst::isle::gen_call_common(
933+
&mut self.lower_ctx,
934+
num_rets,
935+
caller,
936+
args,
937+
Some((et, targets)),
938+
);
918939
}
919940
};
920941
}

cranelift/filetests/filetests/isa/aarch64/exceptions.clif

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,3 +121,129 @@ function %f0(i32) -> i32, f32, f64 {
121121
; ldp x29, x30, [sp], #0x10
122122
; ret
123123

124+
function %f2(i32) -> i32, f32, f64 {
125+
sig0 = (i32) -> f32 tail
126+
fn0 = %g(i32) -> f32 tail
127+
128+
block0(v1: i32):
129+
v2 = f64const 0x1.0
130+
v10 = func_addr.i64 fn0
131+
try_call_indirect v10(v1), sig0, block1(ret0, v2), [ default: block2(exn0) ]
132+
133+
block1(v3: f32, v4: f64):
134+
v5 = iconst.i32 1
135+
return v5, v3, v4
136+
137+
block2(v6: i64):
138+
v7 = ireduce.i32 v6
139+
v8 = iadd_imm.i32 v7, 1
140+
v9 = f32const 0x0.0
141+
return v8, v9, v2
142+
}
143+
144+
; VCode:
145+
; stp fp, lr, [sp, #-16]!
146+
; mov fp, sp
147+
; stp x27, x28, [sp, #-16]!
148+
; stp x25, x26, [sp, #-16]!
149+
; stp x23, x24, [sp, #-16]!
150+
; stp x21, x22, [sp, #-16]!
151+
; stp x19, x20, [sp, #-16]!
152+
; stp d14, d15, [sp, #-16]!
153+
; stp d12, d13, [sp, #-16]!
154+
; stp d10, d11, [sp, #-16]!
155+
; stp d8, d9, [sp, #-16]!
156+
; sub sp, sp, #16
157+
; block0:
158+
; fmov d1, #1
159+
; str q1, [sp]
160+
; load_ext_name x11, TestCase(%g)+0
161+
; mov x2, x0
162+
; blr x11; b MachLabel(1); catch [None: MachLabel(2)]
163+
; block1:
164+
; movz w0, #1
165+
; ldr q1, [sp]
166+
; add sp, sp, #16
167+
; ldp d8, d9, [sp], #16
168+
; ldp d10, d11, [sp], #16
169+
; ldp d12, d13, [sp], #16
170+
; ldp d14, d15, [sp], #16
171+
; ldp x19, x20, [sp], #16
172+
; ldp x21, x22, [sp], #16
173+
; ldp x23, x24, [sp], #16
174+
; ldp x25, x26, [sp], #16
175+
; ldp x27, x28, [sp], #16
176+
; ldp fp, lr, [sp], #16
177+
; ret
178+
; block2:
179+
; ldr q1, [sp]
180+
; add w0, w0, #1
181+
; movi v0.2s, #0
182+
; add sp, sp, #16
183+
; ldp d8, d9, [sp], #16
184+
; ldp d10, d11, [sp], #16
185+
; ldp d12, d13, [sp], #16
186+
; ldp d14, d15, [sp], #16
187+
; ldp x19, x20, [sp], #16
188+
; ldp x21, x22, [sp], #16
189+
; ldp x23, x24, [sp], #16
190+
; ldp x25, x26, [sp], #16
191+
; ldp x27, x28, [sp], #16
192+
; ldp fp, lr, [sp], #16
193+
; ret
194+
;
195+
; Disassembled:
196+
; block0: ; offset 0x0
197+
; stp x29, x30, [sp, #-0x10]!
198+
; mov x29, sp
199+
; stp x27, x28, [sp, #-0x10]!
200+
; stp x25, x26, [sp, #-0x10]!
201+
; stp x23, x24, [sp, #-0x10]!
202+
; stp x21, x22, [sp, #-0x10]!
203+
; stp x19, x20, [sp, #-0x10]!
204+
; stp d14, d15, [sp, #-0x10]!
205+
; stp d12, d13, [sp, #-0x10]!
206+
; stp d10, d11, [sp, #-0x10]!
207+
; stp d8, d9, [sp, #-0x10]!
208+
; sub sp, sp, #0x10
209+
; block1: ; offset 0x30
210+
; fmov d1, #1.00000000
211+
; stur q1, [sp]
212+
; ldr x11, #0x40
213+
; b #0x48
214+
; .byte 0x00, 0x00, 0x00, 0x00 ; reloc_external Abs8 %g 0
215+
; .byte 0x00, 0x00, 0x00, 0x00
216+
; mov x2, x0
217+
; blr x11
218+
; block2: ; offset 0x50
219+
; mov w0, #1
220+
; ldur q1, [sp]
221+
; add sp, sp, #0x10
222+
; ldp d8, d9, [sp], #0x10
223+
; ldp d10, d11, [sp], #0x10
224+
; ldp d12, d13, [sp], #0x10
225+
; ldp d14, d15, [sp], #0x10
226+
; ldp x19, x20, [sp], #0x10
227+
; ldp x21, x22, [sp], #0x10
228+
; ldp x23, x24, [sp], #0x10
229+
; ldp x25, x26, [sp], #0x10
230+
; ldp x27, x28, [sp], #0x10
231+
; ldp x29, x30, [sp], #0x10
232+
; ret
233+
; block3: ; offset 0x88
234+
; ldur q1, [sp]
235+
; add w0, w0, #1
236+
; movi v0.2s, #0
237+
; add sp, sp, #0x10
238+
; ldp d8, d9, [sp], #0x10
239+
; ldp d10, d11, [sp], #0x10
240+
; ldp d12, d13, [sp], #0x10
241+
; ldp d14, d15, [sp], #0x10
242+
; ldp x19, x20, [sp], #0x10
243+
; ldp x21, x22, [sp], #0x10
244+
; ldp x23, x24, [sp], #0x10
245+
; ldp x25, x26, [sp], #0x10
246+
; ldp x27, x28, [sp], #0x10
247+
; ldp x29, x30, [sp], #0x10
248+
; ret
249+

cranelift/filetests/filetests/isa/pulley32/exceptions.clif

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -147,4 +147,3 @@ function %f0(i32) -> i32, f32, f64 {
147147
; fload64le_o32 f31, sp, 16
148148
; pop_frame_restore 272, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0
149149
; ret
150-

cranelift/filetests/filetests/isa/pulley64/exceptions.clif

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,4 +148,3 @@ function %f0(i32) -> i32, f32, f64 {
148148
; fload64le_o32 f31, sp, 16
149149
; pop_frame_restore 272, x16, x17, x18, x19, x20, x21, x22, x23, x24, x25, x26, x27, x28, x29, sp, spilltmp0
150150
; ret
151-

0 commit comments

Comments
 (0)