use super::{TlsDescValue, TlsImageSource, TlsIndex, TlsInfo, TlsModuleId, TlsTpOffset};
use crate::{Result, TlsError, memory::VmAddr, relocation::RelocationArch};
pub trait TlsResolver<Arch: RelocationArch>: 'static {
const OVERRIDE_TLS_GET_ADDR: bool = false;
fn register(tls_info: &TlsInfo) -> Result<TlsModuleId>;
fn register_static(tls_info: &TlsInfo) -> Result<(TlsModuleId, TlsTpOffset)>;
fn add_static_tls(tls_info: &TlsInfo, offset: TlsTpOffset) -> Result<TlsModuleId>;
fn init_tls(
source: TlsImageSource,
mod_id: TlsModuleId,
offset: Option<TlsTpOffset>,
) -> Result<()>;
fn unregister(mod_id: TlsModuleId);
fn bind_tls_get_addr() -> Result<VmAddr>;
fn resolve_tls_addr(ti: TlsIndex) -> Result<VmAddr>;
#[inline]
fn bind_static_tlsdesc(_tpoff: usize) -> Result<TlsDescValue> {
Err(TlsError::ResolverUnsupported.into())
}
#[inline]
fn bind_dynamic_tlsdesc(_ti: TlsIndex) -> Result<TlsDescValue> {
Err(TlsError::ResolverUnsupported.into())
}
#[inline]
fn bind_undefweak_tlsdesc(_addend: usize) -> Result<TlsDescValue> {
Err(TlsError::ResolverUnsupported.into())
}
}
impl<Arch: RelocationArch> TlsResolver<Arch> for () {
fn register(_tls_info: &TlsInfo) -> Result<TlsModuleId> {
Err(TlsError::ResolverUnsupported.into())
}
fn register_static(_tls_info: &TlsInfo) -> Result<(TlsModuleId, TlsTpOffset)> {
Err(TlsError::StaticResolverUnsupported.into())
}
fn add_static_tls(_tls_info: &TlsInfo, _offset: TlsTpOffset) -> Result<TlsModuleId> {
Err(TlsError::StaticResolverUnsupported.into())
}
fn init_tls(
_source: TlsImageSource,
_mod_id: TlsModuleId,
_offset: Option<TlsTpOffset>,
) -> Result<()> {
Err(TlsError::StaticResolverUnsupported.into())
}
fn unregister(_mod_id: TlsModuleId) {
}
fn bind_tls_get_addr() -> Result<VmAddr> {
Err(TlsError::ResolverUnsupported.into())
}
fn resolve_tls_addr(_ti: TlsIndex) -> Result<VmAddr> {
Err(TlsError::ResolverUnsupported.into())
}
}