Skip to content

Instantly share code, notes, and snippets.

@shepmaster
Created June 18, 2019 14:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shepmaster/af41bfc01f9a1427e57a56198e93d529 to your computer and use it in GitHub Desktop.
Save shepmaster/af41bfc01f9a1427e57a56198e93d529 to your computer and use it in GitHub Desktop.
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