Baldrdash: use the right frame offset when loading arguments from the stack
This commit is contained in:
@@ -12,6 +12,9 @@ pub trait ABIBody {
|
||||
/// The instruction type for the ISA associated with this ABI.
|
||||
type I: VCodeInst;
|
||||
|
||||
/// Get the settings controlling this function's compilation.
|
||||
fn flags(&self) -> &settings::Flags;
|
||||
|
||||
/// Get the liveins of the function.
|
||||
fn liveins(&self) -> Set<RealReg>;
|
||||
|
||||
@@ -82,13 +85,13 @@ pub trait ABIBody {
|
||||
/// `store_retval`, and spillslot accesses.) `self` is mutable so that we
|
||||
/// can store information in it which will be useful when creating the
|
||||
/// epilogue.
|
||||
fn gen_prologue(&mut self, flags: &settings::Flags) -> Vec<Self::I>;
|
||||
fn gen_prologue(&mut self) -> Vec<Self::I>;
|
||||
|
||||
/// Generate an epilogue, post-regalloc. Note that this must generate the
|
||||
/// actual return instruction (rather than emitting this in the lowering
|
||||
/// logic), because the epilogue code comes before the return and the two are
|
||||
/// likely closely related.
|
||||
fn gen_epilogue(&self, flags: &settings::Flags) -> Vec<Self::I>;
|
||||
fn gen_epilogue(&self) -> Vec<Self::I>;
|
||||
|
||||
/// Returns the full frame size for the given function, after prologue emission has run. This
|
||||
/// comprises the spill space, incoming argument space, alignment padding, etc.
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
|
||||
use crate::ir::Function;
|
||||
use crate::machinst::*;
|
||||
use crate::settings;
|
||||
use crate::timing;
|
||||
|
||||
use log::debug;
|
||||
@@ -14,7 +13,6 @@ pub fn compile<B: LowerBackend>(
|
||||
f: &Function,
|
||||
b: &B,
|
||||
abi: Box<dyn ABIBody<I = B::MInst>>,
|
||||
flags: &settings::Flags,
|
||||
) -> VCode<B::MInst>
|
||||
where
|
||||
B::MInst: ShowWithRRU,
|
||||
@@ -47,7 +45,7 @@ where
|
||||
|
||||
// Reorder vcode into final order and copy out final instruction sequence
|
||||
// all at once. This also inserts prologues/epilogues.
|
||||
vcode.replace_insns_from_regalloc(result, flags);
|
||||
vcode.replace_insns_from_regalloc(result);
|
||||
|
||||
vcode.remove_redundant_branches();
|
||||
|
||||
|
||||
@@ -102,9 +102,9 @@ pub trait LowerBackend {
|
||||
|
||||
/// Machine-independent lowering driver / machine-instruction container. Maintains a correspondence
|
||||
/// from original Inst to MachInsts.
|
||||
pub struct Lower<'a, I: VCodeInst> {
|
||||
pub struct Lower<'func, I: VCodeInst> {
|
||||
/// The function to lower.
|
||||
f: &'a Function,
|
||||
f: &'func Function,
|
||||
|
||||
/// Lowered machine instructions.
|
||||
vcode: VCodeBuilder<I>,
|
||||
@@ -142,9 +142,9 @@ enum GenerateReturn {
|
||||
No,
|
||||
}
|
||||
|
||||
impl<'a, I: VCodeInst> Lower<'a, I> {
|
||||
impl<'func, I: VCodeInst> Lower<'func, I> {
|
||||
/// Prepare a new lowering context for the given IR function.
|
||||
pub fn new(f: &'a Function, abi: Box<dyn ABIBody<I = I>>) -> Lower<'a, I> {
|
||||
pub fn new(f: &'func Function, abi: Box<dyn ABIBody<I = I>>) -> Lower<'func, I> {
|
||||
let mut vcode = VCodeBuilder::new(abi);
|
||||
|
||||
let num_uses = NumUses::compute(f).take_uses();
|
||||
@@ -516,7 +516,7 @@ impl<'a, I: VCodeInst> Lower<'a, I> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a, I: VCodeInst> LowerCtx for Lower<'a, I> {
|
||||
impl<'func, I: VCodeInst> LowerCtx for Lower<'func, I> {
|
||||
type I = I;
|
||||
|
||||
/// Get the instdata for a given IR instruction.
|
||||
|
||||
@@ -299,6 +299,11 @@ impl<I: VCodeInst> VCode<I> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the flags controlling this function's compilation.
|
||||
pub fn flags(&self) -> &settings::Flags {
|
||||
self.abi.flags()
|
||||
}
|
||||
|
||||
/// Get the IR-level type of a VReg.
|
||||
pub fn vreg_type(&self, vreg: VirtualReg) -> Type {
|
||||
self.vreg_types[vreg.get_index()]
|
||||
@@ -329,11 +334,7 @@ impl<I: VCodeInst> VCode<I> {
|
||||
/// Take the results of register allocation, with a sequence of
|
||||
/// instructions including spliced fill/reload/move instructions, and replace
|
||||
/// the VCode with them.
|
||||
pub fn replace_insns_from_regalloc(
|
||||
&mut self,
|
||||
result: RegAllocResult<Self>,
|
||||
flags: &settings::Flags,
|
||||
) {
|
||||
pub fn replace_insns_from_regalloc(&mut self, result: RegAllocResult<Self>) {
|
||||
self.final_block_order = compute_final_block_order(self);
|
||||
|
||||
// Record the spillslot count and clobbered registers for the ABI/stack
|
||||
@@ -355,7 +356,7 @@ impl<I: VCodeInst> VCode<I> {
|
||||
|
||||
if *block == self.entry {
|
||||
// Start with the prologue.
|
||||
final_insns.extend(self.abi.gen_prologue(flags).into_iter());
|
||||
final_insns.extend(self.abi.gen_prologue().into_iter());
|
||||
}
|
||||
|
||||
for i in start..end {
|
||||
@@ -371,7 +372,7 @@ impl<I: VCodeInst> VCode<I> {
|
||||
// with the epilogue.
|
||||
let is_ret = insn.is_term() == MachTerminator::Ret;
|
||||
if is_ret {
|
||||
final_insns.extend(self.abi.gen_epilogue(flags).into_iter());
|
||||
final_insns.extend(self.abi.gen_epilogue().into_iter());
|
||||
} else {
|
||||
final_insns.push(insn.clone());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user