Add LLVM attributes in batches instead of individually
This should improve performance.
This commit is contained in:
parent
6f681a8eb3
commit
30d3ce0674
11 changed files with 451 additions and 473 deletions
|
@ -155,7 +155,7 @@ pub enum DLLStorageClass {
|
|||
/// though it is not ABI compatible (since it's a C++ enum)
|
||||
#[repr(C)]
|
||||
#[derive(Copy, Clone, Debug)]
|
||||
pub enum Attribute {
|
||||
pub enum AttributeKind {
|
||||
AlwaysInline = 0,
|
||||
ByVal = 1,
|
||||
Cold = 2,
|
||||
|
@ -643,6 +643,9 @@ extern "C" {
|
|||
extern "C" {
|
||||
pub type ConstantInt;
|
||||
}
|
||||
extern "C" {
|
||||
pub type Attribute;
|
||||
}
|
||||
extern "C" {
|
||||
pub type Metadata;
|
||||
}
|
||||
|
@ -1169,6 +1172,21 @@ extern "C" {
|
|||
) -> Option<&Value>;
|
||||
pub fn LLVMSetTailCall(CallInst: &Value, IsTailCall: Bool);
|
||||
|
||||
// Operations on attributes
|
||||
pub fn LLVMRustCreateAttrNoValue(C: &Context, attr: AttributeKind) -> &Attribute;
|
||||
pub fn LLVMRustCreateAttrString(C: &Context, Name: *const c_char) -> &Attribute;
|
||||
pub fn LLVMRustCreateAttrStringValue(
|
||||
C: &Context,
|
||||
Name: *const c_char,
|
||||
Value: *const c_char,
|
||||
) -> &Attribute;
|
||||
pub fn LLVMRustCreateAlignmentAttr(C: &Context, bytes: u64) -> &Attribute;
|
||||
pub fn LLVMRustCreateDereferenceableAttr(C: &Context, bytes: u64) -> &Attribute;
|
||||
pub fn LLVMRustCreateDereferenceableOrNullAttr(C: &Context, bytes: u64) -> &Attribute;
|
||||
pub fn LLVMRustCreateByValAttr<'a>(C: &'a Context, ty: &'a Type) -> &'a Attribute;
|
||||
pub fn LLVMRustCreateStructRetAttr<'a>(C: &'a Context, ty: &'a Type) -> &'a Attribute;
|
||||
pub fn LLVMRustCreateUWTableAttr(C: &Context, async_: bool) -> &Attribute;
|
||||
|
||||
// Operations on functions
|
||||
pub fn LLVMRustGetOrInsertFunction<'a>(
|
||||
M: &'a Module,
|
||||
|
@ -1177,20 +1195,18 @@ extern "C" {
|
|||
FunctionTy: &'a Type,
|
||||
) -> &'a Value;
|
||||
pub fn LLVMSetFunctionCallConv(Fn: &Value, CC: c_uint);
|
||||
pub fn LLVMRustAddAlignmentAttr(Fn: &Value, index: c_uint, bytes: u32);
|
||||
pub fn LLVMRustAddDereferenceableAttr(Fn: &Value, index: c_uint, bytes: u64);
|
||||
pub fn LLVMRustAddDereferenceableOrNullAttr(Fn: &Value, index: c_uint, bytes: u64);
|
||||
pub fn LLVMRustAddByValAttr(Fn: &Value, index: c_uint, ty: &Type);
|
||||
pub fn LLVMRustAddStructRetAttr(Fn: &Value, index: c_uint, ty: &Type);
|
||||
pub fn LLVMRustAddFunctionAttribute(Fn: &Value, index: c_uint, attr: Attribute);
|
||||
pub fn LLVMRustEmitUWTableAttr(Fn: &Value, async_: bool);
|
||||
pub fn LLVMRustAddFunctionAttrStringValue(
|
||||
pub fn LLVMRustAddFunctionAttributes<'a>(
|
||||
Fn: &'a Value,
|
||||
index: c_uint,
|
||||
Attrs: *const &'a Attribute,
|
||||
AttrsLen: size_t,
|
||||
);
|
||||
pub fn LLVMRustRemoveFunctionAttributes(
|
||||
Fn: &Value,
|
||||
index: c_uint,
|
||||
Name: *const c_char,
|
||||
Value: *const c_char,
|
||||
Attrs: *const AttributeKind,
|
||||
AttrsLen: size_t,
|
||||
);
|
||||
pub fn LLVMRustRemoveFunctionAttributes(Fn: &Value, index: c_uint, attr: Attribute);
|
||||
|
||||
// Operations on parameters
|
||||
pub fn LLVMIsAArgument(Val: &Value) -> Option<&Value>;
|
||||
|
@ -1211,13 +1227,12 @@ extern "C" {
|
|||
|
||||
// Operations on call sites
|
||||
pub fn LLVMSetInstructionCallConv(Instr: &Value, CC: c_uint);
|
||||
pub fn LLVMRustAddCallSiteAttribute(Instr: &Value, index: c_uint, attr: Attribute);
|
||||
pub fn LLVMRustAddCallSiteAttrString(Instr: &Value, index: c_uint, Name: *const c_char);
|
||||
pub fn LLVMRustAddAlignmentCallSiteAttr(Instr: &Value, index: c_uint, bytes: u32);
|
||||
pub fn LLVMRustAddDereferenceableCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64);
|
||||
pub fn LLVMRustAddDereferenceableOrNullCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64);
|
||||
pub fn LLVMRustAddByValCallSiteAttr(Instr: &Value, index: c_uint, ty: &Type);
|
||||
pub fn LLVMRustAddStructRetCallSiteAttr(Instr: &Value, index: c_uint, ty: &Type);
|
||||
pub fn LLVMRustAddCallSiteAttributes<'a>(
|
||||
Instr: &'a Value,
|
||||
index: c_uint,
|
||||
Attrs: *const &'a Attribute,
|
||||
AttrsLen: size_t,
|
||||
);
|
||||
|
||||
// Operations on load/store instructions (only)
|
||||
pub fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool);
|
||||
|
|
|
@ -31,24 +31,58 @@ impl LLVMRustResult {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn EmitUWTableAttr(llfn: &Value, async_: bool) {
|
||||
unsafe { LLVMRustEmitUWTableAttr(llfn, async_) }
|
||||
}
|
||||
|
||||
pub fn AddFunctionAttrStringValue(llfn: &Value, idx: AttributePlace, attr: &CStr, value: &CStr) {
|
||||
pub fn AddFunctionAttributes<'ll>(llfn: &'ll Value, idx: AttributePlace, attrs: &[&'ll Attribute]) {
|
||||
unsafe {
|
||||
LLVMRustAddFunctionAttrStringValue(llfn, idx.as_uint(), attr.as_ptr(), value.as_ptr())
|
||||
LLVMRustAddFunctionAttributes(llfn, idx.as_uint(), attrs.as_ptr(), attrs.len());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn AddFunctionAttrString(llfn: &Value, idx: AttributePlace, attr: &CStr) {
|
||||
pub fn RemoveFunctionAttributes(llfn: &Value, idx: AttributePlace, attrs: &[AttributeKind]) {
|
||||
unsafe {
|
||||
LLVMRustAddFunctionAttrStringValue(llfn, idx.as_uint(), attr.as_ptr(), std::ptr::null())
|
||||
LLVMRustRemoveFunctionAttributes(llfn, idx.as_uint(), attrs.as_ptr(), attrs.len());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn AddCallSiteAttrString(callsite: &Value, idx: AttributePlace, attr: &CStr) {
|
||||
unsafe { LLVMRustAddCallSiteAttrString(callsite, idx.as_uint(), attr.as_ptr()) }
|
||||
pub fn AddCallSiteAttributes<'ll>(
|
||||
callsite: &'ll Value,
|
||||
idx: AttributePlace,
|
||||
attrs: &[&'ll Attribute],
|
||||
) {
|
||||
unsafe {
|
||||
LLVMRustAddCallSiteAttributes(callsite, idx.as_uint(), attrs.as_ptr(), attrs.len());
|
||||
}
|
||||
}
|
||||
|
||||
pub fn CreateAttrStringValue<'ll>(llcx: &'ll Context, attr: &CStr, value: &CStr) -> &'ll Attribute {
|
||||
unsafe { LLVMRustCreateAttrStringValue(llcx, attr.as_ptr(), value.as_ptr()) }
|
||||
}
|
||||
|
||||
pub fn CreateAttrString<'ll>(llcx: &'ll Context, attr: &CStr) -> &'ll Attribute {
|
||||
unsafe { LLVMRustCreateAttrStringValue(llcx, attr.as_ptr(), std::ptr::null()) }
|
||||
}
|
||||
|
||||
pub fn CreateAlignmentAttr(llcx: &Context, bytes: u64) -> &Attribute {
|
||||
unsafe { LLVMRustCreateAlignmentAttr(llcx, bytes) }
|
||||
}
|
||||
|
||||
pub fn CreateDereferenceableAttr(llcx: &Context, bytes: u64) -> &Attribute {
|
||||
unsafe { LLVMRustCreateDereferenceableAttr(llcx, bytes) }
|
||||
}
|
||||
|
||||
pub fn CreateDereferenceableOrNullAttr(llcx: &Context, bytes: u64) -> &Attribute {
|
||||
unsafe { LLVMRustCreateDereferenceableOrNullAttr(llcx, bytes) }
|
||||
}
|
||||
|
||||
pub fn CreateByValAttr<'ll>(llcx: &'ll Context, ty: &'ll Type) -> &'ll Attribute {
|
||||
unsafe { LLVMRustCreateByValAttr(llcx, ty) }
|
||||
}
|
||||
|
||||
pub fn CreateStructRetAttr<'ll>(llcx: &'ll Context, ty: &'ll Type) -> &'ll Attribute {
|
||||
unsafe { LLVMRustCreateStructRetAttr(llcx, ty) }
|
||||
}
|
||||
|
||||
pub fn CreateUWTableAttr(llcx: &Context, async_: bool) -> &Attribute {
|
||||
unsafe { LLVMRustCreateUWTableAttr(llcx, async_) }
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone)]
|
||||
|
@ -132,25 +166,10 @@ pub fn set_thread_local_mode(global: &Value, mode: ThreadLocalMode) {
|
|||
}
|
||||
}
|
||||
|
||||
impl Attribute {
|
||||
pub fn apply_llfn(&self, idx: AttributePlace, llfn: &Value) {
|
||||
unsafe { LLVMRustAddFunctionAttribute(llfn, idx.as_uint(), *self) }
|
||||
}
|
||||
|
||||
pub fn apply_callsite(&self, idx: AttributePlace, callsite: &Value) {
|
||||
unsafe { LLVMRustAddCallSiteAttribute(callsite, idx.as_uint(), *self) }
|
||||
}
|
||||
|
||||
pub fn unapply_llfn(&self, idx: AttributePlace, llfn: &Value) {
|
||||
unsafe { LLVMRustRemoveFunctionAttributes(llfn, idx.as_uint(), *self) }
|
||||
}
|
||||
|
||||
pub fn toggle_llfn(&self, idx: AttributePlace, llfn: &Value, set: bool) {
|
||||
if set {
|
||||
self.apply_llfn(idx, llfn);
|
||||
} else {
|
||||
self.unapply_llfn(idx, llfn);
|
||||
}
|
||||
impl AttributeKind {
|
||||
/// Create an LLVM Attribute with no associated value.
|
||||
pub fn create_attr(self, llcx: &Context) -> &Attribute {
|
||||
unsafe { LLVMRustCreateAttrNoValue(llcx, self) }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue