Add an ArgumentLoc data type.
This will be used to amend function signatures with ABI lowering information.
This commit is contained in:
@@ -23,7 +23,7 @@ pub use ir::entities::{Ebb, Inst, Value, StackSlot, JumpTable, FuncRef, SigRef};
|
|||||||
pub use ir::instructions::{Opcode, InstructionData, VariableArgs};
|
pub use ir::instructions::{Opcode, InstructionData, VariableArgs};
|
||||||
pub use ir::stackslot::StackSlotData;
|
pub use ir::stackslot::StackSlotData;
|
||||||
pub use ir::jumptable::JumpTableData;
|
pub use ir::jumptable::JumpTableData;
|
||||||
pub use ir::valueloc::ValueLoc;
|
pub use ir::valueloc::{ValueLoc, ArgumentLoc};
|
||||||
pub use ir::dfg::{DataFlowGraph, ValueDef};
|
pub use ir::dfg::{DataFlowGraph, ValueDef};
|
||||||
pub use ir::layout::{Layout, Cursor};
|
pub use ir::layout::{Layout, Cursor};
|
||||||
pub use ir::function::Function;
|
pub use ir::function::Function;
|
||||||
|
|||||||
@@ -22,3 +22,37 @@ impl Default for ValueLoc {
|
|||||||
ValueLoc::Unassigned
|
ValueLoc::Unassigned
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Function argument location.
|
||||||
|
///
|
||||||
|
/// The ABI specifies how arguments are passed to a function, and where return values appear after
|
||||||
|
/// the call. Just like a `ValueLoc`, function arguments can be passed in registers or on the
|
||||||
|
/// stack.
|
||||||
|
///
|
||||||
|
/// Function arguments on the stack are accessed differently for the incoming arguments to the
|
||||||
|
/// current function and the outgoing arguments to a called external function. For this reason,
|
||||||
|
/// the location of stack arguments is described as an offset into the array of function arguments
|
||||||
|
/// on the stack.
|
||||||
|
///
|
||||||
|
/// An `ArgumentLoc` can be translated to a `ValueLoc` only when we know if we're talking about an
|
||||||
|
/// incoming argument or an outgoing argument.
|
||||||
|
///
|
||||||
|
/// - For stack arguments, different `StackSlot` entities are used to represent incoming and
|
||||||
|
/// outgoing arguments.
|
||||||
|
/// - For register arguments, there is usually no difference, but if we ever add support for a
|
||||||
|
/// register-window ISA like SPARC, register arguments would also need to be translated.
|
||||||
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
pub enum ArgumentLoc {
|
||||||
|
/// This argument has not been assigned to a location yet.
|
||||||
|
Unassigned,
|
||||||
|
/// Argument is passed in a register.
|
||||||
|
Reg(RegUnit),
|
||||||
|
/// Argument is passed on the stack, at the given byte offset into the argument array.
|
||||||
|
Stack(u32),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for ArgumentLoc {
|
||||||
|
fn default() -> Self {
|
||||||
|
ArgumentLoc::Unassigned
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user