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

`