On Sun, Jan 6, 2013 at 4:00 AM, pps . <mtlr...@hotmail.com> wrote:
> 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

The above code snippet is perfectly ok.  Type-based aliasing only
works with the dynamic type of *data (which is determined by
the stores to the memory region).  It should work this way since GCC 4.5, btw.

> 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.

The error must be elsewhere, not aliasing related.

Richard.

>
> Thanks.

Reply via email to