Fix project_deref() implementation

I'm not really sure what is wrong here, but I was getting load
type mismatches in the debuginfo code (which is the only place
using this function).

Replacing the project_deref() implementation with a generic
load_operand + deref did the trick.
This commit is contained in:
Nikita Popov 2021-07-04 23:07:37 +02:00
parent 4560efe46c
commit 208173f8e9
2 changed files with 1 additions and 13 deletions

View file

@ -274,7 +274,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> {
match *elem { match *elem {
mir::ProjectionElem::Deref => { mir::ProjectionElem::Deref => {
indirect_offsets.push(Size::ZERO); indirect_offsets.push(Size::ZERO);
place = place.project_deref(bx); place = bx.load_operand(place).deref(bx.cx());
} }
mir::ProjectionElem::Field(field, _) => { mir::ProjectionElem::Field(field, _) => {
let i = field.index(); let i = field.index();

View file

@ -402,18 +402,6 @@ impl<'a, 'tcx, V: CodegenObject> PlaceRef<'tcx, V> {
downcast downcast
} }
pub fn project_deref<Bx: BuilderMethods<'a, 'tcx, Value = V>>(&self, bx: &mut Bx) -> Self {
let target_ty = self.layout.ty.builtin_deref(true).expect("failed to deref");
let layout = bx.layout_of(target_ty.ty);
PlaceRef {
llval: bx.load(bx.backend_type(layout), self.llval, self.align),
llextra: None,
layout,
align: layout.align.abi,
}
}
pub fn storage_live<Bx: BuilderMethods<'a, 'tcx, Value = V>>(&self, bx: &mut Bx) { pub fn storage_live<Bx: BuilderMethods<'a, 'tcx, Value = V>>(&self, bx: &mut Bx) {
bx.lifetime_start(self.llval, self.layout.size); bx.lifetime_start(self.llval, self.layout.size);
} }