[DTrace-devel] [PATCH 01/20] Correct storage size assignment for variables

Eugene Loh eugene.loh at oracle.com
Mon Jun 7 23:05:00 PDT 2021


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>

I understand the commit message, but I don't understand the parser and 
so I cannot say I really reviewed this.  I'm curious though: no tests?  
Or, are the tests in the alignment patch?  If so, should the two patches 
be combined?

On 6/2/21 1:47 AM, Kris Van Hees wrote:
> The implementation of global and local variables using BPF maps added
> calls to dt_ident_set_storage() to set the offset and size of the data
> storage for each variable.  It was setting the storage requirement for
> any automatically declared variable to 8 bytes regardless of its type.
> Since the datatype of such a variable is determined dynamically based
> on its use, the storage assignment must be done once the datatype is
> known.
>
> Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
> ---
>   libdtrace/dt_parser.c | 14 +++++++-------
>   1 file changed, 7 insertions(+), 7 deletions(-)
>
> diff --git a/libdtrace/dt_parser.c b/libdtrace/dt_parser.c
> index 948ef2d8..9d71cd43 100644
> --- a/libdtrace/dt_parser.c
> +++ b/libdtrace/dt_parser.c
> @@ -1661,10 +1661,10 @@ dt_node_decl(void)
>   			if (idp == NULL)
>   				longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
>   
> -			dt_ident_set_storage(idp, 8,
> -					     ctf_type_size(dtt.dtt_ctfp, type));
> -
>   			dt_ident_type_assign(idp, dtt.dtt_ctfp, dtt.dtt_type);
> +			dt_ident_set_storage(idp, 8,
> +					     ctf_type_size(dtt.dtt_ctfp,
> +							   dtt.dtt_type));
>   
>   			/*
>   			 * If we are declaring an associative array, use our
> @@ -2754,10 +2754,6 @@ dt_xcook_ident(dt_node_t *dnp, dt_idhash_t *dhp, uint_t idkind, int create)
>   		if (idp == NULL)
>   			longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
>   
> -		/* aggregation storage size is set later, in dt_cg.c */
> -		if (idkind != DT_IDENT_AGG)
> -			dt_ident_set_storage(idp, 8, 8);
> -
>   		/*
>   		 * Arrays and aggregations are not cooked individually. They
>   		 * have dynamic types and must be referenced using operator [].
> @@ -2871,6 +2867,8 @@ dt_cook_op1(dt_node_t *dnp, uint_t idflags)
>   			xyerror(D_TYPE_ERR, "failed to lookup int64_t\n");
>   
>   		dt_ident_type_assign(cp->dn_ident, dtt.dtt_ctfp, dtt.dtt_type);
> +		dt_ident_set_storage(cp->dn_ident, 8,
> +				     ctf_type_size(dtt.dtt_ctfp, dtt.dtt_type));
>   		dt_node_type_assign(cp, dtt.dtt_ctfp, dtt.dtt_type);
>   	}
>   
> @@ -3485,6 +3483,8 @@ dt_cook_op2(dt_node_t *dnp, uint_t idflags)
>   		    dt_ident_unref(lp->dn_ident)) {
>   			dt_node_type_assign(lp, ctfp, type);
>   			dt_ident_type_assign(lp->dn_ident, ctfp, type);
> +			dt_ident_set_storage(lp->dn_ident, 8,
> +					     ctf_type_size(ctfp, type));
>   
>   			if (uref) {
>   				lp->dn_flags |= DT_NF_USERLAND;



More information about the DTrace-devel mailing list