mod memorysink;
mod stack_map;
pub use self::memorysink::{
MemoryCodeSink, NullRelocSink, NullStackMapSink, NullTrapSink, RelocSink, StackMapSink,
TrapSink,
};
pub use self::stack_map::StackMap;
use crate::ir::{ExternalName, Opcode, SourceLoc, TrapCode};
use core::fmt;
#[cfg(feature = "enable-serde")]
use serde::{Deserialize, Serialize};
pub type CodeOffset = u32;
pub type Addend = i64;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
pub enum Reloc {
Abs4,
Abs8,
X86PCRel4,
X86CallPCRel4,
X86CallPLTRel4,
X86GOTPCRel4,
Arm32Call,
Arm64Call,
S390xPCRel32Dbl,
ElfX86_64TlsGd,
MachOX86_64Tlv,
Aarch64TlsGdAdrPage21,
Aarch64TlsGdAddLo12Nc,
}
impl fmt::Display for Reloc {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Self::Abs4 => write!(f, "Abs4"),
Self::Abs8 => write!(f, "Abs8"),
Self::S390xPCRel32Dbl => write!(f, "PCRel32Dbl"),
Self::X86PCRel4 => write!(f, "PCRel4"),
Self::X86CallPCRel4 => write!(f, "CallPCRel4"),
Self::X86CallPLTRel4 => write!(f, "CallPLTRel4"),
Self::X86GOTPCRel4 => write!(f, "GOTPCRel4"),
Self::Arm32Call | Self::Arm64Call => write!(f, "Call"),
Self::ElfX86_64TlsGd => write!(f, "ElfX86_64TlsGd"),
Self::MachOX86_64Tlv => write!(f, "MachOX86_64Tlv"),
Self::Aarch64TlsGdAdrPage21 => write!(f, "Aarch64TlsGdAdrPage21"),
Self::Aarch64TlsGdAddLo12Nc => write!(f, "Aarch64TlsGdAddLo12Nc"),
}
}
}
#[derive(PartialEq)]
pub struct CodeInfo {
pub code_size: CodeOffset,
pub jumptables_size: CodeOffset,
pub rodata_size: CodeOffset,
pub total_size: CodeOffset,
}
impl CodeInfo {
pub fn jumptables(&self) -> CodeOffset {
self.code_size
}
pub fn rodata(&self) -> CodeOffset {
self.code_size + self.jumptables_size
}
}
pub trait CodeSink {
fn offset(&self) -> CodeOffset;
fn put1(&mut self, _: u8);
fn put2(&mut self, _: u16);
fn put4(&mut self, _: u32);
fn put8(&mut self, _: u64);
fn reloc_external(&mut self, _: SourceLoc, _: Reloc, _: &ExternalName, _: Addend);
fn trap(&mut self, _: TrapCode, _: SourceLoc);
fn begin_jumptables(&mut self);
fn begin_rodata(&mut self);
fn end_codegen(&mut self);
fn add_call_site(&mut self, _: Opcode, _: SourceLoc) {
}
}