[LLVMdev] How to access llvm Types from the codegen?

Evan Cheng evan.cheng at apple.com
Thu Jul 26 16:10:29 PDT 2007


Code generator shouldn't introspect the LLVM type at all, except to  
get the size of the type.  Anything needed should be encoded by the  
front-end.  In the short term, please focus on getting parity with  
what we already have.  This means x86-64 will be wrong, but it  
already is.  As a second step we can then worry about x86-64-specific  
param attributes that should be added to handle this stuff correctly.

Evan

On Jul 18, 2007, at 10:01 AM, Rafael Espindola wrote:

> In order to the code generators to lower functions arguments that have
> the "byval" attribute, they would have to access the original argument
> Type. For example, on linux x86_64 {i64, i64} should be passed on
> registers and {i64, i64, i64} goes on the stack.
>
> The problem is that when looking at (for example) FORMAL_ARGUMENTS,
> the only thing that is present is the type of the pointer itself (i64
> for example).
>
> I can see three options to solve the problem:
>
> 1) Make FORMAL_ARGUMENTS have one SrcValueSDNode per argument in
> addition to the flags and make CALL use SrcValueSDNode for the
> arguments. The calling convention functions (CC_X86_64_C) can then be
> modified to take a Type as an additional argument.
>
> 2) Implement part of the ABI on the DAG construction. In this approach
> a struct that should be passed on registers would result on a series
> of arguments at the DAG level, similar to what is done by llvm-gcc
> today, but one lever lower (llvm -> DAG instead of C -> llvm).
> Arguments that should go on the stack result in an argument tagged as
> a implicit pointer that the code generators can compute as an offset
> from the frame pointer. In order to find the offset only the size of
> the struct has to be added to the DAG somehow.
>
> 3) Similar to 2, but, for arguments that should go on registers, let
> llvm-gcc do the splitting. In this approach the "byval" argument would
> be a much simpler extension. It would mean: this pointer is to be
> computed as an offset from the frame pointer.
>
> In order to implement options 2 or 3 we have to add the structure size
> to the DAG somehow. Suggestions?
>
> I prefer option 3, but I would like to know the opinion from other  
> developers.
>
> Thanks,
> -- 
> Rafael Avila de Espindola
>
> Google Ireland Ltd.
> Gordon House
> Barrow Street
> Dublin 4
> Ireland
>
> Registered in Dublin, Ireland
> Registration Number: 368047
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev




More information about the llvm-dev mailing list