[llvm-commits] [llvm] r37940 - in /llvm/trunk: include/llvm/CodeGen/SelectionDAGNodes.h include/llvm/ParameterAttributes.h lib/AsmParser/Lexer.l lib/AsmParser/llvmAsmParser.y lib/CodeGen/SelectionDAG/SelectionDAGISel.cpp lib/Target/TargetCallingC

Rafael Espindola espindola at google.com
Mon Jul 9 08:37:25 PDT 2007


Sorry for the delay...

> first let me point out that much of what you say also applies to
> StructReturn, which probably can also be used for returning arrays,
> ints etc.  And like StructReturn this is all about the ABI: my
> understanding is that on some platforms the ABI allows for passing
> (small) structs by value.  We need to be able to support this, but
> how?  The idea is to treat such parameters as passed by reference,
> and add an attribute to tell the code generators to in fact pass them
> in whatever way the ABI says they should be.  See PR1521.
>
> Thus in the IR the function is declared to take a pointer to the
> struct as an argument, and the ByVal marker is placed for the
> benefit of the code generators.  However it is not clear to me
> that this is semantically correct.  Doesn't ByVal mean what it
> says: a copy of the struct is made, and if this copy is modified
> inside the called function then this does not change the original
> struct?  But if in the IR we pass in a pointer to the struct, then
> any writes to the struct will modify the original, which is wrong.

The way it should work on the code generators is that when compiling a
call to a function with a "byval" argument, a copy of the struct is
created and placed on the stack. When compiling the function itself,
the code generator should use the stack pointer to create a pointer to
the *copy* of the structure that was placed on the stack.

> Also, I agree that there needs to be more clarity about what is
> allowed to be passed ByVal and returned by SRet.

I propose that we change the verifier so that it checks that "byval"
is only applied to arguments that are pointers to structures. When we
find a case were an array should be passed by value, we can easily
change the verifier.

I will try to write a patch (with a testcase) tomorrow.

> Finally, if StructReturn can also return arrays, then I don't mind
> to much if ByVal is called StructByVal or something like that.
>
> Ciao,
>
> Duncan.

Cheers,
Rafael



More information about the llvm-commits mailing list