Comment 18 for bug 604874

Revision history for this message
Ulrich Weigand (uweigand) wrote :

Hmm ... actually there *is* code in the Mozilla sources to attempt to ensure proper alignment, in jsstr.cpp:

#ifdef __SUNPRO_CC
#pragma pack(8)
#else
#pragma pack(push, 8)
#endif

JSString JSString::unitStringTable[]
#ifdef __GNUC__
__attribute__ ((aligned (8)))
#endif
= {
    U(0x00), U(0x01), U(0x02), U(0x03), U(0x04), U(0x05), U(0x06), U(0x07),

However, the compiler does not respect the attribute.

Minimal test case is:

struct JSString
{
  unsigned int mLength;
  static JSString unitStringTable[];
};

#pragma pack(push, 8)
JSString JSString::unitStringTable[] __attribute__ ((aligned (8))) = { 1 };
#pragma pack(pop)

Building this with g++ -S results in:

        .global _ZN8JSString15unitStringTableE
        .data
        .align 2
        .type _ZN8JSString15unitStringTableE, %object
        .size _ZN8JSString15unitStringTableE, 4
_ZN8JSString15unitStringTableE:
        .word 1

.align 2 is wrong; this should be .align 3. Vanilla FSF GCC 4.4.4 gets this correct, so it does look like a Linaro GCC bug after all.

Interestingly enough, the bug only happens with C++ class static variables; for "normal" global variables, the alignment attribute is respected correctly. Looking into GCC now ...