use crate::{
Result,
arch::NativeArch,
image::ModuleHandle,
input::ElfReader,
linker::{DependencyRequest, RootRequest},
relocation::RelocationArch,
tls::TlsResolver,
};
use alloc::{boxed::Box, vec::Vec};
pub enum ResolvedKey<'cfg, K, Arch: RelocationArch = NativeArch, Tls: TlsResolver<Arch> = ()> {
Existing(K),
Load {
key: K,
reader: Box<dyn ElfReader + 'cfg>,
},
Module {
key: K,
module: ModuleHandle<Arch, Tls>,
deps: Vec<ResolvedKey<'cfg, K, Arch, Tls>>,
},
}
impl<'cfg, K, Arch: RelocationArch, Tls: TlsResolver<Arch>> ResolvedKey<'cfg, K, Arch, Tls> {
#[inline]
pub fn existing(key: K) -> Self {
Self::Existing(key)
}
#[inline]
pub fn load(key: K, reader: impl ElfReader + 'cfg) -> Self {
Self::Load {
key,
reader: Box::new(reader),
}
}
#[inline]
pub fn module(
key: K,
module: impl Into<ModuleHandle<Arch, Tls>>,
deps: impl Into<Vec<ResolvedKey<'cfg, K, Arch, Tls>>>,
) -> Self {
Self::Module {
key,
module: module.into(),
deps: deps.into(),
}
}
}
pub trait KeyResolver<
K: Clone,
Arch: RelocationArch = NativeArch,
Q: ?Sized = K,
Tls: TlsResolver<Arch> = (),
>
{
fn load_root<'cfg>(
&self,
req: &RootRequest<'_, K, Q>,
) -> Result<ResolvedKey<'cfg, K, Arch, Tls>>
where
K: 'cfg;
fn resolve_dependency<'cfg>(
&self,
req: &DependencyRequest<'_, K, Q>,
) -> Result<ResolvedKey<'cfg, K, Arch, Tls>>
where
K: 'cfg;
}