------- Comment #6 from mikpe at csd dot uu dot se 2005-11-09 22:04 ------- Here's a standalone test case. This fails (returns 1 from main()) on armv5b-linux when compiled with gcc-3.4.4, 3.3.6, or 3.3.3, at -O2 or -O1 -foptimize-sibling-calls. Disabling sibcall optimisation hides the bug.
If the variable x in main() is removed (passing NULL not &x to clobbers_callers_stack()), then the return address slot in main()'s frame gets clobbered, causing main() to return to la-la land, resulting in a seg fault. #include <stdio.h> void doit(void *p, unsigned long long ull, unsigned c, unsigned a, unsigned s) { if (!(int)ull) printf("%p %016llx %x %x %x\n", p, ull, c, a, s); } void clobbers_callers_stack(void *p1, void *p2, unsigned c, unsigned long long ull) { doit(NULL, ull, 0x55, 0x20, 0x3a3a3a3a); } int main(void) { int x = 0; clobbers_callers_stack(&x, NULL, 8, 0x700ULL); if (x != 0) { printf("main: x == %#x\n", x); return 1; } return 0; } -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=24675