This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
ARM stack alignment on hand called functions
- From: "Kris Warkentin" <kewarken at qnx dot com>
- To: <gdb at sources dot redhat dot com>
- Date: Wed, 20 Nov 2002 10:29:00 -0500
- Subject: ARM stack alignment on hand called functions
Hi,
I was chasing a bug that was uncovered by the gdb dejagnu regression suite
on QNX 6 with gdb 5.2.1. The problem was in the file 'structs.c' which
follows the pattern below.
If I break on main and then do something like 'call fun1()', the inferior
would die with a SIGBUS. As long as I called functions whose structures
were divisible by 4, like fun4(), fun12(), etc., it was fine. I chased it
down to stack pointer alignment: the value stuffed into sp when it executed
the dummy frame was not aligned on a 4 byte boundary.
Initially I had tried defining STACK_ALIGN() but it seemed to cause other
problems to pop up. For example, 'call Fun1(foo1)' would fail with a
SIGBUS. My final fix which seems to work well was just to add sp = (sp + 3)
& ~3 at the end of arm_push_arguments() in arm-tdep.c just before it returns
sp. Looking at the code for mips_push_arguments though, it seems like this
might be a little simplistic since there is quite a lot of alignment code in
there.
Can anyone comment on the correctness of this fix?
cheers,
Kris
struct struct1 { char a;};
struct struct2 { char a, b;};
struct struct3 { char a, b, c; };
...
struct struct1 foo1 = {'1'}, L1;
struct struct2 foo2 = { 'a', 'b'}, L2;
struct struct3 foo3 = { 'A', 'B', 'C'}, L3;
...
struct struct1 fun1()
{
return foo1;
}
struct struct2 fun2()
{
return foo2;
}
...
void Fun1(struct struct1 foo1)
{
L1 = foo1;
}
void Fun2(struct struct2 foo2)
{
L2 = foo2;
}
....