commit
65bc9d7730
|
@ -39,12 +39,7 @@ pub fn llvm(build: &Build, target: &str) {
|
|||
|
||||
let _ = fs::remove_dir_all(&dst.join("build"));
|
||||
t!(fs::create_dir_all(&dst.join("build")));
|
||||
let mut assertions = if build.config.llvm_assertions {"ON"} else {"OFF"};
|
||||
|
||||
// Disable LLVM assertions on ARM compilers until #32360 is fixed
|
||||
if target.contains("arm") && target.contains("gnu") {
|
||||
assertions = "OFF";
|
||||
}
|
||||
let assertions = if build.config.llvm_assertions {"ON"} else {"OFF"};
|
||||
|
||||
// http://llvm.org/docs/CMake.html
|
||||
let mut cfg = cmake::Config::new(build.src.join("src/llvm"));
|
||||
|
|
|
@ -964,9 +964,10 @@ extern {
|
|||
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;
|
||||
|
@ -2184,6 +2185,13 @@ pub fn SetFunctionAttribute(fn_: ValueRef, attr: Attribute) {
|
|||
}
|
||||
}
|
||||
|
||||
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 {
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
// 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;
|
||||
|
@ -28,9 +28,7 @@ pub fn inline(val: ValueRef, inline: 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)
|
||||
},
|
||||
};
|
||||
}
|
||||
|
@ -41,12 +39,7 @@ pub fn emit_uwtable(val: ValueRef, emit: bool) {
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -54,12 +47,7 @@ pub fn emit_uwtable(val: ValueRef, emit: bool) {
|
|||
#[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);
|
||||
}
|
||||
|
@ -72,12 +60,7 @@ pub fn set_optimize_for_size(val: ValueRef, optimize: bool) {
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -87,9 +70,7 @@ pub fn naked(val: ValueRef, is_naked: bool) {
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -151,6 +151,16 @@ extern "C" void LLVMAddFunctionAttrStringValue(LLVMValueRef Fn, unsigned index,
|
|||
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();
|
||||
|
|
Loading…
Reference in New Issue