<div dir="ltr">Mr. John, really appreciate your help! I will try DSA and see whether it works or not, Thank you!<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jul 18, 2015 at 10:54 AM, John Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
  
    
  
  <div bgcolor="#FFFFFF" text="#000000"><span class="">
    <div>On 7/17/15 8:32 PM, Shen Liu wrote:<br>
    </div>
    <blockquote type="cite">
      <div dir="ltr">John, thanks for your helpful advice. 
        <div><br>
        </div>
        <div>My ultimate goal is to construct a full instruction-level
          program dependence graph for a given IR file. The hard point
          is how to establish the correct data dependence edges when
          some function arguments are multi-level pointers. To solve
          this problem I hope to check the point-to level for each
          pointer variable. I think the data dependence through pointers
          can be described more accurately in this way. Unfortunately i
          didn't find any available interface to finish this job, so i
          guess i have to write it by myself.    <br>
        </div>
      </div>
    </blockquote>
    <br></span>
    It sounds like you need a shape graph.  DSA can provide that, and it
    currently works with LLVM mainline.  You can find it in the
    poolalloc module (svn co
    <a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__llvm.org_svn_llvm-2Dproject_poolalloc_trunk&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=4Fkok2SMdgjX2KWr3Tku5ByoVQVlmWtkiVS0CO-RPo4&s=QwCuG6qThzCryEK43GeRSRpAac4DDzE8tuBh3RYH1Z8&e=" target="_blank">http://llvm.org/svn/llvm-project/poolalloc/trunk</a> poolalloc) or a
    slightly older version on my Github page
    (<a href="https://urldefense.proofpoint.com/v2/url?u=https-3A__github.com_jtcriswell_llvm-2Ddsa&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=4Fkok2SMdgjX2KWr3Tku5ByoVQVlmWtkiVS0CO-RPo4&s=oUiHDUOfC9xNHeMIvflNS3lbB_x10XH8IiuFbiZq8Wc&e=" target="_blank">https://github.com/jtcriswell/llvm-dsa</a>).  Please note that the
    version from LLVM SVN will only compile lib/DSA.  I don't think
    anyone has brought lib/PoolAllocate up to date.<br>
    <br>
    There is documentation which gives a very basic overview of the DSA
    passes and how to use the shape graph.<br>
    <br>
    The open question is whether DSA will be sufficiently accurate for
    your needs.  Of that, I'm not sure.  You would need to try it out
    and see if it's sufficient accurate for you.<div><div class="h5"><br>
    <br>
    Regards,<br>
    <br>
    John Criswell<br>
    <br>
    <br>
    <blockquote type="cite">
      <div dir="ltr">
        <div>  </div>
        <div><br>
        </div>
        <div>Best regards,</div>
        <div><br>
        </div>
        <div>Shen</div>
        <div><br>
        </div>
        <div><br>
        </div>
      </div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">On Fri, Jul 17, 2015 at 2:22 PM, John
          Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span>
          wrote:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div bgcolor="#FFFFFF" text="#000000"><span>
                <div>On 7/17/15 1:06 PM, Shen Liu wrote:<br>
                </div>
                <blockquote type="cite">
                  <div dir="ltr"> John, thanks for you answer! But as
                    far as I know LLVM doesn't provide any interface for
                    finding the pointee of a pointer directly, so i have
                    to process a multi-level pointer i need to write my
                    own function to check pointers level by level, is
                    that right?<br>
                  </div>
                </blockquote>
                <br>
              </span> I'm not sure what you're trying to do.  If you're
              trying to determine the LLVM pointer type and the LLVM
              type to which it points, what I've said will work.<br>
              <br>
              If you're trying to do something more complicated, then
              you need to explain more clearly what you want to do.  I
              think it would also help if you "jumped up a level" and
              explained what your end goal is so that the community can
              give you better advice.  Based on your previous emails, it
              seems like you're asking very specific questions instead
              of asking how to best achieve your overall goal.<br>
              <br>
              Regards,<br>
              <br>
              John Criswell<span><br>
                <br>
                <br>
                <blockquote type="cite">
                  <div class="gmail_extra"><br>
                    <div class="gmail_quote">On Fri, Jul 17, 2015 at
                      1:47 PM, John Criswell <span dir="ltr"><<a href="mailto:jtcriswel@gmail.com" target="_blank">jtcriswel@gmail.com</a>></span>
                      wrote:<br>
                      <blockquote class="gmail_quote">
                        <div><span>
                            <div>On 7/17/15 12:38 PM, Shen Liu wrote:<br>
                            </div>
                            <blockquote type="cite">
                              <div dir="ltr">Hi all, as a LLVM beginner
                                I would like to know how can i check the
                                pointer types with different levels like
                                int 32* and int 32**, int 32***? 
                                <div><br>
                                </div>
                                <div>By using
                                  value->getType()->isPointerTy()
                                  i can just know they are pointers. But
                                  the dump results clearly show they are
                                  different. Is there a good way to
                                  calculate their actual point to
                                  levels? Thanks!</div>
                              </div>
                            </blockquote>
                            <br>
                          </span> You will need to use
                          dyn_cast<PointerType> to cast the Type *
                          into a PointerType *.  Once you do that, you
                          can find the Type * that the PointerType
                          points to.<br>
                          <br>
                          Regards,<br>
                          <br>
                          John Criswell<br>
                          <br>
                          <blockquote type="cite">
                            <div dir="ltr">
                              <div><br>
                              </div>
                              <div><br>
                              </div>
                              <div>Best regards,</div>
                              <div><br>
                              </div>
                              <div>Shen</div>
                            </div>
                            <br>
                            <fieldset></fieldset>
                            <br>
                            <pre>_______________________________________________
LLVM Developers mailing list
<a href="mailto:LLVMdev@cs.uiuc.edu" target="_blank">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><span>
</span></pre>
                            <span> </span></blockquote>
                          <span> <br>
                            <br>
                            <pre cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__www.cs.rochester.edu_u_criswell&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=4Fkok2SMdgjX2KWr3Tku5ByoVQVlmWtkiVS0CO-RPo4&s=FscT1b5IgRLf5AYDQfIbF5zZfrp9caDPs0ePGi-MQbo&e=" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
                          </span></div>
                      </blockquote>
                    </div>
                    <br>
                  </div>
                </blockquote>
                <br>
                <br>
                <pre cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__www.cs.rochester.edu_u_criswell&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=4Fkok2SMdgjX2KWr3Tku5ByoVQVlmWtkiVS0CO-RPo4&s=FscT1b5IgRLf5AYDQfIbF5zZfrp9caDPs0ePGi-MQbo&e=" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
              </span></div>
          </blockquote>
        </div>
        <br>
      </div>
    </blockquote>
    <br>
    <br>
    <pre cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a href="https://urldefense.proofpoint.com/v2/url?u=http-3A__www.cs.rochester.edu_u_criswell&d=AwMFaQ&c=8hUWFZcy2Z-Za5rBPlktOQ&r=Mfk2qtn1LTDThVkh6-oGglNfMADXfJdty4_bhmuhMHA&m=4Fkok2SMdgjX2KWr3Tku5ByoVQVlmWtkiVS0CO-RPo4&s=FscT1b5IgRLf5AYDQfIbF5zZfrp9caDPs0ePGi-MQbo&e=" target="_blank">http://www.cs.rochester.edu/u/criswell</a></pre>
  </div></div></div>

</blockquote></div><br></div>