# HG changeset patch # User Robert Mustacchi # Date 1364954268 25200 # Node ID dd91fed709a7f14fe20a16571c60cd4c75393e9d # Parent d4552e4ac833a8fb0ba385fd28f24b29137dcf24 3675 DTrace print() should try to resolve function pointers 3676 dt_print_enum hardcodes a value of zero Reviewed by: Carlos Cardenas Reviewed by: Richard Lowe Reviewed by: Eric Schrock Approved by: Gordon Ross diff -r d4552e4ac833 -r dd91fed709a7 usr/src/cmd/dtrace/test/tst/common/print/tst.enum.d --- /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); +} diff -r d4552e4ac833 -r dd91fed709a7 usr/src/cmd/dtrace/test/tst/common/print/tst.enum.d.out --- /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 + diff -r d4552e4ac833 -r dd91fed709a7 usr/src/lib/libdtrace/common/dt_print.c --- 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, "", (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; diff -r d4552e4ac833 -r dd91fed709a7 usr/src/pkg/manifests/system-dtrace-tests.mf --- 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