+use std::convert::TryFrom;
use std::fs::File;
use std::path::Path;
use rustc::middle::cstore::{EncodedMetadata, MetadataLoader};
-use rustc::session::config;
+use rustc_session::config;
use rustc::ty::TyCtxt;
use rustc_codegen_ssa::METADATA_FILENAME;
use rustc_data_structures::owning_ref::{self, OwningRef};
use rustc_data_structures::rustc_erase_owner;
use rustc_target::spec::Target;
+use crate::backend::WriteMetadata;
+
pub struct CraneliftMetadataLoader;
impl MetadataLoader for CraneliftMetadataLoader {
while let Some(entry_result) = archive.next_entry() {
let mut entry = entry_result.map_err(|e| format!("{:?}", e))?;
if entry.header().identifier() == METADATA_FILENAME.as_bytes() {
- let mut buf = Vec::new();
+ let mut buf = Vec::with_capacity(
+ usize::try_from(entry.header().size())
+ .expect("Rlib metadata file too big to load into memory.")
+ );
::std::io::copy(&mut entry, &mut buf).map_err(|e| format!("{:?}", e))?;
let buf: OwningRef<Vec<u8>, [u8]> = OwningRef::new(buf).into();
return Ok(rustc_erase_owner!(buf.map_owner_box()));
}
// Adapted from https://github.com/rust-lang/rust/blob/da573206f87b5510de4b0ee1a9c044127e409bd3/src/librustc_codegen_llvm/base.rs#L47-L112
-pub fn write_metadata(tcx: TyCtxt<'_>, artifact: &mut faerie::Artifact) -> EncodedMetadata {
+pub fn write_metadata<P: WriteMetadata>(tcx: TyCtxt<'_>, product: &mut P) -> EncodedMetadata {
use flate2::write::DeflateEncoder;
use flate2::Compression;
use std::io::Write;
.write_all(&metadata.raw_data)
.unwrap();
- artifact
- .declare(".rustc", faerie::Decl::section(faerie::SectionKind::Data))
- .unwrap();
- artifact
- .define_with_symbols(".rustc", compressed, {
- let mut map = std::collections::BTreeMap::new();
- // FIXME implement faerie elf backend section custom symbols
- // For MachO this is necessary to prevent the linker from throwing away the .rustc section,
- // but for ELF it isn't.
- if tcx.sess.target.target.options.is_like_osx {
- map.insert(
- rustc::middle::exported_symbols::metadata_symbol_name(tcx),
- 0,
- );
- }
- map
- })
- .unwrap();
+ product.add_rustc_section(
+ rustc::middle::exported_symbols::metadata_symbol_name(tcx),
+ compressed,
+ tcx.sess.target.target.options.is_like_osx,
+ );
metadata
}