70
cranelift/codegen/src/ir/framelayout.rs
Normal file
70
cranelift/codegen/src/ir/framelayout.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
//! Frame layout item changes.
|
||||
|
||||
use crate::ir::entities::Inst;
|
||||
use crate::isa::RegUnit;
|
||||
use std::boxed::Box;
|
||||
|
||||
use crate::HashMap;
|
||||
|
||||
/// Change in the frame layout information.
|
||||
#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
|
||||
pub enum FrameLayoutChange {
|
||||
/// Base CallFrameAddress (CFA) pointer moved to different register/offset.
|
||||
CallFrameAddressAt {
|
||||
/// CFA register.
|
||||
reg: RegUnit,
|
||||
/// CFA offset.
|
||||
offset: isize,
|
||||
},
|
||||
/// Register saved at.
|
||||
RegAt {
|
||||
/// Saved register.
|
||||
reg: RegUnit,
|
||||
/// Offset in the frame (offset from CFA).
|
||||
cfa_offset: isize,
|
||||
},
|
||||
/// Return address saved at.
|
||||
ReturnAddressAt {
|
||||
/// Offset in the frame (offset from CFA).
|
||||
cfa_offset: isize,
|
||||
},
|
||||
/// The entire frame layout must be preserved somewhere to be restored at a corresponding
|
||||
/// `Restore` change.
|
||||
///
|
||||
/// This likely maps to the DWARF call frame instruction `.cfa_remember_state`.
|
||||
Preserve,
|
||||
/// Restore the entire frame layout from a corresponding prior `Preserve` frame change.
|
||||
///
|
||||
/// This likely maps to the DWARF call frame instruction `.cfa_restore_state`.
|
||||
Restore,
|
||||
}
|
||||
|
||||
/// Set of frame layout changes.
|
||||
pub type FrameLayoutChanges = Box<[FrameLayoutChange]>;
|
||||
|
||||
/// Frame items layout for (prologue/epilogue) instructions.
|
||||
#[derive(Debug, Clone)]
|
||||
pub struct FrameLayout {
|
||||
/// Initial frame layout.
|
||||
pub initial: FrameLayoutChanges,
|
||||
|
||||
/// Instruction frame layout (changes). Because the map will not be dense,
|
||||
/// a HashMap is used instead of a SecondaryMap.
|
||||
pub instructions: HashMap<Inst, FrameLayoutChanges>,
|
||||
}
|
||||
|
||||
impl FrameLayout {
|
||||
/// Create instance of FrameLayout.
|
||||
pub fn new() -> Self {
|
||||
FrameLayout {
|
||||
initial: vec![].into_boxed_slice(),
|
||||
instructions: HashMap::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Clear the structure.
|
||||
pub fn clear(&mut self) {
|
||||
self.initial = vec![].into_boxed_slice();
|
||||
self.instructions.clear();
|
||||
}
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
@@ -6,6 +6,7 @@ pub mod dfg;
|
||||
pub mod entities;
|
||||
mod extfunc;
|
||||
mod extname;
|
||||
mod framelayout;
|
||||
pub mod function;
|
||||
mod globalvalue;
|
||||
mod heap;
|
||||
@@ -39,6 +40,7 @@ pub use crate::ir::extfunc::{
|
||||
AbiParam, ArgumentExtension, ArgumentPurpose, ExtFuncData, Signature,
|
||||
};
|
||||
pub use crate::ir::extname::ExternalName;
|
||||
pub use crate::ir::framelayout::{FrameLayout, FrameLayoutChange, FrameLayoutChanges};
|
||||
pub use crate::ir::function::{DisplayFunctionAnnotations, Function};
|
||||
pub use crate::ir::globalvalue::GlobalValueData;
|
||||
pub use crate::ir::heap::{HeapData, HeapStyle};
|
||||
|
||||
Reference in New Issue
Block a user