[rfa?] Add frame_align(); Was: ARM stack alignment on hand called functions

Keith Walker keith.walker@arm.com
Thu Nov 28 05:52:00 GMT 2002


At 10:40 28/11/2002 +0000, Richard Earnshaw wrote:
> > Richard Earnshaw <rearnsha@arm.com> writes:
> >
> > |> > +/* Ensure that the ARM's stack pointer has the correct alignment 
> for a
> > |> > +   new frame.  */
> > |> > +static CORE_ADDR
> > |> > +arm_frame_align (struct gdbarch *gdbarch, CORE_ADDR addr)
> > |> > +{
> > |> > +  return (addr & -16);
> > |> > +}
> > |>
> > |> Yuck, two's complement assumption.
> >
> > No, -16 is implicitly cast to bfd_vma, which is unsigned, and this
> > operation is completely defined independent of the representation of
> > signed integers.
>
>Hmm, strictly speaking you are correct.  I don't have to like it though,
>and it means that the code is heavily dependent on the non-obvious fact
>that addr is an unsigned type to get the correct behaviour (if bfd_vma
>were to be changed to a signed type then this code would quietly break).
>
>So I'll change my comment to:
>
>Yuck, implicit cast of negative number to unsigned.

I notice that the h8300-tdep.c file defines some macros to do this sort of 
rounding ... round_up() and round_down().     As aligning addresses is a 
reasonable common thing to do maybe these macros should be moved to a more 
generic place and used whenever such rounding is required.    It doesn't 
fix the implicit cast issue, but would at least make finding where such 
alignment occurs easier.

Keith





More information about the Gdb-patches mailing list