Track frame layout changes. (#1204)

* Track frame layout changes.
This commit is contained in:
iximeow
2019-11-18 10:18:38 -08:00
committed by GitHub
parent f72a5d9caa
commit d804ab8b92
4 changed files with 298 additions and 13 deletions

View File

@@ -11,7 +11,7 @@ use crate::ir::{
Ebb, ExtFuncData, FuncRef, GlobalValue, GlobalValueData, Heap, HeapData, Inst, JumpTable,
JumpTableData, SigRef, StackSlot, StackSlotData, Table, TableData,
};
use crate::ir::{EbbOffsets, InstEncodings, SourceLocs, StackSlots, ValueLocations};
use crate::ir::{EbbOffsets, FrameLayout, InstEncodings, SourceLocs, StackSlots, ValueLocations};
use crate::ir::{JumpTableOffsets, JumpTables};
use crate::isa::{CallConv, EncInfo, Encoding, Legalize, TargetIsa};
use crate::regalloc::{EntryRegDiversions, RegDiversions};
@@ -92,6 +92,13 @@ pub struct Function {
///
/// This is used for some calling conventions to track the end of unwind information.
pub prologue_end: Option<Inst>,
/// Frame layout for the instructions.
///
/// The stack unwinding requires to have information about which registers and where they
/// are saved in the frame. This information is created during the prologue and epilogue
/// passes.
pub frame_layout: Option<FrameLayout>,
}
impl Function {
@@ -115,6 +122,7 @@ impl Function {
jt_offsets: SecondaryMap::new(),
srclocs: SecondaryMap::new(),
prologue_end: None,
frame_layout: None,
}
}
@@ -135,6 +143,7 @@ impl Function {
self.jt_offsets.clear();
self.srclocs.clear();
self.prologue_end = None;
self.frame_layout = None;
}
/// Create a new empty, anonymous function with a Fast calling convention.
@@ -244,6 +253,7 @@ impl Function {
/// Starts collection of debug information.
pub fn collect_debug_info(&mut self) {
self.dfg.collect_debug_info();
self.frame_layout = Some(FrameLayout::new());
}
/// Changes the destination of a jump or branch instruction.