@@ -520,6 +520,7 @@ struct FunCloner {
520
520
check_value_kind (Src, LLVMInstructionValueKind);
521
521
if (!LLVMIsAInstruction (Src))
522
522
report_fatal_error (" Expected an instruction" );
523
+ LLVMContextRef Ctx = LLVMGetTypeContext (LLVMTypeOf (Src));
523
524
524
525
size_t NameLen;
525
526
const char *Name = LLVMGetValueName2 (Src, &NameLen);
@@ -754,7 +755,11 @@ struct FunCloner {
754
755
LLVMSetAlignment (Dst, LLVMGetAlignment (Src));
755
756
LLVMSetOrdering (Dst, LLVMGetOrdering (Src));
756
757
LLVMSetVolatile (Dst, LLVMGetVolatile (Src));
757
- LLVMSetAtomicSingleThread (Dst, LLVMIsAtomicSingleThread (Src));
758
+ LLVMBool IsAtomicSingleThread = LLVMIsAtomicSingleThread (Src);
759
+ if (IsAtomicSingleThread)
760
+ LLVMSetAtomicSingleThread (Dst, IsAtomicSingleThread);
761
+ else
762
+ LLVMSetAtomicSyncScopeID (Dst, LLVMGetAtomicSyncScopeID (Src));
758
763
break ;
759
764
}
760
765
case LLVMStore: {
@@ -764,7 +769,11 @@ struct FunCloner {
764
769
LLVMSetAlignment (Dst, LLVMGetAlignment (Src));
765
770
LLVMSetOrdering (Dst, LLVMGetOrdering (Src));
766
771
LLVMSetVolatile (Dst, LLVMGetVolatile (Src));
767
- LLVMSetAtomicSingleThread (Dst, LLVMIsAtomicSingleThread (Src));
772
+ LLVMBool IsAtomicSingleThread = LLVMIsAtomicSingleThread (Src);
773
+ if (IsAtomicSingleThread)
774
+ LLVMSetAtomicSingleThread (Dst, IsAtomicSingleThread);
775
+ else
776
+ LLVMSetAtomicSyncScopeID (Dst, LLVMGetAtomicSyncScopeID (Src));
768
777
break ;
769
778
}
770
779
case LLVMGetElementPtr: {
@@ -786,7 +795,11 @@ struct FunCloner {
786
795
LLVMAtomicRMWBinOp BinOp = LLVMGetAtomicRMWBinOp (Src);
787
796
LLVMAtomicOrdering Ord = LLVMGetOrdering (Src);
788
797
LLVMBool SingleThread = LLVMIsAtomicSingleThread (Src);
789
- Dst = LLVMBuildAtomicRMW (Builder, BinOp, Ptr, Val, Ord, SingleThread);
798
+ if (SingleThread)
799
+ Dst = LLVMBuildAtomicRMW (Builder, BinOp, Ptr, Val, Ord, SingleThread);
800
+ else
801
+ Dst = LLVMBuildAtomicRMWSyncScope (Builder, BinOp, Ptr, Val, Ord,
802
+ LLVMGetAtomicSyncScopeID (Src));
790
803
LLVMSetAlignment (Dst, LLVMGetAlignment (Src));
791
804
LLVMSetVolatile (Dst, LLVMGetVolatile (Src));
792
805
LLVMSetValueName2 (Dst, Name, NameLen);
@@ -799,9 +812,13 @@ struct FunCloner {
799
812
LLVMAtomicOrdering Succ = LLVMGetCmpXchgSuccessOrdering (Src);
800
813
LLVMAtomicOrdering Fail = LLVMGetCmpXchgFailureOrdering (Src);
801
814
LLVMBool SingleThread = LLVMIsAtomicSingleThread (Src);
802
-
803
- Dst = LLVMBuildAtomicCmpXchg (Builder, Ptr, Cmp, New, Succ, Fail,
804
- SingleThread);
815
+ if (SingleThread)
816
+ Dst = LLVMBuildAtomicCmpXchg (Builder, Ptr, Cmp, New, Succ, Fail,
817
+ SingleThread);
818
+ else
819
+ Dst = LLVMBuildAtomicCmpXchgSyncScope (Builder, Ptr, Cmp, New, Succ,
820
+ Fail,
821
+ LLVMGetAtomicSyncScopeID (Src));
805
822
LLVMSetAlignment (Dst, LLVMGetAlignment (Src));
806
823
LLVMSetVolatile (Dst, LLVMGetVolatile (Src));
807
824
LLVMSetWeak (Dst, LLVMGetWeak (Src));
@@ -993,7 +1010,11 @@ struct FunCloner {
993
1010
case LLVMFence: {
994
1011
LLVMAtomicOrdering Ordering = LLVMGetOrdering (Src);
995
1012
LLVMBool IsSingleThreaded = LLVMIsAtomicSingleThread (Src);
996
- Dst = LLVMBuildFence (Builder, Ordering, IsSingleThreaded, Name);
1013
+ if (IsSingleThreaded)
1014
+ Dst = LLVMBuildFence (Builder, Ordering, IsSingleThreaded, Name);
1015
+ else
1016
+ Dst = LLVMBuildFenceSyncScope (Builder, Ordering,
1017
+ LLVMGetAtomicSyncScopeID (Src), Name);
997
1018
break ;
998
1019
}
999
1020
case LLVMZExt: {
@@ -1059,7 +1080,6 @@ struct FunCloner {
1059
1080
if (LLVMCanValueUseFastMathFlags (Src))
1060
1081
LLVMSetFastMathFlags (Dst, LLVMGetFastMathFlags (Src));
1061
1082
1062
- auto Ctx = LLVMGetModuleContext (M);
1063
1083
size_t NumMetadataEntries;
1064
1084
auto *AllMetadata =
1065
1085
LLVMInstructionGetAllMetadataOtherThanDebugLoc (Src,
@@ -1609,12 +1629,12 @@ static void clone_symbols(LLVMModuleRef Src, LLVMModuleRef M) {
1609
1629
int llvm_echo (void ) {
1610
1630
LLVMEnablePrettyStackTrace ();
1611
1631
1612
- LLVMModuleRef Src = llvm_load_module (false , true );
1632
+ LLVMContextRef Ctx = LLVMContextCreate ();
1633
+ LLVMModuleRef Src = llvm_load_module (Ctx, false , true );
1613
1634
size_t SourceFileLen;
1614
1635
const char *SourceFileName = LLVMGetSourceFileName (Src, &SourceFileLen);
1615
1636
size_t ModuleIdentLen;
1616
1637
const char *ModuleName = LLVMGetModuleIdentifier (Src, &ModuleIdentLen);
1617
- LLVMContextRef Ctx = LLVMContextCreate ();
1618
1638
LLVMModuleRef M = LLVMModuleCreateWithNameInContext (ModuleName, Ctx);
1619
1639
1620
1640
LLVMSetSourceFileName (M, SourceFileName, SourceFileLen);
0 commit comments