[DTrace-devel] [PATCH 2/4] Add an offsetof() function for CTF types

Kris Van Hees kris.van.hees at oracle.com
Wed May 24 00:38:57 UTC 2023


On Thu, May 18, 2023 at 04:15:15PM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>

> ---
>  libdtrace/dt_cg.c | 23 +++++++++++++++++++++++
>  1 file changed, 23 insertions(+)
> 
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index c581dd11..e431fb36 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -4095,6 +4095,29 @@ dt_cg_asgn_op(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
>  	}
>  }
>  
> +/*
> + * Get offsetof(structname, membername) information from CTF.
> + * Optionally, also get member size.
> + */
> +static int
> +dt_cg_ctf_offsetof(const char *structname, const char *membername, size_t *sizep)
> +{
> +	ctf_file_t *cfp = yypcb->pcb_hdl->dt_shared_ctf;
> +	ctf_id_t type;
> +	ctf_membinfo_t ctm;
> +
> +	if (!cfp)
> +		longjmp(yypcb->pcb_jmpbuf, EDT_NOCTF);
> +	type = ctf_lookup_by_name(cfp, structname);
> +	if (type == CTF_ERR)
> +		longjmp(yypcb->pcb_jmpbuf, EDT_NOCTF);
> +	if (ctf_member_info(cfp, type, membername, &ctm) == CTF_ERR)
> +		longjmp(yypcb->pcb_jmpbuf, EDT_NOCTF);
> +	if (sizep)
> +		*sizep = ctf_type_size(cfp, ctm.ctm_type);
> +	return (ctm.ctm_offset / NBBY);
> +}
> +
>  static void
>  dt_cg_uregs(unsigned int idx, dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
>  {
> -- 
> 2.18.4
> 
> 
> _______________________________________________
> DTrace-devel mailing list
> DTrace-devel at oss.oracle.com
> https://oss.oracle.com/mailman/listinfo/dtrace-devel



More information about the DTrace-devel mailing list