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

Torvald Riegel torvald at se.inf.tu-dresden.de
Wed Jul 14 03:20:27 PDT 2010


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?

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)?

> probably what's happening here is
> that when you use llvm-ld, it assumes the variable data isn't used
> outside of the file in question.  Therefore, it ends up splitting the
> global into its respective members and eliminating the apparently
> unused padding.  Passing -disable-internalize to llvm-ld or declaring
> data as volatile should solve this.

-disable-internalize helps, as does making either of the two accessed fields 
volatile (making the padding volatile doesn't). However, I don't want them to 
be volatile. A single volatile initializing access to the first field seems to 
keep the structure layout, interestingly.

Torvald



More information about the llvm-dev mailing list