------- Comment #9 from mcvick_e at iname dot com  2009-06-16 16:24 -------
Similar behavior has been seen against version 4.3.2.

Using the __attribute__ mechanism in the past has forced the hand of the
alignment issue most all of the time.  I say most all of the time because we
have uncovered a case where the __attribute__ mechanism will NOT suffice to
correct the alignment issue.

As stated the ABI for the PPC Processor states what the alignment requirements
are for bitfields, however here is a case that is only correctable by
restructuring the bitfield.  This in my opinion is poor coding practice as well
(however the original developer has long since been gone).


Code Snippet:


enum Status {
   LOCKED = 1,
   UNLOCKED = 2
};


struct foo {
   Status          lockStatus :  2;
   unsigned char   id         :  8;
   unsigned char   rId        :  8;
   unsigned short  unused     : 14;
};

struct foo2 {
   Status          lockStatus :  2;
   unsigned char   id         :  8;
   unsigned char   rId        :  8;
   unsigned short  unused     : 14;
} __attribute__((aligned(4))) __attribute__((packed));

struct foo3 {
   Status          lockStatus :  2;
   unsigned short  id         :  8;
   unsigned short  rId        :  8;
   unsigned short  unused     : 14;
} __attribute__((aligned(4))) __attribute__((packed));


int main(void) {

   static foo bar   = { LOCKED, 2, 10, 0 };  // Wrong alignment (64-bits)
   static foo1 bar1 = { LOCKED, 2, 10, 0 };  // Wrong alignment (64-bits)
   static foo2 bar2 = { LOCKED, 2, 10, 0 };  // Correct 32-bit alignment!

   // Do something so the compiler will not optimize the variables out in
   // gcc 4.3.2
   bar.lockStatus  = LOCKED;
   bar1.lockStatus = LOCKED;
   bar2.lockStatus = LOCKED;

   return 0;
}


-- 

mcvick_e at iname dot com changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |major


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

Reply via email to