[DTrace-devel] [PATCH REVIEWED] Improvements to the printing of annotations in disassembly listings

Kris Van Hees kris.van.hees at oracle.com
Mon Sep 14 12:50:01 PDT 2020


Annotations in disassembly listings were placed using tabs which would
sometimes cause them to not quite line up with other annotations due to
the instruction string varying in length.  This patch ensures that the
annotations all start in the same column (unless the instruction string
goes beyond the start of the annotations).

Signed-off-by: Kris Van Hees <kris.van.hees at oracle.com>
Reviewed-by: Eugene Loh <eugene.loh at oracle.com>
Reviewed-by: Kris Van Hees <kris.van.hees at oracle.com>
---
 libdtrace/dt_dis.c | 64 +++++++++++++++++++++++++++++++---------------
 1 file changed, 43 insertions(+), 21 deletions(-)

diff --git a/libdtrace/dt_dis.c b/libdtrace/dt_dis.c
index 16b67869..a038bdcc 100644
--- a/libdtrace/dt_dis.c
+++ b/libdtrace/dt_dis.c
@@ -22,6 +22,11 @@ static const char * const helper_fn[] = {
 };
 #undef BPF_HELPER_FN
 
+#define DT_DIS_INSTR_LEN	30
+#define DT_DIS_PAD(n)		((n) > DT_DIS_INSTR_LEN \
+					? 0 \
+					: DT_DIS_INSTR_LEN - (n))
+
 static void
 dt_dis_prefix(uint_t i, const struct bpf_insn *instr, FILE *fp)
 {
@@ -119,8 +124,11 @@ static uint_t
 dt_dis_branch(const dtrace_difo_t *dp, const char *name, uint_t addr,
 	      const struct bpf_insn *in, const char *rname, FILE *fp)
 {
-	fprintf(fp, "%-4s %s, %s, %d\t! -> %03u\n", name, reg(in->dst_reg),
-		reg(in->src_reg), in->off, addr + 1 + in->off);
+	int	n;
+
+	n = fprintf(fp, "%-4s %s, %s, %d", name, reg(in->dst_reg),
+		    reg(in->src_reg), in->off);
+	fprintf(fp, "%*s! -> %03u\n", DT_DIS_PAD(n), "", addr + 1 + in->off);
 	return 0;
 }
 
@@ -129,8 +137,11 @@ static uint_t
 dt_dis_branch_imm(const dtrace_difo_t *dp, const char *name, uint_t addr,
 	      const struct bpf_insn *in, const char *rname, FILE *fp)
 {
-	fprintf(fp, "%-4s %s, %u, %d\t\t! -> %03u\n", name, reg(in->dst_reg),
-		in->imm, in->off, addr + 1 + in->off);
+	int	n;
+
+	n = fprintf(fp, "%-4s %s, %u, %d", name, reg(in->dst_reg), in->imm,
+		    in->off);
+	fprintf(fp, "%*s! -> %03u\n", DT_DIS_PAD(n), "", addr + 1 + in->off);
 	return 0;
 }
 
@@ -141,14 +152,15 @@ dt_dis_load(const dtrace_difo_t *dp, const char *name, uint_t addr,
 {
 	char		buf[256];
 	const char	*vname;
+	int		n;
 
-	fprintf(fp, "%-4s %s, [%s%+d]", name, reg(in->dst_reg),
-		reg(in->src_reg), in->off);
+	n = fprintf(fp, "%-4s %s, [%s%+d]", name, reg(in->dst_reg),
+		    reg(in->src_reg), in->off);
 
 	vname = dt_dis_lvarname(dp, in->src_reg, in->off, addr, buf,
 				sizeof(buf));
 	if (vname)
-		fprintf(fp, "\t! %s\n", vname);
+		fprintf(fp, "%*s! %s\n", DT_DIS_PAD(n), "", vname);
 	else
 		fprintf(fp, "\n");
 
@@ -169,7 +181,7 @@ dt_dis_load_imm(const dtrace_difo_t *dp, const char *name, uint_t addr,
 	dt_dis_prefix(addr + 1, &in[1], fp);
 
 	if (rname != NULL)
-		fprintf(fp, "\t\t\t! %s\n", rname);
+		fprintf(fp, "%*s! %s\n", DT_DIS_INSTR_LEN, "", rname);
 	else
 		fprintf(fp, "\n");
 
@@ -183,14 +195,15 @@ dt_dis_store(const dtrace_difo_t *dp, const char *name, uint_t addr,
 {
 	char		buf[256];
 	const char	*vname;
+	int		n;
 
-	fprintf(fp, "%-4s [%s%+d], %s", name, reg(in->dst_reg), in->off,
-		reg(in->src_reg));
+	n = fprintf(fp, "%-4s [%s%+d], %s", name, reg(in->dst_reg), in->off,
+		    reg(in->src_reg));
 
 	vname = dt_dis_lvarname(dp, in->dst_reg, in->off, addr, buf,
 				sizeof(buf));
 	if (vname)
-		fprintf(fp, "\t! %s\n", vname);
+		fprintf(fp, "%*s! %s\n", DT_DIS_PAD(n), "", vname);
 	else
 		fprintf(fp, "\n");
 
@@ -204,19 +217,21 @@ dt_dis_store_imm(const dtrace_difo_t *dp, const char *name, uint_t addr,
 {
 	char		buf[256];
 	const char	*vname;
+	int		n;
 
-	fprintf(fp, "%-4s [%s%+d], %d", name, reg(in->dst_reg), in->off,
-		in->imm);
+	n = fprintf(fp, "%-4s [%s%+d], %d", name, reg(in->dst_reg), in->off,
+		    in->imm);
 
 	vname = dt_dis_lvarname(dp, in->dst_reg, in->off, addr, buf,
 				sizeof(buf));
 	if (vname) {
 		if (rname)
-			fprintf(fp, "\t! %s = %s\n", vname, rname);
+			fprintf(fp, "%*s! %s = %s\n", DT_DIS_PAD(n), "",
+				vname, rname);
 		else
-			fprintf(fp, "\t! %s\n", vname);
+			fprintf(fp, "%*s! %s\n", DT_DIS_PAD(n), "", vname);
 	} else if (rname) {
-		fprintf(fp, "\t! = %s\n", rname);
+		fprintf(fp, "%*s! = %s\n", DT_DIS_PAD(n), "", rname);
 	} else
 		fprintf(fp, "\n");
 
@@ -314,9 +329,12 @@ dt_dis_call(const dtrace_difo_t *dp, const char *name, uint_t addr,
 		ann = "unknown helper";
 	}
 
-	if (ann)
-		fprintf(fp, "%-4s %-17s ! %s\n", name, fn, ann);
-	else
+	if (ann) {
+		int	n;
+
+		n = fprintf(fp, "%-4s %s", name, fn);
+		fprintf(fp, "%*s! %s\n", DT_DIS_PAD(n), "", ann);
+	} else
 		fprintf(fp, "%-4s %s\n", name, fn);
 
 	return 0;
@@ -329,9 +347,13 @@ dt_dis_jump(const dtrace_difo_t *dp, const char *name, uint_t addr,
 {
 	if (in->off == 0)
 		fprintf(fp, "nop");
-	else
-		fprintf(fp, "%-4s %d\t\t\t! -> %03u\n", name, in->off,
+	else {
+		int	n;
+
+		n = fprintf(fp, "%-4s %d", name, in->off);
+		fprintf(fp, "%*s! -> %03u\n", DT_DIS_PAD(n), "",
 			addr + 1 + in->off);
+	}
 
 	return 0;
 }
-- 
2.28.0




More information about the DTrace-devel mailing list