[llvm-dev] Finding callees of a function
Doerfert, Johannes via llvm-dev
llvm-dev at lists.llvm.org
Wed Jan 15 10:40:38 PST 2020
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>
More information about the llvm-dev
mailing list