Lines Matching refs:Function
30 BinaryBasicBlock *getInternalCallTarget(BinaryFunction &Function, in getInternalCallTarget() argument
32 const BinaryContext &BC = Function.getBinaryContext(); in getInternalCallTarget()
37 return Function.getBasicBlockForLabel(BC.MIB->getTargetSymbol(Inst)); in getInternalCallTarget()
96 void ValidateInternalCalls::fixCFGForPIC(BinaryFunction &Function) const { in fixCFGForPIC()
98 for (BinaryBasicBlock &BB : Function) in fixCFGForPIC()
108 return getInternalCallTarget(Function, Inst) != nullptr; in fixCFGForPIC()
115 BinaryBasicBlock *Target = getInternalCallTarget(Function, *InternalCall); in fixCFGForPIC()
119 std::unique_ptr<BinaryBasicBlock> NewBB = Function.createBasicBlock(); in fixCFGForPIC()
127 Function.insertBasicBlocks(&BB, std::move(NewBBs)); in fixCFGForPIC()
135 bool ValidateInternalCalls::fixCFGForIC(BinaryFunction &Function) const { in fixCFGForIC()
136 const BinaryContext &BC = Function.getBinaryContext(); in fixCFGForIC()
138 StackPointerTrackingForInternalCalls SPTIC(Function); in fixCFGForIC()
143 ReachingInsns<false> RI(Function); in fixCFGForIC()
147 DataflowInfoManager Info(Function, nullptr, nullptr); in fixCFGForIC()
155 if (!getInternalCallTarget(Function, ReachingInst) || in fixCFGForIC()
176 Function.getLayout().getBasicBlockAfter(CallerBlock); in fixCFGForIC()
187 for (BinaryBasicBlock &BB : Function) { in fixCFGForIC()
199 BinaryFunction &Function) const { in hasTailCallsInRange()
200 const BinaryContext &BC = Function.getBinaryContext(); in hasTailCallsInRange()
201 for (BinaryBasicBlock &BB : Function) in hasTailCallsInRange()
208 bool ValidateInternalCalls::analyzeFunction(BinaryFunction &Function) const { in analyzeFunction()
209 fixCFGForPIC(Function); in analyzeFunction()
210 while (fixCFGForIC(Function)) { in analyzeFunction()
213 BinaryContext &BC = Function.getBinaryContext(); in analyzeFunction()
216 bool HasTailCalls = hasTailCallsInRange(Function); in analyzeFunction()
218 for (BinaryBasicBlock &BB : Function) { in analyzeFunction()
220 BinaryBasicBlock *Target = getInternalCallTarget(Function, Inst); in analyzeFunction()
225 LLVM_DEBUG(dbgs() << Function in analyzeFunction()
241 dbgs() << "Frame analysis failed - not simple: " << Function << "\n"; in analyzeFunction()
242 Function.dump(); in analyzeFunction()
251 << Function << "\n"; in analyzeFunction()
252 Function.dump(); in analyzeFunction()
258 ReachingDefOrUse<false>(RA, Function, Reg); in analyzeFunction()
280 Offset + Output > static_cast<int64_t>(Function.getSize())) { in analyzeFunction()
282 dbgs() << "Detected out-of-range PIC reference in " << Function in analyzeFunction()
288 Function.dump(); in analyzeFunction()
314 BinaryFunction &Function = BFI.second; in runOnFunctions() local
315 for (BinaryBasicBlock &BB : Function) { in runOnFunctions()
317 if (getInternalCallTarget(Function, Inst)) { in runOnFunctions()
318 NeedsValidation.insert(&Function); in runOnFunctions()
319 Function.setSimple(false); in runOnFunctions()
336 for (BinaryFunction *Function : NeedsValidation) { in runOnFunctions()
337 LLVM_DEBUG(dbgs() << "Validating " << *Function << "\n"); in runOnFunctions()
338 if (!analyzeFunction(*Function)) in runOnFunctions()
339 Invalid.insert(Function); in runOnFunctions()
340 clearAnnotations(*Function); in runOnFunctions()
346 for (BinaryFunction *Function : Invalid) { in runOnFunctions()
347 errs() << " " << *Function << "\n"; in runOnFunctions()
348 Function->setIgnored(); in runOnFunctions()