use rustc::hir;
use rustc_data_structures::ToHex;
use {type_of, machine, monomorphize};
-use common::CrateContext;
+use common::{self, CrateContext};
use type_::Type;
use rustc::ty::{self, AdtKind, Ty, layout};
use session::config;
fn subroutine_type_metadata<'a, 'tcx>(cx: &CrateContext<'a, 'tcx>,
unique_type_id: UniqueTypeId,
- signature: &ty::PolyFnSig<'tcx>,
+ signature: ty::PolyFnSig<'tcx>,
span: Span)
-> MetadataCreationResult
{
- let signature = cx.tcx().erase_late_bound_regions(signature);
+ let signature = cx.tcx().erase_late_bound_regions_and_normalize(&signature);
let mut signature_metadata: Vec<DIType> = Vec::with_capacity(signature.inputs().len() + 1);
// return type
signature_metadata.push(match signature.output().sty {
- ty::TyTuple(ref tys) if tys.is_empty() => ptr::null_mut(),
+ ty::TyTuple(ref tys, _) if tys.is_empty() => ptr::null_mut(),
_ => type_metadata(cx, signature.output(), span)
});
ty::TyFloat(_) => {
MetadataCreationResult::new(basic_type_metadata(cx, t), false)
}
- ty::TyTuple(ref elements) if elements.is_empty() => {
+ ty::TyTuple(ref elements, _) if elements.is_empty() => {
MetadataCreationResult::new(basic_type_metadata(cx, t), false)
}
ty::TyArray(typ, len) => {
Err(metadata) => return metadata,
}
}
- ty::TyFnDef(.., ref barefnty) | ty::TyFnPtr(ref barefnty) => {
+ ty::TyFnDef(.., sig) | ty::TyFnPtr(sig) => {
let fn_metadata = subroutine_type_metadata(cx,
unique_type_id,
- &barefnty.sig,
+ sig,
usage_site_span).metadata;
match debug_context(cx).type_map
.borrow()
usage_site_span).finalize(cx)
}
},
- ty::TyTuple(ref elements) => {
+ ty::TyTuple(ref elements, _) => {
prepare_tuple_metadata(cx,
t,
&elements[..],
let (name, encoding) = match t.sty {
ty::TyNever => ("!", DW_ATE_unsigned),
- ty::TyTuple(ref elements) if elements.is_empty() =>
+ ty::TyTuple(ref elements, _) if elements.is_empty() =>
("()", DW_ATE_unsigned),
ty::TyBool => ("bool", DW_ATE_boolean),
ty::TyChar => ("char", DW_ATE_unsigned_char),
let producer = CString::new(producer).unwrap();
let flags = "\0";
let split_name = "\0";
- return unsafe {
- llvm::LLVMRustDIBuilderCreateCompileUnit(
+
+ unsafe {
+ let file_metadata = llvm::LLVMRustDIBuilderCreateFile(
+ debug_context.builder, compile_unit_name, work_dir.as_ptr());
+
+ return llvm::LLVMRustDIBuilderCreateCompileUnit(
debug_context.builder,
DW_LANG_RUST,
- compile_unit_name,
- work_dir.as_ptr(),
+ file_metadata,
producer.as_ptr(),
sess.opts.optimize != config::OptLevel::No,
flags.as_ptr() as *const _,
// <unknown>
let file_metadata = unknown_file_metadata(cx);
- let variants = &enum_type.ty_adt_def().unwrap().variants;
- let enumerators_metadata: Vec<DIDescriptor> = variants
- .iter()
- .map(|v| {
+ let def = enum_type.ty_adt_def().unwrap();
+ let enumerators_metadata: Vec<DIDescriptor> = def.discriminants(cx.tcx())
+ .zip(&def.variants)
+ .map(|(discr, v)| {
let token = v.name.as_str();
let name = CString::new(token.as_bytes()).unwrap();
unsafe {
DIB(cx),
name.as_ptr(),
// FIXME: what if enumeration has i128 discriminant?
- v.disr_val.to_u128_unchecked() as u64)
+ discr.to_u128_unchecked() as u64)
}
})
.collect();
};
let is_local_to_unit = is_node_local_to_unit(cx, node_id);
- let variable_type = tcx.erase_regions(&tcx.item_type(node_def_id));
+ let variable_type = common::def_ty(cx.shared(), node_def_id, Substs::empty());
let type_metadata = type_metadata(cx, variable_type, span);
let var_name = tcx.item_name(node_def_id).to_string();
let linkage_name = mangled_name_of_item(cx, node_def_id, "");
let var_name = CString::new(var_name).unwrap();
let linkage_name = CString::new(linkage_name).unwrap();
- let ty = cx.tcx().item_type(node_def_id);
- let global_align = type_of::align_of(cx, ty);
+ let global_align = type_of::align_of(cx, variable_type);
unsafe {
llvm::LLVMRustDIBuilderCreateStaticVariable(DIB(cx),
is_local_to_unit,
global,
ptr::null_mut(),
- global_align as u64,
+ global_align,
);
}
}