-
-
Save shepmaster/af41bfc01f9a1427e57a56198e93d529 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/librustc_codegen_llvm/common.rs b/src/librustc_codegen_llvm/common.rs | |
index 0b23aac522..61cace3920 100644 | |
--- a/src/librustc_codegen_llvm/common.rs | |
+++ b/src/librustc_codegen_llvm/common.rs | |
@@ -290,7 +290,7 @@ impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> { | |
&self, | |
cv: Scalar, | |
layout: &layout::Scalar, | |
- llty: &'ll Type, | |
+ llty: Option<&'ll Type>, | |
) -> &'ll Value { | |
let bitsize = if layout.is_bool() { 1 } else { layout.value.size(self).bits() }; | |
match cv { | |
@@ -301,10 +301,16 @@ impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> { | |
Scalar::Raw { data, size } => { | |
assert_eq!(size as u64, layout.value.size(self).bytes()); | |
let llval = self.const_uint_big(self.type_ix(bitsize), data); | |
- if layout.value == layout::Pointer { | |
- unsafe { llvm::LLVMConstIntToPtr(llval, llty) } | |
- } else { | |
- self.const_bitcast(llval, llty) | |
+ | |
+ match llty { | |
+ Some(llty) => { | |
+ if layout.value == layout::Pointer { | |
+ unsafe { llvm::LLVMConstIntToPtr(llval, llty) } | |
+ } else { | |
+ self.const_bitcast(llval, llty) | |
+ } | |
+ }, | |
+ None => llval, | |
} | |
}, | |
Scalar::Ptr(ptr) => { | |
@@ -327,15 +333,26 @@ impl ConstMethods<'tcx> for CodegenCx<'ll, 'tcx> { | |
} | |
None => bug!("missing allocation {:?}", ptr.alloc_id), | |
}; | |
- let llval = unsafe { llvm::LLVMConstInBoundsGEP( | |
- self.const_bitcast(base_addr, self.type_i8p()), | |
- &self.const_usize(ptr.offset.bytes()), | |
- 1, | |
- ) }; | |
- if layout.value != layout::Pointer { | |
- unsafe { llvm::LLVMConstPtrToInt(llval, llty) } | |
+ | |
+ let llval = if ptr.offset == Size::ZERO { | |
+ base_addr | |
} else { | |
- self.const_bitcast(llval, llty) | |
+ unsafe { llvm::LLVMConstInBoundsGEP( | |
+ self.const_bitcast(base_addr, self.type_i8p()), | |
+ &self.const_usize(ptr.offset.bytes()), | |
+ 1, | |
+ ) } | |
+ }; | |
+ | |
+ match llty { | |
+ Some(llty) => { | |
+ if layout.value != layout::Pointer { | |
+ unsafe { llvm::LLVMConstPtrToInt(llval, llty) } | |
+ } else { | |
+ self.const_bitcast(llval, llty) | |
+ } | |
+ }, | |
+ None => llval, | |
} | |
} | |
} | |
diff --git a/src/librustc_codegen_llvm/consts.rs b/src/librustc_codegen_llvm/consts.rs | |
index eb059ac453..186ff65eb9 100644 | |
--- a/src/librustc_codegen_llvm/consts.rs | |
+++ b/src/librustc_codegen_llvm/consts.rs | |
@@ -47,7 +47,7 @@ pub fn const_alloc_to_llvm(cx: &CodegenCx<'ll, '_>, alloc: &Allocation) -> &'ll | |
value: layout::Primitive::Pointer, | |
valid_range: 0..=!0 | |
}, | |
- cx.type_i8p() | |
+ None, | |
)); | |
next_offset = offset + pointer_size; | |
} | |
diff --git a/src/librustc_codegen_ssa/mir/constant.rs b/src/librustc_codegen_ssa/mir/constant.rs | |
index 78c22206ab..2b41fab67b 100644 | |
--- a/src/librustc_codegen_ssa/mir/constant.rs | |
+++ b/src/librustc_codegen_ssa/mir/constant.rs | |
@@ -56,7 +56,7 @@ impl<'a, 'tcx: 'a, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { | |
}; | |
bx.scalar_to_backend( | |
prim, scalar, | |
- bx.immediate_backend_type(layout), | |
+ Some(bx.immediate_backend_type(layout)), | |
) | |
} else { | |
bug!("simd shuffle field {:?}", field) | |
diff --git a/src/librustc_codegen_ssa/mir/operand.rs b/src/librustc_codegen_ssa/mir/operand.rs | |
index b4303cf5c9..96aa2b3b91 100644 | |
--- a/src/librustc_codegen_ssa/mir/operand.rs | |
+++ b/src/librustc_codegen_ssa/mir/operand.rs | |
@@ -88,7 +88,7 @@ impl<'a, 'tcx: 'a, V: CodegenObject> OperandRef<'tcx, V> { | |
let llval = bx.scalar_to_backend( | |
x, | |
scalar, | |
- bx.immediate_backend_type(layout), | |
+ Some(bx.immediate_backend_type(layout)), | |
); | |
OperandValue::Immediate(llval) | |
}, | |
@@ -104,7 +104,7 @@ impl<'a, 'tcx: 'a, V: CodegenObject> OperandRef<'tcx, V> { | |
let a_llval = bx.scalar_to_backend( | |
a, | |
a_scalar, | |
- bx.scalar_pair_element_backend_type(layout, 0, true), | |
+ Some(bx.scalar_pair_element_backend_type(layout, 0, true)), | |
); | |
let b_llval = bx.const_usize((end - start) as u64); | |
OperandValue::Pair(a_llval, b_llval) | |
diff --git a/src/librustc_codegen_ssa/traits/consts.rs b/src/librustc_codegen_ssa/traits/consts.rs | |
index 32412f303c..9e2eeaca4b 100644 | |
--- a/src/librustc_codegen_ssa/traits/consts.rs | |
+++ b/src/librustc_codegen_ssa/traits/consts.rs | |
@@ -29,7 +29,7 @@ pub trait ConstMethods<'tcx>: BackendTypes { | |
&self, | |
cv: Scalar, | |
layout: &layout::Scalar, | |
- llty: Self::Type, | |
+ llty: Option<Self::Type>, | |
) -> Self::Value; | |
fn from_const_alloc( | |
&self, |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment