diff --git a/src/librustc_codegen_llvm/builder.rs b/src/librustc_codegen_llvm/builder.rs index f8ab6fc4ec2f233002f23e5e70a08cef3cb09020..83467bba20f13b251085aabaa2bdf55589c13775 100644 --- a/src/librustc_codegen_llvm/builder.rs +++ b/src/librustc_codegen_llvm/builder.rs @@ -1059,13 +1059,19 @@ fn atomic_cmpxchg( } 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 9f43a95c446d03c0d74df51933afb58d434e335f..6893adc513797083dc427f60f9aacb2cd918b6b3 100644 --- a/src/librustc_codegen_llvm/intrinsic.rs +++ b/src/librustc_codegen_llvm/intrinsic.rs @@ -31,7 +31,7 @@ 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 dd47024a6579a74bd80a9aac3df62cb446f9c666..b44b611f439c3aa39ef2fac4742c43d9bb74a93a 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 e23eeac1c29a816f5c0a8c437afe8560252f40e9..c647fceb994b69d14a77348f77396e1639ee47aa 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,