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:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user