Mercurial > illumos > illumos-gate
changeset 14004:dd91fed709a7
3675 DTrace print() should try to resolve function pointers
3676 dt_print_enum hardcodes a value of zero
Reviewed by: Carlos Cardenas <carlos.cardenas@joyent.com>
Reviewed by: Richard Lowe <richlowe@richlowe.net>
Reviewed by: Eric Schrock <eric.schrock@delphix.com>
Approved by: Gordon Ross <gwr@nexenta.com>
author | Robert Mustacchi <rm@joyent.com> |
---|---|
date | Tue, 02 Apr 2013 18:57:48 -0700 |
parents | d4552e4ac833 |
children | 55fc53126003 |
files | usr/src/cmd/dtrace/test/tst/common/print/tst.enum.d usr/src/cmd/dtrace/test/tst/common/print/tst.enum.d.out usr/src/lib/libdtrace/common/dt_print.c usr/src/pkg/manifests/system-dtrace-tests.mf |
diffstat | 4 files changed, 85 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/dtrace/test/tst/common/print/tst.enum.d Tue Apr 02 18:57:48 2013 -0700 @@ -0,0 +1,33 @@ +/* + * This file and its contents are supplied under the terms of the + * Common Development and Distribution License ("CDDL"), version 1.0. + * You may only use this file in accordance with the terms of version + * 1.0 of the CDDL. + * + * A full copy of the text of the CDDL should have accompanied this + * source. A copy of the CDDL is also available via the Internet at + * http://www.illumos.org/license/CDDL. + */ +/* + * Copyright (c) 2013, Joyent, Inc. All rights reserved. + */ + +#pragma D option quiet + +enum simpson { + homer, + marge, + bart, + lisa, + maggie, + snowball_ii, + santas_little_helper +}; + +BEGIN +{ + print(bart); + print((enum simpson)4); + print(snowball_ii); + exit(0); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/usr/src/cmd/dtrace/test/tst/common/print/tst.enum.d.out Tue Apr 02 18:57:48 2013 -0700 @@ -0,0 +1,4 @@ +enum simpson bart +enum simpson maggie +enum simpson snowball_ii +
--- a/usr/src/lib/libdtrace/common/dt_print.c Tue Apr 02 19:04:36 2013 -0700 +++ b/usr/src/lib/libdtrace/common/dt_print.c Tue Apr 02 18:57:48 2013 -0700 @@ -25,6 +25,9 @@ /* * Copyright (c) 2011 by Delphix. All rights reserved. */ +/* + * Copyright (c) 2013, Joyent, Inc. All rights reserved. + */ /* * DTrace print() action @@ -93,6 +96,7 @@ * Print structure passed down recursively through printing algorithm. */ typedef struct dt_printarg { + dtrace_hdl_t *pa_dtp; /* libdtrace handle */ caddr_t pa_addr; /* base address of trace data */ ctf_file_t *pa_ctfp; /* CTF container */ int pa_depth; /* member depth */ @@ -303,8 +307,8 @@ } /* - * A pointer is printed as a fixed-size integer. This is used both for - * pointers and functions. + * A pointer is generally printed as a fixed-size integer. If we have a + * function pointer, we try to look up its name. */ static void dt_print_ptr(ctf_id_t base, ulong_t off, dt_printarg_t *pap) @@ -313,8 +317,23 @@ ctf_file_t *ctfp = pap->pa_ctfp; caddr_t addr = pap->pa_addr + off / NBBY; size_t size = ctf_type_size(ctfp, base); + ctf_id_t bid = ctf_type_reference(ctfp, base); + uint64_t pc; + dtrace_syminfo_t dts; + GElf_Sym sym; - dt_print_hex(fp, addr, size); + if (bid == CTF_ERR || ctf_type_kind(ctfp, bid) != CTF_K_FUNCTION) { + dt_print_hex(fp, addr, size); + } else { + /* LINTED - alignment */ + pc = *((uint64_t *)addr); + if (dtrace_lookup_by_addr(pap->pa_dtp, pc, &sym, &dts) != 0) { + dt_print_hex(fp, addr, size); + } else { + (void) fprintf(fp, "%s`%s", dts.dts_object, + dts.dts_name); + } + } } /* @@ -459,8 +478,31 @@ FILE *fp = pap->pa_file; ctf_file_t *ctfp = pap->pa_ctfp; const char *ename; + ssize_t size; + caddr_t addr = pap->pa_addr + off / NBBY; int value = 0; + /* + * The C standard says that an enum will be at most the sizeof (int). + * But if all the values are less than that, the compiler can use a + * smaller size. Thanks standards. + */ + size = ctf_type_size(ctfp, base); + switch (size) { + case sizeof (uint8_t): + value = *(uint8_t *)addr; + break; + case sizeof (uint16_t): + value = *(uint16_t *)addr; + break; + case sizeof (int32_t): + value = *(int32_t *)addr; + break; + default: + (void) fprintf(fp, "<invalid enum size %u>", (uint_t)size); + return; + } + if ((ename = ctf_enum_name(ctfp, base, value)) != NULL) (void) fprintf(fp, "%s", ename); else @@ -635,6 +677,7 @@ } /* setup the print structure and kick off the main print routine */ + pa.pa_dtp = dtp; pa.pa_addr = addr; pa.pa_ctfp = dt_module_getctf(dtp, dmp); pa.pa_nest = 0;
--- a/usr/src/pkg/manifests/system-dtrace-tests.mf Tue Apr 02 19:04:36 2013 -0700 +++ b/usr/src/pkg/manifests/system-dtrace-tests.mf Tue Apr 02 18:57:48 2013 -0700 @@ -1261,6 +1261,8 @@ file path=opt/SUNWdtrt/tst/common/print/tst.bitfield.d mode=0444 file path=opt/SUNWdtrt/tst/common/print/tst.bitfield.d.out mode=0444 file path=opt/SUNWdtrt/tst/common/print/tst.dyn.d mode=0444 +file path=opt/SUNWdtrt/tst/common/print/tst.enum.d mode=0444 +file path=opt/SUNWdtrt/tst/common/print/tst.enum.d.out mode=0444 file path=opt/SUNWdtrt/tst/common/print/tst.primitive.d mode=0444 file path=opt/SUNWdtrt/tst/common/print/tst.primitive.d.out mode=0444 file path=opt/SUNWdtrt/tst/common/print/tst.struct.d mode=0444