about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEduard Burtescu <edy.burt@gmail.com>2016-04-19 15:57:34 +0300
committerEduard Burtescu <edy.burt@gmail.com>2016-04-19 16:08:45 +0300
commit24ca1ec07da202f77ed70f96ec6bfb138eaf29be (patch)
tree7bf34e27e86cb66f851ec80cbe6258199be94ec8 /src
parentfe48a4af8403289ebc811884964fc4ef91f6bc09 (diff)
downloadrust-24ca1ec07da202f77ed70f96ec6bfb138eaf29be.tar.gz
rust-24ca1ec07da202f77ed70f96ec6bfb138eaf29be.zip
Guard against rustc::layout diverging from rustc_trans.
Diffstat (limited to 'src')
-rw-r--r--src/librustc_trans/type_of.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/librustc_trans/type_of.rs b/src/librustc_trans/type_of.rs
index 1f0a18ad4fa..863ae3f942e 100644
--- a/src/librustc_trans/type_of.rs
+++ b/src/librustc_trans/type_of.rs
@@ -17,6 +17,7 @@ use abi::FnType;
 use adt;
 use common::*;
 use machine;
+use rustc::traits::ProjectionMode;
 use rustc::ty::{self, Ty, TypeFoldable};
 
 use type_::Type;
@@ -121,6 +122,37 @@ pub fn sizing_type_of<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>, t: Ty<'tcx>) -> Typ
     debug!("--> mapped t={:?} to llsizingty={:?}", t, llsizingty);
 
     cx.llsizingtypes().borrow_mut().insert(t, llsizingty);
+
+    // FIXME(eddyb) Temporary sanity check for ty::layout.
+    let infcx = infer::normalizing_infer_ctxt(cx.tcx(), &cx.tcx().tables, ProjectionMode::Any);
+    match t.layout(&infcx) {
+        Ok(layout) => {
+            if !type_is_sized(cx.tcx(), t) {
+                if !layout.is_unsized() {
+                    bug!("layout should be unsized for type `{}` / {:#?}",
+                         t, layout);
+                }
+
+                // Unsized types get turned into a fat pointer for LLVM.
+                return llsizingty;
+            }
+            let r = layout.size(&cx.tcx().data_layout).bytes();
+            let l = machine::llsize_of_alloc(cx, llsizingty);
+            if r != l {
+                bug!("size differs (rustc: {}, llvm: {}) for type `{}` / {:#?}",
+                     r, l, t, layout);
+            }
+            let r = layout.align(&cx.tcx().data_layout).abi();
+            let l = machine::llalign_of_min(cx, llsizingty) as u64;
+            if r != l {
+                bug!("align differs (rustc: {}, llvm: {}) for type `{}` / {:#?}",
+                     r, l, t, layout);
+            }
+        }
+        Err(e) => {
+            bug!("failed to get layout for `{}`: {}", t, e);
+        }
+    }
     llsizingty
 }