Use MetadataRef in the metadata loader to fix parallel rustc

This commit is contained in:
bjorn3 2020-10-15 16:15:04 +02:00
parent 1c40840738
commit 7045b101cc

View File

@ -5,8 +5,9 @@ use std::fs::File;
use std::path::Path; use std::path::Path;
use rustc_codegen_ssa::METADATA_FILENAME; use rustc_codegen_ssa::METADATA_FILENAME;
use rustc_data_structures::owning_ref::{self, OwningRef}; use rustc_data_structures::owning_ref::OwningRef;
use rustc_data_structures::rustc_erase_owner; use rustc_data_structures::rustc_erase_owner;
use rustc_data_structures::sync::MetadataRef;
use rustc_middle::middle::cstore::{EncodedMetadata, MetadataLoader}; use rustc_middle::middle::cstore::{EncodedMetadata, MetadataLoader};
use rustc_middle::ty::TyCtxt; use rustc_middle::ty::TyCtxt;
use rustc_session::config; use rustc_session::config;
@ -17,11 +18,7 @@ use crate::backend::WriteMetadata;
pub(crate) struct CraneliftMetadataLoader; pub(crate) struct CraneliftMetadataLoader;
impl MetadataLoader for CraneliftMetadataLoader { impl MetadataLoader for CraneliftMetadataLoader {
fn get_rlib_metadata( fn get_rlib_metadata(&self, _target: &Target, path: &Path) -> Result<MetadataRef, String> {
&self,
_target: &Target,
path: &Path,
) -> Result<owning_ref::ErasedBoxRef<[u8]>, String> {
let mut archive = ar::Archive::new(File::open(path).map_err(|e| format!("{:?}", e))?); let mut archive = ar::Archive::new(File::open(path).map_err(|e| format!("{:?}", e))?);
// Iterate over all entries in the archive: // Iterate over all entries in the archive:
while let Some(entry_result) = archive.next_entry() { while let Some(entry_result) = archive.next_entry() {
@ -38,14 +35,9 @@ impl MetadataLoader for CraneliftMetadataLoader {
} }
Err("couldn't find metadata entry".to_string()) Err("couldn't find metadata entry".to_string())
//self.get_dylib_metadata(target, path)
} }
fn get_dylib_metadata( fn get_dylib_metadata(&self, _target: &Target, path: &Path) -> Result<MetadataRef, String> {
&self,
_target: &Target,
path: &Path,
) -> Result<owning_ref::ErasedBoxRef<[u8]>, String> {
use object::{Object, ObjectSection}; use object::{Object, ObjectSection};
let file = std::fs::read(path).map_err(|e| format!("read:{:?}", e))?; let file = std::fs::read(path).map_err(|e| format!("read:{:?}", e))?;
let file = object::File::parse(&file).map_err(|e| format!("parse: {:?}", e))?; let file = object::File::parse(&file).map_err(|e| format!("parse: {:?}", e))?;