[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