summary refs log tree commit diff
path: root/compiler/rustc_codegen_ssa/src
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-02-07 19:17:04 +0000
committerMichael Goulet <michael@errs.io>2023-02-18 19:47:33 +0000
commitdf52e2037ab73828a29c46addf07df5522b305e5 (patch)
treed766f6483e7b8024d9ed8119a0707760c47586b0 /compiler/rustc_codegen_ssa/src
parent88e39ee3149b813af3966388a0d49a92f947e322 (diff)
downloadrust-df52e2037ab73828a29c46addf07df5522b305e5.tar.gz
rust-df52e2037ab73828a29c46addf07df5522b305e5.zip
Use inttoptr to support usize as dyn* value, use pointercast to make sure pointers are compatible
Diffstat (limited to 'compiler/rustc_codegen_ssa/src')
-rw-r--r--compiler/rustc_codegen_ssa/src/base.rs8
1 files changed, 8 insertions, 0 deletions
diff --git a/compiler/rustc_codegen_ssa/src/base.rs b/compiler/rustc_codegen_ssa/src/base.rs
index 229e3d9dc5f..4e13d4dbcb7 100644
--- a/compiler/rustc_codegen_ssa/src/base.rs
+++ b/compiler/rustc_codegen_ssa/src/base.rs
@@ -273,6 +273,14 @@ pub fn cast_to_dyn_star<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>(
         matches!(dst_ty.kind(), ty::Dynamic(_, _, ty::DynStar)),
         "destination type must be a dyn*"
     );
+    // FIXME(dyn-star): We can remove this when all supported LLVMs use opaque ptrs only.
+    let unit_ptr = bx.cx().type_ptr_to(bx.cx().type_struct(&[], false));
+    let src = match bx.cx().type_kind(bx.cx().backend_type(src_ty_and_layout)) {
+        TypeKind::Pointer => bx.pointercast(src, unit_ptr),
+        TypeKind::Integer => bx.inttoptr(src, unit_ptr),
+        // FIXME(dyn-star): We probably have to do a bitcast first, then inttoptr.
+        kind => bug!("unexpected TypeKind for left-hand side of `dyn*` cast: {kind:?}"),
+    };
     (src, unsized_info(bx, src_ty_and_layout.ty, dst_ty, old_info))
 }