@@ -146,6 +146,24 @@ unsigned LLVMGetMDKindID(const char *Name, unsigned SLen) {
146
146
return LLVMGetMDKindIDInContext (LLVMGetGlobalContext (), Name, SLen);
147
147
}
148
148
149
+ unsigned LLVMGetSyncScopeIDInContext (LLVMContextRef C, const char *Name,
150
+ unsigned SLen) {
151
+ return unwrap (C)->getOrInsertSyncScopeID (StringRef (Name, SLen));
152
+ }
153
+
154
+ unsigned LLVMGetSyncScopeID (const char *Name, unsigned SLen) {
155
+ return LLVMGetSyncScopeIDInContext (LLVMGetGlobalContext (), Name, SLen);
156
+ }
157
+
158
+ const char *LLVMGetSyncScopeName (LLVMContextRef C, unsigned ID,
159
+ unsigned *Length) {
160
+ SmallVector<StringRef> SSNs;
161
+ unwrap (C)->getSyncScopeNames (SSNs);
162
+ StringRef Name = SSNs[ID].empty () ? " system" : SSNs[ID];
163
+ *Length = Name.size ();
164
+ return Name.data ();
165
+ }
166
+
149
167
unsigned LLVMGetEnumAttributeKindForName (const char *Name, size_t SLen) {
150
168
return Attribute::getAttrKindFromName (StringRef (Name, SLen));
151
169
}
@@ -3949,8 +3967,6 @@ static LLVMAtomicRMWBinOp mapToLLVMRMWBinOp(AtomicRMWInst::BinOp BinOp) {
3949
3967
llvm_unreachable (" Invalid AtomicRMWBinOp value!" );
3950
3968
}
3951
3969
3952
- // TODO: Should this and other atomic instructions support building with
3953
- // "syncscope"?
3954
3970
LLVMValueRef LLVMBuildFence (LLVMBuilderRef B, LLVMAtomicOrdering Ordering,
3955
3971
LLVMBool isSingleThread, const char *Name) {
3956
3972
return wrap (
@@ -3960,6 +3976,13 @@ LLVMValueRef LLVMBuildFence(LLVMBuilderRef B, LLVMAtomicOrdering Ordering,
3960
3976
Name));
3961
3977
}
3962
3978
3979
+ LLVMValueRef LLVMBuildFenceSyncScope (LLVMBuilderRef B,
3980
+ LLVMAtomicOrdering Ordering, unsigned SSID,
3981
+ const char *Name) {
3982
+ return wrap (
3983
+ unwrap (B)->CreateFence (mapFromLLVMOrdering (Ordering), SSID, Name));
3984
+ }
3985
+
3963
3986
LLVMValueRef LLVMBuildGEP2 (LLVMBuilderRef B, LLVMTypeRef Ty,
3964
3987
LLVMValueRef Pointer, LLVMValueRef *Indices,
3965
3988
unsigned NumIndices, const char *Name) {
@@ -4309,6 +4332,22 @@ LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op,
4309
4332
singleThread ? SyncScope::SingleThread : SyncScope::System));
4310
4333
}
4311
4334
4335
+ LLVMValueRef LLVMBuildAtomicRMWSyncScope (LLVMBuilderRef B,
4336
+ LLVMAtomicRMWBinOp op,
4337
+ LLVMValueRef PTR, LLVMValueRef Val,
4338
+ LLVMAtomicOrdering ordering,
4339
+ unsigned SSID) {
4340
+ AtomicRMWInst::BinOp intop = mapFromLLVMRMWBinOp (op);
4341
+
4342
+ SmallVector<StringRef> SSNs;
4343
+ unwrap (B)->getContext ().getSyncScopeNames (SSNs);
4344
+ assert (SSID < SSNs.size () && " Invalid SyncScopeID" );
4345
+
4346
+ return wrap (unwrap (B)->CreateAtomicRMW (intop, unwrap (PTR), unwrap (Val),
4347
+ MaybeAlign (),
4348
+ mapFromLLVMOrdering (ordering), SSID));
4349
+ }
4350
+
4312
4351
LLVMValueRef LLVMBuildAtomicCmpXchg (LLVMBuilderRef B, LLVMValueRef Ptr,
4313
4352
LLVMValueRef Cmp, LLVMValueRef New,
4314
4353
LLVMAtomicOrdering SuccessOrdering,
@@ -4322,6 +4361,17 @@ LLVMValueRef LLVMBuildAtomicCmpXchg(LLVMBuilderRef B, LLVMValueRef Ptr,
4322
4361
singleThread ? SyncScope::SingleThread : SyncScope::System));
4323
4362
}
4324
4363
4364
+ LLVMValueRef LLVMBuildAtomicCmpXchgSyncScope (LLVMBuilderRef B, LLVMValueRef Ptr,
4365
+ LLVMValueRef Cmp, LLVMValueRef New,
4366
+ LLVMAtomicOrdering SuccessOrdering,
4367
+ LLVMAtomicOrdering FailureOrdering,
4368
+ unsigned SSID) {
4369
+ return wrap (unwrap (B)->CreateAtomicCmpXchg (
4370
+ unwrap (Ptr), unwrap (Cmp), unwrap (New), MaybeAlign (),
4371
+ mapFromLLVMOrdering (SuccessOrdering),
4372
+ mapFromLLVMOrdering (FailureOrdering), SSID));
4373
+ }
4374
+
4325
4375
unsigned LLVMGetNumMaskElements (LLVMValueRef SVInst) {
4326
4376
Value *P = unwrap (SVInst);
4327
4377
ShuffleVectorInst *I = cast<ShuffleVectorInst>(P);
@@ -4336,25 +4386,29 @@ int LLVMGetMaskValue(LLVMValueRef SVInst, unsigned Elt) {
4336
4386
4337
4387
int LLVMGetUndefMaskElem (void ) { return PoisonMaskElem; }
4338
4388
4339
- LLVMBool LLVMIsAtomicSingleThread (LLVMValueRef AtomicInst) {
4340
- Value *P = unwrap (AtomicInst);
4341
-
4389
+ static unsigned getAtomicSyncScopeID (Value *P) {
4342
4390
if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
4343
- return I->getSyncScopeID () == SyncScope::SingleThread ;
4391
+ return I->getSyncScopeID ();
4344
4392
else if (FenceInst *FI = dyn_cast<FenceInst>(P))
4345
- return FI->getSyncScopeID () == SyncScope::SingleThread ;
4393
+ return FI->getSyncScopeID ();
4346
4394
else if (StoreInst *SI = dyn_cast<StoreInst>(P))
4347
- return SI->getSyncScopeID () == SyncScope::SingleThread ;
4395
+ return SI->getSyncScopeID ();
4348
4396
else if (LoadInst *LI = dyn_cast<LoadInst>(P))
4349
- return LI->getSyncScopeID () == SyncScope::SingleThread;
4350
- return cast<AtomicCmpXchgInst>(P)->getSyncScopeID () ==
4351
- SyncScope::SingleThread;
4397
+ return LI->getSyncScopeID ();
4398
+ return cast<AtomicCmpXchgInst>(P)->getSyncScopeID ();
4352
4399
}
4353
4400
4354
- void LLVMSetAtomicSingleThread (LLVMValueRef AtomicInst, LLVMBool NewValue ) {
4401
+ LLVMBool LLVMIsAtomicSingleThread (LLVMValueRef AtomicInst) {
4355
4402
Value *P = unwrap (AtomicInst);
4356
- SyncScope::ID SSID = NewValue ? SyncScope::SingleThread : SyncScope::System;
4403
+ return getAtomicSyncScopeID (P) == SyncScope::SingleThread;
4404
+ }
4405
+
4406
+ unsigned LLVMGetAtomicSyncScopeID (LLVMValueRef AtomicInst) {
4407
+ Value *P = unwrap (AtomicInst);
4408
+ return getAtomicSyncScopeID (P);
4409
+ }
4357
4410
4411
+ static void setAtomicSyncScopeID (Value *P, unsigned SSID) {
4358
4412
if (AtomicRMWInst *I = dyn_cast<AtomicRMWInst>(P))
4359
4413
return I->setSyncScopeID (SSID);
4360
4414
else if (FenceInst *FI = dyn_cast<FenceInst>(P))
@@ -4366,6 +4420,17 @@ void LLVMSetAtomicSingleThread(LLVMValueRef AtomicInst, LLVMBool NewValue) {
4366
4420
return cast<AtomicCmpXchgInst>(P)->setSyncScopeID (SSID);
4367
4421
}
4368
4422
4423
+ void LLVMSetAtomicSingleThread (LLVMValueRef AtomicInst, LLVMBool NewValue) {
4424
+ Value *P = unwrap (AtomicInst);
4425
+ SyncScope::ID SSID = NewValue ? SyncScope::SingleThread : SyncScope::System;
4426
+ setAtomicSyncScopeID (P, SSID);
4427
+ }
4428
+
4429
+ void LLVMSetAtomicSyncScopeID (LLVMValueRef AtomicInst, unsigned SSID) {
4430
+ Value *P = unwrap (AtomicInst);
4431
+ setAtomicSyncScopeID (P, SSID);
4432
+ }
4433
+
4369
4434
LLVMAtomicOrdering LLVMGetCmpXchgSuccessOrdering (LLVMValueRef CmpXchgInst) {
4370
4435
Value *P = unwrap (CmpXchgInst);
4371
4436
return mapToLLVMOrdering (cast<AtomicCmpXchgInst>(P)->getSuccessOrdering ());
0 commit comments