pub fn LLVMAddFunctionAttrStringValue(Fn: ValueRef, index: c_uint,
Name: *const c_char,
Value: *const c_char);
+ pub fn LLVMRemoveFunctionAttributes(Fn: ValueRef, index: c_uint, attr: uint64_t);
pub fn LLVMRemoveFunctionAttrString(Fn: ValueRef, index: c_uint, Name: *const c_char);
- pub fn LLVMGetFunctionAttr(Fn: ValueRef) -> c_ulonglong;
- pub fn LLVMRemoveFunctionAttr(Fn: ValueRef, val: c_ulonglong);
+ pub fn LLVMGetFunctionAttr(Fn: ValueRef) -> c_uint;
+ pub fn LLVMRemoveFunctionAttr(Fn: ValueRef, val: c_uint);
/* Operations on parameters */
pub fn LLVMCountParams(Fn: ValueRef) -> c_uint;
}
}
+pub fn RemoveFunctionAttributes(fn_: ValueRef, attr: Attribute) {
+ unsafe {
+ LLVMRemoveFunctionAttributes(fn_, FunctionIndex as c_uint,
+ attr.bits() as uint64_t)
+ }
+}
+
/* Memory-managed interface to target data. */
pub struct TargetData {
// except according to those terms.
//! Set and unset common attributes on LLVM values.
-use libc::{c_uint, c_ulonglong};
+use libc::c_uint;
use llvm::{self, ValueRef};
use session::config::NoDebugInfo;
pub use syntax::attr::InlineAttr;
let attr = llvm::Attribute::InlineHint |
llvm::Attribute::AlwaysInline |
llvm::Attribute::NoInline;
- unsafe {
- llvm::LLVMRemoveFunctionAttr(val, attr.bits() as c_ulonglong)
- }
+ llvm::RemoveFunctionAttributes(val, attr)
},
};
}
if emit {
llvm::SetFunctionAttribute(val, llvm::Attribute::UWTable);
} else {
- unsafe {
- llvm::LLVMRemoveFunctionAttr(
- val,
- llvm::Attribute::UWTable.bits() as c_ulonglong,
- );
- }
+ llvm::RemoveFunctionAttributes(val, llvm::Attribute::UWTable);
}
}
#[inline]
pub fn unwind(val: ValueRef, can_unwind: bool) {
if can_unwind {
- unsafe {
- llvm::LLVMRemoveFunctionAttr(
- val,
- llvm::Attribute::NoUnwind.bits() as c_ulonglong,
- );
- }
+ llvm::RemoveFunctionAttributes(val, llvm::Attribute::NoUnwind);
} else {
llvm::SetFunctionAttribute(val, llvm::Attribute::NoUnwind);
}
if optimize {
llvm::SetFunctionAttribute(val, llvm::Attribute::OptimizeForSize);
} else {
- unsafe {
- llvm::LLVMRemoveFunctionAttr(
- val,
- llvm::Attribute::OptimizeForSize.bits() as c_ulonglong,
- );
- }
+ llvm::RemoveFunctionAttributes(val, llvm::Attribute::OptimizeForSize);
}
}
if is_naked {
llvm::SetFunctionAttribute(val, llvm::Attribute::Naked);
} else {
- unsafe {
- llvm::LLVMRemoveFunctionAttr(val, llvm::Attribute::Naked.bits() as c_ulonglong);
- }
+ llvm::RemoveFunctionAttributes(val, llvm::Attribute::Naked);
}
}
F->addAttributes(index, AttributeSet::get(F->getContext(), index, B));
}
+extern "C" void LLVMRemoveFunctionAttributes(LLVMValueRef Fn, unsigned index, uint64_t Val) {
+ Function *A = unwrap<Function>(Fn);
+ const AttributeSet PAL = A->getAttributes();
+ AttrBuilder B(Val);
+ const AttributeSet PALnew =
+ PAL.removeAttributes(A->getContext(), index,
+ AttributeSet::get(A->getContext(), index, B));
+ A->setAttributes(PALnew);
+}
+
extern "C" void LLVMRemoveFunctionAttrString(LLVMValueRef fn, unsigned index, const char *Name) {
Function *f = unwrap<Function>(fn);
LLVMContext &C = f->getContext();