On Fri, Dec 07, 2018 at 02:52:48PM +0000, Wilco Dijkstra wrote: > - struct __attribute__((aligned (32))) S { int a[4]; } s; > > - bar (&s); >
Any reason to remove the above? > p = __builtin_alloca (x); > + q = __builtin_alloca (x); > if (!__builtin_setjmp (buf)) > broken_longjmp (buf); > > + /* Compute expected next alloca offset - some targets don't align properly > + and allocate too much. */ > + p = q + (q - p); This is UB, pointer difference is only defined within the same object. So, you can only do such subtraction in some integral type rather than as pointer subtraction. > + > /* Fails if stack pointer corrupted. */ > - q = __builtin_alloca (x); > - if (foo (p) < foo (q)) > - { > - if (foo (q) - foo (p) >= 1024) > - abort (); > - } > - else if (foo (p) - foo (q) >= 1024) > + if (p != __builtin_alloca (x)) And I'm not sure you have a guarantee that every zero sized alloca is at the same offset from the previous one. Jakub