#![deny(missing_debug_implementations)]
extern crate either;
#[macro_use]
extern crate enum_methods;
extern crate libc;
extern crate llvm_sys;
#[macro_use]
extern crate inkwell_internal_macros;
#[macro_use]
extern crate lazy_static;
#[macro_use]
pub mod support;
#[deny(missing_docs)]
pub mod attributes;
#[deny(missing_docs)]
#[cfg(not(any(feature = "llvm3-6", feature = "llvm3-7", feature = "llvm3-8", feature = "llvm3-9",
feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0")))]
pub mod comdat;
#[deny(missing_docs)]
pub mod basic_block;
pub mod builder;
#[deny(missing_docs)]
pub mod context;
pub mod data_layout;
pub mod execution_engine;
pub mod memory_buffer;
#[deny(missing_docs)]
pub mod module;
pub mod object_file;
pub mod passes;
pub mod targets;
pub mod types;
pub mod values;
use llvm_sys::{LLVMIntPredicate, LLVMRealPredicate, LLVMVisibility, LLVMThreadLocalMode, LLVMDLLStorageClass, LLVMAtomicOrdering, LLVMAtomicRMWBinOp};
use std::convert::TryFrom;
macro_rules! assert_unique_features {
() => {};
($first:tt $(,$rest:tt)*) => {
$(
#[cfg(all(feature = $first, feature = $rest))]
compile_error!(concat!("features \"", $first, "\" and \"", $rest, "\" cannot be used together"));
)*
assert_unique_features!($($rest),*);
}
}
macro_rules! assert_used_features {
($($all:tt),*) => {
#[cfg(not(any($(feature = $all),*)))]
compile_error!(concat!("One of the LLVM feature flags must be provided: ", $($all, " "),*));
}
}
macro_rules! assert_unique_used_features {
($($all:tt),*) => {
assert_unique_features!($($all),*);
assert_used_features!($($all),*);
}
}
assert_unique_used_features!{"llvm3-6", "llvm3-7", "llvm3-8", "llvm3-9", "llvm4-0", "llvm5-0", "llvm6-0", "llvm7-0", "llvm8-0"}
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum AddressSpace {
Generic = 0,
Global = 1,
Shared = 3,
Const = 4,
Local = 5,
}
impl TryFrom<u32> for AddressSpace {
type Error = ();
fn try_from(val: u32) -> Result<Self, Self::Error> {
match val {
0 => Ok(AddressSpace::Generic),
1 => Ok(AddressSpace::Global),
2 => Ok(AddressSpace::Shared),
3 => Ok(AddressSpace::Const),
4 => Ok(AddressSpace::Local),
_ => Err(()),
}
}
}
enum_rename!{
IntPredicate <=> LLVMIntPredicate {
EQ <=> LLVMIntEQ,
NE <=> LLVMIntNE,
UGT <=> LLVMIntUGT,
UGE <=> LLVMIntUGE,
ULT <=> LLVMIntULT,
ULE <=> LLVMIntULE,
SGT <=> LLVMIntSGT,
SGE <=> LLVMIntSGE,
SLT <=> LLVMIntSLT,
SLE <=> LLVMIntSLE,
}
}
enum_rename!{
FloatPredicate <=> LLVMRealPredicate {
OEQ <=> LLVMRealOEQ,
OGE <=> LLVMRealOGE,
OGT <=> LLVMRealOGT,
OLE <=> LLVMRealOLE,
OLT <=> LLVMRealOLT,
ONE <=> LLVMRealONE,
ORD <=> LLVMRealORD,
PredicateFalse <=> LLVMRealPredicateFalse,
PredicateTrue <=> LLVMRealPredicateTrue,
UEQ <=> LLVMRealUEQ,
UGE <=> LLVMRealUGE,
UGT <=> LLVMRealUGT,
ULE <=> LLVMRealULE,
ULT <=> LLVMRealULT,
UNE <=> LLVMRealUNE,
UNO <=> LLVMRealUNO,
}
}
#[llvm_enum(LLVMAtomicOrdering)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum AtomicOrdering {
#[llvm_variant(LLVMAtomicOrderingNotAtomic)]
NotAtomic,
#[llvm_variant(LLVMAtomicOrderingUnordered)]
Unordered,
#[llvm_variant(LLVMAtomicOrderingMonotonic)]
Monotonic,
#[llvm_variant(LLVMAtomicOrderingAcquire)]
Acquire,
#[llvm_variant(LLVMAtomicOrderingRelease)]
Release,
#[llvm_variant(LLVMAtomicOrderingAcquireRelease)]
AcquireRelease,
#[llvm_variant(LLVMAtomicOrderingSequentiallyConsistent)]
SequentiallyConsistent,
}
#[llvm_enum(LLVMAtomicRMWBinOp)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub enum AtomicRMWBinOp {
#[llvm_variant(LLVMAtomicRMWBinOpXchg)]
Xchg,
#[llvm_variant(LLVMAtomicRMWBinOpAdd)]
Add,
#[llvm_variant(LLVMAtomicRMWBinOpSub)]
Sub,
#[llvm_variant(LLVMAtomicRMWBinOpAnd)]
And,
#[llvm_variant(LLVMAtomicRMWBinOpNand)]
Nand,
#[llvm_variant(LLVMAtomicRMWBinOpOr)]
Or,
#[llvm_variant(LLVMAtomicRMWBinOpXor)]
Xor,
#[llvm_variant(LLVMAtomicRMWBinOpMax)]
Max,
#[llvm_variant(LLVMAtomicRMWBinOpMin)]
Min,
#[llvm_variant(LLVMAtomicRMWBinOpUMax)]
UMax,
#[llvm_variant(LLVMAtomicRMWBinOpUMin)]
UMin,
}
#[repr(u32)]
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
pub enum OptimizationLevel {
None = 0,
Less = 1,
Default = 2,
Aggressive = 3
}
impl Default for OptimizationLevel {
fn default() -> Self {
OptimizationLevel::Default
}
}
enum_rename!{
GlobalVisibility <=> LLVMVisibility {
Default <=> LLVMDefaultVisibility,
Hidden <=> LLVMHiddenVisibility,
Protected <=> LLVMProtectedVisibility,
}
}
impl Default for GlobalVisibility {
fn default() -> Self {
GlobalVisibility::Default
}
}
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
pub enum ThreadLocalMode {
GeneralDynamicTLSModel,
LocalDynamicTLSModel,
InitialExecTLSModel,
LocalExecTLSModel,
}
impl ThreadLocalMode {
pub(crate) fn new(thread_local_mode: LLVMThreadLocalMode) -> Option<Self> {
match thread_local_mode {
LLVMThreadLocalMode::LLVMGeneralDynamicTLSModel => Some(ThreadLocalMode::GeneralDynamicTLSModel),
LLVMThreadLocalMode::LLVMLocalDynamicTLSModel => Some(ThreadLocalMode::LocalDynamicTLSModel),
LLVMThreadLocalMode::LLVMInitialExecTLSModel => Some(ThreadLocalMode::InitialExecTLSModel),
LLVMThreadLocalMode::LLVMLocalExecTLSModel => Some(ThreadLocalMode::LocalExecTLSModel),
LLVMThreadLocalMode::LLVMNotThreadLocal => None
}
}
pub(crate) fn as_llvm_mode(&self) -> LLVMThreadLocalMode {
match *self {
ThreadLocalMode::GeneralDynamicTLSModel => LLVMThreadLocalMode::LLVMGeneralDynamicTLSModel,
ThreadLocalMode::LocalDynamicTLSModel => LLVMThreadLocalMode::LLVMLocalDynamicTLSModel,
ThreadLocalMode::InitialExecTLSModel => LLVMThreadLocalMode::LLVMInitialExecTLSModel,
ThreadLocalMode::LocalExecTLSModel => LLVMThreadLocalMode::LLVMLocalExecTLSModel,
}
}
}
enum_rename! {
DLLStorageClass <=> LLVMDLLStorageClass {
Default <=> LLVMDefaultStorageClass,
Import <=> LLVMDLLImportStorageClass,
Export <=> LLVMDLLExportStorageClass,
}
}
impl Default for DLLStorageClass {
fn default() -> Self {
DLLStorageClass::Default
}
}