<div dir="ltr"><img src="http://t.signalecinque.com/e1t/o/5/f18dQhb0S7ks8dDMPbW2n0x6l2B9gXrN7sKj6v5dj0qW64JvZH6538V-MdV5ZMQFLCHW2swVb-1k1H6H0?si=5235970534801408&pi=cbb49051-d98a-4cda-ad11-19966ceace17" width="1" height="1" style="display:none"><div class="gmail_extra"><div class="gmail_quote"><div>Hi Simon,</div><div> <br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
From: Simone Atzeni <<a href="mailto:simone.at@gmail.com">simone.at@gmail.com</a>><br>
To: John Criswell <<a href="mailto:jtcriswel@gmail.com">jtcriswel@gmail.com</a>><br>
Cc: <a href="mailto:llvmdev@cs.uiuc.edu">llvmdev@cs.uiuc.edu</a><br>
Subject: Re: [LLVMdev] Walking thru CallGraph bottom up<br>
Message-ID: <<a href="mailto:318EBA41-2040-4EFE-B330-5813C817C2A2@gmail.com">318EBA41-2040-4EFE-B330-5813C817C2A2@gmail.com</a>><br>
Content-Type: text/plain; charset="windows-1252"<br>
<br>
I think I got it and the example is pretty, however for what I understand, I can get the CallGraphNode for a given function F that has a list that represents all the functions that F is calling, but how can I get the list of the functions that are calling F? There is not a sort a similar list?<br></blockquote><div><br></div><div>After doing a simple search inside the LLVM documents, I found no so such data structures or methods for finding the callers of a CallGraphNode.</div><div><br></div><div>However, since your problem is to find the path from main to the target function in the CallGraph, I think a depth-first-search from the main node might work. Following is the algorithm I have in mind.</div><div><br></div><div>1. You can keep a list of functions in your search path, pushing to the list each time you visit a new node.</div><div>2. If you find the one you currently have is a wrong path (you reach a leaf or a visited node), you pop out all the functions in the wrong path from your list.</div><div>3. Search in another path, until you hit the node you're looking for. </div><div>4. And then you can have a call path from main to your function in the list.</div><div><br></div><div>Note that you may need a DFS on the entire CallGraph if you want all possible call paths from main to your function.</div><div><br></div><div>IMHO, by getting a list of callers of a target function doesn't actually help simplify the problem a lot. You still need a  DFS or BFS from the node to find the main function node.</div><div><br></div><div>Hope this helps a little.</div><div><br></div><div>Apologies if you find any format, layout or etiquette problems in my mail. This is the first time I write to a mailing list.</div><div><br></div><div>Thanks.</div><div><br></div><div>---</div><div>Regards,</div><div>Kevin Hu</div><div><a href="mailto:hxy9243@gmail.com">hxy9243@gmail.com</a></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Thanks.<br>
Simone<br>
<br>
> On Feb 25, 2015, at 09:01, John Criswell <<a href="mailto:jtcriswel@gmail.com">jtcriswel@gmail.com</a>> wrote:<br>
><br>
> On 2/25/15 10:51 AM, Simone Atzeni wrote:<br>
>> Thanks John.<br>
>><br>
>> I guess I will use a ModulePass, so when I am implementing the ?runOnModule? function,<br>
>> do I have to loop through all the functions, for each functions all the BasicBlocks and for each BasicBlock all the instructions<br>
><br>
> If you know the Instruction, you can get it's basic block using Instruction::getParent(), and then get its enclosing function using BasicBlock::getParent().<br>
><br>
> Once you know the enclosing function, you can use the CallGraph pass to find which functions call it, and then repeat the procedures for functions calling that function, etc.<br>
><br>
>> or given the Module I have to call the CallGraph directly?<br>
>> Is there an example out there? I can?t find anything.<br>
><br>
> It uses the DSA CallGraph pass, but <a href="http://llvm.org/viewvc/llvm-project/safecode/branches/release_32/lib/InsertPoolChecks/CFIChecks.cpp?revision=189030&view=markup" target="_blank">http://llvm.org/viewvc/llvm-project/safecode/branches/release_32/lib/InsertPoolChecks/CFIChecks.cpp?revision=189030&view=markup</a> <<a href="http://llvm.org/viewvc/llvm-project/safecode/branches/release_32/lib/InsertPoolChecks/CFIChecks.cpp?revision=189030&view=markup" target="_blank">http://llvm.org/viewvc/llvm-project/safecode/branches/release_32/lib/InsertPoolChecks/CFIChecks.cpp?revision=189030&view=markup</a>> might provide a decent example.<br>
><br>
> Regards,<br>
><br>
> John Criswell<br>
><br>
>><br>
>> Thanks.<br>
>> Simone<br>
>><br>
>>> On Feb 24, 2015, at 13:29, John Criswell <<a href="mailto:jtcriswel@gmail.com">jtcriswel@gmail.com</a>> wrote:<br>
>>><br>
>>> On 2/24/15 2:27 PM, Simone Atzeni wrote:<br>
>>>> Hi all,<br>
>>>><br>
>>>> I would like to create a Pass that given an IR instruction walks starting from that instruction up to the main function<br>
>>>> to identify all the functions call that have been made to call that instruction.<br>
>>>><br>
>>>> Is it possible? What kind of Pass should I create?<br>
>>> Yes, it is possible.  I think a ModulePass would be most appropriate, though a FunctionPass may be alright.<br>
>>><br>
>>> To get the call graph, you can use LLVM's CallGraph analysis.  If you need to handle function pointers more accurately than LLVM's internal CallGraph analysis does, you can use DSA's CallGraph analysis (which has the same interface but may only work with LLVM 3.2 and earlier LLVM releases).<br>
>>><br>
>>> -- John T.<br>
>>><br>
>>>> Thanks<br>
>>>> Best,<br>
>>>> Simone<br>
>>>><br>
>>>> Simone Atzeni<br>
>>>> <a href="mailto:simone.at@gmail.com">simone.at@gmail.com</a><br>
>>>> <a href="tel:%2B1%20%28801%29%20696-8373" value="+18016968373">+1 (801) 696-8373</a><br>
>>>><br>
>>>><br>
>>>> _______________________________________________<br>
>>>> LLVM Developers mailing list<br>
>>>> <a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
>>>> <a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
>>><br>
>>> --<br>
>>> John Criswell<br>
>>> Assistant Professor<br>
>>> Department of Computer Science, University of Rochester<br>
>>> <a href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a><br>
>>><br>
><br>
><br>
> --<br>
> John Criswell<br>
> Assistant Professor<br>
> Department of Computer Science, University of Rochester<br>
> <a href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a> <<a href="http://www.cs.rochester.edu/u/criswell" target="_blank">http://www.cs.rochester.edu/u/criswell</a>><br>
-------------- next part --------------<br>
An HTML attachment was scrubbed...<br>
URL: <<a href="http://lists.cs.uiuc.edu/pipermail/llvmdev/attachments/20150226/51760124/attachment-0001.html" target="_blank">http://lists.cs.uiuc.edu/pipermail/llvmdev/attachments/20150226/51760124/attachment-0001.html</a>><br>d of LLVMdev Digest, Vol 128, Issue 111<br>
*****************************************<br>
</blockquote></div><br><br clear="all"><div><br></div><div class="gmail_signature"><div dir="ltr">Yours,<div>Kevin Hu</div></div></div>
</div></div>