diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2019-09-26 00:58:55 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2019-09-26 00:58:55 +0000 |
commit | f57e968dd036b2230c59c00e1ed10fecf1668828 (patch) | |
tree | cbde2866a50cbab1452dd416ca34c03fb5b7d0dd /llvm/tools/llvm-c-test | |
parent | da3cf6165406ccf57c4379cf517f1b4040e4f9d0 (diff) | |
download | bcm5719-llvm-f57e968dd036b2230c59c00e1ed10fecf1668828.tar.gz bcm5719-llvm-f57e968dd036b2230c59c00e1ed10fecf1668828.zip |
Improve C API support for atomicrmw and cmpxchg.
atomicrmw and cmpxchg have a volatile flag, so allow them to be get and set with LLVM{Get,Set}Volatile. atomicrmw and fence have orderings, so allow them to be get and set with LLVM{Get,Set}Ordering. Add missing LLVMAtomicRMWBinOpFAdd and LLVMAtomicRMWBinOpFSub enum constants. AtomicCmpXchg also has a weak flag, add a getter/setter for that too. Add a getter/setter for the binary-op of an atomicrmw.
atomicrmw and cmpxchg have a volatile flag, so allow it to be set/get with LLVMGetVolatile and LLVMSetVolatile. Add missing LLVMAtomicRMWBinOpFAdd and LLVMAtomicRMWBinOpFSub enum constants. AtomicCmpXchg also has a weak flag, add a getter/setter for that too. Add a getter/setter for the binary-op of an atomicrmw.
Add LLVMIsA## for CatchSwitchInst, CallBrInst and FenceInst, as well as AtomicCmpXchgInst and AtomicRMWInst.
Update llvm-c-test to include atomicrmw and fence, and to copy volatile for the four applicable instructions.
Differential Revision: https://reviews.llvm.org/D67132
llvm-svn: 372938
Diffstat (limited to 'llvm/tools/llvm-c-test')
-rw-r--r-- | llvm/tools/llvm-c-test/echo.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/llvm/tools/llvm-c-test/echo.cpp b/llvm/tools/llvm-c-test/echo.cpp index 8341b11aa45..4d10a4bbfc0 100644 --- a/llvm/tools/llvm-c-test/echo.cpp +++ b/llvm/tools/llvm-c-test/echo.cpp @@ -576,6 +576,8 @@ struct FunCloner { LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); Dst = LLVMBuildLoad(Builder, Ptr, Name); LLVMSetAlignment(Dst, LLVMGetAlignment(Src)); + LLVMSetOrdering(Dst, LLVMGetOrdering(Src)); + LLVMSetVolatile(Dst, LLVMGetVolatile(Src)); break; } case LLVMStore: { @@ -583,6 +585,8 @@ struct FunCloner { LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 1)); Dst = LLVMBuildStore(Builder, Val, Ptr); LLVMSetAlignment(Dst, LLVMGetAlignment(Src)); + LLVMSetOrdering(Dst, LLVMGetOrdering(Src)); + LLVMSetVolatile(Dst, LLVMGetVolatile(Src)); break; } case LLVMGetElementPtr: { @@ -597,6 +601,17 @@ struct FunCloner { Dst = LLVMBuildGEP(Builder, Ptr, Idx.data(), NumIdx, Name); break; } + case LLVMAtomicRMW: { + LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); + LLVMValueRef Val = CloneValue(LLVMGetOperand(Src, 1)); + LLVMAtomicRMWBinOp BinOp = LLVMGetAtomicRMWBinOp(Src); + LLVMAtomicOrdering Ord = LLVMGetOrdering(Src); + LLVMBool SingleThread = LLVMIsAtomicSingleThread(Src); + Dst = LLVMBuildAtomicRMW(Builder, BinOp, Ptr, Val, Ord, SingleThread); + LLVMSetVolatile(Dst, LLVMGetVolatile(Src)); + LLVMSetValueName2(Dst, Name, NameLen); + break; + } case LLVMAtomicCmpXchg: { LLVMValueRef Ptr = CloneValue(LLVMGetOperand(Src, 0)); LLVMValueRef Cmp = CloneValue(LLVMGetOperand(Src, 1)); @@ -607,7 +622,11 @@ struct FunCloner { Dst = LLVMBuildAtomicCmpXchg(Builder, Ptr, Cmp, New, Succ, Fail, SingleThread); - } break; + LLVMSetVolatile(Dst, LLVMGetVolatile(Src)); + LLVMSetWeak(Dst, LLVMGetWeak(Src)); + LLVMSetValueName2(Dst, Name, NameLen); + break; + } case LLVMBitCast: { LLVMValueRef V = CloneValue(LLVMGetOperand(Src, 0)); Dst = LLVMBuildBitCast(Builder, V, CloneType(Src), Name); |