Lines Matching refs:Function

30 BinaryBasicBlock *getInternalCallTarget(BinaryFunction &Function,
32 const BinaryContext &BC = Function.getBinaryContext();
37 return Function.getBasicBlockForLabel(BC.MIB->getTargetSymbol(Inst));
96 void ValidateInternalCalls::fixCFGForPIC(BinaryFunction &Function) const {
98 for (BinaryBasicBlock &BB : Function)
108 return getInternalCallTarget(Function, Inst) != nullptr;
115 BinaryBasicBlock *Target = getInternalCallTarget(Function, *InternalCall);
119 std::unique_ptr<BinaryBasicBlock> NewBB = Function.createBasicBlock();
126 Function.insertBasicBlocks(&BB, std::move(NewBBs));
134 bool ValidateInternalCalls::fixCFGForIC(BinaryFunction &Function) const {
135 const BinaryContext &BC = Function.getBinaryContext();
137 StackPointerTrackingForInternalCalls SPTIC(Function);
142 ReachingInsns<false> RI(Function);
146 DataflowInfoManager Info(Function, nullptr, nullptr);
154 if (!getInternalCallTarget(Function, ReachingInst) ||
175 Function.getLayout().getBasicBlockAfter(CallerBlock);
186 for (BinaryBasicBlock &BB : Function) {
198 BinaryFunction &Function) const {
199 const BinaryContext &BC = Function.getBinaryContext();
200 for (BinaryBasicBlock &BB : Function)
207 bool ValidateInternalCalls::analyzeFunction(BinaryFunction &Function) const {
208 fixCFGForPIC(Function);
209 while (fixCFGForIC(Function)) {
212 BinaryContext &BC = Function.getBinaryContext();
215 bool HasTailCalls = hasTailCallsInRange(Function);
217 for (BinaryBasicBlock &BB : Function) {
219 BinaryBasicBlock *Target = getInternalCallTarget(Function, Inst);
224 LLVM_DEBUG(dbgs() << Function
240 dbgs() << "Frame analysis failed - not simple: " << Function << "\n";
241 Function.dump();
250 << Function << "\n";
251 Function.dump();
257 ReachingDefOrUse<false>(RA, Function, Reg);
279 Offset + Output > static_cast<int64_t>(Function.getSize())) {
281 dbgs() << "Detected out-of-range PIC reference in " << Function
286 Function.dump();
308 BinaryFunction &Function = BFI.second;
309 for (BinaryBasicBlock &BB : Function) {
311 if (getInternalCallTarget(Function, Inst)) {
313 << Function << '\n';
314 NeedsValidation.insert(&Function);
315 Function.setSimple(false);
316 Function.setPreserveNops(true);
336 for (BinaryFunction *Function : NeedsValidation) {
337 LLVM_DEBUG(dbgs() << "Validating " << *Function << "\n");
338 if (!analyzeFunction(*Function))
339 Invalid.insert(Function);
340 clearAnnotations(*Function);
347 for (BinaryFunction *Function : Invalid) {
348 BC.errs() << " " << *Function << "\n";
349 Function->setIgnored();