Ditch stack_check instruction
This commit is contained in:
committed by
Dan Gohman
parent
944251260b
commit
e9111d1de2
@@ -546,8 +546,6 @@ instructions before instruction selection::
|
||||
When Cretonne code is running in a sandbox, it can also be necessary to include
|
||||
stack overflow checks in the prologue.
|
||||
|
||||
.. autoinst:: stack_check
|
||||
|
||||
Global variables
|
||||
----------------
|
||||
|
||||
|
||||
@@ -108,17 +108,3 @@ ebb0(v0: i32, v999: i64):
|
||||
; nextln: v2 = load.f32 v1+0x7fff_ffff
|
||||
return v2
|
||||
}
|
||||
|
||||
; Stack overflow check.
|
||||
; The stack limit is stored in a pointer-sized global variable.
|
||||
function %stkchk(i64 vmctx) baldrdash {
|
||||
gv0 = vmctx+64
|
||||
|
||||
ebb0(v0: i64):
|
||||
; check: ebb0(
|
||||
stack_check gv0
|
||||
; check: $(limit=$V) = load.i64 notrap aligned
|
||||
; check: $(flags=$V) = ifcmp_sp $limit
|
||||
; check: trapif uge $flags, stk_ovf
|
||||
return
|
||||
}
|
||||
|
||||
@@ -668,27 +668,6 @@ copy_special = Instruction(
|
||||
ins=(src, dst),
|
||||
other_side_effects=True)
|
||||
|
||||
GV = Operand(
|
||||
'GV', entities.global_var, doc=r"""
|
||||
Global variable containing the stack limit.
|
||||
""")
|
||||
|
||||
stack_check = Instruction(
|
||||
'stack_check', r"""
|
||||
Check for stack overflow.
|
||||
|
||||
Read the stack limit from ``GV`` and compare it to the stack pointer. If
|
||||
the stack pointer has reached or exceeded the limit, generate a trap with a
|
||||
``stk_ovf`` code.
|
||||
|
||||
The global variable must be accessible and naturally aligned for a
|
||||
pointer-sized value.
|
||||
|
||||
`stack_check` is an alternative way to detect stack overflow, when using
|
||||
a calling convention that doesn't perform stack probes.
|
||||
""",
|
||||
ins=GV, can_trap=True)
|
||||
|
||||
delta = Operand('delta', Int)
|
||||
adjust_sp_down = Instruction(
|
||||
'adjust_sp_down', r"""
|
||||
|
||||
@@ -287,7 +287,6 @@ for ty, minus_zero in [
|
||||
|
||||
|
||||
# Expansions using CPU flags.
|
||||
expand_flags.custom_legalize(insts.stack_check, 'expand_stack_check')
|
||||
|
||||
expand_flags.legalize(
|
||||
insts.trapnz(x, c),
|
||||
|
||||
@@ -269,35 +269,3 @@ fn expand_fconst(
|
||||
};
|
||||
pos.func.dfg.replace(inst).bitcast(ty, ival);
|
||||
}
|
||||
|
||||
/// Expand the stack check instruction.
|
||||
pub fn expand_stack_check(
|
||||
inst: ir::Inst,
|
||||
func: &mut ir::Function,
|
||||
_cfg: &mut ControlFlowGraph,
|
||||
isa: &TargetIsa,
|
||||
) {
|
||||
use ir::condcodes::IntCC;
|
||||
|
||||
let gv = match func.dfg[inst] {
|
||||
ir::InstructionData::UnaryGlobalVar { global_var, .. } => global_var,
|
||||
_ => panic!("Want stack_check: {}", func.dfg.display_inst(inst, isa)),
|
||||
};
|
||||
let ptr_ty = isa.pointer_type();
|
||||
|
||||
let mut pos = FuncCursor::new(func).at_inst(inst);
|
||||
pos.use_srcloc(inst);
|
||||
|
||||
let limit_addr = pos.ins().global_addr(ptr_ty, gv);
|
||||
|
||||
let mut mflags = ir::MemFlags::new();
|
||||
mflags.set_aligned();
|
||||
mflags.set_notrap();
|
||||
let limit = pos.ins().load(ptr_ty, mflags, limit_addr, 0);
|
||||
let cflags = pos.ins().ifcmp_sp(limit);
|
||||
pos.func.dfg.replace(inst).trapif(
|
||||
IntCC::UnsignedGreaterThanOrEqual,
|
||||
cflags,
|
||||
ir::TrapCode::StackOverflow,
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user