/// A bitmask, tracking which 4-byte slots have been written via `set_immediates`. /// Bit N corresponds to bytes [N*4 .. N*4+4). #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] #[cfg_attr(feature = "serialize", derive(serde::Serialize))] #[cfg_attr(feature = "deserialize", derive(serde::Deserialize))] pubstruct ImmediateSlots(u64);
/// Compute the bitmask for a byte range [offset .. offset + size_bytes). pubconstfn from_range(offset: u32, size_bytes: u32) -> Self { if size_bytes == 0 { returnSelf(0);
} let lo = offset / 4; let hi = (offset + size_bytes).div_ceil(4); Self(u64::MAX << lo & u64::MAX >> (64 - hi))
}
/// Compute the slots occupied by a type at a given byte offset, /// excluding padding between struct members. pubfn from_type(
ty: &crate::TypeInner,
offset: u32,
types: &crate::UniqueArena<crate::Type>,
gctx: crate::proc::GlobalCtx,
) -> Self { match *ty { crate::TypeInner::Struct { ref members, .. } => { letmut slots = Self::default(); for member in members { let member_ty = &types[member.ty].inner;
slots |= Self::from_type(member_ty, offset + member.offset, types, gctx);
}
slots
}
_ => Self::from_range(offset, ty.size(gctx)),
}
}
/// Returns true if `self` contains all bits in `other`. pubconstfn contains(self, other: Self) -> bool {
other.0 & !self.0 == 0
}
/// Returns the bits in `self` that are not set in `other`. pubconstfn difference(self, other: Self) -> Self { Self(self.0 & !other.0)
}
/// Returns the byte size of the `var<immediate>` type in a module. /// Zero if the module has no `var<immediate>`. pubfn size_for_module(module: &crate::Module) -> u32 {
module
.global_variables
.iter()
.find(|&(_, var)| var.space == crate::AddressSpace::Immediate)
.map(|(_, var)| module.types[var.ty].inner.size(module.to_ctx()))
.unwrap_or(0)
}
/// Compute the immediate slot bitmask for a pointer expression that /// refers to (part of) an immediate global variable. /// /// `global` is the handle of the immediate global variable that this /// pointer derives from (obtained from `assignable_global`). pub(crate) fn for_pointer(
pointer: crate::arena::Handle<crate::Expression>,
global: crate::arena::Handle<crate::GlobalVariable>,
expression_arena: &crate::Arena<crate::Expression>,
global_vars: &crate::Arena<crate::GlobalVariable>,
types: &crate::UniqueArena<crate::Type>,
) -> Self { usecrate::Expression as E; usecrate::TypeInner;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.