This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
RE: Align a POD srtu ct on the stack (ali asing issu e with gcc 4.6+)
- From: "pps ." <mtlroom at hotmail dot com>
- To: "gcc at gcc dot gnu dot org" <gcc at gcc dot gnu dot org>
- Date: Sat, 5 Jan 2013 22:03:17 -0500
- Subject: RE: Align a POD srtu ct on the stack (ali asing issu e with gcc 4.6+)
- References: <BAY002-W98EEBA886EC80FDF07370FA5260@phx.gbl>
>
> Question: How can I allocate random amount of stack space (using char
> arrays or alloca, and then align pointer to that stack space and
> reinterpret this chunk of memory as some structure that has some well
> defined layout that guarantees alignment of certain variables as long
> as the structure itself is aligned properly? How can I do so with 4.6+
> GCC with full optimizations enabled with strict aliasing enabled (e.g.
> without passing -fno-strict-aliasing).
>
> Pseudo code:
>
> struct my_array
> {
> char data[6666];
> };
>
> void * buffer = alloca(sizeof(my_array) + 32);
> void * buffer32 = (((uintptr_t)buffer) + 31) & (~31);
> assert( ((uintptr_t)buffer) % 32 == 0);
>
> my_array * data = (my_array*)buffer32;
>
> .... now use my_array, data->data is 32-byte aligned
>
>
> I have a huge function that allocates multiple aligned arrays on the stack
> using this approach and now it doesn't produce correct results with GCC
> 4.6+ (on arm, I didn't test it on x86).
> I've spent 2 days trying to fix the issue, perhaps gcc mailing list is a
> good place to ask for appropriate workaround? I want to ensure that the
> function produces correct result even with strict-aliasing enabled.
>
I also asked this question on SO, there are more details about the issue:
http://stackoverflow.com/questions/14170010/strict-aliasing-and-memory-alignment