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
_______________________________________________
LLVM Developers mailing list
llvm...@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
On Wed, 15 Jan 2020 at 09:52, Marc via llvm-dev <llvm...@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.
Zhang
Zhang
> 在 2020年1月15日,17:58,Tim Northover via llvm-dev <llvm...@lists.llvm.org> 写道:
>