git: 028a372fe265 - main - gdb(4): Do not use run length encoding for 3-symbol repetitions

From: Ed Maste <emaste_at_FreeBSD.org>
Date: Sat, 22 Jan 2022 19:46:31 UTC
The branch main has been updated by emaste:

URL: https://cgit.FreeBSD.org/src/commit/?id=028a372fe2658ccf72ed481b9e942b28a59cb178

commit 028a372fe2658ccf72ed481b9e942b28a59cb178
Author:     Michał Górny <mgorny@gentoo.org>
AuthorDate: 2022-01-10 03:03:46 +0000
Commit:     Ed Maste <emaste@FreeBSD.org>
CommitDate: 2022-01-22 19:46:06 +0000

    gdb(4): Do not use run length encoding for 3-symbol repetitions
    
    Disable the gdb packet run length encoding for 3-symbol repetitions.
    While it is technically possible to encode them, they have no advantage
    over sending the characters verbatim (the resulting length is the same)
    and they result in sending non-printable \x1f character.  The protocol
    has been designed with the intent of avoiding non-printable characters
    and therefore the run length encoding is biased to emit \x20 (a space)
    with the minimal intended run length of 4.
    
    While at it, simplify the logic by merging the different 'if' blocks
    into a single while loop, and moving 'runlen == 0' check lower.
    
    Reviewed by:    cem, emaste
    MFC after:      2 weeks
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D33686
---
 sys/gdb/gdb_packet.c | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/sys/gdb/gdb_packet.c b/sys/gdb/gdb_packet.c
index 9a85184eb49a..11ed5358848d 100644
--- a/sys/gdb/gdb_packet.c
+++ b/sys/gdb/gdb_packet.c
@@ -315,24 +315,16 @@ gdb_tx_end(void)
 					runlen--;
 				}
 			}
-			if (runlen == 1) {
+			/* Don't emit '$', '#', '+', '-' or a run length below 3. */
+			while (runlen == 1 || runlen == 2 ||
+			    runlen + 29 == '$' || runlen + 29 == '#' ||
+			    runlen + 29 == '+' || runlen + 29 == '-') {
 				gdb_cur->gdb_putc(c);
 				cksum += c;
 				runlen--;
 			}
 			if (runlen == 0)
 				continue;
-			/* Don't emit '$', '#', '+' or '-'. */
-			if (runlen == 7) {
-				gdb_cur->gdb_putc(c);
-				cksum += c;
-				runlen--;
-			}
-			if (runlen == 6 || runlen == 14 || runlen == 16) {
-				gdb_cur->gdb_putc(c);
-				cksum += c;
-				runlen--;
-			}
 			gdb_cur->gdb_putc('*');
 			cksum += '*';
 			gdb_cur->gdb_putc(runlen+29);