use crate::CUint;
use llvm_sys::{
core, LLVMDLLStorageClass, LLVMIntPredicate, LLVMLinkage, LLVMOpcode, LLVMRealPredicate,
LLVMUnnamedAddr, LLVMVisibility,
};
use std::fmt::Display;
use std::ops::Deref;
pub mod context;
pub mod module;
pub mod types;
pub mod values;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct AddressSpace(CUint);
impl From<u32> for AddressSpace {
fn from(value: u32) -> Self {
Self(CUint::from(value))
}
}
impl Deref for AddressSpace {
type Target = CUint;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl AddressSpace {
#[must_use]
pub const fn new(value: CUint) -> Self {
Self(value)
}
}
pub fn dispose_message(_message: libc::c_char) {
unreachable!(
"LLVMDisposeMessage is unsafe adn restricted to operated to operate directly for safe code"
);
}
pub struct Version {
major: u32,
minor: u32,
patch: u32,
}
impl Version {
#[must_use]
pub fn new() -> Self {
let mut major = CUint::from(0_u32);
let mut minor = CUint::from(0_u32);
let mut patch = CUint::from(0_u32);
unsafe {
core::LLVMGetVersion(&mut *major, &mut *minor, &mut *patch);
}
Self {
major: major.into(),
minor: minor.into(),
patch: patch.into(),
}
}
#[must_use]
pub const fn get(&self) -> (u32, u32, u32) {
(self.minor, self.minor, self.patch)
}
}
impl Display for Version {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}.{}.{}", self.major, self.minor, self.patch)
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Opcode {
Ret,
Br,
Switch,
IndirectBr,
Invoke,
Unreachable,
CallBr,
FNeg,
Add,
FAdd,
Sub,
FSub,
Mul,
FMul,
UDiv,
SDiv,
FDiv,
URem,
SRem,
FRem,
Shl,
LShr,
AShr,
And,
Or,
Xor,
Alloca,
Load,
Store,
GetElementPtr,
Trunc,
ZExt,
SExt,
FPToUI,
FPToSI,
UIToFP,
SIToFP,
FPTrunc,
FPExt,
PtrToInt,
IntToPtr,
BitCast,
AddrSpaceCast,
ICmp,
FCmp,
PHI,
Call,
Select,
UserOp1,
UserOp2,
VAArg,
ExtractElement,
InsertElement,
ShuffleVector,
ExtractValue,
InsertValue,
Freeze,
Fence,
AtomicCmpXchg,
AtomicRMW,
Resume,
LandingPad,
CleanupRet,
CatchRet,
CatchPad,
CleanupPad,
CatchSwitch,
}
impl From<LLVMOpcode> for Opcode {
fn from(opcode: LLVMOpcode) -> Self {
match opcode {
LLVMOpcode::LLVMRet => Self::Ret,
LLVMOpcode::LLVMBr => Self::Br,
LLVMOpcode::LLVMSwitch => Self::Switch,
LLVMOpcode::LLVMIndirectBr => Self::IndirectBr,
LLVMOpcode::LLVMInvoke => Self::Invoke,
LLVMOpcode::LLVMUnreachable => Self::Unreachable,
LLVMOpcode::LLVMCallBr => Self::CallBr,
LLVMOpcode::LLVMFNeg => Self::FNeg,
LLVMOpcode::LLVMAdd => Self::Add,
LLVMOpcode::LLVMFAdd => Self::FAdd,
LLVMOpcode::LLVMSub => Self::Sub,
LLVMOpcode::LLVMFSub => Self::FSub,
LLVMOpcode::LLVMMul => Self::Mul,
LLVMOpcode::LLVMFMul => Self::FMul,
LLVMOpcode::LLVMUDiv => Self::UDiv,
LLVMOpcode::LLVMSDiv => Self::SDiv,
LLVMOpcode::LLVMFDiv => Self::FDiv,
LLVMOpcode::LLVMURem => Self::URem,
LLVMOpcode::LLVMSRem => Self::SRem,
LLVMOpcode::LLVMFRem => Self::FRem,
LLVMOpcode::LLVMShl => Self::Shl,
LLVMOpcode::LLVMLShr => Self::LShr,
LLVMOpcode::LLVMAShr => Self::AShr,
LLVMOpcode::LLVMAnd => Self::And,
LLVMOpcode::LLVMOr => Self::Or,
LLVMOpcode::LLVMXor => Self::Xor,
LLVMOpcode::LLVMAlloca => Self::Alloca,
LLVMOpcode::LLVMLoad => Self::Load,
LLVMOpcode::LLVMStore => Self::Store,
LLVMOpcode::LLVMGetElementPtr => Self::GetElementPtr,
LLVMOpcode::LLVMTrunc => Self::Trunc,
LLVMOpcode::LLVMZExt => Self::ZExt,
LLVMOpcode::LLVMSExt => Self::SExt,
LLVMOpcode::LLVMFPToUI => Self::FPToUI,
LLVMOpcode::LLVMFPToSI => Self::FPToSI,
LLVMOpcode::LLVMUIToFP => Self::UIToFP,
LLVMOpcode::LLVMSIToFP => Self::SIToFP,
LLVMOpcode::LLVMFPTrunc => Self::FPTrunc,
LLVMOpcode::LLVMFPExt => Self::FPExt,
LLVMOpcode::LLVMPtrToInt => Self::PtrToInt,
LLVMOpcode::LLVMIntToPtr => Self::IntToPtr,
LLVMOpcode::LLVMBitCast => Self::BitCast,
LLVMOpcode::LLVMAddrSpaceCast => Self::AddrSpaceCast,
LLVMOpcode::LLVMICmp => Self::ICmp,
LLVMOpcode::LLVMFCmp => Self::FCmp,
LLVMOpcode::LLVMPHI => Self::PHI,
LLVMOpcode::LLVMCall => Self::Call,
LLVMOpcode::LLVMSelect => Self::Select,
LLVMOpcode::LLVMUserOp1 => Self::UserOp1,
LLVMOpcode::LLVMUserOp2 => Self::UserOp2,
LLVMOpcode::LLVMVAArg => Self::VAArg,
LLVMOpcode::LLVMExtractElement => Self::ExtractElement,
LLVMOpcode::LLVMInsertElement => Self::InsertElement,
LLVMOpcode::LLVMShuffleVector => Self::ShuffleVector,
LLVMOpcode::LLVMExtractValue => Self::ExtractValue,
LLVMOpcode::LLVMInsertValue => Self::InsertValue,
LLVMOpcode::LLVMFreeze => Self::Freeze,
LLVMOpcode::LLVMFence => Self::Fence,
LLVMOpcode::LLVMAtomicCmpXchg => Self::AtomicCmpXchg,
LLVMOpcode::LLVMAtomicRMW => Self::AtomicRMW,
LLVMOpcode::LLVMResume => Self::Resume,
LLVMOpcode::LLVMLandingPad => Self::LandingPad,
LLVMOpcode::LLVMCleanupRet => Self::CleanupRet,
LLVMOpcode::LLVMCatchRet => Self::CatchRet,
LLVMOpcode::LLVMCatchPad => Self::CatchPad,
LLVMOpcode::LLVMCleanupPad => Self::CleanupPad,
LLVMOpcode::LLVMCatchSwitch => Self::CatchSwitch,
}
}
}
impl From<Opcode> for LLVMOpcode {
fn from(opcode: Opcode) -> Self {
match opcode {
Opcode::Ret => Self::LLVMRet,
Opcode::Br => Self::LLVMBr,
Opcode::Switch => Self::LLVMSwitch,
Opcode::IndirectBr => Self::LLVMIndirectBr,
Opcode::Invoke => Self::LLVMInvoke,
Opcode::Unreachable => Self::LLVMUnreachable,
Opcode::CallBr => Self::LLVMCallBr,
Opcode::FNeg => Self::LLVMFNeg,
Opcode::Add => Self::LLVMAdd,
Opcode::FAdd => Self::LLVMFAdd,
Opcode::Sub => Self::LLVMSub,
Opcode::FSub => Self::LLVMFSub,
Opcode::Mul => Self::LLVMMul,
Opcode::FMul => Self::LLVMFMul,
Opcode::UDiv => Self::LLVMUDiv,
Opcode::SDiv => Self::LLVMSDiv,
Opcode::FDiv => Self::LLVMFDiv,
Opcode::URem => Self::LLVMURem,
Opcode::SRem => Self::LLVMSRem,
Opcode::FRem => Self::LLVMFRem,
Opcode::Shl => Self::LLVMShl,
Opcode::LShr => Self::LLVMLShr,
Opcode::AShr => Self::LLVMAShr,
Opcode::And => Self::LLVMAnd,
Opcode::Or => Self::LLVMOr,
Opcode::Xor => Self::LLVMXor,
Opcode::Alloca => Self::LLVMAlloca,
Opcode::Load => Self::LLVMLoad,
Opcode::Store => Self::LLVMStore,
Opcode::GetElementPtr => Self::LLVMGetElementPtr,
Opcode::Trunc => Self::LLVMTrunc,
Opcode::ZExt => Self::LLVMZExt,
Opcode::SExt => Self::LLVMSExt,
Opcode::FPToUI => Self::LLVMFPToUI,
Opcode::FPToSI => Self::LLVMFPToSI,
Opcode::UIToFP => Self::LLVMUIToFP,
Opcode::SIToFP => Self::LLVMSIToFP,
Opcode::FPTrunc => Self::LLVMFPTrunc,
Opcode::FPExt => Self::LLVMFPExt,
Opcode::PtrToInt => Self::LLVMPtrToInt,
Opcode::IntToPtr => Self::LLVMIntToPtr,
Opcode::BitCast => Self::LLVMBitCast,
Opcode::AddrSpaceCast => Self::LLVMAddrSpaceCast,
Opcode::ICmp => Self::LLVMICmp,
Opcode::FCmp => Self::LLVMFCmp,
Opcode::PHI => Self::LLVMPHI,
Opcode::Call => Self::LLVMCall,
Opcode::Select => Self::LLVMSelect,
Opcode::UserOp1 => Self::LLVMUserOp1,
Opcode::UserOp2 => Self::LLVMUserOp2,
Opcode::VAArg => Self::LLVMVAArg,
Opcode::ExtractElement => Self::LLVMExtractElement,
Opcode::InsertElement => Self::LLVMInsertElement,
Opcode::ShuffleVector => Self::LLVMShuffleVector,
Opcode::ExtractValue => Self::LLVMExtractValue,
Opcode::InsertValue => Self::LLVMInsertValue,
Opcode::Freeze => Self::LLVMFreeze,
Opcode::Fence => Self::LLVMFence,
Opcode::AtomicCmpXchg => Self::LLVMAtomicCmpXchg,
Opcode::AtomicRMW => Self::LLVMAtomicRMW,
Opcode::Resume => Self::LLVMResume,
Opcode::LandingPad => Self::LLVMLandingPad,
Opcode::CleanupRet => Self::LLVMCleanupRet,
Opcode::CatchRet => Self::LLVMCatchRet,
Opcode::CatchPad => Self::LLVMCatchPad,
Opcode::CleanupPad => Self::LLVMCleanupPad,
Opcode::CatchSwitch => Self::LLVMCatchSwitch,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum IntPredicate {
IntEQ,
IntNE,
IntUGT,
IntUGE,
IntULT,
IntULE,
IntSGT,
IntSGE,
IntSLT,
IntSLE,
}
impl From<LLVMIntPredicate> for IntPredicate {
fn from(predicate: LLVMIntPredicate) -> Self {
match predicate {
LLVMIntPredicate::LLVMIntEQ => Self::IntEQ,
LLVMIntPredicate::LLVMIntNE => Self::IntNE,
LLVMIntPredicate::LLVMIntUGT => Self::IntUGT,
LLVMIntPredicate::LLVMIntUGE => Self::IntUGE,
LLVMIntPredicate::LLVMIntULT => Self::IntULT,
LLVMIntPredicate::LLVMIntULE => Self::IntULE,
LLVMIntPredicate::LLVMIntSGT => Self::IntSGT,
LLVMIntPredicate::LLVMIntSGE => Self::IntSGE,
LLVMIntPredicate::LLVMIntSLT => Self::IntSLT,
LLVMIntPredicate::LLVMIntSLE => Self::IntSLE,
}
}
}
impl From<IntPredicate> for LLVMIntPredicate {
fn from(predicate: IntPredicate) -> Self {
match predicate {
IntPredicate::IntEQ => Self::LLVMIntEQ,
IntPredicate::IntNE => Self::LLVMIntNE,
IntPredicate::IntUGT => Self::LLVMIntUGT,
IntPredicate::IntUGE => Self::LLVMIntUGE,
IntPredicate::IntULT => Self::LLVMIntULT,
IntPredicate::IntULE => Self::LLVMIntULE,
IntPredicate::IntSGT => Self::LLVMIntSGT,
IntPredicate::IntSGE => Self::LLVMIntSGE,
IntPredicate::IntSLT => Self::LLVMIntSLT,
IntPredicate::IntSLE => Self::LLVMIntSLE,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum RealPredicate {
RealPredicateFalse = 0,
RealOEQ,
RealOGT,
RealOGE,
RealOLT,
RealOLE,
RealONE,
RealORD,
RealUNO,
RealUEQ,
RealUGT,
RealUGE,
RealULT,
RealULE,
RealUNE,
RealPredicateTrue,
}
impl From<LLVMRealPredicate> for RealPredicate {
fn from(predicate: LLVMRealPredicate) -> Self {
match predicate {
LLVMRealPredicate::LLVMRealPredicateFalse => Self::RealPredicateFalse,
LLVMRealPredicate::LLVMRealOEQ => Self::RealOEQ,
LLVMRealPredicate::LLVMRealOGT => Self::RealOGT,
LLVMRealPredicate::LLVMRealOGE => Self::RealOGE,
LLVMRealPredicate::LLVMRealOLT => Self::RealOLT,
LLVMRealPredicate::LLVMRealOLE => Self::RealOLE,
LLVMRealPredicate::LLVMRealONE => Self::RealONE,
LLVMRealPredicate::LLVMRealORD => Self::RealORD,
LLVMRealPredicate::LLVMRealUNO => Self::RealUNO,
LLVMRealPredicate::LLVMRealUEQ => Self::RealUEQ,
LLVMRealPredicate::LLVMRealUGT => Self::RealUGT,
LLVMRealPredicate::LLVMRealUGE => Self::RealUGE,
LLVMRealPredicate::LLVMRealULT => Self::RealULT,
LLVMRealPredicate::LLVMRealULE => Self::RealULE,
LLVMRealPredicate::LLVMRealUNE => Self::RealUNE,
LLVMRealPredicate::LLVMRealPredicateTrue => Self::RealPredicateTrue,
}
}
}
impl From<RealPredicate> for LLVMRealPredicate {
fn from(predicate: RealPredicate) -> Self {
match predicate {
RealPredicate::RealPredicateFalse => Self::LLVMRealPredicateFalse,
RealPredicate::RealOEQ => Self::LLVMRealOEQ,
RealPredicate::RealOGT => Self::LLVMRealOGT,
RealPredicate::RealOGE => Self::LLVMRealOGE,
RealPredicate::RealOLT => Self::LLVMRealOLT,
RealPredicate::RealOLE => Self::LLVMRealOLE,
RealPredicate::RealONE => Self::LLVMRealONE,
RealPredicate::RealORD => Self::LLVMRealORD,
RealPredicate::RealUNO => Self::LLVMRealUNO,
RealPredicate::RealUEQ => Self::LLVMRealUEQ,
RealPredicate::RealUGT => Self::LLVMRealUGT,
RealPredicate::RealUGE => Self::LLVMRealUGE,
RealPredicate::RealULT => Self::LLVMRealULT,
RealPredicate::RealULE => Self::LLVMRealULE,
RealPredicate::RealUNE => Self::LLVMRealUNE,
RealPredicate::RealPredicateTrue => Self::LLVMRealPredicateTrue,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Linkage {
ExternalLinkage,
AvailableExternallyLinkage,
LinkOnceAnyLinkage,
LinkOnceODRLinkage,
LinkOnceODRAutoHideLinkage,
WeakAnyLinkage,
WeakODRLinkage,
AppendingLinkage,
InternalLinkage,
PrivateLinkage,
DLLImportLinkage,
DLLExportLinkage,
ExternalWeakLinkage,
GhostLinkage,
CommonLinkage,
LinkerPrivateLinkage,
LinkerPrivateWeakLinkage,
}
impl From<LLVMLinkage> for Linkage {
fn from(linkage: LLVMLinkage) -> Self {
match linkage {
LLVMLinkage::LLVMExternalLinkage => Self::ExternalLinkage,
LLVMLinkage::LLVMAvailableExternallyLinkage => Self::AvailableExternallyLinkage,
LLVMLinkage::LLVMLinkOnceAnyLinkage => Self::LinkOnceAnyLinkage,
LLVMLinkage::LLVMLinkOnceODRLinkage => Self::LinkOnceODRLinkage,
LLVMLinkage::LLVMLinkOnceODRAutoHideLinkage => Self::LinkOnceODRAutoHideLinkage,
LLVMLinkage::LLVMWeakAnyLinkage => Self::WeakAnyLinkage,
LLVMLinkage::LLVMWeakODRLinkage => Self::WeakODRLinkage,
LLVMLinkage::LLVMAppendingLinkage => Self::AppendingLinkage,
LLVMLinkage::LLVMInternalLinkage => Self::InternalLinkage,
LLVMLinkage::LLVMPrivateLinkage => Self::PrivateLinkage,
LLVMLinkage::LLVMDLLImportLinkage => Self::DLLImportLinkage,
LLVMLinkage::LLVMDLLExportLinkage => Self::DLLExportLinkage,
LLVMLinkage::LLVMExternalWeakLinkage => Self::ExternalWeakLinkage,
LLVMLinkage::LLVMGhostLinkage => Self::GhostLinkage,
LLVMLinkage::LLVMCommonLinkage => Self::CommonLinkage,
LLVMLinkage::LLVMLinkerPrivateLinkage => Self::LinkerPrivateLinkage,
LLVMLinkage::LLVMLinkerPrivateWeakLinkage => Self::LinkerPrivateWeakLinkage,
}
}
}
impl From<Linkage> for LLVMLinkage {
fn from(linkage: Linkage) -> Self {
match linkage {
Linkage::ExternalLinkage => Self::LLVMExternalLinkage,
Linkage::AvailableExternallyLinkage => Self::LLVMAvailableExternallyLinkage,
Linkage::LinkOnceAnyLinkage => Self::LLVMLinkOnceAnyLinkage,
Linkage::LinkOnceODRLinkage => Self::LLVMLinkOnceODRLinkage,
Linkage::LinkOnceODRAutoHideLinkage => Self::LLVMLinkOnceODRAutoHideLinkage,
Linkage::WeakAnyLinkage => Self::LLVMWeakAnyLinkage,
Linkage::WeakODRLinkage => Self::LLVMWeakODRLinkage,
Linkage::AppendingLinkage => Self::LLVMAppendingLinkage,
Linkage::InternalLinkage => Self::LLVMInternalLinkage,
Linkage::PrivateLinkage => Self::LLVMPrivateLinkage,
Linkage::DLLImportLinkage => Self::LLVMDLLImportLinkage,
Linkage::DLLExportLinkage => Self::LLVMDLLExportLinkage,
Linkage::ExternalWeakLinkage => Self::LLVMExternalWeakLinkage,
Linkage::GhostLinkage => Self::LLVMGhostLinkage,
Linkage::CommonLinkage => Self::LLVMCommonLinkage,
Linkage::LinkerPrivateLinkage => Self::LLVMLinkerPrivateLinkage,
Linkage::LinkerPrivateWeakLinkage => Self::LLVMLinkerPrivateWeakLinkage,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum Visibility {
DefaultVisibility,
HiddenVisibility,
ProtectedVisibility,
}
impl From<LLVMVisibility> for Visibility {
fn from(visibility: LLVMVisibility) -> Self {
match visibility {
LLVMVisibility::LLVMDefaultVisibility => Self::DefaultVisibility,
LLVMVisibility::LLVMHiddenVisibility => Self::HiddenVisibility,
LLVMVisibility::LLVMProtectedVisibility => Self::ProtectedVisibility,
}
}
}
impl From<Visibility> for LLVMVisibility {
fn from(visibility: Visibility) -> Self {
match visibility {
Visibility::DefaultVisibility => Self::LLVMDefaultVisibility,
Visibility::HiddenVisibility => Self::LLVMHiddenVisibility,
Visibility::ProtectedVisibility => Self::LLVMProtectedVisibility,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DLLStorageClass {
DefaultStorageClass,
DLLImportStorageClass,
DLLExportStorageClass,
}
impl From<DLLStorageClass> for LLVMDLLStorageClass {
fn from(storage_class: DLLStorageClass) -> Self {
match storage_class {
DLLStorageClass::DefaultStorageClass => Self::LLVMDefaultStorageClass,
DLLStorageClass::DLLImportStorageClass => Self::LLVMDLLImportStorageClass,
DLLStorageClass::DLLExportStorageClass => Self::LLVMDLLExportStorageClass,
}
}
}
impl From<LLVMDLLStorageClass> for DLLStorageClass {
fn from(storage_class: LLVMDLLStorageClass) -> Self {
match storage_class {
LLVMDLLStorageClass::LLVMDefaultStorageClass => Self::DefaultStorageClass,
LLVMDLLStorageClass::LLVMDLLImportStorageClass => Self::DLLImportStorageClass,
LLVMDLLStorageClass::LLVMDLLExportStorageClass => Self::DLLExportStorageClass,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum UnnamedAddr {
NoUnnamedAddr,
LocalUnnamedAddr,
GlobalUnnamedAddr,
}
impl From<UnnamedAddr> for LLVMUnnamedAddr {
fn from(unnamed_addr: UnnamedAddr) -> Self {
match unnamed_addr {
UnnamedAddr::NoUnnamedAddr => Self::LLVMNoUnnamedAddr,
UnnamedAddr::LocalUnnamedAddr => Self::LLVMLocalUnnamedAddr,
UnnamedAddr::GlobalUnnamedAddr => Self::LLVMGlobalUnnamedAddr,
}
}
}
impl From<LLVMUnnamedAddr> for UnnamedAddr {
fn from(unnamed_addr: LLVMUnnamedAddr) -> Self {
match unnamed_addr {
LLVMUnnamedAddr::LLVMNoUnnamedAddr => Self::NoUnnamedAddr,
LLVMUnnamedAddr::LLVMLocalUnnamedAddr => Self::LocalUnnamedAddr,
LLVMUnnamedAddr::LLVMGlobalUnnamedAddr => Self::GlobalUnnamedAddr,
}
}
}