[LLVMdev] [llvm-commits] [cfe-commits] [Patch?] Fix handling of ARM homogenous aggregates

Tim Northover Tim.Northover at arm.com
Tue Apr 10 02:45:37 PDT 2012


> I think that ABI of LLVM IR level is different from ABI on real architecture
> such as ARM or x86. ABI of LLVM IR level doesn't consider about register
> usage. It just describes parameters and padding information related to
> alignment of parameters. 

I'm not sure what you mean here. LLVM's IR certainly doesn't care about 
registers and so on, but the LLVM backends have to, and front-ends have to 
know to a greater or lesser degree how the backends actually do it so that 
they can create ABI compliant code.

My view (possibly biased by the ARM ABI) is that LLVM's primary goal should be 
to make writing an ABI-compliant front-end as easy as possible. After that it 
should aim to have a sane ABI for hand-written LLVM code, and finally it 
should try to follow the ABI itself where possible (the last two are possibly 
interchangeable, but the first is primary).

The current situation with HFAs is that, without changes to make the backend 
aware of the concept, the front-end needs to know the entire sequence of 
previous arguments and how LLVM lowers them to work out how to pass an HFA 
correctly. 

The goal I'd like to see reached is that a front-end should be able to map one 
of its types to an LLVM type and know that if it uses that LLVM type then LLVM 
will do the right thing. As far as I'm aware, this is what happens for other 
targets already (we *are* a bit weird with the HFAs). I think this is 
achievable for the ARM ABI too: LLVM's type system is certainly rich enough to 
capture the distinctions necessary. 

>From Anton:
> I think here stuff should be thought of from different points. While
> providing source type for argument might be beneficial, it might cause
> moving the code from frontend to backend. 

That could certainly go too far, but conceptually it's not necessarily a 
massive problem: if multiple front-ends implement the same ABI calling 
conventions, then perhaps the shared backend is the right place to put that 
common code.

And conversely, I think that if a front-end is worrying about the allocation 
of register numbers then something is a little awry.

But I suppose there will be a substantial cost to implementing this, wherever 
we put it.

> Consider e.g. passing struct
> by value including crazy padding inside. The ABI might specify that
> padding should be removed and struct is passed field-by-field.

To me that would still be a prime candidate for the front-end doing the work: 
it still seems to have an essentially context-free representation as a 
(sequence of) LLVM types.

> Also, note that in many cases the ABI rules are worded in terms of
> source language which might now be preserved during IR generation,
> so...

I'm not sure I follow this point. Is preserving the source language a bad 
thing for some reason I'm missing? Certainly, if it affects optimisation it 
would be.

Tim.





More information about the llvm-dev mailing list