gallivm: add compare exchange wrapper

This just pulls the wrapper from LLVM for older versions

Reviewed-by: Roland Scheidegger <sroland@vmware.com>
This commit is contained in:
Dave Airlie
2019-07-02 07:10:53 +10:00
parent 4f709c86a9
commit 2a55acbc1d
3 changed files with 39 additions and 1 deletions
-1
View File
@@ -108,5 +108,4 @@ typedef void *LLVMMCJITMemoryManagerRef;
# define LLVMSetAlignment LLVMSetAlignmentBackport
#endif
#endif /* LP_BLD_H */
@@ -804,3 +804,33 @@ lp_is_function(LLVMValueRef v)
return llvm::isa<llvm::Function>(llvm::unwrap(v));
#endif
}
#if HAVE_LLVM < 0x309
static llvm::AtomicOrdering mapFromLLVMOrdering(LLVMAtomicOrdering Ordering) {
switch (Ordering) {
case LLVMAtomicOrderingNotAtomic: return llvm::AtomicOrdering::NotAtomic;
case LLVMAtomicOrderingUnordered: return llvm::AtomicOrdering::Unordered;
case LLVMAtomicOrderingMonotonic: return llvm::AtomicOrdering::Monotonic;
case LLVMAtomicOrderingAcquire: return llvm::AtomicOrdering::Acquire;
case LLVMAtomicOrderingRelease: return llvm::AtomicOrdering::Release;
case LLVMAtomicOrderingAcquireRelease:
return llvm::AtomicOrdering::AcquireRelease;
case LLVMAtomicOrderingSequentiallyConsistent:
return llvm::AtomicOrdering::SequentiallyConsistent;
}
llvm_unreachable("Invalid LLVMAtomicOrdering value!");
}
LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr,
LLVMValueRef Cmp, LLVMValueRef New,
LLVMAtomicOrdering SuccessOrdering,
LLVMAtomicOrdering FailureOrdering,
LLVMBool SingleThread)
{
/* LLVM 3.8 doesn't have a second ordering and uses old SynchronizationScope enum */
return llvm::wrap(llvm::unwrap(B)->CreateAtomicCmpXchg(llvm::unwrap(Ptr), llvm::unwrap(Cmp),
llvm::unwrap(New), mapFromLLVMOrdering(SuccessOrdering),
SingleThread ? llvm::SynchronizationScope::SingleThread : llvm::SynchronizationScope::CrossThread));
}
#endif
@@ -76,6 +76,15 @@ lp_get_called_value(LLVMValueRef call);
extern bool
lp_is_function(LLVMValueRef v);
/* LLVM 3.9 introduces this, provide our own for earlier */
#if HAVE_LLVM < 0x309
LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr,
LLVMValueRef Cmp, LLVMValueRef New,
LLVMAtomicOrdering SuccessOrdering,
LLVMAtomicOrdering FailureOrdering,
LLVMBool SingleThread);
#endif
#ifdef __cplusplus
}
#endif