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 https://github.com/rust-lang/rust/issues/46437
This commit is contained in:
@@ -639,13 +639,9 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
size: Size,
|
size: Size,
|
||||||
) -> &'ll Value {
|
) -> &'ll Value {
|
||||||
unsafe {
|
unsafe {
|
||||||
let load = llvm::LLVMRustBuildAtomicLoad(
|
let load = llvm::LLVMBuildLoad2(self.llbuilder, ty, ptr, UNNAMED);
|
||||||
self.llbuilder,
|
// Set atomic ordering
|
||||||
ty,
|
llvm::LLVMSetOrdering(load, AtomicOrdering::from_generic(order));
|
||||||
ptr,
|
|
||||||
UNNAMED,
|
|
||||||
AtomicOrdering::from_generic(order),
|
|
||||||
);
|
|
||||||
// LLVM requires the alignment of atomic loads to be at least the size of the type.
|
// LLVM requires the alignment of atomic loads to be at least the size of the type.
|
||||||
llvm::LLVMSetAlignment(load, size.bytes() as c_uint);
|
llvm::LLVMSetAlignment(load, size.bytes() as c_uint);
|
||||||
load
|
load
|
||||||
@@ -872,12 +868,9 @@ impl<'a, 'll, 'tcx> BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> {
|
|||||||
debug!("Store {:?} -> {:?}", val, ptr);
|
debug!("Store {:?} -> {:?}", val, ptr);
|
||||||
assert_eq!(self.cx.type_kind(self.cx.val_ty(ptr)), TypeKind::Pointer);
|
assert_eq!(self.cx.type_kind(self.cx.val_ty(ptr)), TypeKind::Pointer);
|
||||||
unsafe {
|
unsafe {
|
||||||
let store = llvm::LLVMRustBuildAtomicStore(
|
let store = llvm::LLVMBuildStore(self.llbuilder, val, ptr);
|
||||||
self.llbuilder,
|
// Set atomic ordering
|
||||||
val,
|
llvm::LLVMSetOrdering(store, AtomicOrdering::from_generic(order));
|
||||||
ptr,
|
|
||||||
AtomicOrdering::from_generic(order),
|
|
||||||
);
|
|
||||||
// LLVM requires the alignment of atomic stores to be at least the size of the type.
|
// LLVM requires the alignment of atomic stores to be at least the size of the type.
|
||||||
llvm::LLVMSetAlignment(store, size.bytes() as c_uint);
|
llvm::LLVMSetAlignment(store, size.bytes() as c_uint);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1151,6 +1151,7 @@ unsafe extern "C" {
|
|||||||
|
|
||||||
// Operations on load/store instructions (only)
|
// Operations on load/store instructions (only)
|
||||||
pub(crate) fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool);
|
pub(crate) fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool);
|
||||||
|
pub(crate) fn LLVMSetOrdering(MemoryAccessInst: &Value, Ordering: AtomicOrdering);
|
||||||
|
|
||||||
// Operations on phi nodes
|
// Operations on phi nodes
|
||||||
pub(crate) fn LLVMAddIncoming<'a>(
|
pub(crate) fn LLVMAddIncoming<'a>(
|
||||||
@@ -2090,22 +2091,6 @@ unsafe extern "C" {
|
|||||||
RHS: &'a Value,
|
RHS: &'a Value,
|
||||||
) -> &'a Value;
|
) -> &'a Value;
|
||||||
|
|
||||||
// Atomic Operations
|
|
||||||
pub(crate) fn LLVMRustBuildAtomicLoad<'a>(
|
|
||||||
B: &Builder<'a>,
|
|
||||||
ElementType: &'a Type,
|
|
||||||
PointerVal: &'a Value,
|
|
||||||
Name: *const c_char,
|
|
||||||
Order: AtomicOrdering,
|
|
||||||
) -> &'a Value;
|
|
||||||
|
|
||||||
pub(crate) fn LLVMRustBuildAtomicStore<'a>(
|
|
||||||
B: &Builder<'a>,
|
|
||||||
Val: &'a Value,
|
|
||||||
Ptr: &'a Value,
|
|
||||||
Order: AtomicOrdering,
|
|
||||||
) -> &'a Value;
|
|
||||||
|
|
||||||
pub(crate) fn LLVMRustTimeTraceProfilerInitialize();
|
pub(crate) fn LLVMRustTimeTraceProfilerInitialize();
|
||||||
|
|
||||||
pub(crate) fn LLVMRustTimeTraceProfilerFinishThread();
|
pub(crate) fn LLVMRustTimeTraceProfilerFinishThread();
|
||||||
|
|||||||
@@ -60,29 +60,6 @@ using namespace llvm::object;
|
|||||||
static_assert(dwarf::DW_OP_LLVM_fragment == 0x1000);
|
static_assert(dwarf::DW_OP_LLVM_fragment == 0x1000);
|
||||||
static_assert(dwarf::DW_OP_stack_value == 0x9f);
|
static_assert(dwarf::DW_OP_stack_value == 0x9f);
|
||||||
|
|
||||||
// LLVMAtomicOrdering is already an enum - don't create another
|
|
||||||
// one.
|
|
||||||
static AtomicOrdering fromRust(LLVMAtomicOrdering Ordering) {
|
|
||||||
switch (Ordering) {
|
|
||||||
case LLVMAtomicOrderingNotAtomic:
|
|
||||||
return AtomicOrdering::NotAtomic;
|
|
||||||
case LLVMAtomicOrderingUnordered:
|
|
||||||
return AtomicOrdering::Unordered;
|
|
||||||
case LLVMAtomicOrderingMonotonic:
|
|
||||||
return AtomicOrdering::Monotonic;
|
|
||||||
case LLVMAtomicOrderingAcquire:
|
|
||||||
return AtomicOrdering::Acquire;
|
|
||||||
case LLVMAtomicOrderingRelease:
|
|
||||||
return AtomicOrdering::Release;
|
|
||||||
case LLVMAtomicOrderingAcquireRelease:
|
|
||||||
return AtomicOrdering::AcquireRelease;
|
|
||||||
case LLVMAtomicOrderingSequentiallyConsistent:
|
|
||||||
return AtomicOrdering::SequentiallyConsistent;
|
|
||||||
}
|
|
||||||
|
|
||||||
report_fatal_error("Invalid LLVMAtomicOrdering value!");
|
|
||||||
}
|
|
||||||
|
|
||||||
static LLVM_THREAD_LOCAL char *LastError;
|
static LLVM_THREAD_LOCAL char *LastError;
|
||||||
|
|
||||||
// Custom error handler for fatal LLVM errors.
|
// Custom error handler for fatal LLVM errors.
|
||||||
@@ -623,24 +600,6 @@ extern "C" void LLVMRustSetAllowReassoc(LLVMValueRef V) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" LLVMValueRef
|
|
||||||
LLVMRustBuildAtomicLoad(LLVMBuilderRef B, LLVMTypeRef Ty, LLVMValueRef Source,
|
|
||||||
const char *Name, LLVMAtomicOrdering Order) {
|
|
||||||
Value *Ptr = unwrap(Source);
|
|
||||||
LoadInst *LI = unwrap(B)->CreateLoad(unwrap(Ty), Ptr, Name);
|
|
||||||
LI->setAtomic(fromRust(Order));
|
|
||||||
return wrap(LI);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" LLVMValueRef LLVMRustBuildAtomicStore(LLVMBuilderRef B,
|
|
||||||
LLVMValueRef V,
|
|
||||||
LLVMValueRef Target,
|
|
||||||
LLVMAtomicOrdering Order) {
|
|
||||||
StoreInst *SI = unwrap(B)->CreateStore(unwrap(V), unwrap(Target));
|
|
||||||
SI->setAtomic(fromRust(Order));
|
|
||||||
return wrap(SI);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern "C" uint64_t LLVMRustGetArrayNumElements(LLVMTypeRef Ty) {
|
extern "C" uint64_t LLVMRustGetArrayNumElements(LLVMTypeRef Ty) {
|
||||||
return unwrap(Ty)->getArrayNumElements();
|
return unwrap(Ty)->getArrayNumElements();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user