[DTrace-devel] [PATCH 06/14] Move tvar code next to assoc code

Kris Van Hees kris.van.hees at oracle.com
Tue May 23 21:50:57 UTC 2023


On Mon, May 01, 2023 at 11:47:14PM -0400, eugene.loh--- via DTrace-devel wrote:
> From: Eugene Loh <eugene.loh at oracle.com>
> 
> Since the handling of thread-local variables and associative
> arrays are so similar, move tvar code next to to assoc code.

to to -> to

> In subsequent patches, common code will be consolidated.
> 
> Signed-off-by: Eugene Loh <eugene.loh at oracle.com>

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

... with above change (and also assuming changes mentioned below)

> ---
>  libdtrace/dt_cg.c | 171 +++++++++++++++++++++++-----------------------
>  1 file changed, 87 insertions(+), 84 deletions(-)
> 
> diff --git a/libdtrace/dt_cg.c b/libdtrace/dt_cg.c
> index 35c28bcf..895b83db 100644
> --- a/libdtrace/dt_cg.c
> +++ b/libdtrace/dt_cg.c
> @@ -2515,37 +2515,6 @@ dt_cg_load_var(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp)
>  		return;
>  	}
>  
> -	/* global and local variables */
> -	if ((idp->di_flags & DT_IDFLG_LOCAL) ||
> -	    (!(idp->di_flags & DT_IDFLG_TLS) &&
> -	     idp->di_id >= DIF_VAR_OTHER_UBASE)) {
> -		if ((dst->dn_reg = dt_regset_alloc(drp)) == -1)
> -			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> -
> -		/* get pointer to BPF map */
> -		emit(dlp, BPF_LOAD(BPF_DW, dst->dn_reg, BPF_REG_FP, DT_STK_DCTX));
> -		if (idp->di_flags & DT_IDFLG_LOCAL)
> -			emit(dlp, BPF_LOAD(BPF_DW, dst->dn_reg, dst->dn_reg, DCTX_LVARS));
> -		else
> -			emit(dlp, BPF_LOAD(BPF_DW, dst->dn_reg, dst->dn_reg, DCTX_GVARS));
> -
> -		/* load the variable value or address */
> -		if (dst->dn_flags & DT_NF_REF) {
> -			assert(!(dst->dn_flags & DT_NF_ALLOCA));
> -			emit(dlp, BPF_ALU64_IMM(BPF_ADD, dst->dn_reg, idp->di_offset));
> -		} else {
> -			size_t	size = dt_node_type_size(dst);
> -
> -			assert(size > 0 && size <= 8 &&
> -			       (size & (size - 1)) == 0);
> -
> -			emit(dlp, BPF_LOAD(ldstw[size], dst->dn_reg, dst->dn_reg, idp->di_offset));
> -			dt_cg_promote(dst, size, dlp, drp);
> -		}
> -
> -		return;
> -	}
> -
>  	/* thread-local variables */
>  	if (idp->di_flags & DT_IDFLG_TLS) {	/* TLS var */
>  		uint_t	varid = idp->di_id - DIF_VAR_OTHER_UBASE;
> @@ -2592,6 +2561,36 @@ dt_cg_load_var(dt_node_t *dst, dt_irlist_t *dlp, dt_regset_t *drp)
>  		return;
>  	}
>  
> +	/* global and local variables */
> +	if ((idp->di_flags & DT_IDFLG_LOCAL) ||
> +	    (idp->di_id >= DIF_VAR_OTHER_UBASE)) {
> +		if ((dst->dn_reg = dt_regset_alloc(drp)) == -1)
> +			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> +
> +		/* get pointer to BPF map */
> +		emit(dlp, BPF_LOAD(BPF_DW, dst->dn_reg, BPF_REG_FP, DT_STK_DCTX));
> +		if (idp->di_flags & DT_IDFLG_LOCAL)
> +			emit(dlp, BPF_LOAD(BPF_DW, dst->dn_reg, dst->dn_reg, DCTX_LVARS));
> +		else
> +			emit(dlp, BPF_LOAD(BPF_DW, dst->dn_reg, dst->dn_reg, DCTX_GVARS));
> +
> +		/* load the variable value or address */
> +		if (dst->dn_flags & DT_NF_REF) {
> +			assert(!(dst->dn_flags & DT_NF_ALLOCA));
> +			emit(dlp, BPF_ALU64_IMM(BPF_ADD, dst->dn_reg, idp->di_offset));
> +		} else {
> +			size_t	size = dt_node_type_size(dst);
> +
> +			assert(size > 0 && size <= 8 &&
> +			       (size & (size - 1)) == 0);
> +
> +			emit(dlp, BPF_LOAD(ldstw[size], dst->dn_reg, dst->dn_reg, idp->di_offset));
> +			dt_cg_promote(dst, size, dlp, drp);
> +		}
> +
> +		return;
> +	}
> +
>  	/* built-in variables */
>  	if (dt_regset_xalloc_args(drp) == -1)
>  		longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> @@ -3209,6 +3208,63 @@ dt_cg_store_var(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
>  		return;
>  	}
>  
> +	if (idp->di_flags & DT_IDFLG_TLS) {
> +		/* TLS var */
> +		varid = idp->di_id - DIF_VAR_OTHER_UBASE;
> +		size = idp->di_size;
> +
> +		idp = dt_dlib_get_func(yypcb->pcb_hdl, "dt_get_tvar");
> +		assert(idp != NULL);
> +
> +		if (dt_regset_xalloc_args(drp) == -1)
> +			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> +
> +		emit(dlp,  BPF_MOV_IMM(BPF_REG_1, varid));
> +		emit(dlp,  BPF_MOV_IMM(BPF_REG_2, 1));
> +		emit(dlp,  BPF_MOV_REG(BPF_REG_3, dnp->dn_reg));
> +		dt_cg_zerosptr(BPF_REG_4, dlp, drp);
> +		dt_regset_xalloc(drp, BPF_REG_0);
> +		emite(dlp, BPF_CALL_FUNC(idp->di_id), idp);
> +		dt_regset_free_args(drp);
> +		lbl_done = dt_irlist_label(dlp);
> +		emit(dlp,  BPF_BRANCH_IMM(BPF_JEQ, dnp->dn_reg, 0, lbl_done));
> +
> +		if ((reg = dt_regset_alloc(drp)) == -1)
> +			longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> +
> +		emit(dlp,  BPF_MOV_REG(reg, BPF_REG_0));
> +		dt_regset_free(drp, BPF_REG_0);
> +
> +		dt_cg_check_notnull(dlp, drp, reg);
> +
> +		if (dnp->dn_flags & DT_NF_REF) {
> +			size_t		srcsz;
> +
> +			/*
> +			 * Determine the amount of data to be copied.  It is
> +			 * the lesser of the size of the identifier and the
> +			 * size of the data being copied in.
> +			 */
> +			srcsz = dt_node_type_size(dnp->dn_right);
> +			size = MIN(srcsz, size);
> +
> +			dt_cg_memcpy(dlp, drp, reg, dnp->dn_reg, size);
> +		} else {
> +			assert(size > 0 && size <= 8 && (size & (size - 1)) == 0);
> +
> +			emit(dlp, BPF_STORE(ldstw[size], reg, 0, dnp->dn_reg));
> +		}
> +
> +		dt_regset_free(drp, reg);
> +
> +		emitl(dlp, lbl_done,
> +			   BPF_NOP());
> +
> +		TRACE_REGSET("    store_var: End  ");
> +
> +		return;
> +	}
> +
>  	/* global and local variables (that is, not thread-local) */
>  	if (!(idp->di_flags & DT_IDFLG_TLS)) {

With the move of the TLS case, you already know that this identifier is not
TLS so there is no need for this conditional.  And thus the code block can be
unindented one tabstop to the left.

>  		if ((reg = dt_regset_alloc(drp)) == -1)
> @@ -3262,59 +3318,6 @@ dt_cg_store_var(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
>  
>  		return;
>  	}
> -
> -	/* TLS var */
> -	varid = idp->di_id - DIF_VAR_OTHER_UBASE;
> -	size = idp->di_size;
> -
> -	idp = dt_dlib_get_func(yypcb->pcb_hdl, "dt_get_tvar");
> -	assert(idp != NULL);
> -
> -	if (dt_regset_xalloc_args(drp) == -1)
> -		longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> -
> -	emit(dlp,  BPF_MOV_IMM(BPF_REG_1, varid));
> -	emit(dlp,  BPF_MOV_IMM(BPF_REG_2, 1));
> -	emit(dlp,  BPF_MOV_REG(BPF_REG_3, dnp->dn_reg));
> -	dt_cg_zerosptr(BPF_REG_4, dlp, drp);
> -	dt_regset_xalloc(drp, BPF_REG_0);
> -	emite(dlp, BPF_CALL_FUNC(idp->di_id), idp);
> -	dt_regset_free_args(drp);
> -	lbl_done = dt_irlist_label(dlp);
> -	emit(dlp,  BPF_BRANCH_IMM(BPF_JEQ, dnp->dn_reg, 0, lbl_done));
> -
> -	if ((reg = dt_regset_alloc(drp)) == -1)
> -		longjmp(yypcb->pcb_jmpbuf, EDT_NOREG);
> -
> -	emit(dlp,  BPF_MOV_REG(reg, BPF_REG_0));
> -	dt_regset_free(drp, BPF_REG_0);
> -
> -	dt_cg_check_notnull(dlp, drp, reg);
> -
> -	if (dnp->dn_flags & DT_NF_REF) {
> -		size_t		srcsz;
> -
> -		/*
> -		 * Determine the amount of data to be copied.  It is
> -		 * the lesser of the size of the identifier and the
> -		 * size of the data being copied in.
> -		 */
> -		srcsz = dt_node_type_size(dnp->dn_right);
> -		size = MIN(srcsz, size);
> -
> -		dt_cg_memcpy(dlp, drp, reg, dnp->dn_reg, size);
> -	} else {
> -		assert(size > 0 && size <= 8 && (size & (size - 1)) == 0);
> -
> -		emit(dlp, BPF_STORE(ldstw[size], reg, 0, dnp->dn_reg));
> -	}
> -
> -	dt_regset_free(drp, reg);
> -
> -	emitl(dlp, lbl_done,
> -		   BPF_NOP());
> -
> -	TRACE_REGSET("    store_var: End  ");
>  }
>  
>  static void
> -- 
> 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