[LLVMdev] Returning a structure

Rob Rix rob at monochromeindustries.com
Wed Jan 27 06:18:49 PST 2010


Hi Duncan,

Thank you again for your clear and thorough response.

>> Apologies in advance if this has been hashed over already—and of course, one should be aware that I know _absolutely nothing_ in this regard ( (: )—but perhaps at least some platform ABI details could be handled by an IR-to-IR transformation (a la one of the function passes), taking a function that returns some arbitrary structure via a return mechanism and changing it to use the platform ABI (returning via reference on the stack) instead?
> 
> yes, this has be discussed many times already on the mailing list, and in
> general it is not possible, sorry.

Okay, that’s pretty much what I expected.

> If this routine is only going to be called from code you generate, then you can
> use whatever calling convention you like, for example you can just return your
> struct in registers.  Otherwise I'm afraid you are mistaken in thinking that
> returning a struct is simple - in fact the ABI logic on (eg) x86-64 is really
> horribly complicated for this.

Ah, I wasn’t aware of the former detail. I believe I can arrange things to suit that, or alternatively _always_ return the structure in question via the stack.

>> In this case, I actually meant building the Value of the appropriate struct type. Is there a simpler way to build a structure than to alloca a struct and store things into its fields? Or is the “{ i32 1, i32 2 }” thing only possible for 100% constant structs (I expect the answer is yes, just looking for verification (: )?
> 
> Look in the docs for "first class aggregates".  Check out this example:
> 
> <snip>

Perfect, this is exactly what I was looking for. Thank you once again for taking the time to answer my foolish questions (:

Gratefully,
Rob

--
Rob Rix, Unknown Quantity
Monochrome Industries





More information about the llvm-dev mailing list