Index: lib/CodeGen/CGStmt.cpp |
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp |
index f207a4f7f8d1cee77cc7433050c244ba1acca724..1064e5115a8e1d02b783a3b3327ba64172c6a60b 100644 |
--- a/lib/CodeGen/CGStmt.cpp |
+++ b/lib/CodeGen/CGStmt.cpp |
@@ -2044,6 +2044,18 @@ void CodeGenFunction::EmitAsmStmt(const AsmStmt &S) { |
Result->addAttribute(llvm::AttributeSet::FunctionIndex, |
llvm::Attribute::NoUnwind); |
+ // @LOCALMOD-START |
+ if (getTargetHooks().asmMemoryIsFence() && IA->isAsmMemory()) { |
+ // Targets can ask that ``asm("":::"memory")`` be treated like |
+ // ``__sync_synchronize()``. |
+ Builder.CreateFence(llvm::SequentiallyConsistent); |
+ Builder.CreateCall( |
+ llvm::InlineAsm::get(FTy, AsmString, Constraints, HasSideEffect))-> |
+ addAttribute(llvm::AttributeSet::FunctionIndex, |
+ llvm::Attribute::NoUnwind); |
+ } |
+ // @LOCALMOD-END |
+ |
// Slap the source location of the inline asm into a !srcloc metadata on the |
// call. |
if (const GCCAsmStmt *gccAsmStmt = dyn_cast<GCCAsmStmt>(&S)) { |