<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>