void FPInferredTargetsAnalysis::findAllFunctionPointersInValue(Value* V, ValueContextPairList& worklist, ValueSet& visited) { if (!visited.count(V)) { visited.insert(V); if (GlobalVariable* G = dyn_cast<GlobalVariable>(V)) { SDEBUG("soaap.analysis.infoflow.fp.infer", 3, dbgs() << INDENT_1 << "Global var: " << G->getName() << "\n"); // don't look in the llvm.global.annotations array if (G->getName() != "llvm.global.annotations" && G->hasInitializer()) { findAllFunctionPointersInValue(G->getInitializer(), worklist, visited); } } else if (ConstantArray* CA = dyn_cast<ConstantArray>(V)) { SDEBUG("soaap.analysis.infoflow.fp.infer", 3, dbgs() << INDENT_1 << "Constant array, num of operands: " << CA->getNumOperands() << "\n"); for (int i=0; i<CA->getNumOperands(); i++) { Value* V2 = CA->getOperand(i)->stripInBoundsOffsets(); findAllFunctionPointersInValue(V2, worklist, visited); } } else if (Function* F = dyn_cast<Function>(V)) { fpTargetsUniv.insert(F); SDEBUG("soaap.analysis.infoflow.fp.infer", 3, dbgs() << INDENT_1 << "Func: " << F->getName() << "\n"); setBitVector(state[ContextUtils::NO_CONTEXT][V], F); addToWorklist(V, ContextUtils::NO_CONTEXT, worklist); } else if (ConstantStruct* S = dyn_cast<ConstantStruct>(V)) { SDEBUG("soaap.analysis.infoflow.fp.infer", 3, dbgs() << INDENT_1 << "Struct, num of fields: " << S->getNumOperands() << "\n"); for (int j=0; j<S->getNumOperands(); j++) { Value* V2 = S->getOperand(j)->stripInBoundsOffsets(); findAllFunctionPointersInValue(V2, worklist, visited); } } } }
bool PointerAnalysis::test(Value *v, ValueSet &set) { if (set.count(v) == 0) { return false; } return true; }
bool PointerAnalysis::unEqual (const ValueSet &a, const ValueSet &b) { if (a.size() != b.size()) return true; for (auto const& e : a) if (b.count(e) == 0) return true; return false; }
void Preparer::replaceUndefsWithNull(User *I, ValueSet &Replaced) { if (Replaced.count(I)) return; Replaced.insert(I); for (User::op_iterator OI = I->op_begin(); OI != I->op_end(); ++OI) { Value *V = OI->get(); if (isa<UndefValue>(V) && V->getType()->isPointerTy()) { OI->set(ConstantPointerNull::get(cast<PointerType>(V->getType()))); } if (User *I2 = dyn_cast<User>(V)) { replaceUndefsWithNull(I2, Replaced); } } }
void CodeExtractor::findInputsOutputs(ValueSet &Inputs, ValueSet &Outputs, const ValueSet &SinkCands) const { for (BasicBlock *BB : Blocks) { // If a used value is defined outside the region, it's an input. If an // instruction is used outside the region, it's an output. for (Instruction &II : *BB) { for (User::op_iterator OI = II.op_begin(), OE = II.op_end(); OI != OE; ++OI) { Value *V = *OI; if (!SinkCands.count(V) && definedInCaller(Blocks, V)) Inputs.insert(V); } for (User *U : II.users()) if (!definedInRegion(Blocks, U)) { Outputs.insert(&II); break; } } } }