about summary refs log tree commit diff
path: root/src/librustc_codegen_llvm
diff options
context:
space:
mode:
authorDenis Merigoux <denis.merigoux@gmail.com>2018-08-21 17:54:12 +0200
committerEduard-Mihai Burtescu <edy.burt@gmail.com>2018-11-16 14:11:09 +0200
commit275589150b3ea0f077ccbfd4b6343aaa6e9683ad (patch)
tree5a721a072656cf8c5d610497590e9ecd3c1ecc4e /src/librustc_codegen_llvm
parent1bcb4df16678a71b484ea9d1b65911f22b381d86 (diff)
downloadrust-275589150b3ea0f077ccbfd4b6343aaa6e9683ad.tar.gz
rust-275589150b3ea0f077ccbfd4b6343aaa6e9683ad.zip
Generalized AtomicRmwBinOp for BuilderMethods
Diffstat (limited to 'src/librustc_codegen_llvm')
-rw-r--r--src/librustc_codegen_llvm/builder.rs10
-rw-r--r--src/librustc_codegen_llvm/intrinsic.rs24
-rw-r--r--src/librustc_codegen_llvm/llvm/ffi.rs18
-rw-r--r--src/librustc_codegen_llvm/traits.rs22
4 files changed, 56 insertions, 18 deletions
diff --git a/src/librustc_codegen_llvm/builder.rs b/src/librustc_codegen_llvm/builder.rs
index f8ab6fc4ec2..83467bba20f 100644
--- a/src/librustc_codegen_llvm/builder.rs
+++ b/src/librustc_codegen_llvm/builder.rs
@@ -1059,13 +1059,19 @@ impl BuilderMethods<'a, 'll, 'tcx, Value, BasicBlock>
     }
     fn atomic_rmw(
         &self,
-        op: AtomicRmwBinOp,
+        op: traits::AtomicRmwBinOp,
         dst: &'ll Value,
         src: &'ll Value,
         order: AtomicOrdering,
     ) -> &'ll Value {
         unsafe {
-            llvm::LLVMBuildAtomicRMW(self.llbuilder, op, dst, src, order, False)
+            llvm::LLVMBuildAtomicRMW(
+                self.llbuilder,
+                AtomicRmwBinOp::from_generic(op),
+                dst,
+                src,
+                order,
+                False)
         }
     }
 
diff --git a/src/librustc_codegen_llvm/intrinsic.rs b/src/librustc_codegen_llvm/intrinsic.rs
index 9f43a95c446..6893adc5137 100644
--- a/src/librustc_codegen_llvm/intrinsic.rs
+++ b/src/librustc_codegen_llvm/intrinsic.rs
@@ -31,7 +31,7 @@ use syntax::symbol::Symbol;
 use builder::Builder;
 use value::Value;
 
-use traits::BuilderMethods;
+use traits::{BuilderMethods, AtomicRmwBinOp};
 
 use rustc::session::Session;
 use syntax_pos::Span;
