[DTrace-devel] [PATCH 4/4] Remove the string length prefix

Eugene Loh eugene.loh at oracle.com
Fri Jan 28 21:22:18 UTC 2022


Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
with minor comments below.

First (and I think this could have been done a while ago), shouldn't the 
dt_strlen() in dt_string.[c|h] be removed?

On 1/26/22 11:29 AM, Kris Van Hees via DTrace-devel wrote:
> This is the final stage of discontinuing the string length prefix code.
> It removes the actual storage allocation for the 2-byte string length
> prefix, and updates all code that adjusted pointers because of the
> prefix.  The dt_strlen_store() function is gone.
>
> This change affects the offset calculation for variab;e storage when a

variab;e

> string is involved.  Test results for gvar/tst.undecl-offset.r are
> updated to reflect this.
>
> diff --git a/bpf/strjoin.S b/bpf/strjoin.S
> @@ -22,43 +20,26 @@ dt_strjoin:
>   	lddw	%r6, STRSZ
>   	add	%r6, 1			/* cnt = STRSZ + 1 */
>   
> -	add	%r1, DT_STRLEN_BYTES	/* dst is in %r1 already */
>   	mov	%r2, %r6
>   	mov	%r3, %r7
> -	add	%r3, DT_STRLEN_BYTES
> -	call	BPF_FUNC_probe_read_str	/*
> -					 * rc = probe_read_str(
> -					 *	  &dst[DT_STRLEN_BYTES],
> -					 *	  cnt,
> -					 *	  &s1[DT_STRLEN_BYTES]);
> -					 */
> +	call	BPF_FUNC_probe_read_str	/* rc = probe_read_str(dst, cnt, s1); */
>   	jsle	%r0, 0, .Lexit		/* if (rc s<= 0) goto .Lexit; */
>   	mov	%r7, %r0		/* len = rc */
> -	jeq	%r7, %r6, .Lset_len	/* if (len == cnt) goto .Lset_len; */
> +	jeq	%r7, %r6, .Lexit	/* if (len == cnt) goto .Lexit; */
>   	sub	%r7, 1			/* len-- */
>   
>   	mov	%r1, %r9
> -	add	%r1, DT_STRLEN_BYTES
>   	add	%r1, %r7
>   	mov	%r2, %r6
>   	sub	%r2, %r7
>   	mov	%r3, %r8
> -	add	%r3, DT_STRLEN_BYTES
>   	call	BPF_FUNC_probe_read_str	/*
> -					 * rc = probe_read_str(
> -					 *	  &dst[DT_STRLEN_BYTES + len],
> -					 *	  cnt - len,
> -					 *	  &s2[DT_STRLEN_BYTES]);
> +					 * rc = probe_read_str(dst, cnt - len,
> +					 *		       s2);


I don't think that comment is quite right.  You're copying the second 
string to dst+len, not to dst.

>   					 */
> -	jsle	%r0, 0, .Lexit		/* if (rc s<= 0) goto .Lset_len; */
> +	jsle	%r0, 0, .Lexit		/* if (rc s<= 0) goto .Lexit */
>   	add	%r7, %r0		/* len += rc */
>   
> -.Lset_len:
> -	sub	%r7, 1			/* len-- */
> -	mov	%r1, %r7
> -	mov	%r2, %r9
> -	call	dt_strlen_store		/* dt_strlen_store(len - 1, dst) */
> -
>   .Lexit:
>   	exit
>   	.size	dt_strjoin, .-dt_strjoin
> diff --git a/bpf/strrchr.S b/bpf/strrchr.S
> @@ -71,10 +65,9 @@ dt_strrchr :
>   .Lloop:
>   	sub	%r8, 1			/* r8-- */
>   	mov	%r4, %r8
> -	add	%r4, DT_STRLEN_BYTES
>   	ldxdw	%r3, [%fp+-8]
>   	add	%r3, %r4
> -	ldxb	%r3, [%r3+0]		/* r3 = src[DT_STRLEN_BYTES+ r8] */
> +	ldxb	%r3, [%r3+0]		/* r3 = src[r8] */
>   	lsh	%r3, 56			/* r3 <<= 56 */
>   	jeq	%r3, %r5, .Lfound	/* if (r3 == c) goto Lfound */
>   	jgt	%r8, 0, .Lloop		/* if (r8 > 0) goto Lloop */

Perhaps DT_STRLEN_BYTES should have been handled differently originally, 
but now it is definitely out of the picture.  So, with the 
simplification, %r4 is not needed.  No need to "mov %r4 %r8". Just "add 
%r3 %r8" directly.

> diff --git a/bpf/strtok.S b/bpf/strtok.S
> @@ -291,8 +289,6 @@ dt_strtok_flip:
>    * void dt_strtok(char *dst, char *str, const char *del, char *tmp)
>    * {
>    *     // discard delimiter length prefix; we look for the NULL terminator anyhow
> - *     del += DT_STRLEN_BYTES
> - *
>    *     // len = roundup(STRSZ + 1, 8)
>    *     len = ((STRSZ + 1) + 7) & -8
>    *

Since the "del+=DT_STRLEN_BYTES" is removed, its comment should also be 
removed.

> @@ -459,23 +451,18 @@ dt_strtok:
>   	mov	BGN, 0
>   
>   	/* copy str + bgn to destination */
> -	mov	%r1, LEN
> -	ldxdw	%r2, DST_X
> -	call	dt_strlen_store		/* dt_strlen_store(len, dst) */
> -
>   	ldxdw	%r1, DST_X
> -	add	%r1, DT_STRLEN_BYTES
>   	mov	%r2, LEN
>   	mov	%r3, STR
>   	add	%r3, 8
>   	add	%r3, BGN
> -	call	BPF_FUNC_probe_read	/* bpf_probe_read(dst + DT_STRLEN_BYTES, len, str + 8 + bgn) */
> +	call	BPF_FUNC_probe_read	/* bpf_probe_read(dst, len, str + 8 + bgn) */
>   
>   	mov	%r1, 0
>   	ldxdw	%r2, DST_X
>   	add	%r2, LEN
> -	stxb	[%r2+DT_STRLEN_BYTES], %r1
> -					/* dst[DT_STRLEN_BYTES + len] = '\0' */
> +	stxb	[%r2+0], %r1
> +					/* dst[len] = '\0' */
>   
>   	/* update the 8-byte prefix (strtok offset) */
>   	add	BGN, LEN		/* bgn += len */

The stxb instruction is now short enough that its comment can be on the 
same line as it is.



More information about the DTrace-devel mailing list