[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