use cranelift_entity::{EntityRef, PrimaryMap};
use std::collections::HashMap;
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct DefinedFuncIndex(usize);
impl EntityRef for DefinedFuncIndex {
fn new(v: usize) -> Self {
Self(v)
}
fn index(self) -> usize {
self.0
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy)]
pub struct SourceLoc(u32);
impl SourceLoc {
pub fn new(v: u32) -> Self {
Self(v)
}
pub fn get(&self) -> u32 {
self.0
}
pub fn is_default(&self) -> bool {
self.0 == !0
}
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct CompiledFunctionData {
pub instructions: Vec<CompiledInstructionData>,
pub start_srcloc: SourceLoc,
pub end_srcloc: SourceLoc,
pub body_offset: usize,
pub body_len: usize,
}
#[derive(Debug, PartialEq, Eq, Clone)]
pub struct CompiledInstructionData {
pub srcloc: SourceLoc,
pub code_len: usize,
pub code_offset: usize,
}
pub fn create_module_address_map<'a, I>(info: I) -> ModuleAddressMap
where
I: Iterator<Item = &'a CompiledFunctionData>,
{
let mut map = PrimaryMap::new();
for cfd in info {
map.push(cfd.clone());
}
map
}
pub type ModuleAddressMap = PrimaryMap<DefinedFuncIndex, CompiledFunctionData>;
pub type RegUnit = u16;
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct StackSlot(u32);
impl StackSlot {
pub fn from_u32(x: u32) -> Self {
Self(x)
}
pub fn as_u32(self) -> u32 {
self.0
}
}
#[derive(Debug, PartialEq, Eq, Clone, Copy, Hash)]
pub struct ValueLabel(u32);
impl ValueLabel {
pub fn from_u32(x: u32) -> Self {
Self(x)
}
pub fn as_u32(self) -> u32 {
self.0
}
}
impl EntityRef for ValueLabel {
fn new(v: usize) -> Self {
Self(v as u32)
}
fn index(self) -> usize {
self.0 as usize
}
}
#[derive(Debug, Clone, Copy)]
pub enum ValueLoc {
Unassigned,
Reg(RegUnit),
Stack(StackSlot),
}
#[derive(Debug, Clone)]
pub struct ValueLocRange {
pub loc: ValueLoc,
pub start: u32,
pub end: u32,
}
pub fn build_values_ranges<'a, I>(vlri_iter: I) -> ValueLabelsRanges
where
I: Iterator<Item = &'a ValueLabelsRangesInner>,
{
let mut map = PrimaryMap::new();
for i in vlri_iter {
map.push(i.clone());
}
map
}
pub type ValueLabelsRanges = PrimaryMap<DefinedFuncIndex, ValueLabelsRangesInner>;
pub type ValueLabelsRangesInner = HashMap<ValueLabel, Vec<ValueLocRange>>;
pub fn get_vmctx_value_label() -> ValueLabel {
ValueLabel(0xffff_fffe)
}
pub struct ModuleVmctxInfo {
pub memory_offset: i64,
pub vmctx_size: i64,
pub stack_slot_offsets: PrimaryMap<DefinedFuncIndex, Vec<Option<i32>>>,
}
impl ModuleVmctxInfo {
pub fn new<'a, I>(memory_offset: i64, vmctx_size: i64, stack_slot_offsets: I) -> Self
where
I: Iterator<Item = &'a Vec<Option<i32>>>,
{
let mut map = PrimaryMap::new();
for o in stack_slot_offsets {
map.push(o.clone());
}
Self {
memory_offset,
vmctx_size,
stack_slot_offsets: map,
}
}
}