Skip to content

Commit b699866

Browse files
denismerigouxeddyb
authored andcommitted
Generalized AtomicOrdering for BuilderMethods
1 parent 2755891 commit b699866

File tree

4 files changed

+69
-14
lines changed

4 files changed

+69
-14
lines changed

src/librustc_codegen_llvm/builder.rs

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -488,10 +488,20 @@ impl BuilderMethods<'a, 'll, 'tcx, Value, BasicBlock>
488488
}
489489
}
490490

491-
fn atomic_load(&self, ptr: &'ll Value, order: AtomicOrdering, size: Size) -> &'ll Value {
491+
fn atomic_load(
492+
&self,
493+
ptr: &'ll Value,
494+
order: traits::AtomicOrdering,
495+
size: Size,
496+
) -> &'ll Value {
492497
self.count_insn("load.atomic");
493498
unsafe {
494-
let load = llvm::LLVMRustBuildAtomicLoad(self.llbuilder, ptr, noname(), order);
499+
let load = llvm::LLVMRustBuildAtomicLoad(
500+
self.llbuilder,
501+
ptr,
502+
noname(),
503+
AtomicOrdering::from_generic(order),
504+
);
495505
// LLVM requires the alignment of atomic loads to be at least the size of the type.
496506
llvm::LLVMSetAlignment(load, size.bytes() as c_uint);
497507
load
@@ -568,12 +578,17 @@ impl BuilderMethods<'a, 'll, 'tcx, Value, BasicBlock>
568578
}
569579

570580
fn atomic_store(&self, val: &'ll Value, ptr: &'ll Value,
571-
order: AtomicOrdering, size: Size) {
581+
order: traits::AtomicOrdering, size: Size) {
572582
debug!("Store {:?} -> {:?}", val, ptr);
573583
self.count_insn("store.atomic");
574584
let ptr = self.check_store(val, ptr);
575585
unsafe {
576-
let store = llvm::LLVMRustBuildAtomicStore(self.llbuilder, val, ptr, order);
586+
let store = llvm::LLVMRustBuildAtomicStore(
587+
self.llbuilder,
588+
val,
589+
ptr,
590+
AtomicOrdering::from_generic(order),
591+
);
577592
// LLVM requires the alignment of atomic stores to be at least the size of the type.
578593
llvm::LLVMSetAlignment(store, size.bytes() as c_uint);
579594
}
@@ -1047,37 +1062,48 @@ impl BuilderMethods<'a, 'll, 'tcx, Value, BasicBlock>
10471062
dst: &'ll Value,
10481063
cmp: &'ll Value,
10491064
src: &'ll Value,
1050-
order: AtomicOrdering,
1051-
failure_order: AtomicOrdering,
1065+
order: traits::AtomicOrdering,
1066+
failure_order: traits::AtomicOrdering,
10521067
weak: bool,
10531068
) -> &'ll Value {
10541069
let weak = if weak { llvm::True } else { llvm::False };
10551070
unsafe {
1056-
llvm::LLVMRustBuildAtomicCmpXchg(self.llbuilder, dst, cmp, src,
1057-
order, failure_order, weak)
1071+
llvm::LLVMRustBuildAtomicCmpXchg(
1072+
self.llbuilder,
1073+
dst,
1074+
cmp,
1075+
src,
1076+
AtomicOrdering::from_generic(order),
1077+
AtomicOrdering::from_generic(failure_order),
1078+
weak
1079+
)
10581080
}
10591081
}
10601082
fn atomic_rmw(
10611083
&self,
10621084
op: traits::AtomicRmwBinOp,
10631085
dst: &'ll Value,
10641086
src: &'ll Value,
1065-
order: AtomicOrdering,
1087+
order: traits::AtomicOrdering,
10661088
) -> &'ll Value {
10671089
unsafe {
10681090
llvm::LLVMBuildAtomicRMW(
10691091
self.llbuilder,
10701092
AtomicRmwBinOp::from_generic(op),
10711093
dst,
10721094
src,
1073-
order,
1095+
AtomicOrdering::from_generic(order),
10741096
False)
10751097
}
10761098
}
10771099

1078-
fn atomic_fence(&self, order: AtomicOrdering, scope: SynchronizationScope) {
1100+
fn atomic_fence(&self, order: traits::AtomicOrdering, scope: SynchronizationScope) {
10791101
unsafe {
1080-
llvm::LLVMRustBuildAtomicFence(self.llbuilder, order, scope);
1102+
llvm::LLVMRustBuildAtomicFence(
1103+
self.llbuilder,
1104+
AtomicOrdering::from_generic(order),
1105+
scope
1106+
);
10811107
}
10821108
}
10831109

src/librustc_codegen_llvm/intrinsic.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ pub fn codegen_intrinsic_call(
439439
// This requires that atomic intrinsics follow a specific naming pattern:
440440
// "atomic_<operation>[_<ordering>]", and no ordering means SeqCst
441441
name if name.starts_with("atomic_") => {
442-
use llvm::AtomicOrdering::*;
442+
use traits::AtomicOrdering::*;
443443

444444
let split: Vec<&str> = name.split('_').collect();
445445

src/librustc_codegen_llvm/llvm/ffi.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,22 @@ pub enum AtomicOrdering {
277277
SequentiallyConsistent = 7,
278278
}
279279

280+
impl AtomicOrdering {
281+
pub fn from_generic(ao : traits::AtomicOrdering) -> Self {
282+
match ao {
283+
traits::AtomicOrdering::NotAtomic => AtomicOrdering::NotAtomic,
284+
traits::AtomicOrdering::Unordered => AtomicOrdering::Unordered,
285+
traits::AtomicOrdering::Monotonic => AtomicOrdering::Monotonic,
286+
traits::AtomicOrdering::Acquire => AtomicOrdering::Acquire,
287+
traits::AtomicOrdering::Release => AtomicOrdering::Release,
288+
traits::AtomicOrdering::AcquireRelease => AtomicOrdering::AcquireRelease,
289+
traits::AtomicOrdering::SequentiallyConsistent =>
290+
AtomicOrdering::SequentiallyConsistent
291+
}
292+
}
293+
}
294+
295+
280296
/// LLVMRustSynchronizationScope
281297
#[derive(Copy, Clone)]
282298
#[repr(C)]

src/librustc_codegen_llvm/traits.rs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
use llvm::{AtomicOrdering, SynchronizationScope, AsmDialect};
11+
use llvm::{SynchronizationScope, AsmDialect};
1212
use common::*;
1313
use type_::Type;
1414
use libc::c_char;
@@ -82,6 +82,19 @@ pub enum AtomicRmwBinOp {
8282
AtomicUMin
8383
}
8484

85+
pub enum AtomicOrdering {
86+
#[allow(dead_code)]
87+
NotAtomic,
88+
Unordered,
89+
Monotonic,
90+
// Consume, // Not specified yet.
91+
Acquire,
92+
Release,
93+
AcquireRelease,
94+
SequentiallyConsistent,
95+
}
96+
97+
8598
pub trait BuilderMethods<'a, 'll :'a, 'tcx: 'll,
8699
Value : ?Sized,
87100
BasicBlock: ?Sized

0 commit comments

Comments
 (0)