public inbox for gcc-bugs@sourceware.org
help / color / mirror / Atom feed
* [Bug c/46354] New: attribute((aligned(...))) can incorrectly decrease structure field alignment
@ 2010-11-07 22:42 pageexec at freemail dot hu
  2010-11-07 22:43 ` [Bug c/46354] " pageexec at freemail dot hu
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: pageexec at freemail dot hu @ 2010-11-07 22:42 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46354

           Summary: attribute((aligned(...))) can incorrectly decrease
                    structure field alignment
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
        AssignedTo: unassigned@gcc.gnu.org
        ReportedBy: pageexec@freemail.hu


while investigating a clang error when compiling the linux kernel i narrowed
the problem down to what seems to be a gcc bug. what happens is that despite
what the gcc documentation says about the aligned attribute, gcc does decrease
structure field alignment even when the packed attribute is not specified. the
attached example shows that the issue is only with the attribute attached to a
typedef. the relevant part of the generated asm looks like this for gcc:

        movq    xx+8(%rip), %rax
        addq    x+4(%rip), %rax   <==== bug, should be +8
        addq    p+2(%rip), %rax   <==== should it be +4?
        addq    pp+4(%rip), %rax

and for clang:

        movq    xx+8(%rip), %rax
        addq    x+8(%rip), %rax
        addq    p+2(%rip), %rax
        addq    pp+4(%rip), %rax

the tested gcc versions so far:

  gcc version 4.4.5 (Gentoo 4.4.5 p1.0, pie-0.4.5)
  gcc version 4.5.1 20100924 (Red Hat 4.5.1-4) (GCC) 

note that fixing this bug will have a non-trivial effect on linux as this
construct is relied upon throughout the compat layer (that implements
transforming syscall parameters between 32 bit userland and the 64 bit kernel)
so when gcc stops decreasing the natural alignment of these structure fields,
all such code will have to be changed to explicitly use the packed attribute
lest the kernel/userland syscall ABI break... only to run into the next issue
in that the packed attribute on the structure ignores the aligned attribute in
the typedef (see the +2 above), both in gcc and clang (given both compilers are
affected, i'm not sure if this is a bug or feature). more interestingly, if the
aligned attribute is on the structure field itself then it is properly taken
into account, both in gcc and clang. so this looks like a fine mess to clean up
if/when the root bug gets fixed.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug c/46354] attribute((aligned(...))) can incorrectly decrease structure field alignment
  2010-11-07 22:42 [Bug c/46354] New: attribute((aligned(...))) can incorrectly decrease structure field alignment pageexec at freemail dot hu
@ 2010-11-07 22:43 ` pageexec at freemail dot hu
  2010-11-07 23:00 ` rguenth at gcc dot gnu.org
  2010-11-07 23:34 ` pageexec at freemail dot hu
  2 siblings, 0 replies; 4+ messages in thread
From: pageexec at freemail dot hu @ 2010-11-07 22:43 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46354

--- Comment #1 from pageexec at freemail dot hu 2010-11-07 22:43:33 UTC ---
Created attachment 22314
  --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=22314
sample code to demonstrate structure field offsets


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug c/46354] attribute((aligned(...))) can incorrectly decrease structure field alignment
  2010-11-07 22:42 [Bug c/46354] New: attribute((aligned(...))) can incorrectly decrease structure field alignment pageexec at freemail dot hu
  2010-11-07 22:43 ` [Bug c/46354] " pageexec at freemail dot hu
@ 2010-11-07 23:00 ` rguenth at gcc dot gnu.org
  2010-11-07 23:34 ` pageexec at freemail dot hu
  2 siblings, 0 replies; 4+ messages in thread
From: rguenth at gcc dot gnu.org @ 2010-11-07 23:00 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46354

--- Comment #2 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-11-07 23:00:25 UTC ---
Generally GCC lays out structures based on the types of the elemets, not
based on the alignment specified on fields.  Which is why I think what you
see is correct and intended.


^ permalink raw reply	[flat|nested] 4+ messages in thread

* [Bug c/46354] attribute((aligned(...))) can incorrectly decrease structure field alignment
  2010-11-07 22:42 [Bug c/46354] New: attribute((aligned(...))) can incorrectly decrease structure field alignment pageexec at freemail dot hu
  2010-11-07 22:43 ` [Bug c/46354] " pageexec at freemail dot hu
  2010-11-07 23:00 ` rguenth at gcc dot gnu.org
@ 2010-11-07 23:34 ` pageexec at freemail dot hu
  2 siblings, 0 replies; 4+ messages in thread
From: pageexec at freemail dot hu @ 2010-11-07 23:34 UTC (permalink / raw)
  To: gcc-bugs

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46354

--- Comment #3 from pageexec at freemail dot hu 2010-11-07 23:33:54 UTC ---
(In reply to comment #2)
> Generally GCC lays out structures based on the types of the elemets, not
> based on the alignment specified on fields.

according to the gcc docs, explicit alignment on structure fields *is* taken
into account in that one can *increase* the natural alignment associated with a
given type:

     The `aligned' attribute can only increase the alignment; but you
     can decrease it by specifying `packed' as well.  See below.

in this bug you can see that even without the packed attribute gcc can decrease
the alignment. so either the docs or the implementation is buggy ;).

the second issue is that when one does use the packed attribute on a structure,
the resulting field alignment seems inconsistent depending on where the aligned
attribute is (typedef vs. structure field). i don't see where the docs specify
or imply this behaviour.


^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2010-11-07 23:34 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2010-11-07 22:42 [Bug c/46354] New: attribute((aligned(...))) can incorrectly decrease structure field alignment pageexec at freemail dot hu
2010-11-07 22:43 ` [Bug c/46354] " pageexec at freemail dot hu
2010-11-07 23:00 ` rguenth at gcc dot gnu.org
2010-11-07 23:34 ` pageexec at freemail dot hu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).