| 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();
 | 
| -}
 | 
| -}
 | 
| 
 |