On Wed, Nov 03, 2021 at 05:28:48PM +0100, Florian Weimer wrote:
> @@ -383,12 +376,34 @@ _Unwind_IteratePhdrCallback (struct dl_phdr_info *info,
> size_t size, void *ptr)
> # endif
> #endif
>
> - _Unwind_Ptr dbase = unw_eh_callback_data_dbase (data);
> + return 1;
> +}
> +
> +/* Result type of find_fde_tail below. */
> +struct find_fde_tail_result
> +{
> + const fde *entry;
> + void *func;
> +};
> +
> +/* Find the FDE for the program counter PC, in a previously located
> + PT_GNU_EH_FRAME data region. */
> +static struct find_fde_tail_result
> +find_fde_tail (_Unwind_Ptr pc,
> + const struct unw_eh_frame_hdr *hdr,
> + _Unwind_Ptr dbase)
I think returning a struct like find_fde_tail_result can work nicely
on certain targets, but on many others the psABI forces such returns through
stack etc.
Wouldn't it be better to return const fde * instead of
struct find_fde_tail_result, pass in struct dwarf_eh_bases *bases
as another argument to find_fde_tail, just return NULL on the failure
cases and return some fde pointer and set bases->func on success?
> +{
> + const unsigned char *p = (const unsigned char *) (hdr + 1);
> + _Unwind_Ptr eh_frame;
> + struct object ob;
> +
> + if (hdr->version != 1)
> + return (struct find_fde_tail_result) { NULL, };
If really returning a struct, I would have preferred { NULL, NULL }
in these cases, but see above.
> + if (pc < table[mid].initial_loc + data_base + range)
> + return (struct find_fde_tail_result) { f, func };
> + else
> + return (struct find_fde_tail_result) { NULL, func };
This case was returning NULL fde and non-NULL func? What it would be good
for, the caller just throws that away.
Otherwise LGTM.
Jakub