Index: lib/Transforms/NaCl/RewriteAsmDirectives.cpp |
diff --git a/lib/Transforms/NaCl/RewriteAsmDirectives.cpp b/lib/Transforms/NaCl/RewriteAsmDirectives.cpp |
deleted file mode 100644 |
index cb726d2365ef34cd326767e84c03d255a037e4ef..0000000000000000000000000000000000000000 |
--- a/lib/Transforms/NaCl/RewriteAsmDirectives.cpp |
+++ /dev/null |
@@ -1,111 +0,0 @@ |
-//===- RewriteAsmDirectives.cpp - Handle Architecture-Independent Assembly-===// |
-// |
-// The LLVM Compiler Infrastructure |
-// |
-// This file is distributed under the University of Illinois Open Source |
-// License. See LICENSE.TXT for details. |
-// |
-//===----------------------------------------------------------------------===// |
-// |
-// This pass rewrites any inline assembly directive which is portable |
-// into LLVM bitcode. |
-// |
-//===----------------------------------------------------------------------===// |
- |
-#include "llvm/ADT/Twine.h" |
-#include "llvm/IR/Function.h" |
-#include "llvm/IR/InlineAsm.h" |
-#include "llvm/IR/Instructions.h" |
-#include "llvm/IR/Module.h" |
-#include "llvm/InstVisitor.h" |
-#include "llvm/Pass.h" |
-#include <string> |
- |
-using namespace llvm; |
- |
-namespace { |
-class RewriteAsmDirectives : public FunctionPass { |
-public: |
- static char ID; // Pass identification, replacement for typeid |
- RewriteAsmDirectives() : FunctionPass(ID) { |
- initializeRewriteAsmDirectivesPass(*PassRegistry::getPassRegistry()); |
- } |
- |
- virtual bool runOnFunction(Function &F); |
-}; |
- |
-class AsmDirectivesVisitor : public InstVisitor<AsmDirectivesVisitor> { |
-public: |
- AsmDirectivesVisitor(Function &F) |
- : F(F), C(F.getParent()->getContext()), ModifiedFunction(false) {} |
- ~AsmDirectivesVisitor() {} |
- bool modifiedFunction() const { return ModifiedFunction; } |
- |
- /// Only Call Instructions are ever inline assembly directives. |
- void visitCallInst(CallInst &CI); |
- |
-private: |
- Function &F; |
- LLVMContext &C; |
- bool ModifiedFunction; |
- |
- AsmDirectivesVisitor() LLVM_DELETED_FUNCTION; |
- AsmDirectivesVisitor(const AsmDirectivesVisitor &) LLVM_DELETED_FUNCTION; |
- AsmDirectivesVisitor &operator=(const AsmDirectivesVisitor &) LLVM_DELETED_FUNCTION; |
-}; |
-} |
- |
-char RewriteAsmDirectives::ID = 0; |
-INITIALIZE_PASS( |
- RewriteAsmDirectives, "rewrite-asm-directives", |
- "rewrite portable inline assembly directives into non-asm LLVM IR", |
- false, false) |
- |
-bool RewriteAsmDirectives::runOnFunction(Function &F) { |
- AsmDirectivesVisitor AV(F); |
- AV.visit(F); |
- return AV.modifiedFunction(); |
-} |
- |
-void AsmDirectivesVisitor::visitCallInst(CallInst &CI) { |
- if (!CI.isInlineAsm()) |
- return; |
- |
- Instruction *Replacement = NULL; |
- |
- InlineAsm *IA = cast<InlineAsm>(CI.getCalledValue()); |
- std::string AsmStr(IA->getAsmString()); |
- std::string ConstraintStr(IA->getConstraintString()); |
- Type *T = CI.getType(); |
- |
- bool isEmptyAsm = AsmStr.empty(); |
- // Different triples will encode "touch everything" differently, e.g.: |
- // - le32-unknown-nacl has "~{memory}". |
- // - x86 "~{memory},~{dirflag},~{fpsr},~{flags}". |
- // The following code therefore only searches for memory: this pass |
- // deals with portable assembly, touching anything else than memory in |
- // an empty assembly statement is meaningless. |
- bool touchesMemory = ConstraintStr.find("~{memory}") != std::string::npos; |
- |
- if (T->isVoidTy() && IA->hasSideEffects() && isEmptyAsm && touchesMemory) { |
- // asm("":::"memory") => fence seq_cst |
- // This transformation is safe and strictly stronger: the former is |
- // purely a compiler fence, whereas the latter is a compiler fence |
- // as well as a hardware fence which orders all loads and stores on |
- // the current thread of execution. |
- Replacement = new FenceInst(C, SequentiallyConsistent, CrossThread, &CI); |
- } |
- |
- if (Replacement) { |
- Replacement->setDebugLoc(CI.getDebugLoc()); |
- CI.replaceAllUsesWith(Replacement); |
- CI.eraseFromParent(); |
- ModifiedFunction = true; |
- } |
-} |
- |
-namespace llvm { |
-FunctionPass *createRewriteAsmDirectivesPass() { |
- return new RewriteAsmDirectives(); |
-} |
-} |