================ @@ -3361,6 +3382,194 @@ void PPCAIXAsmPrinter::emitModuleCommandLines(Module &M) { OutStreamer->emitXCOFFCInfoSym(".GCC.command.line", RSOS.str()); } +static bool TOCRestoreNeeded(const GlobalIFunc &GI) { + auto IsLocalFunc = [&](const Value *V) { + if (!isa<Function>(V)) + return false; + auto *F = cast<Function>(V); + + // static functions are local + if (F->getLinkage() == GlobalValue::InternalLinkage) + return true; + // for now, declarations we treat as potentially non-local + if (F->isDeclarationForLinker()) + return false; + // hidden visibility definitions cannot be preempted, so treat as local. + if (F->getVisibility() == GlobalValue::HiddenVisibility) + return true; + + return false; + }; + + if (!IFuncLocal.empty()) { + ArrayRef<std::string> List = IFuncLocal; + // special case of -ifunc-local=1 + if (List.size() == 1 && List[0].compare("1") == 0) + return false; + StringRef IFuncName = GI.getName(); + if (any_of(List, [&](const std::string &Element) { + return Element.size() == IFuncName.size() && + Element.compare(IFuncName.data()) == 0; + })) + return false; + } + + // if one of the return values of the resolver function is not a + // local function, then we have to conservatively do a TOC save/restore. + auto *Resolver = GI.getResolverFunction(); ---------------- w2yehia wrote:
the resolver can be preempted so only walk the body if it's not preemtible. double check that it's valid to have a preemptible resolver. https://github.com/llvm/llvm-project/pull/153049 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits