Auto merge of #122320 - erikdesjardins:vtable, r= · rust-lang/rust@6b7c145 (original) (raw)
`@@ -20,22 +20,24 @@ impl<'a, 'tcx> VirtualIndex {
`
20
20
`ty: Ty<'tcx>,
`
21
21
`fn_abi: &FnAbi<'tcx, Ty<'tcx>>,
`
22
22
`) -> Bx::Value {
`
23
``
`-
// Load the data pointer from the object.
`
``
23
`+
// Load the function pointer from the object.
`
24
24
`debug!("get_fn({llvtable:?}, {ty:?}, {self:?})");
`
``
25
+
25
26
`let llty = bx.fn_ptr_backend_type(fn_abi);
`
``
27
`+
let ptr_size = bx.data_layout().pointer_size;
`
``
28
`+
let ptr_align = bx.data_layout().pointer_align.abi;
`
``
29
`+
let vtable_byte_offset = self.0 * ptr_size.bytes();
`
26
30
``
27
31
`if bx.cx().sess().opts.unstable_opts.virtual_function_elimination
`
28
32
` && bx.cx().sess().lto() == Lto::Fat
`
29
33
`{
`
30
34
`let typeid = bx
`
31
35
`.typeid_metadata(typeid_for_trait_ref(bx.tcx(), expect_dyn_trait_in_self(ty)))
`
32
36
`.unwrap();
`
33
``
`-
let vtable_byte_offset = self.0 * bx.data_layout().pointer_size.bytes();
`
34
37
`let func = bx.type_checked_load(llvtable, vtable_byte_offset, typeid);
`
35
38
` func
`
36
39
`} else {
`
37
``
`-
let ptr_align = bx.tcx().data_layout.pointer_align.abi;
`
38
``
`-
let gep = bx.inbounds_gep(llty, llvtable, &[bx.const_usize(self.0)]);
`
``
40
`+
let gep = bx.inbounds_ptradd(llvtable, bx.const_usize(vtable_byte_offset));
`
39
41
`let ptr = bx.load(llty, gep, ptr_align);
`
40
42
` bx.nonnull_metadata(ptr);
`
41
43
`// VTable loads are invariant.
`
`@@ -53,9 +55,12 @@ impl<'a, 'tcx> VirtualIndex {
`
53
55
`debug!("get_int({:?}, {:?})", llvtable, self);
`
54
56
``
55
57
`let llty = bx.type_isize();
`
56
``
`-
let usize_align = bx.tcx().data_layout.pointer_align.abi;
`
57
``
`-
let gep = bx.inbounds_gep(llty, llvtable, &[bx.const_usize(self.0)]);
`
58
``
`-
let ptr = bx.load(llty, gep, usize_align);
`
``
58
`+
let ptr_size = bx.data_layout().pointer_size;
`
``
59
`+
let ptr_align = bx.data_layout().pointer_align.abi;
`
``
60
`+
let vtable_byte_offset = self.0 * ptr_size.bytes();
`
``
61
+
``
62
`+
let gep = bx.inbounds_ptradd(llvtable, bx.const_usize(vtable_byte_offset));
`
``
63
`+
let ptr = bx.load(llty, gep, ptr_align);
`
59
64
`// VTable loads are invariant.
`
60
65
` bx.set_invariant_load(ptr);
`
61
66
` ptr
`