From 56240ec043802aae263f08bf394e4e9007f4a9e9 Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Thu, 7 Feb 2019 17:15:46 +0200 Subject: [PATCH] rustc_codegen_llvm: use opaque LLVM structs for `extern type`. --- src/librustc_codegen_llvm/type_of.rs | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/src/librustc_codegen_llvm/type_of.rs b/src/librustc_codegen_llvm/type_of.rs index afaeb352cd992..c59aec61a13a7 100644 --- a/src/librustc_codegen_llvm/type_of.rs +++ b/src/librustc_codegen_llvm/type_of.rs @@ -90,10 +90,10 @@ fn uncached_llvm_type<'a, 'tcx>(cx: &CodegenCx<'a, 'tcx>, match name { None => { let (llfields, packed) = struct_llfields(cx, layout); - cx.type_struct( &llfields, packed) + cx.type_struct(&llfields, packed) } Some(ref name) => { - let llty = cx.type_named_struct( name); + let llty = cx.type_named_struct(name); *defer = Some((llty, layout)); llty } @@ -298,8 +298,15 @@ impl<'tcx> LayoutLlvmExt<'tcx> for TyLayout<'tcx> { cx.lltypes.borrow_mut().insert((self.ty, variant_index), llty); if let Some((llty, layout)) = defer { - let (llfields, packed) = struct_llfields(cx, layout); - cx.set_struct_body(llty, &llfields, packed) + match layout.ty.sty { + // Leave an `extern type` fully opaque (LLVM "unsized"). + ty::Foreign(..) => {} + + _ => { + let (llfields, packed) = struct_llfields(cx, layout); + cx.set_struct_body(llty, &llfields, packed) + } + } } llty