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]

Re: 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?

No, I don't think this is correct, since it will mean that the structure 
starts at an unaligned address.  Instead the space allocated for the 
structure on the stack should be rounded up to a word and then the 
structure copied into that space with an aligned starting point.

R.


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