[llvm-dev] Function arguments pass by value or by reference.

John Criswell via llvm-dev llvm-dev at lists.llvm.org
Tue May 17 09:08:53 PDT 2016

On 5/17/16 10:57 AM, mats petersson wrote:
> On 17 May 2016 at 15:45, John Criswell via llvm-dev 
> <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>     On 5/17/16 4:13 AM, PeiLIU via llvm-dev wrote:
>>     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,
>>     I want get your help to get it down properly.
>>     Q1. There is a function declaration:
>>     call i32 @create(i64* %tid, %union.t* %pab, i8* (i8*)* @worker,
>>     i8* null) // callInst
>>     Store instruction goes like this:
>>     store i8* (i32, double, i32*)* %fp, i8* (i32, double, i32*)**
>>     %fp.addr // storeInst
>>     I want to determine the type of the operands are function pointer
>>     or not? (That's what I want)
>>     However, callInst->getOperand(2)->getType()->getTypeID() always
>>     return 14 that'a the enum number of
>>     PointerTypeID. For the store instruction, first operand is the
>>     same as the operation with call instruction.
>>     How can I get the function pointer properly?
>     Instead of looking at the Type ID, you should use
>     isa<FunctionType> to determine if the value has function type:
>     if (isa<FunctionType>(callInst->getOperand(2)->getType()) {
>       ... <second operand has function type>
>     }
>     In LLVM, functions are global variables and therefore are a
>     pointer type.
>>     Q2. Function arguments can be passed by value or by pointer in
>>     C-programming language.
>>     int arr[10];
>>     struct node {
>>     int a;
>>     int att[10];
>>     double ul;
>>     };
>>     struct node Node;
>>     testStruct(Node);
>>     testStructPointer(&Node);
>>     After compiled and change it to .ll file, it looks like this:
>>     call void @testStruct(%struct.node* byval align 8 @Node), !dbg !160
>>     call void @testStructPointer(%struct.node* @Node), !dbg !161
>>     You can see that function named testStruction's parameter is
>>     passed by value while the testStructPointer passed by pointer.
>>     I used callInst->getOperand(0)->getType()->dump(), it always
>>     return the same %struct.node*.
>>     I want to know is there some properly library functions can be
>>     used to get the precise parameters type?
>>     I want to know the functions arguments are passed by value or by
>>     pointer?
>     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.
> I think you mean that they are "by reference unless they have a byval" 
> attribute?

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.

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.


John Criswell

John Criswell
Assistant Professor
Department of Computer Science, University of Rochester

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160517/10caa1b7/attachment.html>

More information about the llvm-dev mailing list