On Fri, 2023-11-10 at 08:10 -0800, Andrii Nakryiko wrote: > Print the same register state representation when printing stack state, > as we do for normal registers. Note that if stack slot contains > subregister spill (1, 2, or 4 byte long), we'll still emit "m0?" mask > for those bytes that are not part of spilled register. > > While means we can get something like fp-8=0000scalar() for a 4-byte > spill with other 4 bytes still being STACK_ZERO. > > Some example before and after, taken from the log of > pyperf_subprogs.bpf.o: > > 49: (7b) *(u64 *)(r10 -256) = r1 ; frame1: R1_w=ctx(off=0,imm=0) R10=fp0 fp-256_w=ctx > 49: (7b) *(u64 *)(r10 -256) = r1 ; frame1: R1_w=ctx(off=0,imm=0) R10=fp0 fp-256_w=ctx(off=0,imm=0) > > 150: (7b) *(u64 *)(r10 -264) = r0 ; frame1: R0_w=map_value_or_null(id=6,off=0,ks=192,vs=4,imm=0) R10=fp0 fp-264_w=map_value_or_null > 150: (7b) *(u64 *)(r10 -264) = r0 ; frame1: R0_w=map_value_or_null(id=6,off=0,ks=192,vs=4,imm=0) R10=fp0 fp-264_w=map_value_or_null(id=6,off=0,ks=192,vs=4,imm=0) > > 5192: (61) r1 = *(u32 *)(r10 -272) ; frame1: R1_w=scalar(smin=smin32=0,smax=umax=smax32=umax32=15,var_off=(0x0; 0xf)) R10=fp0 fp-272= > 5192: (61) r1 = *(u32 *)(r10 -272) ; frame1: R1_w=scalar(smin=smin32=0,smax=umax=smax32=umax32=15,var_off=(0x0; 0xf)) R10=fp0 fp-272=????scalar(smin=smin32=0,smax=umax=smax32=umax32=15,var_off=(0x0; 0xf)) > > While at it, do a few other simple clean ups: > - skip slot if it's not scratched before detecting whether it's valid; > - move taking spilled_reg pointer outside of switch (only DYNPTR has > to adjust that to get to the "main" slot); > - don't recalculate types_buf second time for MISC/ZERO/default case. > > Signed-off-by: Andrii Nakryiko <andrii@xxxxxxxxxx> This is great! Acked-by: Eduard Zingerman <eddyz87@xxxxxxxxx>