diff options
author | markj <markj@FreeBSD.org> | 2013-05-19 17:14:36 +0000 |
---|---|---|
committer | markj <markj@FreeBSD.org> | 2013-05-19 17:14:36 +0000 |
commit | 9e08262228664ec82db5b2827324c4bd41571af3 (patch) | |
tree | 191b586f26c3dbc072d2f8d29909688c6d134bdb /cddl/contrib/opensolaris/lib/libdtrace/common/dt_dis.c | |
parent | 0e0a417d2bcaf3630559ef3ff0ba356da3a6f4b4 (diff) | |
parent | 73d9b47b2a7a8df111f99bb69b7879f98cd3b57c (diff) | |
download | FreeBSD-src-9e08262228664ec82db5b2827324c4bd41571af3.zip FreeBSD-src-9e08262228664ec82db5b2827324c4bd41571af3.tar.gz |
Re-introduce another part of r249367. This commit fixes a register leak in
dt_cg_ptrsize() and generally cleans up some of the error handling around
register allocation.
This change corresponds to part of illumos-gate commit e5803b76927480:
3025 register leak in D code generation
Reviewed by: pfg
Obtained from: illumos
MFC after: 1 month
Diffstat (limited to 'cddl/contrib/opensolaris/lib/libdtrace/common/dt_dis.c')
-rw-r--r-- | cddl/contrib/opensolaris/lib/libdtrace/common/dt_dis.c | 23 |
1 files changed, 18 insertions, 5 deletions
diff --git a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_dis.c b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_dis.c index f4bb0c4..fff4235 100644 --- a/cddl/contrib/opensolaris/lib/libdtrace/common/dt_dis.c +++ b/cddl/contrib/opensolaris/lib/libdtrace/common/dt_dis.c @@ -19,12 +19,15 @@ * * CDDL HEADER END */ + /* * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ -#pragma ident "%Z%%M% %I% %E% SMI" +/* + * Copyright (c) 2012 by Delphix. All rights reserved. + */ #include <strings.h> #include <stdio.h> @@ -212,12 +215,22 @@ dt_dis_pushts(const dtrace_difo_t *dp, { static const char *const tnames[] = { "D type", "string" }; uint_t type = DIF_INSTR_TYPE(in); + const char *pad; - (void) fprintf(fp, "%-4s DT_TYPE(%u), %%r%u, %%r%u", - name, type, DIF_INSTR_R2(in), DIF_INSTR_RS(in)); + if (DIF_INSTR_OP(in) == DIF_OP_PUSHTV) { + (void) fprintf(fp, "%-4s DT_TYPE(%u), %%r%u", + name, type, DIF_INSTR_RS(in)); + pad = "\t\t"; + } else { + (void) fprintf(fp, "%-4s DT_TYPE(%u), %%r%u, %%r%u", + name, type, DIF_INSTR_R2(in), DIF_INSTR_RS(in)); + pad = "\t"; + } - if (type < sizeof (tnames) / sizeof (tnames[0])) - (void) fprintf(fp, "\t! DT_TYPE(%u) = %s", type, tnames[type]); + if (type < sizeof (tnames) / sizeof (tnames[0])) { + (void) fprintf(fp, "%s! DT_TYPE(%u) = %s", pad, + type, tnames[type]); + } } static void |