This is the mail archive of the gcc-help@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

local variable alignment on Solaris/SPARC, with gcc 4.x


Hi,

Relevant info:
- GCC version: 4.1.0, configured for 32-bit compiles
- Operating System: Solaris 10, SPARC V9

In migrating from GCC 3.3.5 to GCC 4.1.0, we have observed a change in alignment of local (stack) variables. GCC 3.3.5 (and GCC 3.4.6) align local variables on 4-byte boundaries by default. In contrast, GCC 4.1.0 (going back to GCC 4.0.2) seems to align variables at their 'default' alignment.

Take for example the following code:

void someFunction()
{
  char buf[10];
  ...
}

Under gcc 3.3.5, buf is aligned on a 4-byte address, while on gcc 4.1.0, it is aligned on a 1-byte address (presumably because buf is a character array). This happens with or without optimization. Both the 3.3.5 and 4.1.0 compilers are configured similarly and execute on the same machine. Compilation is done with the same options in both cases - 'no-options' and '-O2' produce the same results.

The consequence of this change is that code that is dependent on the alignment of the buffer fails with the newer compiler. I understand that such code is inherently non-portable and unstable, but is unfortunately part of our application.

My questions are as follows:
1. Has anyone else experienced the same behavior? I'd like to rule out configuration issues.
2. Assuming this is not a configuration issue, does anyone have information as to why such a change was made? For example, was the change made to comply with the SPARC ABI? [Incidentally, the Sun Studio compiler also aligns at 1-byte, but moves up to 4-byte alignment with optimization]
3. I understand that it is possible to override the alignment using the '__attribute__((aligned))' directive, but this is not a trivial change across several thousand lines of code. Does anyone know of any compiler options that would produce the same results globally?


-Amruth


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]