Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Apr 2013 19:39:27 +0000 (UTC)
From:      "Pedro F. Giffuni" <pfg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r249563 - in head/cddl/contrib/opensolaris: cmd/dtrace/test/tst/common/print lib/libdtrace/common
Message-ID:  <201304161939.r3GJdRdA078548@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201304161939.r3GJdRdA078548>