aboutsummaryrefslogtreecommitdiff
path: root/vendor/object/src/read/xcoff/relocation.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/object/src/read/xcoff/relocation.rs')
-rw-r--r--vendor/object/src/read/xcoff/relocation.rs127
1 files changed, 0 insertions, 127 deletions
diff --git a/vendor/object/src/read/xcoff/relocation.rs b/vendor/object/src/read/xcoff/relocation.rs
deleted file mode 100644
index a655ccc..0000000
--- a/vendor/object/src/read/xcoff/relocation.rs
+++ /dev/null
@@ -1,127 +0,0 @@
-use alloc::fmt;
-use core::fmt::Debug;
-use core::slice;
-
-use crate::pod::Pod;
-use crate::{xcoff, BigEndian as BE, Relocation};
-
-use crate::read::{ReadRef, RelocationEncoding, RelocationKind, RelocationTarget, SymbolIndex};
-
-use super::{FileHeader, SectionHeader, XcoffFile};
-
-/// An iterator for the relocations in an [`XcoffSection32`](super::XcoffSection32).
-pub type XcoffRelocationIterator32<'data, 'file, R = &'data [u8]> =
- XcoffRelocationIterator<'data, 'file, xcoff::FileHeader32, R>;
-/// An iterator for the relocations in an [`XcoffSection64`](super::XcoffSection64).
-pub type XcoffRelocationIterator64<'data, 'file, R = &'data [u8]> =
- XcoffRelocationIterator<'data, 'file, xcoff::FileHeader64, R>;
-
-/// An iterator for the relocations in an [`XcoffSection`](super::XcoffSection).
-pub struct XcoffRelocationIterator<'data, 'file, Xcoff, R = &'data [u8]>
-where
- Xcoff: FileHeader,
- R: ReadRef<'data>,
-{
- #[allow(unused)]
- pub(super) file: &'file XcoffFile<'data, Xcoff, R>,
- pub(super) relocations:
- slice::Iter<'data, <<Xcoff as FileHeader>::SectionHeader as SectionHeader>::Rel>,
-}
-
-impl<'data, 'file, Xcoff, R> Iterator for XcoffRelocationIterator<'data, 'file, Xcoff, R>
-where
- Xcoff: FileHeader,
- R: ReadRef<'data>,
-{
- type Item = (u64, Relocation);
-
- fn next(&mut self) -> Option<Self::Item> {
- self.relocations.next().map(|relocation| {
- let encoding = RelocationEncoding::Generic;
- let (kind, addend) = match relocation.r_rtype() {
- xcoff::R_POS
- | xcoff::R_RL
- | xcoff::R_RLA
- | xcoff::R_BA
- | xcoff::R_RBA
- | xcoff::R_TLS => (RelocationKind::Absolute, 0),
- xcoff::R_REL | xcoff::R_BR | xcoff::R_RBR => (RelocationKind::Relative, -4),
- xcoff::R_TOC | xcoff::R_TOCL | xcoff::R_TOCU => (RelocationKind::Got, 0),
- r_type => (RelocationKind::Xcoff(r_type), 0),
- };
- let size = (relocation.r_rsize() & 0x3F) + 1;
- let target = RelocationTarget::Symbol(SymbolIndex(relocation.r_symndx() as usize));
- (
- relocation.r_vaddr().into(),
- Relocation {
- kind,
- encoding,
- size,
- target,
- addend,
- implicit_addend: true,
- },
- )
- })
- }
-}
-
-impl<'data, 'file, Xcoff, R> fmt::Debug for XcoffRelocationIterator<'data, 'file, Xcoff, R>
-where
- Xcoff: FileHeader,
- R: ReadRef<'data>,
-{
- fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
- f.debug_struct("XcoffRelocationIterator").finish()
- }
-}
-
-/// A trait for generic access to [`xcoff::Rel32`] and [`xcoff::Rel64`].
-#[allow(missing_docs)]
-pub trait Rel: Debug + Pod {
- type Word: Into<u64>;
- fn r_vaddr(&self) -> Self::Word;
- fn r_symndx(&self) -> u32;
- fn r_rsize(&self) -> u8;
- fn r_rtype(&self) -> u8;
-}
-
-impl Rel for xcoff::Rel32 {
- type Word = u32;
-
- fn r_vaddr(&self) -> Self::Word {
- self.r_vaddr.get(BE)
- }
-
- fn r_symndx(&self) -> u32 {
- self.r_symndx.get(BE)
- }
-
- fn r_rsize(&self) -> u8 {
- self.r_rsize
- }
-
- fn r_rtype(&self) -> u8 {
- self.r_rtype
- }
-}
-
-impl Rel for xcoff::Rel64 {
- type Word = u64;
-
- fn r_vaddr(&self) -> Self::Word {
- self.r_vaddr.get(BE)
- }
-
- fn r_symndx(&self) -> u32 {
- self.r_symndx.get(BE)
- }
-
- fn r_rsize(&self) -> u8 {
- self.r_rsize
- }
-
- fn r_rtype(&self) -> u8 {
- self.r_rtype
- }
-}