On Wed, Mar 25, 2026 at 9:18 AM Andreas Schwab <[email protected]> wrote:
>
> >
> On Mär 25 2026, Farid Zakaria wrote:
>
> > @@ -437,23 +446,45 @@ find_fde_tail (_Unwind_Ptr pc,
> >        /* Shouldn't happen.  */
> >        if (fde_count == 0)
> >       return NULL;
> > -      if ((((_Unwind_Ptr) p) & 3) == 0)
> > +      if ((((_Unwind_Ptr) p) & align_mask) == 0)
> >       {
> > -       struct fde_table {
> > -         signed initial_loc __attribute__ ((mode (SI)));
> > -         signed fde __attribute__ ((mode (SI)));
> > -       };
> > -       const struct fde_table *table = (const struct fde_table *) p;
> > +       const unsigned char *table = p;
> >         size_t lo, hi, mid;
> >         _Unwind_Ptr data_base = (_Unwind_Ptr) hdr;
> >         fde *f;
> >         unsigned int f_enc, f_enc_size;
> >         _Unwind_Ptr range;
> >
> > +       /* Read a signed field from the table.  For sdata4 entries
> > +          these are mode (SI) (32-bit); for sdata8, mode (DI) (64-bit).
> > +          Use the packed unaligned union from unwind-pe.h types.  */
> > +       union table_entry {
> > +         signed s4 __attribute__ ((mode (SI)));
> > +         signed s8 __attribute__ ((mode (DI)));
> > +       } __attribute__ ((__packed__));
> > +
> > +       /* Read the initial_loc field at a given table index.  */
> > +#define TABLE_LOC(i)                                         \
> > +       (is_sdata8                                            \
> > +        ? (_Unwind_Ptr) ((const union table_entry *)         \
> > +                         (table + (i) * entry_size))->s8     \
> > +        : (_Unwind_Ptr) ((const union table_entry *)         \
> > +                         (table + (i) * entry_size))->s4)
> > +
> > +       /* Read the fde field at a given table index.  */
> > +#define TABLE_FDE(i)                                         \
> > +       (is_sdata8                                            \
> > +        ? (_Unwind_Ptr) ((const union table_entry *)         \
> > +                         (table + (i) * entry_size           \
> > +                          + field_size))->s8                 \
> > +        : (_Unwind_Ptr) ((const union table_entry *)         \
> > +                         (table + (i) * entry_size           \
> > +                          + field_size))->s4)
>
> Why does that need to use unaligned accesses when the table pointer is
> guaranteed to be aligned?

Looks like you are right.
I can remove it.

I don't often submit `send-mail` patches... (this is my 2nd?)
Should I wait for a few more reviewers before updating the patch series?

> --
> Andreas Schwab, SUSE Labs, [email protected]
> GPG Key fingerprint = 0196 BAD8 1CE9 1970 F4BE  1748 E4D4 88E3 0EEA B9D7
> "And now for something completely different."

Reply via email to