zcov: / lib/Module/RaiseAsm.cpp


Files: 1 Branches Taken: 75.0% 21 / 28
Generated: 2009-05-17 22:47 Branches Executed: 85.7% 24 / 28
Line Coverage: 100.0% 23 / 23


Programs: 1 Runs 371


       1                 : /* -*- mode: c++; c-basic-offset: 2; -*- */
       2                 : 
       3                 : #include "Passes.h"
       4                 : 
       5                 : #include "llvm/InlineAsm.h"
       6                 : 
       7                 : using namespace llvm;
       8                 : using namespace klee;
       9                 : 
      10                 : char RaiseAsmPass::ID = 0;
      11                 : 
      12                 : Function *RaiseAsmPass::getIntrinsic(llvm::Module &M,
      13                 :                                      unsigned IID,
      14                 :                                      const Type **Tys,
      15                1:                                      unsigned NumTys) {  
      16                1:   return Intrinsic::getDeclaration(&M, (llvm::Intrinsic::ID) IID, Tys, NumTys);
      17                 : }
      18                 : 
      19                 : // FIXME: This should just be implemented as a patch to
      20                 : // X86TargetAsmInfo.cpp, then everyone will benefit.
      21            97511: bool RaiseAsmPass::runOnInstruction(Module &M, Instruction *I) {
                     4031: branch 0 taken
                    93480: branch 1 taken
      22            97511:   if (CallInst *ci = dyn_cast<CallInst>(I)) {
                        1: branch 0 taken
                     4030: branch 1 taken
      23             8062:     if (InlineAsm *ia = dyn_cast<InlineAsm>(ci->getCalledValue())) {
      24                1:       const std::string &as = ia->getAsmString();
      25                1:       const std::string &cs = ia->getConstraintString();
      26                2:       const llvm::Type *T = ci->getType();
      27                 : 
      28                 :       // bswaps
                        1: branch 0 taken
                        0: branch 1 not taken
                        1: branch 3 taken
                        0: branch 4 not taken
                        0: branch 5 not taken
                        1: branch 6 taken
                        1: branch 7 taken
                        1: branch 8 taken
                        1: branch 9 taken
                        1: branch 10 taken
                        1: branch 11 taken
                        0: branch 12 not taken
                        1: branch 13 taken
                        0: branch 14 not taken
                        1: branch 15 taken
                        0: branch 16 not taken
                        1: branch 17 taken
                        0: branch 18 not taken
      29                4:       if (ci->getNumOperands() == 2 && 
      30                 :           T == ci->getOperand(1)->getType() &&
      31                 :           ((T == llvm::Type::Int16Ty && 
      32                 :             as == "rorw $$8, ${0:w}" &&
      33                 :             cs == "=r,0,~{dirflag},~{fpsr},~{flags},~{cc}") ||
      34                 :            (T == llvm::Type::Int32Ty &&
      35                 :             as == "rorw $$8, ${0:w};rorl $$16, $0;rorw $$8, ${0:w}" &&
      36                 :             cs == "=r,0,~{dirflag},~{fpsr},~{flags},~{cc}"))) {
      37                1:         llvm::Value *Arg0 = ci->getOperand(1);
      38                2:         Function *F = getIntrinsic(M, Intrinsic::bswap, Arg0->getType());
      39                1:         ci->setOperand(0, F);
      40                1:         return true;
      41                 :       }
      42                 :     }
      43                 :   }
      44                 : 
      45            97510:   return false;
      46                 : }
      47                 : 
      48              103: bool RaiseAsmPass::runOnModule(Module &M) {
      49              103:   bool changed = false;
      50                 :   
                      842: branch 1 taken
                      103: branch 2 taken
      51             1787:   for (Module::iterator fi = M.begin(), fe = M.end(); fi != fe; ++fi) {
                    10590: branch 1 taken
                      842: branch 2 taken
      52            22864:     for (Function::iterator bi = fi->begin(), be = fi->end(); bi != be; ++bi) {
                    97511: branch 0 taken
                    10590: branch 1 taken
      53           118691:       for (BasicBlock::iterator ii = bi->begin(), ie = bi->end(); ii != ie;) {
      54            97511:         Instruction *i = ii;
      55            97511:         ++ii;  
      56            97511:         changed |= runOnInstruction(M, i);
      57                 :       }
      58                 :     }
      59                 :   }
      60                 : 
      61              103:   return changed;
      62                 : }

Generated: 2009-05-17 22:47 by zcov