Skip to content

Commit a7e47f3

Browse files
committed
pulley: Fix prologue for large stack frames
This fixes a mistake from bytecodealliance#9999 which was discovered in the testing of bytecodealliance#9837 where the prologue was generated in the wrong order.
1 parent 21ab8ea commit a7e47f3

File tree

2 files changed

+38
-1
lines changed
  • cranelift
    • codegen/src/isa/pulley_shared
    • filetests/filetests/isa/pulley64

2 files changed

+38
-1
lines changed

cranelift/codegen/src/isa/pulley_shared/abi.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,10 @@ where
320320
match &style {
321321
FrameStyle::None => {}
322322
FrameStyle::PulleyBasicSetup { frame_size } => {
323+
insts.push(RawInst::PushFrame.into());
323324
insts.extend(Self::gen_sp_reg_adjust(
324325
-i32::try_from(*frame_size).unwrap(),
325326
));
326-
insts.push(RawInst::PushFrame.into());
327327
}
328328
FrameStyle::PulleySetupAndSaveClobbers {
329329
frame_size,

cranelift/filetests/filetests/isa/pulley64/call.clif

+37
Original file line numberDiff line numberDiff line change
@@ -383,3 +383,40 @@ block0:
383383
; pop_frame_restore 64,
384384
; ret
385385

386+
function %very_large_stack_frame(i32) -> i32 {
387+
fn0 = colocated %g() -> i32
388+
ss0 = explicit_slot 1000000
389+
390+
block0(v0: i32):
391+
v1 = call fn0()
392+
v2 = iadd v0, v1
393+
return v2
394+
}
395+
396+
; VCode:
397+
; push_frame
398+
; stack_alloc32 1000016
399+
; xstore64 sp+1000008, x20 // flags = notrap aligned
400+
; block0:
401+
; xmov x20, x0
402+
; call CallInfo { dest: PulleyCall { name: TestCase(%g), args: [] }, uses: [], defs: [CallRetPair { vreg: Writable { reg: p0i }, preg: p0i }], clobbers: PRegSet { bits: [65534, 65535, 4294967295, 0] }, callee_conv: Fast, caller_conv: Fast, callee_pop_size: 0 }
403+
; xmov x5, x20
404+
; xadd32 x0, x5, x0
405+
; x20 = xload64 sp+1000008 // flags = notrap aligned
406+
; stack_free32 1000016
407+
; pop_frame
408+
; ret
409+
;
410+
; Disassembled:
411+
; push_frame
412+
; stack_alloc32 1000016
413+
; xstore64le_offset32 sp, 1000008, x20
414+
; xmov x20, x0
415+
; call 0x0 // target = 0x10
416+
; xmov x5, x20
417+
; xadd32 x0, x5, x0
418+
; xload64le_offset32 x20, sp, 1000008
419+
; stack_free32 1000016
420+
; pop_frame
421+
; ret
422+

0 commit comments

Comments
 (0)