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

Regards,

John Criswell

-- 
John Criswell
Assistant Professor
Department of Computer Science, University of Rochester
http://www.cs.rochester.edu/u/criswell

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