Lines Matching refs:G
186 void replaceBy(Function *G) const { in replaceBy()
187 F = G; in replaceBy()
255 void mergeTwoFunctions(Function *F, Function *G);
263 void eraseTail(Function *G);
272 void writeThunk(Function *F, Function *G);
275 void writeAlias(Function *F, Function *G);
279 bool writeThunkOrAlias(Function *F, Function *G);
282 void replaceFunctionInTree(const FunctionNode &FN, Function *G);
527 void MergeFunctions::eraseTail(Function *G) { in eraseTail() argument
529 for (BasicBlock &BB : drop_begin(*G)) { in eraseTail()
680 void MergeFunctions::writeThunk(Function *F, Function *G) { in writeThunk() argument
688 << G->getName() << "()\n"); in writeThunk()
689 GEntryBlock = &G->getEntryBlock(); in writeThunk()
693 << G->getName() << "() {\n"); in writeThunk()
698 NewG = Function::Create(G->getFunctionType(), G->getLinkage(), in writeThunk()
699 G->getAddressSpace(), "", G->getParent()); in writeThunk()
700 NewG->setComdat(G->getComdat()); in writeThunk()
705 Function *H = MergeFunctionsPDI ? G : NewG; in writeThunk()
717 G->getCallingConv() == CallingConv::SwiftTail; in writeThunk()
729 DISubprogram *DIS = G->getSubprogram(); in writeThunk()
740 << G->getName() << "()\n"); in writeThunk()
742 eraseTail(G); in writeThunk()
746 << G->getName() << "()\n"); in writeThunk()
748 NewG->copyAttributesFrom(G); in writeThunk()
749 NewG->takeName(G); in writeThunk()
751 copyMetadataIfPresent(G, NewG, "type"); in writeThunk()
752 copyMetadataIfPresent(G, NewG, "kcfi_type"); in writeThunk()
753 removeUsers(G); in writeThunk()
754 G->replaceAllUsesWith(NewG); in writeThunk()
755 G->eraseFromParent(); in writeThunk()
774 void MergeFunctions::writeAlias(Function *F, Function *G) { in writeAlias() argument
775 PointerType *PtrType = G->getType(); in writeAlias()
776 auto *GA = GlobalAlias::create(G->getValueType(), PtrType->getAddressSpace(), in writeAlias()
777 G->getLinkage(), "", F, G->getParent()); in writeAlias()
780 const MaybeAlign GAlign = G->getAlign(); in writeAlias()
785 GA->takeName(G); in writeAlias()
786 GA->setVisibility(G->getVisibility()); in writeAlias()
789 removeUsers(G); in writeAlias()
790 G->replaceAllUsesWith(GA); in writeAlias()
791 G->eraseFromParent(); in writeAlias()
799 bool MergeFunctions::writeThunkOrAlias(Function *F, Function *G) { in writeThunkOrAlias() argument
800 if (canCreateAliasFor(G)) { in writeThunkOrAlias()
801 writeAlias(F, G); in writeThunkOrAlias()
805 writeThunk(F, G); in writeThunkOrAlias()
812 void MergeFunctions::mergeTwoFunctions(Function *F, Function *G) { in mergeTwoFunctions() argument
814 assert(G->isInterposable()); in mergeTwoFunctions()
820 (!canCreateAliasFor(F) || !canCreateAliasFor(G))) in mergeTwoFunctions()
837 const MaybeAlign GAlign = G->getAlign(); in mergeTwoFunctions()
839 writeThunkOrAlias(F, G); in mergeTwoFunctions()
852 if (!G->isInterposable() && !MergeFunctionsPDI) { in mergeTwoFunctions()
856 if (G->hasGlobalUnnamedAddr() && !Used.contains(G)) { in mergeTwoFunctions()
859 GlobalNumbers.erase(G); in mergeTwoFunctions()
861 removeUsers(G); in mergeTwoFunctions()
862 G->replaceAllUsesWith(F); in mergeTwoFunctions()
866 replaceDirectCallers(G, F); in mergeTwoFunctions()
873 if (G->isDiscardableIfUnused() && G->use_empty() && !MergeFunctionsPDI) { in mergeTwoFunctions()
874 G->eraseFromParent(); in mergeTwoFunctions()
879 if (writeThunkOrAlias(F, G)) { in mergeTwoFunctions()
887 Function *G) { in replaceFunctionInTree() argument
889 assert(FunctionComparator(F, G, &GlobalNumbers).compare() == 0 && in replaceFunctionInTree()
894 assert(FNodesInTree.count(G) == 0 && "FNodesInTree should not contain G"); in replaceFunctionInTree()
900 FNodesInTree.insert({G, IterToFNInFnTree}); in replaceFunctionInTree()
902 FN.replaceBy(G); in replaceFunctionInTree()
906 static bool isFuncOrderCorrect(const Function *F, const Function *G) { in isFuncOrderCorrect() argument
907 if (F->isInterposable() != G->isInterposable()) { in isFuncOrderCorrect()
912 if (F->hasLocalLinkage() != G->hasLocalLinkage()) { in isFuncOrderCorrect()
920 return F->getName() <= G->getName(); in isFuncOrderCorrect()