1#![deny(missing_debug_implementations)]
14#![cfg_attr(feature = "nightly", feature(doc_cfg))]
15
16#[macro_use]
17extern crate inkwell_internals;
18
19#[macro_use]
20pub mod support;
21#[deny(missing_docs)]
22pub mod attributes;
23#[deny(missing_docs)]
24pub mod basic_block;
25pub mod builder;
26#[deny(missing_docs)]
27#[cfg(not(any(feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0")))]
28pub mod comdat;
29#[deny(missing_docs)]
30pub mod context;
31pub mod data_layout;
32#[cfg(not(any(feature = "llvm4-0", feature = "llvm5-0", feature = "llvm6-0")))]
33pub mod debug_info;
34pub mod execution_engine;
35pub mod intrinsics;
36pub mod memory_buffer;
37#[deny(missing_docs)]
38pub mod module;
39pub mod object_file;
40pub mod passes;
41pub mod targets;
42pub mod types;
43pub mod values;
44
45#[cfg(feature = "llvm10-0")]
47pub extern crate llvm_sys_100 as llvm_sys;
48#[cfg(feature = "llvm11-0")]
49pub extern crate llvm_sys_110 as llvm_sys;
50#[cfg(feature = "llvm12-0")]
51pub extern crate llvm_sys_120 as llvm_sys;
52#[cfg(feature = "llvm13-0")]
53pub extern crate llvm_sys_130 as llvm_sys;
54#[cfg(feature = "llvm14-0")]
55pub extern crate llvm_sys_140 as llvm_sys;
56#[cfg(feature = "llvm15-0")]
57pub extern crate llvm_sys_150 as llvm_sys;
58#[cfg(feature = "llvm16-0")]
59pub extern crate llvm_sys_160 as llvm_sys;
60#[cfg(feature = "llvm4-0")]
61pub extern crate llvm_sys_40 as llvm_sys;
62#[cfg(feature = "llvm5-0")]
63pub extern crate llvm_sys_50 as llvm_sys;
64#[cfg(feature = "llvm6-0")]
65pub extern crate llvm_sys_60 as llvm_sys;
66#[cfg(feature = "llvm7-0")]
67pub extern crate llvm_sys_70 as llvm_sys;
68#[cfg(feature = "llvm8-0")]
69pub extern crate llvm_sys_80 as llvm_sys;
70#[cfg(feature = "llvm9-0")]
71pub extern crate llvm_sys_90 as llvm_sys;
72
73use llvm_sys::{
74 LLVMAtomicOrdering, LLVMAtomicRMWBinOp, LLVMDLLStorageClass, LLVMIntPredicate, LLVMRealPredicate,
75 LLVMThreadLocalMode, LLVMVisibility,
76};
77
78#[llvm_versions(7.0..=latest)]
79use llvm_sys::LLVMInlineAsmDialect;
80
81use std::convert::TryFrom;
82
83macro_rules! assert_unique_features {
86 () => {};
87 ($first:tt $(,$rest:tt)*) => {
88 $(
89 #[cfg(all(feature = $first, feature = $rest))]
90 compile_error!(concat!("features \"", $first, "\" and \"", $rest, "\" cannot be used together"));
91 )*
92 assert_unique_features!($($rest),*);
93 }
94}
95
96macro_rules! assert_used_features {
99 ($($all:tt),*) => {
100 #[cfg(not(any($(feature = $all),*)))]
101 compile_error!(concat!("One of the LLVM feature flags must be provided: ", $($all, " "),*));
102 }
103}
104
105macro_rules! assert_unique_used_features {
106 ($($all:tt),*) => {
107 assert_unique_features!($($all),*);
108 assert_used_features!($($all),*);
109 }
110}
111
112assert_unique_used_features! {"llvm4-0", "llvm5-0", "llvm6-0", "llvm7-0", "llvm8-0", "llvm9-0", "llvm10-0", "llvm11-0", "llvm12-0", "llvm13-0", "llvm14-0", "llvm15-0", "llvm16-0"}
113
114#[derive(Debug, PartialEq, Eq, Copy, Clone)]
130pub struct AddressSpace(u32);
131
132impl Default for AddressSpace {
133 fn default() -> Self {
134 AddressSpace(0)
135 }
136}
137
138impl From<u16> for AddressSpace {
139 fn from(val: u16) -> Self {
140 AddressSpace(val as u32)
141 }
142}
143
144impl TryFrom<u32> for AddressSpace {
145 type Error = ();
146
147 fn try_from(val: u32) -> Result<Self, Self::Error> {
148 if val < 1 << 24 {
150 Ok(AddressSpace(val))
151 } else {
152 Err(())
153 }
154 }
155}
156
157#[llvm_enum(LLVMIntPredicate)]
160#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
161pub enum IntPredicate {
162 #[llvm_variant(LLVMIntEQ)]
164 EQ,
165
166 #[llvm_variant(LLVMIntNE)]
168 NE,
169
170 #[llvm_variant(LLVMIntUGT)]
172 UGT,
173
174 #[llvm_variant(LLVMIntUGE)]
176 UGE,
177
178 #[llvm_variant(LLVMIntULT)]
180 ULT,
181
182 #[llvm_variant(LLVMIntULE)]
184 ULE,
185
186 #[llvm_variant(LLVMIntSGT)]
188 SGT,
189
190 #[llvm_variant(LLVMIntSGE)]
192 SGE,
193
194 #[llvm_variant(LLVMIntSLT)]
196 SLT,
197
198 #[llvm_variant(LLVMIntSLE)]
200 SLE,
201}
202
203#[llvm_enum(LLVMRealPredicate)]
206#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
207pub enum FloatPredicate {
208 #[llvm_variant(LLVMRealOEQ)]
210 OEQ,
211
212 #[llvm_variant(LLVMRealOGE)]
214 OGE,
215
216 #[llvm_variant(LLVMRealOGT)]
218 OGT,
219
220 #[llvm_variant(LLVMRealOLE)]
222 OLE,
223
224 #[llvm_variant(LLVMRealOLT)]
226 OLT,
227
228 #[llvm_variant(LLVMRealONE)]
230 ONE,
231
232 #[llvm_variant(LLVMRealORD)]
234 ORD,
235
236 #[llvm_variant(LLVMRealPredicateFalse)]
238 PredicateFalse,
239
240 #[llvm_variant(LLVMRealPredicateTrue)]
242 PredicateTrue,
243
244 #[llvm_variant(LLVMRealUEQ)]
246 UEQ,
247
248 #[llvm_variant(LLVMRealUGE)]
250 UGE,
251
252 #[llvm_variant(LLVMRealUGT)]
254 UGT,
255
256 #[llvm_variant(LLVMRealULE)]
258 ULE,
259
260 #[llvm_variant(LLVMRealULT)]
262 ULT,
263
264 #[llvm_variant(LLVMRealUNE)]
266 UNE,
267
268 #[llvm_variant(LLVMRealUNO)]
270 UNO,
271}
272
273#[llvm_enum(LLVMAtomicOrdering)]
275#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
276pub enum AtomicOrdering {
277 #[llvm_variant(LLVMAtomicOrderingNotAtomic)]
278 NotAtomic,
279 #[llvm_variant(LLVMAtomicOrderingUnordered)]
280 Unordered,
281 #[llvm_variant(LLVMAtomicOrderingMonotonic)]
282 Monotonic,
283 #[llvm_variant(LLVMAtomicOrderingAcquire)]
284 Acquire,
285 #[llvm_variant(LLVMAtomicOrderingRelease)]
286 Release,
287 #[llvm_variant(LLVMAtomicOrderingAcquireRelease)]
288 AcquireRelease,
289 #[llvm_variant(LLVMAtomicOrderingSequentiallyConsistent)]
290 SequentiallyConsistent,
291}
292
293#[llvm_enum(LLVMAtomicRMWBinOp)]
294#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
295pub enum AtomicRMWBinOp {
296 #[llvm_variant(LLVMAtomicRMWBinOpXchg)]
298 Xchg,
299
300 #[llvm_variant(LLVMAtomicRMWBinOpAdd)]
302 Add,
303
304 #[llvm_variant(LLVMAtomicRMWBinOpSub)]
306 Sub,
307
308 #[llvm_variant(LLVMAtomicRMWBinOpAnd)]
310 And,
311
312 #[llvm_variant(LLVMAtomicRMWBinOpNand)]
314 Nand,
315
316 #[llvm_variant(LLVMAtomicRMWBinOpOr)]
318 Or,
319
320 #[llvm_variant(LLVMAtomicRMWBinOpXor)]
322 Xor,
323
324 #[llvm_variant(LLVMAtomicRMWBinOpMax)]
326 Max,
327
328 #[llvm_variant(LLVMAtomicRMWBinOpMin)]
330 Min,
331
332 #[llvm_variant(LLVMAtomicRMWBinOpUMax)]
334 UMax,
335
336 #[llvm_variant(LLVMAtomicRMWBinOpUMin)]
338 UMin,
339
340 #[llvm_versions(10.0..=latest)]
344 #[llvm_variant(LLVMAtomicRMWBinOpFAdd)]
345 FAdd,
346
347 #[llvm_versions(10.0..=latest)]
351 #[llvm_variant(LLVMAtomicRMWBinOpFSub)]
352 FSub,
353
354 #[llvm_versions(15.0..=latest)]
356 #[llvm_variant(LLVMAtomicRMWBinOpFMax)]
357 FMax,
358
359 #[llvm_versions(15.0..=latest)]
361 #[llvm_variant(LLVMAtomicRMWBinOpFMin)]
362 FMin,
363}
364
365#[repr(u32)]
370#[derive(Debug, PartialEq, Eq, Copy, Clone)]
371pub enum OptimizationLevel {
372 None = 0,
373 Less = 1,
374 Default = 2,
375 Aggressive = 3,
376}
377
378impl Default for OptimizationLevel {
379 fn default() -> Self {
381 OptimizationLevel::Default
382 }
383}
384
385#[llvm_enum(LLVMVisibility)]
386#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
387pub enum GlobalVisibility {
388 #[llvm_variant(LLVMDefaultVisibility)]
389 Default,
390 #[llvm_variant(LLVMHiddenVisibility)]
391 Hidden,
392 #[llvm_variant(LLVMProtectedVisibility)]
393 Protected,
394}
395
396impl Default for GlobalVisibility {
397 fn default() -> Self {
399 GlobalVisibility::Default
400 }
401}
402
403#[derive(Clone, Copy, Debug, Eq, PartialEq)]
404pub enum ThreadLocalMode {
405 GeneralDynamicTLSModel,
406 LocalDynamicTLSModel,
407 InitialExecTLSModel,
408 LocalExecTLSModel,
409}
410
411impl ThreadLocalMode {
412 pub(crate) fn new(thread_local_mode: LLVMThreadLocalMode) -> Option<Self> {
413 match thread_local_mode {
414 LLVMThreadLocalMode::LLVMGeneralDynamicTLSModel => Some(ThreadLocalMode::GeneralDynamicTLSModel),
415 LLVMThreadLocalMode::LLVMLocalDynamicTLSModel => Some(ThreadLocalMode::LocalDynamicTLSModel),
416 LLVMThreadLocalMode::LLVMInitialExecTLSModel => Some(ThreadLocalMode::InitialExecTLSModel),
417 LLVMThreadLocalMode::LLVMLocalExecTLSModel => Some(ThreadLocalMode::LocalExecTLSModel),
418 LLVMThreadLocalMode::LLVMNotThreadLocal => None,
419 }
420 }
421
422 pub(crate) fn as_llvm_mode(self) -> LLVMThreadLocalMode {
423 match self {
424 ThreadLocalMode::GeneralDynamicTLSModel => LLVMThreadLocalMode::LLVMGeneralDynamicTLSModel,
425 ThreadLocalMode::LocalDynamicTLSModel => LLVMThreadLocalMode::LLVMLocalDynamicTLSModel,
426 ThreadLocalMode::InitialExecTLSModel => LLVMThreadLocalMode::LLVMInitialExecTLSModel,
427 ThreadLocalMode::LocalExecTLSModel => LLVMThreadLocalMode::LLVMLocalExecTLSModel,
428 }
430 }
431}
432
433#[llvm_enum(LLVMDLLStorageClass)]
434#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
435pub enum DLLStorageClass {
436 #[llvm_variant(LLVMDefaultStorageClass)]
437 Default,
438 #[llvm_variant(LLVMDLLImportStorageClass)]
439 Import,
440 #[llvm_variant(LLVMDLLExportStorageClass)]
441 Export,
442}
443
444impl Default for DLLStorageClass {
445 fn default() -> Self {
447 DLLStorageClass::Default
448 }
449}
450
451#[llvm_versions(7.0..=latest)]
452#[llvm_enum(LLVMInlineAsmDialect)]
453#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
454pub enum InlineAsmDialect {
455 #[llvm_variant(LLVMInlineAsmDialectATT)]
456 ATT,
457 #[llvm_variant(LLVMInlineAsmDialectIntel)]
458 Intel,
459}