about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAustin Hicks <camlorn@camlorn.net>2016-12-19 21:14:27 -0500
committerAustin Hicks <camlorn@camlorn.net>2016-12-19 21:14:27 -0500
commite1d8806efd702ee396992677cd04ab40c329d5d7 (patch)
treeb6f7bd728810fbb814b773d9b6a2f61af781dd87
parent3f9823d5f53230e83b707b4876b5bb271a4c22ef (diff)
downloadrust-e1d8806efd702ee396992677cd04ab40c329d5d7.tar.gz
rust-e1d8806efd702ee396992677cd04ab40c329d5d7.zip
Fix closure debuginfo.
-rw-r--r--src/librustc_trans/mir/mod.rs14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/librustc_trans/mir/mod.rs b/src/librustc_trans/mir/mod.rs
index 12cbfcef7d2..94dc9a5fdb4 100644
--- a/src/librustc_trans/mir/mod.rs
+++ b/src/librustc_trans/mir/mod.rs
@@ -10,14 +10,13 @@
 
 use libc::c_uint;
 use llvm::{self, ValueRef};
-use rustc::ty;
+use rustc::ty::{self, layout};
 use rustc::mir;
 use rustc::mir::tcx::LvalueTy;
 use session::config::FullDebugInfo;
 use base;
 use common::{self, Block, BlockAndBuilder, CrateContext, FunctionContext, C_null};
 use debuginfo::{self, declare_local, DebugLoc, VariableAccess, VariableKind, FunctionDebugContext};
-use machine;
 use type_of;
 
 use syntax_pos::{DUMMY_SP, NO_EXPANSION, COMMAND_LINE_EXPN, BytePos};
@@ -494,10 +493,15 @@ fn arg_local_refs<'bcx, 'tcx>(bcx: &BlockAndBuilder<'bcx, 'tcx>,
                 llval
             };
 
-            let llclosurety = type_of::type_of(bcx.ccx(), closure_ty);
+            let layout = bcx.ccx().layout_of(closure_ty);
+            let offsets = match *layout {
+                layout::Univariant { ref variant, .. } => &variant.offsets[..],
+                _ => bug!("Closures are only supposed to be Univariant")
+            };
+
             for (i, (decl, ty)) in mir.upvar_decls.iter().zip(upvar_tys).enumerate() {
-                let byte_offset_of_var_in_env =
-                    machine::llelement_offset(bcx.ccx(), llclosurety, i);
+                let byte_offset_of_var_in_env = offsets[i].bytes();
+
 
                 let ops = unsafe {
                     [llvm::LLVMRustDIBuilderCreateOpDeref(),