I searched the doxygen documentation and could not find a solution to my task: In a ModulePass running at EP_OptimizerLast, if I have a function F like in: bool Foo:runOnModule(Module &M) { LLVMContext &C = M.getContext(); for (auto &F : M) { // magic here if I want to know from which function (callee) each function is called - how can I do this? (so that I e.g. have a "Function *callee" result or a list if it is called from several other functions - or even better, the specific basic blocks where the calls are.) I am aware that this will not work for calls that are made outside of the analyzed module. Thanks! Regards, Marc -- Marc Heuse www.mh-sec.de PGP: AF3D 1D4C D810 F0BB 977D 3807 C7EE D0A0 6BE9 F573
Hi Marc, On Wed, 15 Jan 2020 at 09:52, Marc via llvm-dev <llvm-dev at lists.llvm.org> wrote:> bool Foo:runOnModule(Module &M) { > LLVMContext &C = M.getContext(); > for (auto &F : M) { > // magic here > > if I want to know from which function (callee) each function is called - > how can I do this?To get the direct callers you would iterate through the users of F, and check whether it's being used as the callee operand in a CallInst or InvokeInst. Fortunately there's a CallSite class that abstracts away many of the differences. So something like: for (auto &U : F.getUsers()) { if (auto CS = CallSite(U)) { if (CS->getCalledFunction() == F) doStuff(CS); } }> I am aware that this will not work for calls that are made outside of > the analyzed module.Also indirect calls. Cheers. Tim.
You should use getCalledValue()->stripPointerCasts() instead Zhang> 在 2020年1月15日,17:58,Tim Northover via llvm-dev <llvm-dev at lists.llvm.org> 写道: > > Hi Marc, > >> On Wed, 15 Jan 2020 at 09:52, Marc via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> bool Foo:runOnModule(Module &M) { >> LLVMContext &C = M.getContext(); >> for (auto &F : M) { >> // magic here >> >> if I want to know from which function (callee) each function is called - >> how can I do this? > > To get the direct callers you would iterate through the users of F, > and check whether it's being used as the callee operand in a CallInst > or InvokeInst. Fortunately there's a CallSite class that abstracts > away many of the differences. So something like: > > for (auto &U : F.getUsers()) { > if (auto CS = CallSite(U)) { > if (CS->getCalledFunction() == F) > doStuff(CS); > } > } > >> I am aware that this will not work for calls that are made outside of >> the analyzed module. > > Also indirect calls. > > Cheers. > > Tim. > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
——-If you need to handle indirect calls Zhang> 在 2020年1月15日,17:58,Tim Northover via llvm-dev <llvm-dev at lists.llvm.org> 写道: > > Hi Marc, > >> On Wed, 15 Jan 2020 at 09:52, Marc via llvm-dev <llvm-dev at lists.llvm.org> wrote: >> bool Foo:runOnModule(Module &M) { >> LLVMContext &C = M.getContext(); >> for (auto &F : M) { >> // magic here >> >> if I want to know from which function (callee) each function is called - >> how can I do this? > > To get the direct callers you would iterate through the users of F, > and check whether it's being used as the callee operand in a CallInst > or InvokeInst. Fortunately there's a CallSite class that abstracts > away many of the differences. So something like: > > for (auto &U : F.getUsers()) { > if (auto CS = CallSite(U)) { > if (CS->getCalledFunction() == F) > doStuff(CS); > } > } > >> I am aware that this will not work for calls that are made outside of >> the analyzed module. > > Also indirect calls. > > Cheers. > > Tim. > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
Doerfert, Johannes via llvm-dev
2020-Jan-15 18:40 UTC
[llvm-dev] Finding callees of a function
On 01/15, Tim Northover via llvm-dev wrote:> Hi Marc, > > On Wed, 15 Jan 2020 at 09:52, Marc via llvm-dev <llvm-dev at lists.llvm.org> wrote: > > bool Foo:runOnModule(Module &M) { > > LLVMContext &C = M.getContext(); > > for (auto &F : M) { > > // magic here > > > > if I want to know from which function (callee) each function is called - > > how can I do this? > > To get the direct callers you would iterate through the users of F, > and check whether it's being used as the callee operand in a CallInst > or InvokeInst. Fortunately there's a CallSite class that abstracts > away many of the differences. So something like: > > for (auto &U : F.getUsers()) { > if (auto CS = CallSite(U)) { > if (CS->getCalledFunction() == F) > doStuff(CS); > } > }Nit: This might visit the same call site multiple times if the function is passed as a function pointer argument to recursive call `f(&f, &f)`. for (auto &U : F.getUses()) { if (auto CS = CallSite(U.getUser())) { if (CS->isCallee(&U)) doStuff(CS); } } or, if you also want to deal with callback calls [0, 1, 2], you can do: for (auto &U : F.getUses()) { if (auto ACS = AbstractCallSite(U)) doStuff(ACS); // or ACS.getCallSite() } Cheers, Johannes [0] https://clang.llvm.org/docs/AttributeReference.html#callback [1] https://llvm.org/docs/LangRef.html#callback-metadata [2] https://www.youtube.com/watch?v=zfiHaPaoQPc> > I am aware that this will not work for calls that are made outside of > > the analyzed module. > > Also indirect calls. > > Cheers. > > Tim. > _______________________________________________ > LLVM Developers mailing list > llvm-dev at lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev-- Johannes Doerfert Researcher Argonne National Laboratory Lemont, IL 60439, USA jdoerfert at anl.gov -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 228 bytes Desc: not available URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20200115/d9d5ec85/attachment.sig>
Maybe Matching Threads
- [LLVMdev] the called function equal NULL
- Change function call name in a CallInst only in certain functions
- CallInst::getCalledFunction returns null?
- [LLVMdev] the called function equal NULL
- Change function call name in a CallInst only in certain functions