Skip to content

Commit 6def047

Browse files
committed
split function for different llvm versions
1 parent 0665e00 commit 6def047

File tree

2 files changed

+51
-5
lines changed

2 files changed

+51
-5
lines changed

src/context.rs

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
//! A `Context` is an opaque owner and manager of core global data.
22
3-
use llvm_sys::core::{LLVMAppendBasicBlockInContext, LLVMContextCreate, LLVMContextDispose, LLVMCreateBuilderInContext, LLVMDoubleTypeInContext, LLVMFloatTypeInContext, LLVMFP128TypeInContext, LLVMInsertBasicBlockInContext, LLVMInt16TypeInContext, LLVMInt1TypeInContext, LLVMInt32TypeInContext, LLVMInt64TypeInContext, LLVMInt8TypeInContext, LLVMIntTypeInContext, LLVMModuleCreateWithNameInContext, LLVMStructCreateNamed, LLVMStructTypeInContext, LLVMVoidTypeInContext, LLVMHalfTypeInContext, LLVMGetGlobalContext, LLVMPPCFP128TypeInContext, LLVMConstStructInContext, LLVMMDNodeInContext, LLVMMDStringInContext, LLVMGetMDKindIDInContext, LLVMX86FP80TypeInContext, LLVMConstStringInContext, LLVMContextSetDiagnosticHandler, LLVMGetInlineAsm};
3+
use llvm_sys::core::{LLVMAppendBasicBlockInContext, LLVMContextCreate, LLVMContextDispose, LLVMCreateBuilderInContext, LLVMDoubleTypeInContext, LLVMFloatTypeInContext, LLVMFP128TypeInContext, LLVMInsertBasicBlockInContext, LLVMInt16TypeInContext, LLVMInt1TypeInContext, LLVMInt32TypeInContext, LLVMInt64TypeInContext, LLVMInt8TypeInContext, LLVMIntTypeInContext, LLVMModuleCreateWithNameInContext, LLVMStructCreateNamed, LLVMStructTypeInContext, LLVMVoidTypeInContext, LLVMHalfTypeInContext, LLVMGetGlobalContext, LLVMPPCFP128TypeInContext, LLVMConstStructInContext, LLVMMDNodeInContext, LLVMMDStringInContext, LLVMGetMDKindIDInContext, LLVMX86FP80TypeInContext, LLVMConstStringInContext, LLVMContextSetDiagnosticHandler};
44
#[llvm_versions(4.0..=latest)]
55
use llvm_sys::core::{LLVMCreateEnumAttribute, LLVMCreateStringAttribute};
6+
#[llvm_versions(3.6..7.0)]
7+
use llvm_sys::core::{LLVMConstInlineAsm};
8+
#[llvm_versions(7.0..=latest)]
9+
use llvm_sys::core::{LLVMGetInlineAsm};
10+
#[llvm_versions(7.0..=latest)]
11+
use crate::InlineAsmDialect;
612
use llvm_sys::prelude::{LLVMContextRef, LLVMTypeRef, LLVMValueRef, LLVMDiagnosticInfoRef};
713
use llvm_sys::ir_reader::LLVMParseIRInContext;
814
use llvm_sys::target::{LLVMIntPtrTypeForASInContext, LLVMIntPtrTypeInContext};
915
use libc::c_void;
1016
use once_cell::sync::Lazy;
1117
use parking_lot::{Mutex, MutexGuard};
1218

