void LLVMDefUseAnalysis::addDataDependence(LLVMNode *node, llvm::Value *rdval) { LLVMNode *rdnode = dg->getNode(rdval); if (!rdnode) { // that means that the value is not from this graph. // We need to add interprocedural edge llvm::Function *F = llvm::cast<llvm::Instruction>(rdval)->getParent()->getParent(); LLVMNode *entryNode = dg->getGlobalNode(F); assert(entryNode && "Don't have built function"); // get the graph where the node lives LLVMDependenceGraph *graph = entryNode->getDG(); assert(graph != dg && "Cannot find a node"); rdnode = graph->getNode(rdval); if (!rdnode) { llvmutils::printerr("[DU] error: DG doesn't have val: ", rdval); abort(); return; } } assert(rdnode); rdnode->addDataDependence(node); }
void LLVMDefUseAnalysis::handleInlineAsm(LLVMNode *callNode) { CallInst *CI = cast<CallInst>(callNode->getValue()); LLVMDependenceGraph *dg = callNode->getDG(); // the last operand is the asm itself, so iterate only to e - 1 for (unsigned i = 0, e = CI->getNumOperands(); i < e - 1; ++i) { Value *opVal = CI->getOperand(i); if (!opVal->getType()->isPointerTy()) continue; LLVMNode *opNode = dg->getNode(opVal->stripInBoundsOffsets()); if (!opNode) { // FIXME: ConstantExpr llvmutils::printerr("WARN: unhandled inline asm operand: ", opVal); continue; } assert(opNode && "Do not have an operand for inline asm"); // if nothing else, this call at least uses the operands opNode->addDataDependence(callNode); } }