https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91043

--- Comment #24 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #23)
> (In reply to Hanoch Haim from comment #22)
> >  
> > "Of course it does, because without aligning the container you cannot have
> > aligned members.  Maximum alignment always propagates outwards."
> > 
> > Sorry, your answer is still not  clear, so let give a short example
> > In this case there is a discrepancy betwean two gcc modules  
> > 
> > 1. The module that generates the code think that it is aligned
> > (CCPortLatency)
> > 2. However the linker puts it in a none aligned location  
> > 
> > 
> > "
> > class CTimeHistogram {
> > 
> > } __rte_cache_aligned;
> > 
> > class CCPortLatency {
> > public:
> >      CTimeHistogram  m_hist;  
> > }; 
> > class Root {
> > 
> >     CCPortLatency port;
> > 
> > } __rte_cache_aligned;
> > 
> > static Root root; 
> > "
> > 
> > In this case can I expect root.port to be aligned because its child (m_hist)
> > was defined as aligned and it propogate? Or should I explicitly ask both to
> > be aligned?
> 
> Yes, for
> 
> class CTimeHistogram {
> } __attribute__((aligned(64)));
> class CCPortLatency {
> public:
>     CTimeHistogram  m_hist;
> };
> class Root {
>     CCPortLatency port;
> };
> static Root root;
> 
> 'root' will be aligned to 64 bytes.  This is also what you can easily
> observe when inspecting the ELF object:
> 
> Section Headers:
>   [Nr] Name              Type             Address           Offset
>        Size              EntSize          Flags  Link  Info  Align
> ...
>   [ 3] .bss              NOBITS           0000000000000000  00000040
>        0000000000000040  0000000000000000  WA       0     0     64
> 
> Symbol table '.symtab' contains 8 entries:
>    Num:    Value          Size Type    Bind   Vis      Ndx Name
> ...
>      5: 0000000000000000    64 OBJECT  LOCAL  DEFAULT    3 _ZL4root
> 
> compiled without optimization since root is unused and will otherwise
> be eliminated.

You can also check with

static_assert (__alignof__(root.port.m_hist) == 64, "oops");

(need to make port public for this, eh)

Reply via email to