struct_in_context(self.llcx, elts, packed)
}
- fn const_to_uint(&self, v: &'ll Value) -> u64 {
- unsafe {
- llvm::LLVMConstIntGetZExtValue(v)
- }
- }
-
- fn is_const_integral(&self, v: &'ll Value) -> bool {
- unsafe {
- llvm::LLVMIsAConstantInt(v).is_some()
+ fn const_to_opt_uint(&self, v: &'ll Value) -> Option<u64> {
+ if is_const_integral(v) {
+ unsafe {
+ Some(llvm::LLVMConstIntGetZExtValue(v))
+ }
+ } else {
+ None
}
}
fn const_to_opt_u128(&self, v: &'ll Value, sign_ext: bool) -> Option<u128> {
unsafe {
- if self.is_const_integral(v) {
+ if is_const_integral(v) {
let (mut lo, mut hi) = (0u64, 0u64);
let success = llvm::LLVMRustConstInt128Get(v, sign_ext,
&mut hi, &mut lo);
fn hi_lo_to_u128(lo: u64, hi: u64) -> u128 {
((hi as u128) << 64) | (lo as u128)
}
+
+fn is_const_integral(v: &'ll Value) -> bool {
+ unsafe {
+ llvm::LLVMIsAConstantInt(v).is_some()
+ }
+}
// Statically compute the offset if we can, otherwise just use the element size,
// as this will yield the lowest alignment.
let layout = self.layout.field(bx, 0);
- let offset = if bx.is_const_integral(llindex) {
- layout.size.checked_mul(bx.const_to_uint(llindex), bx).unwrap_or(layout.size)
+ let offset = if let Some(llindex) = bx.const_to_opt_uint(llindex) {
+ layout.size.checked_mul(llindex, bx).unwrap_or(layout.size)
} else {
layout.size
};
let size = bx.const_usize(dest.layout.size.bytes());
// Use llvm.memset.p0i8.* to initialize all zero arrays
- if bx.cx().is_const_integral(v) && bx.cx().const_to_uint(v) == 0 {
+ if bx.cx().const_to_opt_uint(v) == Some(0) {
let fill = bx.cx().const_u8(0);
bx.memset(start, fill, size, dest.align, MemFlags::empty());
return bx;
fn const_struct(&self, elts: &[Self::Value], packed: bool) -> Self::Value;
- fn const_to_uint(&self, v: Self::Value) -> u64;
+ fn const_to_opt_uint(&self, v: Self::Value) -> Option<u64>;
fn const_to_opt_u128(&self, v: Self::Value, sign_ext: bool) -> Option<u128>;
- fn is_const_integral(&self, v: Self::Value) -> bool;
-
fn scalar_to_backend(
&self,
cv: Scalar,