summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-c-test
diff options
context:
space:
mode:
authorNick Lewycky <nicholas@mxc.ca>2019-09-26 00:58:55 +0000
committerNick Lewycky <nicholas@mxc.ca>2019-09-26 00:58:55 +0000
commitf57e968dd036b2230c59c00e1ed10fecf1668828 (patch)
treecbde2866a50cbab1452dd416ca34c03fb5b7d0dd /llvm/tools/llvm-c-test
parentda3cf6165406ccf57c4379cf517f1b4040e4f9d0 (diff)
downloadbcm5719-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.cpp21
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);
OpenPOWER on IntegriCloud