24
24
#include " llvm/IR/GlobalVariable.h"
25
25
#include " llvm/IR/IRBuilder.h"
26
26
#include " llvm/IR/InlineAsm.h"
27
+ #include " llvm/IR/Instructions.h"
27
28
#include " llvm/IR/IntrinsicInst.h"
28
29
#include " llvm/IR/LLVMContext.h"
29
30
#include " llvm/IR/LegacyPassManager.h"
@@ -146,6 +147,10 @@ unsigned LLVMGetMDKindID(const char *Name, unsigned SLen) {
146
147
return LLVMGetMDKindIDInContext (LLVMGetGlobalContext (), Name, SLen);
147
148
}
148
149
150
+ unsigned LLVMGetSyncScopeID (LLVMContextRef C, const char *Name, size_t SLen) {
151
+ return unwrap (C)->getOrInsertSyncScopeID (StringRef (Name, SLen));
152
+ }
153
+
149
154
unsigned LLVMGetEnumAttributeKindForName (const char *Name, size_t SLen) {
150
155
return Attribute::getAttrKindFromName (StringRef (Name, SLen));
151
156
}
@@ -3957,8 +3962,6 @@ static LLVMAtomicRMWBinOp mapToLLVMRMWBinOp(AtomicRMWInst::BinOp BinOp) {
3957
3962
llvm_unreachable (" Invalid AtomicRMWBinOp value!" );
3958
3963
}
3959
3964
3960
- // TODO: Should this and other atomic instructions support building with
3961
- // "syncscope"?
3962
3965
LLVMValueRef LLVMBuildFence (LLVMBuilderRef B, LLVMAtomicOrdering Ordering,
3963
3966
LLVMBool isSingleThread, const char *Name) {
3964
3967
return wrap (
@@ -3968,6 +3971,13 @@ LLVMValueRef LLVMBuildFence(LLVMBuilderRef B, LLVMAtomicOrdering Ordering,
3968
3971
Name));
3969
3972
}
3970
3973
3974
+ LLVMValueRef LLVMBuildFenceSyncScope (LLVMBuilderRef B,
3975
+ LLVMAtomicOrdering Ordering, unsigned SSID,
3976
+ const char *Name) {
3977
+ return wrap (
3978
+ unwrap (B)->CreateFence (mapFromLLVMOrdering (Ordering), SSID, Name));
3979
+ }
3980
+
3971
3981
LLVMValueRef LLVMBuildGEP2 (LLVMBuilderRef B, LLVMTypeRef Ty,
3972
3982
LLVMValueRef Pointer, LLVMValueRef *Indices,
3973
3983
unsigned NumIndices, const char *Name) {
@@ -4317,6 +4327,17 @@ LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op,
4317
4327
singleThread ? SyncScope::SingleThread : SyncScope::System));
4318
4328
}
4319
4329
4330
+ LLVMValueRef LLVMBuildAtomicRMWSyncScope (LLVMBuilderRef B,
4331
+ LLVMAtomicRMWBinOp op,
4332
+ LLVMValueRef PTR, LLVMValueRef Val,
4333
+ LLVMAtomicOrdering ordering,
4334
+ unsigned SSID) {
4335
+ AtomicRMWInst::BinOp intop = mapFromLLVMRMWBinOp (op);
4336
+ return wrap (unwrap (B)->CreateAtomicRMW (intop, unwrap (PTR), unwrap (Val),
4337
+ MaybeAlign (),
4338
+ mapFromLLVMOrdering (ordering), SSID));
4339
+ }
4340
+
4320
4341
LLVMValueRef LLVMBuildAtomicCmpXchg (LLVMBuilderRef B, LLVMValueRef Ptr,
4321
4342
LLVMValueRef Cmp, LLVMValueRef New,
4322
4343
LLVMAtomicOrdering SuccessOrdering,
@@ -4330,6 +4351,17 @@ LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr,
4330
4351
singleThread ? SyncScope::SingleThread : SyncScope::System));
4331
4352
}
4332
4353
4354
+ LLVMValueRef LLVMBuildAtomicCmpXchgSyncScope (LLVMBuilderRef B, LLVMValueRef Ptr,
4355
+ LLVMValueRef Cmp, LLVMValueRef New,
4356
+ LLVMAtomicOrdering SuccessOrdering,
4357
+ LLVMAtomicOrdering FailureOrdering,
4358
+ unsigned SSID) {
4359
+ return wrap (unwrap (B)->CreateAtomicCmpXchg (
4360
+ unwrap (Ptr), unwrap (Cmp), unwrap (New), MaybeAlign (),
4361
+ mapFromLLVMOrdering (SuccessOrdering),
4362
+ mapFromLLVMOrdering (FailureOrdering), SSID));
4363
+ }
4364
+
4333
4365
unsigned LLVMGetNumMaskElements (LLVMValueRef SVInst) {
4334
4366
Value *P = unwrap (SVInst);
4335
4367
ShuffleVectorInst *I = cast<ShuffleVectorInst>(P);
@@ -4344,34 +4376,39 @@ int LLVMGetMaskValue(LLVMValueRef SVInst, unsigned Elt) {
4344
4376
4345
4377
int LLVMGetUndefMaskElem (void ) { return PoisonMaskElem; }
4346
4378
4379
+ LLVMBool LLVMIsAtomic (LLVMValueRef Inst) {
4380
+ return unwrap<Instruction>(Inst)->isAtomic ();
4381
+ }
4382
+
4347
4383
LLVMBool LLVMIsAtomicSingleThread (LLVMValueRef AtomicInst) {
4348
- Value *P = unwrap (AtomicInst);
4384
+ // Backwards compatibility: return false for non-atomic instructions
4385
+ Instruction *I = unwrap<Instruction>(AtomicInst);
4386
+ if (!I->isAtomic ())
4387
+ return 0 ;
4349
4388
4350
- if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
4351
- return I->getSyncScopeID () == SyncScope::SingleThread;
4352
- else if (FenceInst *FI = dyn_cast<FenceInst>(P))
4353
- return FI->getSyncScopeID () == SyncScope::SingleThread;
4354
- else if (StoreInst *SI = dyn_cast<StoreInst>(P))
4355
- return SI->getSyncScopeID () == SyncScope::SingleThread;
4356
- else if (LoadInst *LI = dyn_cast<LoadInst>(P))
4357
- return LI->getSyncScopeID () == SyncScope::SingleThread;
4358
- return cast<AtomicCmpXchgInst>(P)->getSyncScopeID () ==
4359
- SyncScope::SingleThread;
4389
+ return *getAtomicSyncScopeID (I) == SyncScope::SingleThread;
4360
4390
}
4361
4391
4362
4392
void LLVMSetAtomicSingleThread (LLVMValueRef AtomicInst, LLVMBool NewValue) {
4363
- Value *P = unwrap (AtomicInst);
4393
+ // Backwards compatibility: ignore non-atomic instructions
4394
+ Instruction *I = unwrap<Instruction>(AtomicInst);
4395
+ if (!I->isAtomic ())
4396
+ return ;
4397
+
4364
4398
SyncScope::ID SSID = NewValue ? SyncScope::SingleThread : SyncScope::System;
4399
+ setAtomicSyncScopeID (I, SSID);
4400
+ }
4365
4401
4366
- if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
4367
- return I->setSyncScopeID (SSID);
4368
- else if (FenceInst *FI = dyn_cast<FenceInst>(P))
4369
- return FI->setSyncScopeID (SSID);
4370
- else if (StoreInst *SI = dyn_cast<StoreInst>(P))
4371
- return SI->setSyncScopeID (SSID);
4372
- else if (LoadInst *LI = dyn_cast<LoadInst>(P))
4373
- return LI->setSyncScopeID (SSID);
4374
- return cast<AtomicCmpXchgInst>(P)->setSyncScopeID (SSID);
4402
+ unsigned LLVMGetAtomicSyncScopeID (LLVMValueRef AtomicInst) {
4403
+ Instruction *I = unwrap<Instruction>(AtomicInst);
4404
+ assert (I->isAtomic () && " Expected an atomic instruction" );
4405
+ return *getAtomicSyncScopeID (I);
4406
+ }
4407
+
4408
+ void LLVMSetAtomicSyncScopeID (LLVMValueRef AtomicInst, unsigned SSID) {
4409
+ Instruction *I = unwrap<Instruction>(AtomicInst);
4410
+ assert (I->isAtomic () && " Expected an atomic instruction" );
4411
+ setAtomicSyncScopeID (I, SSID);
4375
4412
}
4376
4413
4377
4414
LLVMAtomicOrdering LLVMGetCmpXchgSuccessOrdering (LLVMValueRef CmpXchgInst) {
0 commit comments