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.