mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Rollup merge of #110145 - WaffleLapkin:share_slice_of_bytes, r=Nilstrieb
Share slice of bytes r? `@Nilstrieb` cc `@noamtashma`
This commit is contained in:
commit
2a5c4baf68
@ -14,8 +14,7 @@ use snap::write::FrameEncoder;
|
|||||||
|
|
||||||
use object::elf::NT_GNU_PROPERTY_TYPE_0;
|
use object::elf::NT_GNU_PROPERTY_TYPE_0;
|
||||||
use rustc_data_structures::memmap::Mmap;
|
use rustc_data_structures::memmap::Mmap;
|
||||||
use rustc_data_structures::owned_slice::try_slice_owned;
|
use rustc_data_structures::owned_slice::{try_slice_owned, OwnedSlice};
|
||||||
use rustc_data_structures::sync::MetadataRef;
|
|
||||||
use rustc_metadata::fs::METADATA_FILENAME;
|
use rustc_metadata::fs::METADATA_FILENAME;
|
||||||
use rustc_metadata::EncodedMetadata;
|
use rustc_metadata::EncodedMetadata;
|
||||||
use rustc_session::cstore::MetadataLoader;
|
use rustc_session::cstore::MetadataLoader;
|
||||||
@ -39,7 +38,7 @@ pub struct DefaultMetadataLoader;
|
|||||||
fn load_metadata_with(
|
fn load_metadata_with(
|
||||||
path: &Path,
|
path: &Path,
|
||||||
f: impl for<'a> FnOnce(&'a [u8]) -> Result<&'a [u8], String>,
|
f: impl for<'a> FnOnce(&'a [u8]) -> Result<&'a [u8], String>,
|
||||||
) -> Result<MetadataRef, String> {
|
) -> Result<OwnedSlice, String> {
|
||||||
let file =
|
let file =
|
||||||
File::open(path).map_err(|e| format!("failed to open file '{}': {}", path.display(), e))?;
|
File::open(path).map_err(|e| format!("failed to open file '{}': {}", path.display(), e))?;
|
||||||
|
|
||||||
@ -49,7 +48,7 @@ fn load_metadata_with(
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl MetadataLoader for DefaultMetadataLoader {
|
impl MetadataLoader for DefaultMetadataLoader {
|
||||||
fn get_rlib_metadata(&self, _target: &Target, path: &Path) -> Result<MetadataRef, String> {
|
fn get_rlib_metadata(&self, _target: &Target, path: &Path) -> Result<OwnedSlice, String> {
|
||||||
load_metadata_with(path, |data| {
|
load_metadata_with(path, |data| {
|
||||||
let archive = object::read::archive::ArchiveFile::parse(&*data)
|
let archive = object::read::archive::ArchiveFile::parse(&*data)
|
||||||
.map_err(|e| format!("failed to parse rlib '{}': {}", path.display(), e))?;
|
.map_err(|e| format!("failed to parse rlib '{}': {}", path.display(), e))?;
|
||||||
@ -69,7 +68,7 @@ impl MetadataLoader for DefaultMetadataLoader {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_dylib_metadata(&self, _target: &Target, path: &Path) -> Result<MetadataRef, String> {
|
fn get_dylib_metadata(&self, _target: &Target, path: &Path) -> Result<OwnedSlice, String> {
|
||||||
load_metadata_with(path, |data| search_for_section(path, data, ".rustc"))
|
load_metadata_with(path, |data| search_for_section(path, data, ".rustc"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
use std::any::Any;
|
||||||
|
|
||||||
use super::write::WriteBackendMethods;
|
use super::write::WriteBackendMethods;
|
||||||
use super::CodegenObject;
|
use super::CodegenObject;
|
||||||
use crate::back::write::TargetMachineFactoryFn;
|
use crate::back::write::TargetMachineFactoryFn;
|
||||||
@ -5,6 +7,7 @@ use crate::{CodegenResults, ModuleCodegen};
|
|||||||
|
|
||||||
use rustc_ast::expand::allocator::AllocatorKind;
|
use rustc_ast::expand::allocator::AllocatorKind;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
|
use rustc_data_structures::sync::{DynSend, DynSync};
|
||||||
use rustc_errors::ErrorGuaranteed;
|
use rustc_errors::ErrorGuaranteed;
|
||||||
use rustc_metadata::EncodedMetadata;
|
use rustc_metadata::EncodedMetadata;
|
||||||
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
|
use rustc_middle::dep_graph::{WorkProduct, WorkProductId};
|
||||||
@ -20,11 +23,6 @@ use rustc_span::symbol::Symbol;
|
|||||||
use rustc_target::abi::call::FnAbi;
|
use rustc_target::abi::call::FnAbi;
|
||||||
use rustc_target::spec::Target;
|
use rustc_target::spec::Target;
|
||||||
|
|
||||||
pub use rustc_data_structures::sync::MetadataRef;
|
|
||||||
|
|
||||||
use rustc_data_structures::sync::{DynSend, DynSync};
|
|
||||||
use std::any::Any;
|
|
||||||
|
|
||||||
pub trait BackendTypes {
|
pub trait BackendTypes {
|
||||||
type Value: CodegenObject;
|
type Value: CodegenObject;
|
||||||
type Function: CodegenObject;
|
type Function: CodegenObject;
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
use std::{borrow::Borrow, ops::Deref};
|
use std::{borrow::Borrow, ops::Deref};
|
||||||
|
|
||||||
|
use crate::sync::Lrc;
|
||||||
// Use our fake Send/Sync traits when on not parallel compiler,
|
// Use our fake Send/Sync traits when on not parallel compiler,
|
||||||
// so that `OwnedSlice` only implements/requires Send/Sync
|
// so that `OwnedSlice` only implements/requires Send/Sync
|
||||||
// for parallel compiler builds.
|
// for parallel compiler builds.
|
||||||
@ -7,7 +8,7 @@ use crate::sync::{Send, Sync};
|
|||||||
|
|
||||||
/// An owned slice.
|
/// An owned slice.
|
||||||
///
|
///
|
||||||
/// This is similar to `Box<[u8]>` but allows slicing and using anything as the
|
/// This is similar to `Lrc<[u8]>` but allows slicing and using anything as the
|
||||||
/// backing buffer.
|
/// backing buffer.
|
||||||
///
|
///
|
||||||
/// See [`slice_owned`] for `OwnedSlice` construction and examples.
|
/// See [`slice_owned`] for `OwnedSlice` construction and examples.
|
||||||
@ -16,6 +17,7 @@ use crate::sync::{Send, Sync};
|
|||||||
///
|
///
|
||||||
/// This is essentially a replacement for `owning_ref` which is a lot simpler
|
/// This is essentially a replacement for `owning_ref` which is a lot simpler
|
||||||
/// and even sound! 🌸
|
/// and even sound! 🌸
|
||||||
|
#[derive(Clone)]
|
||||||
pub struct OwnedSlice {
|
pub struct OwnedSlice {
|
||||||
/// This is conceptually a `&'self.owner [u8]`.
|
/// This is conceptually a `&'self.owner [u8]`.
|
||||||
bytes: *const [u8],
|
bytes: *const [u8],
|
||||||
@ -31,7 +33,7 @@ pub struct OwnedSlice {
|
|||||||
// \/
|
// \/
|
||||||
// ⊂(´・◡・⊂ )∘˚˳° (I am the phantom remnant of #97770)
|
// ⊂(´・◡・⊂ )∘˚˳° (I am the phantom remnant of #97770)
|
||||||
#[expect(dead_code)]
|
#[expect(dead_code)]
|
||||||
owner: Box<dyn Send + Sync>,
|
owner: Lrc<dyn Send + Sync>,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Makes an [`OwnedSlice`] out of an `owner` and a `slicer` function.
|
/// Makes an [`OwnedSlice`] out of an `owner` and a `slicer` function.
|
||||||
@ -72,10 +74,10 @@ where
|
|||||||
O: Send + Sync + 'static,
|
O: Send + Sync + 'static,
|
||||||
F: FnOnce(&O) -> Result<&[u8], E>,
|
F: FnOnce(&O) -> Result<&[u8], E>,
|
||||||
{
|
{
|
||||||
// We box the owner of the bytes, so it doesn't move.
|
// We wrap the owner of the bytes in, so it doesn't move.
|
||||||
//
|
//
|
||||||
// Since the owner does not move and we don't access it in any way
|
// Since the owner does not move and we don't access it in any way
|
||||||
// before drop, there is nothing that can invalidate the bytes pointer.
|
// before dropping, there is nothing that can invalidate the bytes pointer.
|
||||||
//
|
//
|
||||||
// Thus, "extending" the lifetime of the reference returned from `F` is fine.
|
// Thus, "extending" the lifetime of the reference returned from `F` is fine.
|
||||||
// We pretend that we pass it a reference that lives as long as the returned slice.
|
// We pretend that we pass it a reference that lives as long as the returned slice.
|
||||||
@ -83,12 +85,39 @@ where
|
|||||||
// N.B. the HRTB on the `slicer` is important — without it the caller could provide
|
// N.B. the HRTB on the `slicer` is important — without it the caller could provide
|
||||||
// a short lived slice, unrelated to the owner.
|
// a short lived slice, unrelated to the owner.
|
||||||
|
|
||||||
let owner = Box::new(owner);
|
let owner = Lrc::new(owner);
|
||||||
let bytes = slicer(&*owner)?;
|
let bytes = slicer(&*owner)?;
|
||||||
|
|
||||||
Ok(OwnedSlice { bytes, owner })
|
Ok(OwnedSlice { bytes, owner })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl OwnedSlice {
|
||||||
|
/// Slice this slice by `slicer`.
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// # use rustc_data_structures::owned_slice::{OwnedSlice, slice_owned};
|
||||||
|
/// let vec = vec![1, 2, 3, 4];
|
||||||
|
///
|
||||||
|
/// // Identical to slicing via `&v[1..3]` but produces an owned slice
|
||||||
|
/// let slice: OwnedSlice = slice_owned(vec, |v| &v[..]);
|
||||||
|
/// assert_eq!(&*slice, [1, 2, 3, 4]);
|
||||||
|
///
|
||||||
|
/// let slice = slice.slice(|slice| &slice[1..][..2]);
|
||||||
|
/// assert_eq!(&*slice, [2, 3]);
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
pub fn slice(self, slicer: impl FnOnce(&[u8]) -> &[u8]) -> OwnedSlice {
|
||||||
|
// This is basically identical to `try_slice_owned`,
|
||||||
|
// `slicer` can only return slices of its argument or some static data,
|
||||||
|
// both of which are valid while `owner` is alive.
|
||||||
|
|
||||||
|
let bytes = slicer(&self);
|
||||||
|
OwnedSlice { bytes, ..self }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Deref for OwnedSlice {
|
impl Deref for OwnedSlice {
|
||||||
type Target = [u8];
|
type Target = [u8];
|
||||||
|
|
||||||
@ -108,11 +137,11 @@ impl Borrow<[u8]> for OwnedSlice {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Safety: `OwnedSlice` is conceptually `(&'self.1 [u8], Box<dyn Send + Sync>)`, which is `Send`
|
// Safety: `OwnedSlice` is conceptually `(&'self.1 [u8], Arc<dyn Send + Sync>)`, which is `Send`
|
||||||
#[cfg(parallel_compiler)]
|
#[cfg(parallel_compiler)]
|
||||||
unsafe impl Send for OwnedSlice {}
|
unsafe impl Send for OwnedSlice {}
|
||||||
|
|
||||||
// Safety: `OwnedSlice` is conceptually `(&'self.1 [u8], Box<dyn Send + Sync>)`, which is `Sync`
|
// Safety: `OwnedSlice` is conceptually `(&'self.1 [u8], Arc<dyn Send + Sync>)`, which is `Sync`
|
||||||
#[cfg(parallel_compiler)]
|
#[cfg(parallel_compiler)]
|
||||||
unsafe impl Sync for OwnedSlice {}
|
unsafe impl Sync for OwnedSlice {}
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ fn static_storage() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn slice_the_slice() {
|
fn slice_owned_the_slice() {
|
||||||
let slice = slice_owned(vec![1, 2, 3, 4, 5, 6], Vec::as_slice);
|
let slice = slice_owned(vec![1, 2, 3, 4, 5, 6], Vec::as_slice);
|
||||||
let slice = slice_owned(slice, |s| &s[1..][..4]);
|
let slice = slice_owned(slice, |s| &s[1..][..4]);
|
||||||
let slice = slice_owned(slice, |s| s);
|
let slice = slice_owned(slice, |s| s);
|
||||||
@ -35,6 +35,16 @@ fn slice_the_slice() {
|
|||||||
assert_eq!(&*slice, &[1, 2, 3, 4, 5, 6][1..][..4][1..]);
|
assert_eq!(&*slice, &[1, 2, 3, 4, 5, 6][1..][..4][1..]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn slice_the_slice() {
|
||||||
|
let slice = slice_owned(vec![1, 2, 3, 4, 5, 6], Vec::as_slice)
|
||||||
|
.slice(|s| &s[1..][..4])
|
||||||
|
.slice(|s| s)
|
||||||
|
.slice(|s| &s[1..]);
|
||||||
|
|
||||||
|
assert_eq!(&*slice, &[1, 2, 3, 4, 5, 6][1..][..4][1..]);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn try_and_fail() {
|
fn try_and_fail() {
|
||||||
let res = try_slice_owned(vec![0], |v| v.get(12..).ok_or(()));
|
let res = try_slice_owned(vec![0], |v| v.get(12..).ok_or(()));
|
||||||
|
@ -40,7 +40,6 @@
|
|||||||
//! [^2] `MTLockRef` is a typedef.
|
//! [^2] `MTLockRef` is a typedef.
|
||||||
|
|
||||||
pub use crate::marker::*;
|
pub use crate::marker::*;
|
||||||
use crate::owned_slice::OwnedSlice;
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::hash::{BuildHasher, Hash};
|
use std::hash::{BuildHasher, Hash};
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
@ -92,6 +91,7 @@ mod mode {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub use mode::{is_dyn_thread_safe, set_dyn_thread_safe_mode};
|
pub use mode::{is_dyn_thread_safe, set_dyn_thread_safe_mode};
|
||||||
|
|
||||||
cfg_if! {
|
cfg_if! {
|
||||||
if #[cfg(not(parallel_compiler))] {
|
if #[cfg(not(parallel_compiler))] {
|
||||||
pub unsafe auto trait Send {}
|
pub unsafe auto trait Send {}
|
||||||
@ -244,8 +244,6 @@ cfg_if! {
|
|||||||
r
|
r
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type MetadataRef = OwnedSlice;
|
|
||||||
|
|
||||||
pub use std::rc::Rc as Lrc;
|
pub use std::rc::Rc as Lrc;
|
||||||
pub use std::rc::Weak as Weak;
|
pub use std::rc::Weak as Weak;
|
||||||
pub use std::cell::Ref as ReadGuard;
|
pub use std::cell::Ref as ReadGuard;
|
||||||
@ -517,8 +515,6 @@ cfg_if! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type MetadataRef = OwnedSlice;
|
|
||||||
|
|
||||||
/// This makes locks panic if they are already held.
|
/// This makes locks panic if they are already held.
|
||||||
/// It is only useful when you are running in a single thread
|
/// It is only useful when you are running in a single thread
|
||||||
const ERROR_CHECKING: bool = false;
|
const ERROR_CHECKING: bool = false;
|
||||||
|
@ -220,7 +220,6 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
|||||||
use rustc_data_structures::memmap::Mmap;
|
use rustc_data_structures::memmap::Mmap;
|
||||||
use rustc_data_structures::owned_slice::slice_owned;
|
use rustc_data_structures::owned_slice::slice_owned;
|
||||||
use rustc_data_structures::svh::Svh;
|
use rustc_data_structures::svh::Svh;
|
||||||
use rustc_data_structures::sync::MetadataRef;
|
|
||||||
use rustc_errors::{DiagnosticArgValue, FatalError, IntoDiagnosticArg};
|
use rustc_errors::{DiagnosticArgValue, FatalError, IntoDiagnosticArg};
|
||||||
use rustc_fs_util::try_canonicalize;
|
use rustc_fs_util::try_canonicalize;
|
||||||
use rustc_session::config::{self, CrateType};
|
use rustc_session::config::{self, CrateType};
|
||||||
@ -782,7 +781,7 @@ fn get_metadata_section<'p>(
|
|||||||
if !filename.exists() {
|
if !filename.exists() {
|
||||||
return Err(MetadataError::NotPresent(filename));
|
return Err(MetadataError::NotPresent(filename));
|
||||||
}
|
}
|
||||||
let raw_bytes: MetadataRef = match flavor {
|
let raw_bytes = match flavor {
|
||||||
CrateFlavor::Rlib => {
|
CrateFlavor::Rlib => {
|
||||||
loader.get_rlib_metadata(target, filename).map_err(MetadataError::LoadFailure)?
|
loader.get_rlib_metadata(target, filename).map_err(MetadataError::LoadFailure)?
|
||||||
}
|
}
|
||||||
@ -843,7 +842,7 @@ fn get_metadata_section<'p>(
|
|||||||
slice_owned(mmap, Deref::deref)
|
slice_owned(mmap, Deref::deref)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let blob = MetadataBlob::new(raw_bytes);
|
let blob = MetadataBlob(raw_bytes);
|
||||||
if blob.is_compatible() {
|
if blob.is_compatible() {
|
||||||
Ok(blob)
|
Ok(blob)
|
||||||
} else {
|
} else {
|
||||||
|
@ -7,6 +7,7 @@ use crate::rmeta::*;
|
|||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::captures::Captures;
|
use rustc_data_structures::captures::Captures;
|
||||||
use rustc_data_structures::fx::FxHashMap;
|
use rustc_data_structures::fx::FxHashMap;
|
||||||
|
use rustc_data_structures::owned_slice::OwnedSlice;
|
||||||
use rustc_data_structures::svh::Svh;
|
use rustc_data_structures::svh::Svh;
|
||||||
use rustc_data_structures::sync::{AppendOnlyVec, Lock, Lrc, OnceCell};
|
use rustc_data_structures::sync::{AppendOnlyVec, Lock, Lrc, OnceCell};
|
||||||
use rustc_data_structures::unhash::UnhashMap;
|
use rustc_data_structures::unhash::UnhashMap;
|
||||||
@ -50,7 +51,7 @@ mod cstore_impl;
|
|||||||
/// A `MetadataBlob` internally is just a reference counted pointer to
|
/// A `MetadataBlob` internally is just a reference counted pointer to
|
||||||
/// the actual data, so cloning it is cheap.
|
/// the actual data, so cloning it is cheap.
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub(crate) struct MetadataBlob(Lrc<MetadataRef>);
|
pub(crate) struct MetadataBlob(pub(crate) OwnedSlice);
|
||||||
|
|
||||||
impl std::ops::Deref for MetadataBlob {
|
impl std::ops::Deref for MetadataBlob {
|
||||||
type Target = [u8];
|
type Target = [u8];
|
||||||
@ -660,10 +661,6 @@ impl<'a, 'tcx, I: Idx, T> Decodable<DecodeContext<'a, 'tcx>> for LazyTable<I, T>
|
|||||||
implement_ty_decoder!(DecodeContext<'a, 'tcx>);
|
implement_ty_decoder!(DecodeContext<'a, 'tcx>);
|
||||||
|
|
||||||
impl MetadataBlob {
|
impl MetadataBlob {
|
||||||
pub(crate) fn new(metadata_ref: MetadataRef) -> MetadataBlob {
|
|
||||||
MetadataBlob(Lrc::new(metadata_ref))
|
|
||||||
}
|
|
||||||
|
|
||||||
pub(crate) fn is_compatible(&self) -> bool {
|
pub(crate) fn is_compatible(&self) -> bool {
|
||||||
self.blob().starts_with(METADATA_HEADER)
|
self.blob().starts_with(METADATA_HEADER)
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
use crate::rmeta::DecodeContext;
|
use crate::rmeta::DecodeContext;
|
||||||
use crate::rmeta::EncodeContext;
|
use crate::rmeta::EncodeContext;
|
||||||
use rustc_data_structures::owned_slice::slice_owned;
|
|
||||||
use rustc_data_structures::owned_slice::OwnedSlice;
|
use rustc_data_structures::owned_slice::OwnedSlice;
|
||||||
use rustc_hir::def_path_hash_map::{Config as HashMapConfig, DefPathHashMap};
|
use rustc_hir::def_path_hash_map::{Config as HashMapConfig, DefPathHashMap};
|
||||||
use rustc_middle::parameterized_over_tcx;
|
use rustc_middle::parameterized_over_tcx;
|
||||||
@ -47,7 +46,7 @@ impl<'a, 'tcx> Decodable<DecodeContext<'a, 'tcx>> for DefPathHashMapRef<'static>
|
|||||||
fn decode(d: &mut DecodeContext<'a, 'tcx>) -> DefPathHashMapRef<'static> {
|
fn decode(d: &mut DecodeContext<'a, 'tcx>) -> DefPathHashMapRef<'static> {
|
||||||
let len = d.read_usize();
|
let len = d.read_usize();
|
||||||
let pos = d.position();
|
let pos = d.position();
|
||||||
let o = slice_owned(d.blob().clone(), |blob| &blob[pos..pos + len]);
|
let o = d.blob().clone().0.slice(|blob| &blob[pos..pos + len]);
|
||||||
|
|
||||||
// Although we already have the data we need via the `OwnedSlice`, we still need
|
// Although we already have the data we need via the `OwnedSlice`, we still need
|
||||||
// to advance the `DecodeContext`'s position so it's in a valid state after
|
// to advance the `DecodeContext`'s position so it's in a valid state after
|
||||||
|
@ -7,7 +7,6 @@ use table::TableBuilder;
|
|||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_attr as attr;
|
use rustc_attr as attr;
|
||||||
use rustc_data_structures::svh::Svh;
|
use rustc_data_structures::svh::Svh;
|
||||||
use rustc_data_structures::sync::MetadataRef;
|
|
||||||
use rustc_hir as hir;
|
use rustc_hir as hir;
|
||||||
use rustc_hir::def::{CtorKind, DefKind, DocLinkResMap};
|
use rustc_hir::def::{CtorKind, DefKind, DocLinkResMap};
|
||||||
use rustc_hir::def_id::{CrateNum, DefId, DefIndex, DefPathHash, StableCrateId};
|
use rustc_hir::def_id::{CrateNum, DefId, DefIndex, DefPathHash, StableCrateId};
|
||||||
|
@ -6,7 +6,8 @@ use crate::search_paths::PathKind;
|
|||||||
use crate::utils::NativeLibKind;
|
use crate::utils::NativeLibKind;
|
||||||
use crate::Session;
|
use crate::Session;
|
||||||
use rustc_ast as ast;
|
use rustc_ast as ast;
|
||||||
use rustc_data_structures::sync::{self, AppendOnlyIndexVec, MetadataRef, RwLock};
|
use rustc_data_structures::owned_slice::OwnedSlice;
|
||||||
|
use rustc_data_structures::sync::{self, AppendOnlyIndexVec, RwLock};
|
||||||
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, StableCrateId, LOCAL_CRATE};
|
use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, StableCrateId, LOCAL_CRATE};
|
||||||
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash, Definitions};
|
use rustc_hir::definitions::{DefKey, DefPath, DefPathHash, Definitions};
|
||||||
use rustc_span::hygiene::{ExpnHash, ExpnId};
|
use rustc_span::hygiene::{ExpnHash, ExpnId};
|
||||||
@ -203,8 +204,8 @@ pub enum ExternCrateSource {
|
|||||||
/// metadata in library -- this trait just serves to decouple rustc_metadata from
|
/// metadata in library -- this trait just serves to decouple rustc_metadata from
|
||||||
/// the archive reader, which depends on LLVM.
|
/// the archive reader, which depends on LLVM.
|
||||||
pub trait MetadataLoader: std::fmt::Debug {
|
pub trait MetadataLoader: std::fmt::Debug {
|
||||||
fn get_rlib_metadata(&self, target: &Target, filename: &Path) -> Result<MetadataRef, String>;
|
fn get_rlib_metadata(&self, target: &Target, filename: &Path) -> Result<OwnedSlice, String>;
|
||||||
fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result<MetadataRef, String>;
|
fn get_dylib_metadata(&self, target: &Target, filename: &Path) -> Result<OwnedSlice, String>;
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type MetadataLoaderDyn = dyn MetadataLoader + Send + Sync + sync::DynSend + sync::DynSync;
|
pub type MetadataLoaderDyn = dyn MetadataLoader + Send + Sync + sync::DynSend + sync::DynSync;
|
||||||
|
Loading…
Reference in New Issue
Block a user