<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    <div class="moz-cite-prefix">On 5/17/16 10:57 AM, mats petersson
      wrote:<br>
    </div>
    <blockquote
cite="mid:CAL-htr6Q9_Sc9jGOUb9KHgjZK3xd+WaWWSv1wDn2xkk9DMkCQQ@mail.gmail.com"
      type="cite">
      <meta http-equiv="Context-Type" content="text/html; charset=UTF-8">
      <div dir="ltr"><br>
        <div class="gmail_extra"><br>
          <div class="gmail_quote">On 17 May 2016 at 15:45, John
            Criswell via llvm-dev <span dir="ltr"><<a
                moz-do-not-send="true"
                href="mailto:llvm-dev@lists.llvm.org" target="_blank"><a class="moz-txt-link-abbreviated" href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a></a>></span>
            wrote:<br>
            <blockquote class="gmail_quote">
              <div><span class="">
                  <div>On 5/17/16 4:13 AM, PeiLIU via llvm-dev wrote:<br>
                  </div>
                  <blockquote type="cite">
                    <div dir="ltr">Now, I am using LLVM-3.3 do some
                      process with functions, however there are some
                      difficult things I can't handle by myself. So, 
                      <div><br>
                      </div>
                      <div>I want get your help to get it down properly.</div>
                      <div><br>
                      </div>
                      <div>Q1. There is a function declaration:</div>
                      <div><br>
                      </div>
                      <div>call i32 @create(i64* %tid, %union.t* %pab,
                        i8* (i8*)* @worker, i8* null) // callInst<br>
                      </div>
                      <div><br>
                      </div>
                      <div>Store instruction goes like this:</div>
                      <div><br>
                      </div>
                      <div>store i8* (i32, double, i32*)* %fp, i8* (i32,
                        double, i32*)** %fp.addr // storeInst<br>
                      </div>
                      <div><br>
                      </div>
                      <div>I want to determine the type of the operands
                        are function pointer or not? (That's what I
                        want)</div>
                      <div><br>
                      </div>
                      <div>However,
                        callInst->getOperand(2)->getType()->getTypeID()
                        always return 14 that'a the enum number of</div>
                      <div><br>
                      </div>
                      <div>PointerTypeID. For the store instruction,
                        first operand is the same as the operation with
                        call instruction.</div>
                      <div><br>
                      </div>
                      <div>How can I get the function pointer properly?</div>
                    </div>
                  </blockquote>
                  <br>
                </span> Instead of looking at the Type ID, you should
                use isa<FunctionType> to determine if the value
                has function type:<br>
                <br>
                if
                (isa<FunctionType>(callInst->getOperand(2)->getType())
                {<br>
                  ... <second operand has function type><br>
                }<br>
                <br>
                In LLVM, functions are global variables and therefore
                are a pointer type.<span class=""><br>
                  <br>
                  <blockquote type="cite">
                    <div dir="ltr">
                      <div><br>
                      </div>
                      <div>Q2. Function arguments can be passed by value
                        or by pointer in C-programming language.</div>
                      <div><br>
                      </div>
                      <div>
                        <div>int arr[10];</div>
                        <div>struct node {</div>
                        <div><span> </span>int a;</div>
                        <div><span> </span>int att[10];</div>
                        <div><span> </span>double ul;</div>
                        <div>};</div>
                        <div><br>
                        </div>
                        <div>struct node Node;</div>
                      </div>
                      <div><br>
                      </div>
                      <div>testStruct(Node);<br>
                      </div>
                      <div><br>
                      </div>
                      <div>
                        <div>testStructPointer(&Node);</div>
                      </div>
                      <div><br>
                      </div>
                      <div>After compiled and change it to .ll file, it
                        looks like this:</div>
                      <div><br>
                      </div>
                      <div>call void @testStruct(%struct.node* byval
                        align 8 @Node), !dbg !160<br>
                      </div>
                      <div><br>
                      </div>
                      <div>call void @testStructPointer(%struct.node*
                        @Node), !dbg !161<br>
                      </div>
                      <div><br>
                      </div>
                      <div>You can see that function named
                        testStruction's parameter is passed by value
                        while the testStructPointer passed by pointer.</div>
                      <div><br>
                      </div>
                      <div>I used
                        callInst->getOperand(0)->getType()->dump(),
                        it always return the same %struct.node*.</div>
                      <div><br>
                      </div>
                      <div>I want to know is there some properly library
                        functions can be used to get the precise
                        parameters type?</div>
                      <div><br>
                      </div>
                      <div>I want to know the functions arguments are
                        passed by value or by pointer?</div>
                    </div>
                  </blockquote>
                  <br>
                </span> In LLVM, all parameters are passed by value
                unless they have the byval attribute.  There's probably
                a method in the Argument class that will tell you
                whether the argument has the byval attribute.  If it's
                not an attribute of the Argument class, it's probably
                part of the type of the Function.<br>
              </div>
            </blockquote>
            <div>I think you mean that they are "by reference unless
              they have a byval" attribute?<br>
            </div>
          </div>
        </div>
      </div>
    </blockquote>
    <br>
    Sorry.  You are correct.  I got the SSA value (which is always
    passed by value) mixed up with the memory to which it points.  It's
    been awhile since I've had to deal with byval.<br>
    <br>
    I took a quick look at Doxygen; the Argument class also has a byval
    attribute (Argument::hasByValAttr()).  I think both the call
    instruction and the Argument have the attribute and need to match in
    order to get defined behavior.<br>
    <br>
    Regards,<br>
    <br>
    John Criswell<br>
    <br>
    <pre class="moz-signature" cols="72">-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
<a class="moz-txt-link-freetext" href="http://www.cs.rochester.edu/u/criswell">http://www.cs.rochester.edu/u/criswell</a></pre>
  </body>
</html>