This is the mail archive of the gdb@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]