]> git.lizzy.rs Git - rust.git/blobdiff - src/metadata.rs
Rustup to rustc 1.44.0-nightly (1edd389cc 2020-03-23)
[rust.git] / src / metadata.rs
index 8d17922725aa7c794fde5ea6a715bdf0ed5e0f11..cedbff914bfd5dec11cc05bdb8c031875df91f58 100644 (file)
@@ -1,14 +1,17 @@
+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 {
@@ -22,7 +25,10 @@ fn get_rlib_metadata(
         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()));
@@ -51,7 +57,7 @@ fn get_dylib_metadata(
 }
 
 // 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;
@@ -95,24 +101,11 @@ enum MetadataKind {
         .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
 }