#![deny(rustdoc::broken_intra_doc_links)]
#![deny(missing_docs)]
#![allow(clippy::redundant_field_names)]
#![forbid(unsafe_code)]
pub mod align;
pub mod attribute;
pub mod bitcodes;
pub mod ty;
use num_enum::{IntoPrimitive, TryFromPrimitive};
pub use self::align::*;
pub use self::attribute::*;
pub use self::ty::*;
pub const LLVM_IR_MAGIC: u32 = 0xdec04342;
pub const BITCODE_WRAPPER_MAGIC: u32 = 0x0b17c0de;
pub const INITIAL_ABBREV_ID_WIDTH: u64 = 2;
pub const FIRST_APPLICATION_ABBREV_ID: usize = 4;
pub const FIRST_APPLICATION_BLOCK_ID: u64 = 8;
pub const CHAR6_ALPHABET: &[u8] =
b"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._";
pub const TARGET_TRIPLE: &str = env!("TARGET_TRIPLE");
#[derive(Debug, PartialEq)]
pub enum Endian {
Little,
Big,
}
#[derive(Debug)]
pub enum InexactEndian {
Exact(Endian),
System,
}
#[derive(Debug, PartialEq)]
pub enum Mangling {
Elf,
Mips,
Macho,
WindowsX86Coff,
WindowsCoff,
XCoff,
}
#[non_exhaustive]
#[derive(Debug, PartialEq)]
#[repr(u64)]
#[allow(missing_docs)]
pub enum Linkage {
External,
AvailableExternally,
LinkOnceAny,
LinkOnceOdr,
WeakAny,
WeakOdr,
Appending,
Internal,
Private,
ExternalWeak,
Common,
}
impl From<u64> for Linkage {
fn from(value: u64) -> Self {
match value {
0 | 5 | 6 | 15 => Linkage::External,
1 | 16 => Linkage::WeakAny,
2 => Linkage::Appending,
3 => Linkage::Internal,
4 | 18 => Linkage::LinkOnceAny,
7 => Linkage::ExternalWeak,
8 => Linkage::Common,
9 | 13 | 14 => Linkage::Private,
10 | 17 => Linkage::WeakOdr,
11 | 19 => Linkage::LinkOnceOdr,
12 => Linkage::AvailableExternally,
_ => Linkage::External,
}
}
}
pub struct StrtabRef {
pub offset: usize,
pub size: usize,
}
impl From<(usize, usize)> for StrtabRef {
fn from(value: (usize, usize)) -> Self {
Self {
offset: value.0,
size: value.1,
}
}
}
impl From<(u64, u64)> for StrtabRef {
fn from(value: (u64, u64)) -> Self {
Self::from((value.0 as usize, value.1 as usize))
}
}
#[derive(Debug, PartialEq, IntoPrimitive, TryFromPrimitive)]
#[repr(u64)]
pub enum Visibility {
Default = 0,
Hidden,
Protected,
}
#[derive(Debug, PartialEq, IntoPrimitive, TryFromPrimitive)]
#[repr(u64)]
pub enum DllStorageClass {
Default = 0,
Import,
Export,
}
#[derive(Debug, PartialEq, IntoPrimitive)]
#[repr(u64)]
pub enum ThreadLocalMode {
NotThreadLocal = 0,
GeneralDynamicTls,
LocalDynamicTls,
InitialExecTls,
LocalExecTls,
}
impl From<u64> for ThreadLocalMode {
fn from(value: u64) -> ThreadLocalMode {
match value {
0 => ThreadLocalMode::NotThreadLocal,
1 => ThreadLocalMode::GeneralDynamicTls,
2 => ThreadLocalMode::LocalDynamicTls,
3 => ThreadLocalMode::InitialExecTls,
4 => ThreadLocalMode::LocalExecTls,
_ => ThreadLocalMode::GeneralDynamicTls,
}
}
}
#[derive(Debug, PartialEq, IntoPrimitive)]
#[repr(u64)]
pub enum UnnamedAddr {
None = 0,
Global,
Local,
}
impl From<u64> for UnnamedAddr {
fn from(value: u64) -> UnnamedAddr {
match value {
0 => UnnamedAddr::None,
1 => UnnamedAddr::Global,
2 => UnnamedAddr::Local,
_ => UnnamedAddr::None,
}
}
}
#[derive(Debug, PartialEq, IntoPrimitive)]
#[repr(u64)]
pub enum RuntimePreemption {
DsoPreemptable,
DsoLocal,
}
impl From<u64> for RuntimePreemption {
fn from(value: u64) -> RuntimePreemption {
match value {
0 => RuntimePreemption::DsoPreemptable,
1 => RuntimePreemption::DsoLocal,
_ => RuntimePreemption::DsoPreemptable,
}
}
}
#[non_exhaustive]
#[derive(Debug, PartialEq, TryFromPrimitive)]
#[repr(u64)]
#[allow(missing_docs)]
pub enum CallingConvention {
C = 0,
Fast = 8,
Cold = 9,
GHC = 10,
HiPE = 11,
WebKitJS = 12,
AnyReg = 13,
PreserveMost = 14,
PreserveAll = 15,
Swift = 16,
CXXFASTTLS = 17,
X86Stdcall = 64,
X86Fastcall = 65,
ARMAPCS = 66,
ARMAAPCS = 67,
ARMAAPCSVFP = 68,
MSP430INTR = 69,
X86ThisCall = 70,
PTXKernel = 71,
PTXDevice = 72,
SPIRFUNC = 75,
SPIRKERNEL = 76,
IntelOCLBI = 77,
X8664SysV = 78,
Win64 = 79,
X86VectorCall = 80,
HHVM = 81,
HHVMC = 82,
X86INTR = 83,
AVRINTR = 84,
AVRSIGNAL = 85,
AVRBUILTIN = 86,
AMDGPUVS = 87,
AMDGPUGS = 88,
AMDGPUPS = 89,
AMDGPUCS = 90,
AMDGPUKERNEL = 91,
X86RegCall = 92,
AMDGPUHS = 93,
MSP430BUILTIN = 94,
AMDGPULS = 95,
AMDGPUES = 96,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_target_triple() {
assert!(!TARGET_TRIPLE.is_empty());
}
}