| 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)) {
|
|
|