13-
use crate::{AddressSpace, InlineAsmDialect};
19+
use crate::AddressSpace;
1420
#[llvm_versions(4.0..=latest)]
1521
use crate::attributes::Attribute;
1622
use crate::basic_block::BasicBlock;
@@ -207,10 +213,11 @@ impl Context {
207213
///
208214
/// builder.position_at_end(basic_block);
209215
/// let asm_fn = context.i64_type().fn_type(&[context.i64_type().into(), context.i64_type().into()], false);
210-
/// let asm = context.create_inline_asm(asm_fn, "syscall", "=r,{rax},{rdi}", true, false, None);
211-
/// let params = &[context.i64_type().const_int(60).into(), context.i64_type().const_int(1).into()];
216+
/// let asm = context.create_inline_asm(asm_fn, "syscall".to_string(), "=r,{rax},{rdi}".to_string(), true, false, None);
217+
/// let params = &[context.i64_type().const_int(60, false).into(), context.i64_type().const_int(1, false).into()];
212218
/// builder.build_call(asm, params, "exit");
213219
/// builder.build_return(None);
220+
#[llvm_versions(7.0..=latest)]
214221
pub fn create_inline_asm(&self, ty: FunctionType, mut assembly: String, mut constraints: String, sideeffects: bool, alignstack: bool, dialect: Option<InlineAsmDialect>) -> PointerValue {
215222
let value = unsafe {
216223
LLVMGetInlineAsm(
@@ -226,6 +233,41 @@ impl Context {
226233
};
227234
PointerValue::new(value)
228235
}
236+
/// Creates a inline asm function pointer.
237+
///
238+
/// # Example
239+
/// ```no_run
240+
/// use inkwell::context::Context;
241+
///
242+
/// let context = Context::create();
243+
/// let module = context.create_module("my_module");
244+
/// let builder = context.create_builder();
245+
/// let void_type = context.void_type();
246+
/// let fn_type = void_type.fn_type(&[], false);
247+
/// let fn_val = module.add_function("my_fn", fn_type, None);
248+
/// let basic_block = context.append_basic_block(fn_val, "entry");
249+
///
250+
/// builder.position_at_end(basic_block);
251+
/// let asm_fn = context.i64_type().fn_type(&[context.i64_type().into(), context.i64_type().into()], false);
252+
/// let asm = context.create_inline_asm(asm_fn, "syscall".to_string(), "=r,{rax},{rdi}".to_string(), true, false);
253+
/// let params = &[context.i64_type().const_int(60, false).into(), context.i64_type().const_int(1, false).into()];
254+
/// builder.build_call(asm, params, "exit");
255+
/// builder.build_return(None);
256+
#[llvm_versions(3.6..7.0)]
257+
pub fn create_inline_asm(&self, ty: FunctionType, mut assembly: String, mut constraints: String, sideeffects: bool, alignstack: bool) -> PointerValue {
258+
let value = unsafe {
259+
LLVMConstInlineAsm(
260+
ty.as_type_ref(),
261+
assembly.as_mut_ptr() as *mut ::libc::c_char,
262+
assembly.len(),
263+
constraints.as_mut_ptr() as *mut ::libc::c_char,
264+
constraints.len(),
265+
sideeffects as i32,
266+
alignstack as i32
267+
)
268+
};
269+
PointerValue::new(value)
270+
}
229271

230272
/// Gets the `VoidType`. It will be assigned the current context.
231273
///

src/lib.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,10 @@ pub mod targets;
3939
pub mod types;
4040
pub mod values;
4141

42-
use llvm_sys::{LLVMIntPredicate, LLVMRealPredicate, LLVMVisibility, LLVMThreadLocalMode, LLVMDLLStorageClass, LLVMAtomicOrdering, LLVMAtomicRMWBinOp, LLVMInlineAsmDialect};
42+
use llvm_sys::{LLVMIntPredicate, LLVMRealPredicate, LLVMVisibility, LLVMThreadLocalMode, LLVMDLLStorageClass, LLVMAtomicOrdering, LLVMAtomicRMWBinOp};
43+
44+
#[llvm_versions(7.0..=latest)]
45+
use llvm_sys::LLVMInlineAsmDialect;
4346

4447
use std::convert::TryFrom;
4548

@@ -386,6 +389,7 @@ impl Default for DLLStorageClass {
386389
}
387390
}
388391

392+
#[llvm_versions(7.0..=latest)]
389393
#[llvm_enum(LLVMInlineAsmDialect)]
390394
#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
391395
pub enum InlineAsmDialect {

0 commit comments

Comments
 (0)