about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_llvm/lib.rs12
-rw-r--r--src/librustc_trans/trans/attributes.rs31
-rw-r--r--src/rustllvm/RustWrapper.cpp10
3 files changed, 26 insertions, 27 deletions
diff --git a/src/librustc_llvm/lib.rs b/src/librustc_llvm/lib.rs
index c1b909bd877..ee57812fb98 100644
--- a/src/librustc_llvm/lib.rs
+++ b/src/librustc_llvm/lib.rs
@@ -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 {
diff --git a/src/librustc_trans/trans/attributes.rs b/src/librustc_trans/trans/attributes.rs
index 4ea920c57aa..b771afea0f3 100644
--- a/src/librustc_trans/trans/attributes.rs
+++ b/src/librustc_trans/trans/attributes.rs
@@ -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);
     }
 }
 
diff --git a/src/rustllvm/RustWrapper.cpp b/src/rustllvm/RustWrapper.cpp
index 33174c1e9df..6ff90a8f53a 100644
--- a/src/rustllvm/RustWrapper.cpp
+++ b/src/rustllvm/RustWrapper.cpp
@@ -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();