use llvm;
use rustc::hir::def_id::LOCAL_CRATE;
use middle::lang_items::StartFnLangItem;
+use middle::cstore::EncodedMetadata;
use rustc::ty::{self, Ty, TyCtxt};
use rustc::dep_graph::{AssertDepGraphSafe, DepNode, WorkProduct};
use rustc::hir::map as hir_map;
use debuginfo;
use declare;
use machine;
-use machine::llsize_of;
use meth;
use mir;
use monomorphize::{self, Instance};
) {
let ccx = bcx.ccx;
- if type_is_zero_size(ccx, t) {
+ let size = ccx.size_of(t);
+ if size == 0 {
return;
}
- let llty = type_of::type_of(ccx, t);
- let llsz = llsize_of(ccx, llty);
- let llalign = align.unwrap_or_else(|| type_of::align_of(ccx, t));
- call_memcpy(bcx, dst, src, llsz, llalign as u32);
+ let align = align.unwrap_or_else(|| ccx.align_of(t));
+ call_memcpy(bcx, dst, src, C_uint(ccx, size), align);
}
pub fn call_memset<'a, 'tcx>(b: &Builder<'a, 'tcx>,
}
fn write_metadata(cx: &SharedCrateContext,
- exported_symbols: &NodeSet) -> Vec<u8> {
+ exported_symbols: &NodeSet)
+ -> EncodedMetadata {
use flate;
#[derive(PartialEq, Eq, PartialOrd, Ord)]
}).max().unwrap();
if kind == MetadataKind::None {
- return Vec::new();
+ return EncodedMetadata {
+ raw_data: vec![],
+ hashes: vec![],
+ };
}
let cstore = &cx.tcx().sess.cstore;
assert!(kind == MetadataKind::Compressed);
let mut compressed = cstore.metadata_encoding_version().to_vec();
- compressed.extend_from_slice(&flate::deflate_bytes(&metadata));
+ compressed.extend_from_slice(&flate::deflate_bytes(&metadata.raw_data));
let llmeta = C_bytes_in_context(cx.metadata_llcx(), &compressed);
let llconst = C_struct_in_context(cx.metadata_llcx(), &[llmeta], false);
}
}
- // Create llvm.used variable
+ // Create the llvm.used variable
+ // This variable has type [N x i8*] and is stored in the llvm.metadata section
if !ccx.used_statics().borrow().is_empty() {
- debug!("llvm.used");
-
let name = CString::new("llvm.used").unwrap();
let section = CString::new("llvm.metadata").unwrap();
let array = C_array(Type::i8(&ccx).ptr_to(), &*ccx.used_statics().borrow());
// (delay format until we actually need it)
let record = |kind, opt_discr_size, variants| {
let type_desc = format!("{:?}", ty);
- let overall_size = layout.size(&tcx.data_layout);
- let align = layout.align(&tcx.data_layout);
+ let overall_size = layout.size(tcx);
+ let align = layout.align(tcx);
tcx.sess.code_stats.borrow_mut().record_type_size(kind,
type_desc,
align,
session::FieldInfo {
name: field_name.to_string(),
offset: offset.bytes(),
- size: field_layout.size(&tcx.data_layout).bytes(),
- align: field_layout.align(&tcx.data_layout).abi(),
+ size: field_layout.size(tcx).bytes(),
+ align: field_layout.align(tcx).abi(),
}
}
}
session::VariantInfo {
name: Some(name.to_string()),
kind: session::SizeKind::Exact,
- align: value.align(&tcx.data_layout).abi(),
- size: value.size(&tcx.data_layout).bytes(),
+ align: value.align(tcx).abi(),
+ size: value.size(tcx).bytes(),
fields: vec![],
}
};