[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