@@ -533,17 +533,17 @@ pub fn codegen_intrinsic_call(
                 // These are all AtomicRMW ops
                 op => {
                     let atom_op = match op {
-                        "xchg"  => llvm::AtomicXchg,
-                        "xadd"  => llvm::AtomicAdd,
-                        "xsub"  => llvm::AtomicSub,
-                        "and"   => llvm::AtomicAnd,
-                        "nand"  => llvm::AtomicNand,
-                        "or"    => llvm::AtomicOr,
-                        "xor"   => llvm::AtomicXor,
-                        "max"   => llvm::AtomicMax,
-                        "min"   => llvm::AtomicMin,
-                        "umax"  => llvm::AtomicUMax,
-                        "umin"  => llvm::AtomicUMin,
+                        "xchg"  => AtomicRmwBinOp::AtomicXchg,
+                        "xadd"  => AtomicRmwBinOp::AtomicAdd,
+                        "xsub"  => AtomicRmwBinOp::AtomicSub,
+                        "and"   => AtomicRmwBinOp::AtomicAnd,
+                        "nand"  => AtomicRmwBinOp::AtomicNand,
+                        "or"    => AtomicRmwBinOp::AtomicOr,
+                        "xor"   => AtomicRmwBinOp::AtomicXor,
+                        "max"   => AtomicRmwBinOp::AtomicMax,
+                        "min"   => AtomicRmwBinOp::AtomicMin,
+                        "umax"  => AtomicRmwBinOp::AtomicUMax,
+                        "umin"  => AtomicRmwBinOp::AtomicUMin,
                         _ => cx.sess().fatal("unknown atomic operation")
                     };
 
diff --git a/src/librustc_codegen_llvm/llvm/ffi.rs b/src/librustc_codegen_llvm/llvm/ffi.rs
index dd47024a657..b44b611f439 100644
--- a/src/librustc_codegen_llvm/llvm/ffi.rs
+++ b/src/librustc_codegen_llvm/llvm/ffi.rs
@@ -244,6 +244,24 @@ pub enum AtomicRmwBinOp {
     AtomicUMin = 10,
 }
 
+impl AtomicRmwBinOp {
+    pub fn from_generic(op : traits::AtomicRmwBinOp) -> Self {
+        match op {
+            traits::AtomicRmwBinOp::AtomicXchg => AtomicRmwBinOp::AtomicXchg,
+            traits::AtomicRmwBinOp::AtomicAdd => AtomicRmwBinOp::AtomicAdd,
+            traits::AtomicRmwBinOp::AtomicSub => AtomicRmwBinOp::AtomicSub,
+            traits::AtomicRmwBinOp::AtomicAnd => AtomicRmwBinOp::AtomicAnd,
+            traits::AtomicRmwBinOp::AtomicNand => AtomicRmwBinOp::AtomicNand,
+            traits::AtomicRmwBinOp::AtomicOr => AtomicRmwBinOp::AtomicOr,
+            traits::AtomicRmwBinOp::AtomicXor => AtomicRmwBinOp::AtomicXor,
+            traits::AtomicRmwBinOp::AtomicMax => AtomicRmwBinOp::AtomicMax,
+            traits::AtomicRmwBinOp::AtomicMin => AtomicRmwBinOp::AtomicMin,
+            traits::AtomicRmwBinOp::AtomicUMax => AtomicRmwBinOp::AtomicUMax,
+            traits::AtomicRmwBinOp::AtomicUMin => AtomicRmwBinOp::AtomicUMin
+        }
+    }
+}
+
 /// LLVMAtomicOrdering
 #[derive(Copy, Clone)]
 #[repr(C)]
diff --git a/src/librustc_codegen_llvm/traits.rs b/src/librustc_codegen_llvm/traits.rs
index e23eeac1c29..c647fceb994 100644
--- a/src/librustc_codegen_llvm/traits.rs
+++ b/src/librustc_codegen_llvm/traits.rs
@@ -8,7 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-use llvm::{AtomicRmwBinOp, AtomicOrdering, SynchronizationScope, AsmDialect};
+use llvm::{AtomicOrdering, SynchronizationScope, AsmDialect};
 use common::*;
 use type_::Type;
 use libc::c_char;
@@ -30,7 +30,7 @@ impl OperandBundleDef<'ll, &'ll Value> {
     pub fn new(name: &'ll str, val: &'ll Value) -> Self {
         OperandBundleDef {
             name,
-            val,
+            val
         }
     }
 }
@@ -45,7 +45,7 @@ pub enum IntPredicate {
     IntSGT,
     IntSGE,
     IntSLT,
-    IntSLE,
+    IntSLE
 }
 
 #[allow(dead_code)]
@@ -65,7 +65,21 @@ pub enum RealPredicate {
     RealULT,
     RealULE,
     RealUNE,
-    RealPredicateTrue,
+    RealPredicateTrue
+}
+
+pub enum AtomicRmwBinOp {
+    AtomicXchg,
+    AtomicAdd,
+    AtomicSub,
+    AtomicAnd,
+    AtomicNand,
+    AtomicOr,
+    AtomicXor,
+    AtomicMax,
+    AtomicMin,
+    AtomicUMax,
+    AtomicUMin
 }
 
 pub trait BuilderMethods<'a, 'll :'a, 'tcx: 'll,