Andrew Lenharth
2010-Jul-14 15:33 UTC
[LLVMdev] different layout of structs for llc vs. llvm-gcc
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? Andrew
Eli Friedman
2010-Jul-14 15:54 UTC
[LLVMdev] different layout of structs for llc vs. llvm-gcc
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. -Eli
Andrew Lenharth
2010-Jul-14 15:57 UTC
[LLVMdev] different layout of structs for llc vs. llvm-gcc
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 >
Seemingly Similar Threads
- [LLVMdev] different layout of structs for llc vs. llvm-gcc
- [LLVMdev] different layout of structs for llc vs. llvm-gcc
- [LLVMdev] different layout of structs for llc vs. llvm-gcc
- [LLVMdev] different layout of structs for llc vs. llvm-gcc
- [LLVMdev] different layout of structs for llc vs. llvm-gcc