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

mats petersson via llvm-dev llvm-dev at lists.llvm.org
Tue May 17 08:57:03 PDT 2016


On 17 May 2016 at 15:45, John Criswell via llvm-dev <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?

The "ByVal" is an attribute on the call instruction.

Here's where my compiler sets that:
https://github.com/Leporacanthicus/lacsap/blob/master/expr.cpp#L1260
(The "ByVal" attribute itself is stored in the attribute container on line
1235)

--
Mats

>
> Just out of curiosity, are you using the doxygen documentation?  The
> doxygen documentation is invaluable; if you have a basic understanding of
> how LLVM uses its class hierarchy to represent the IR, you can usually find
> what you need via the doxygen docs.
>
> Regards,
>
> John Criswell
>
>
> Any advice would be appreciate. Thanks a lot.:)
>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing listllvm-dev at lists.llvm.orghttp://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
>
> --
> John Criswell
> Assistant Professor
> Department of Computer Science, University of Rochesterhttp://www.cs.rochester.edu/u/criswell
>
>
> _______________________________________________
> LLVM Developers mailing list
> llvm-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160517/328c5dd8/attachment.html>


More information about the llvm-dev mailing list