Skip to content

Commit 359bfa9

Browse files
authored
Rollup merge of #147472 - AMS21:remove_llvm_rust_atomics, r=nikic
refactor: replace `LLVMRustAtomicLoad/Store` with LLVM built-in functions This simplifies the code and reduces the burden of maintaining our own wrappers. Work towards #46437
2 parents f6caa5f + 1aed495 commit 359bfa9

File tree

3 files changed

+7
-70
lines changed

3 files changed

+7
-70
lines changed

compiler/rustc_codegen_llvm/src/builder.rs

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -639,13 +639,9 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
639639
size: Size,
640640
) -> &'ll Value {
641641
unsafe {
642-
let load = llvm::LLVMRustBuildAtomicLoad(
643-
self.llbuilder,
644-
ty,
645-
ptr,
646-
UNNAMED,
647-
AtomicOrdering::from_generic(order),
648-
);
642+
let load = llvm::LLVMBuildLoad2(self.llbuilder, ty, ptr, UNNAMED);
643+
// Set atomic ordering
644+
llvm::LLVMSetOrdering(load, AtomicOrdering::from_generic(order));
649645
// LLVM requires the alignment of atomic loads to be at least the size of the type.
650646
llvm::LLVMSetAlignment(load, size.bytes() as c_uint);
651647
load
@@ -872,12 +868,9 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
872868
debug!("Store {:?} -> {:?}", val, ptr);
873869
assert_eq!(self.cx.type_kind(self.cx.val_ty(ptr)), TypeKind::Pointer);
874870
unsafe {
875-
let store = llvm::LLVMRustBuildAtomicStore(
876-
self.llbuilder,
877-
val,
878-
ptr,
879-
AtomicOrdering::from_generic(order),
880-
);
871+
let store = llvm::LLVMBuildStore(self.llbuilder, val, ptr);
872+
// Set atomic ordering
873+
llvm::LLVMSetOrdering(store, AtomicOrdering::from_generic(order));
881874
// LLVM requires the alignment of atomic stores to be at least the size of the type.
882875
llvm::LLVMSetAlignment(store, size.bytes() as c_uint);
883876
}

compiler/rustc_codegen_llvm/src/llvm/ffi.rs

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1151,6 +1151,7 @@ unsafe extern "C" {
11511151

11521152
// Operations on load/store instructions (only)
11531153
pub(crate) fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool);
1154+
pub(crate) fn LLVMSetOrdering(MemoryAccessInst: &Value, Ordering: AtomicOrdering);
11541155

11551156
// Operations on phi nodes
11561157
pub(crate) fn LLVMAddIncoming<'a>(
@@ -2090,22 +2091,6 @@ unsafe extern "C" {
20902091
RHS: &'a Value,
20912092
) -> &'a Value;
20922093

2093-
// Atomic Operations
2094-
pub(crate) fn LLVMRustBuildAtomicLoad<'a>(
2095-
B: &Builder<'a>,
2096-
ElementType: &'a Type,
2097-
PointerVal: &'a Value,
2098-
Name: *const c_char,
2099-
Order: AtomicOrdering,
2100-
) -> &'a Value;
2101-
2102-
pub(crate) fn LLVMRustBuildAtomicStore<'a>(
2103-
B: &Builder<'a>,
2104-
Val: &'a Value,
2105-
Ptr: &'a Value,
2106-
Order: AtomicOrdering,
2107-
) -> &'a Value;
2108-
21092094
pub(crate) fn LLVMRustTimeTraceProfilerInitialize();
21102095

21112096
pub(crate) fn LLVMRustTimeTraceProfilerFinishThread();

compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -60,29 +60,6 @@ using namespace llvm::object;
6060
static_assert(dwarf::DW_OP_LLVM_fragment == 0x1000);
6161
static_assert(dwarf::DW_OP_stack_value == 0x9f);
6262

63-
// LLVMAtomicOrdering is already an enum - don't create another
64-
// one.
65-
static AtomicOrdering fromRust(LLVMAtomicOrdering Ordering) {
66-
switch (Ordering) {
67-
case LLVMAtomicOrderingNotAtomic:
68-
return AtomicOrdering::NotAtomic;
69-
case LLVMAtomicOrderingUnordered:
70-
return AtomicOrdering::Unordered;
71-
case LLVMAtomicOrderingMonotonic:
72-
return AtomicOrdering::Monotonic;
73-
case LLVMAtomicOrderingAcquire:
74-
return AtomicOrdering::Acquire;
75-
case LLVMAtomicOrderingRelease:
76-
return AtomicOrdering::Release;
77-
case LLVMAtomicOrderingAcquireRelease:
78-
return AtomicOrdering::AcquireRelease;
79-
case LLVMAtomicOrderingSequentiallyConsistent:
80-
return AtomicOrdering::SequentiallyConsistent;
81-
}
82-
83-
report_fatal_error("Invalid LLVMAtomicOrdering value!");
84-
}
85-
8663
static LLVM_THREAD_LOCAL char *LastError;
8764

8865
// Custom error handler for fatal LLVM errors.
@@ -623,24 +600,6 @@ extern "C" void LLVMRustSetAllowReassoc(LLVMValueRef V) {
623600
}
624601
}
625602

626-
extern "C" LLVMValueRef
627-
LLVMRustBuildAtomicLoad(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Source,
628-
const char *Name, LLVMAtomicOrdering Order) {
629-
Value *Ptr = unwrap(Source);
630-
LoadInst *LI = unwrap(B)->CreateLoad(unwrap(Ty), Ptr, Name);
631-
LI->setAtomic(fromRust(Order));
632-
return wrap(LI);
633-
}
634-
635-
extern "C" LLVMValueRef LLVMRustBuildAtomicStore(LLVMBuilderRef B,
636-
LLVMValueRef V,
637-
LLVMValueRef Target,
638-
LLVMAtomicOrdering Order) {
639-
StoreInst *SI = unwrap(B)->CreateStore(unwrap(V), unwrap(Target));
640-
SI->setAtomic(fromRust(Order));
641-
return wrap(SI);
642-
}
643-
644603
extern "C" uint64_t LLVMRustGetArrayNumElements(LLVMTypeRef Ty) {
645604
return unwrap(Ty)->getArrayNumElements();
646605
}

0 commit comments

Comments
 (0)