[llvm-dev] Finding all pointers to functions

Russell Wallace via llvm-dev llvm-dev at lists.llvm.org
Tue Dec 22 01:45:30 PST 2015


Oh, I just came across Function::hasAddressTaken. Maybe I can just use that
instead?

On Tue, Dec 22, 2015 at 5:11 AM, Russell Wallace <russell.wallace at gmail.com>
wrote:

> I need to track down all pointers anywhere in a module that could be
> pointing to functions (because some of the optimizations I want to do,
> require either identifying every use of a function, or conservatively
> identifying when such cannot be done).
>
> A starting point is to look at all the global variables:
>
>   for (auto &G : M.globals())
>     for (auto &V : G.operands())
>       if (auto F = dyn_cast<Function>(V))
>
> Of course, instructions can also refer to functions, both as direct calls
> and otherwise:
>
>   for (auto &F : M) {
>     for (auto &I : inst_range(F)) {
>       for (auto &V : I.operands())
>         if (auto F = dyn_cast<Function>(V))
>
> But there are other things as well, for example it seems there is
> something called a personality function that can be a pointer to another
> function, so need to add that
>
>     if (F.hasPersonalityFn())
>
> It seems there are other things called prefix data and prologue data,
> which are pointers to constants, which could contain pointers to functions,
> so would need to include those as well.
>
> Am I correct in thinking that prefix data and prologue data will not be
> included in the global variables list, so do need special handling?
>
> Could they be recursive? That is, could those constants contain pointers
> to other constants... which end up containing pointers to functions... such
> that none of the intermediate constant objects are in the global variable
> list?
>
> Is there anything else I'm missing?
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20151222/9c6c50dc/attachment.html>


More information about the llvm-dev mailing list