[LLVMdev] different layout of structs for llc vs. llvm-gcc

Andrew Lenharth andrewl at lenharth.org
Wed Jul 14 08:57:26 PDT 2010


On Wed, Jul 14, 2010 at 10:54 AM, Eli Friedman <eli.friedman at gmail.com> wrote:
> On Wed, Jul 14, 2010 at 8:33 AM, Andrew Lenharth <andrewl at lenharth.org> wrote:
>> On Wed, Jul 14, 2010 at 10:26 AM, Eli Friedman <eli.friedman at gmail.com> wrote:
>>> On Wed, Jul 14, 2010 at 3:20 AM, Torvald Riegel
>>> <torvald at se.inf.tu-dresden.de> wrote:
>>>> On Tuesday 13 July 2010 19:48:25 you wrote:
>>>>> On Tue, Jul 13, 2010 at 10:09 AM, Torvald Riegel
>>>>> > I thought that the layout of structs was supposed to be preserved (wrong
>>>>> > assumption?). Otherwise, any ideas why this happens?
>>>>>
>>>>> It should be preserved in general;
>>>>
>>>> Is this a "should" or a "must"? Are there any cases in which structure layout
>>>> must be preserved besides for volatile accesses and if the data goes out to
>>>> external code?
>>>
>>> LLVM generally doesn't attempt to preserve the layout of structs which
>>> aren't externally visible or used by a volatile load/store.
>>>
>>>> I've seen code like the one above quite often to put data on different
>>>> cachelines, so even if it's a "should" and not a "must" it might be good to
>>>> preserve the padding. Otherwise, is there a portable way to ensure that
>>>> globals end up on a separate cacheline (without making all accesses to them
>>>> volatile)?
>>>
>>> I can't think of any way of doing it without essentially trying to
>>> trick the compiler... although there are many ways to trick LLVM.
>>>
>>> Anyone else have ideas?
>>
>> Is alignment on a field propagated when the struct is split up?
>
> Irrelevant here; the struct in question only has 4 byte alignment.

Not meant to be irrelevant because the though not explained.  What I
meant to say was if the padding was accomplished with an align
directive on the field, would the alignment be propagated to the
global after being split up?

Andrew

>
> -Eli
>



More information about the llvm-dev mailing list