diff options
| author | Nikita Popov <npopov@redhat.com> | 2022-02-21 11:11:48 +0100 |
|---|---|---|
| committer | Nikita Popov <npopov@redhat.com> | 2022-05-25 17:28:58 +0200 |
| commit | 373789b059324adef491bcabfff316c734522e78 (patch) | |
| tree | 02fd43b76ca02fb4fa9030c0b1face59d6581fd0 /compiler/rustc_codegen_llvm/src | |
| parent | b2eba058e6e1c698723e47074561a30b50b5fa7a (diff) | |
| download | rust-373789b059324adef491bcabfff316c734522e78.tar.gz rust-373789b059324adef491bcabfff316c734522e78.zip | |
Don't use global initializer if type does not match
This was relying on the presence of a bitcast to avoid using the constant global initializer for a load using a different type. With opaque pointers, we need to check this explicitly.
Diffstat (limited to 'compiler/rustc_codegen_llvm/src')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/builder.rs | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/compiler/rustc_codegen_llvm/src/builder.rs b/compiler/rustc_codegen_llvm/src/builder.rs index 839018e2a75..c41a41980eb 100644 --- a/compiler/rustc_codegen_llvm/src/builder.rs +++ b/compiler/rustc_codegen_llvm/src/builder.rs @@ -509,15 +509,20 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> { OperandValue::Ref(place.llval, Some(llextra), place.align) } else if place.layout.is_llvm_immediate() { let mut const_llval = None; + let llty = place.layout.llvm_type(self); unsafe { if let Some(global) = llvm::LLVMIsAGlobalVariable(place.llval) { if llvm::LLVMIsGlobalConstant(global) == llvm::True { - const_llval = llvm::LLVMGetInitializer(global); + if let Some(init) = llvm::LLVMGetInitializer(global) { + if self.val_ty(init) == llty { + const_llval = Some(init); + } + } } } } let llval = const_llval.unwrap_or_else(|| { - let load = self.load(place.layout.llvm_type(self), place.llval, place.align); + let load = self.load(llty, place.llval, place.align); if let abi::Abi::Scalar(scalar) = place.layout.abi { scalar_load_metadata(self, load, scalar, place.layout, Size::ZERO); } |
