Author: pfg
Date: Tue Apr 16 19:39:27 2013
New Revision: 249563
URL: http://svnweb.freebsd.org/changeset/base/249563

Log:
  DTrace: print() should try to resolve function pointers
  
  Merge changes from illumos:
  
  3675 DTrace print() should try to resolve function pointers
  3676 dt_print_enum hardcodes a value of zero
  
  Illumos Revision:     b1fa6326238973aeaf12c34fcda75985b6c06be1
  
  Reference:
  https://www.illumos.org/issues/3675
  https://www.illumos.org/issues/3676
  
  Obtained from:        Illumos
  MFC after:    1 month

Added:
  head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/print/tst.enum.d
     - copied unchanged from r249443, 
vendor/illumos/dist/cmd/dtrace/test/tst/common/print/tst.enum.d
  head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/print/tst.enum.d.out
     - copied unchanged from r249443, 
vendor/illumos/dist/cmd/dtrace/test/tst/common/print/tst.enum.d.out
Modified:
  head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_print.c

Copied: 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/print/tst.enum.d (from 
r249443, vendor/illumos/dist/cmd/dtrace/test/tst/common/print/tst.enum.d)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/print/tst.enum.d   
Tue Apr 16 19:39:27 2013        (r249563, copy of r249443, 
vendor/illumos/dist/cmd/dtrace/test/tst/common/print/tst.enum.d)
@@ -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);
+}

Copied: 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/print/tst.enum.d.out 
(from r249443, 
vendor/illumos/dist/cmd/dtrace/test/tst/common/print/tst.enum.d.out)
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ 
head/cddl/contrib/opensolaris/cmd/dtrace/test/tst/common/print/tst.enum.d.out   
    Tue Apr 16 19:39:27 2013        (r249563, copy of r249443, 
vendor/illumos/dist/cmd/dtrace/test/tst/common/print/tst.enum.d.out)
@@ -0,0 +1,4 @@
+enum simpson bart
+enum simpson maggie
+enum simpson snowball_ii
+

Modified: head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_print.c
==============================================================================
--- head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_print.c       Tue Apr 
16 19:32:12 2013        (r249562)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/common/dt_print.c       Tue Apr 
16 19:39:27 2013        (r249563)
@@ -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 @@ dt_print_float(ctf_id_t base, ulong_t of
 }
 
 /*
- * 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 @@ dt_print_ptr(ctf_id_t base, ulong_t off,
        ctf_file_t *ctfp = pap->pa_ctfp;
        caddr_t addr = pap->pa_addr + off / NBBY;
        size_t size = ctf_type_size(ctfp, base);
-
-       dt_print_hex(fp, addr, size);
+       ctf_id_t bid = ctf_type_reference(ctfp, base);
+       uint64_t pc;
+       dtrace_syminfo_t dts;
+       GElf_Sym sym;
+
+       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 @@ dt_print_enum(ctf_id_t base, ulong_t off
        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 @@ dtrace_print(dtrace_hdl_t *dtp, FILE *fp
        }
 
        /* 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;
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to