]> git.lizzy.rs Git - rust.git/blobdiff - compiler/rustc_codegen_ssa/src/mir/intrinsic.rs
Move vtable_size and vtable_align impls to cg_ssa
[rust.git] / compiler / rustc_codegen_ssa / src / mir / intrinsic.rs
index 7f14b95317b46e66ca0be4501eecfdf7281fe0b0..1fffa3beaaa85174dc5b0745e901b7e310da35f6 100644 (file)
@@ -3,6 +3,7 @@
 use super::FunctionCx;
 use crate::common::{span_invalid_monomorphization_error, IntPredicate};
 use crate::glue;
+use crate::meth;
 use crate::traits::*;
 use crate::MemFlags;
 
@@ -102,6 +103,15 @@ pub fn codegen_intrinsic_call(
                     bx.const_usize(bx.layout_of(tp_ty).align.abi.bytes())
                 }
             }
+            sym::vtable_size | sym::vtable_align => {
+                let vtable = args[0].immediate();
+                let idx = match name {
+                    sym::vtable_size => ty::COMMON_VTABLE_ENTRIES_SIZE,
+                    sym::vtable_align => ty::COMMON_VTABLE_ENTRIES_ALIGN,
+                    _ => bug!(),
+                };
+                meth::VirtualIndex::from_index(idx).get_usize(bx, vtable)
+            }
             sym::pref_align_of
             | sym::needs_drop
             | sym::type_id
@@ -513,9 +523,7 @@ pub fn codegen_intrinsic_call(
                         };
 
                         let ty = substs.type_at(0);
-                        if int_type_width_signed(ty, bx.tcx()).is_some()
-                            || (ty.is_unsafe_ptr() && op == "xchg")
-                        {
+                        if int_type_width_signed(ty, bx.tcx()).is_some() || ty.is_unsafe_ptr() {
                             let mut ptr = args[0].immediate();
                             let mut val = args[1].immediate();
                             if ty.is_unsafe_ptr() {