bool Substitution::substitute(Function *f) { Function *tmp = f; // Loop for the number of time we run the pass on the function int times = ObfTimes; do { for (Function::iterator bb = tmp->begin(); bb != tmp->end(); ++bb) { for (BasicBlock::iterator inst = bb->begin(); inst != bb->end(); ++inst) { if (inst->isBinaryOp()) { switch (inst->getOpcode()) { case BinaryOperator::Add: // case BinaryOperator::FAdd: // Substitute with random add operation (this->*funcAdd[llvm::cryptoutils->get_range(NUMBER_ADD_SUBST)])( cast<BinaryOperator>(inst)); ++Add; break; case BinaryOperator::Sub: // case BinaryOperator::FSub: // Substitute with random sub operation (this->*funcSub[llvm::cryptoutils->get_range(NUMBER_SUB_SUBST)])( cast<BinaryOperator>(inst)); ++Sub; break; case BinaryOperator::Mul: case BinaryOperator::FMul: //++Mul; break; case BinaryOperator::UDiv: case BinaryOperator::SDiv: case BinaryOperator::FDiv: //++Div; break; case BinaryOperator::URem: case BinaryOperator::SRem: case BinaryOperator::FRem: //++Rem; break; case Instruction::Shl: //++Shi; break; case Instruction::LShr: //++Shi; break; case Instruction::AShr: //++Shi; break; case Instruction::And: (this->* funcAnd[llvm::cryptoutils->get_range(2)])(cast<BinaryOperator>(inst)); ++And; break; case Instruction::Or: (this->* funcOr[llvm::cryptoutils->get_range(2)])(cast<BinaryOperator>(inst)); ++Or; break; case Instruction::Xor: (this->* funcXor[llvm::cryptoutils->get_range(2)])(cast<BinaryOperator>(inst)); ++Xor; break; default: break; } // End switch } // End isBinaryOp } // End for basickblock } // End for Function } while (--times > 0); // for times return false; }