This commit was generated by cvs2svn to compensate for changes in r178528,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
John Birrell 2008-04-26 00:54:52 +00:00
commit 20594ebf90
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=178529
98 changed files with 708 additions and 2720 deletions

View File

@ -34,20 +34,15 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <strings.h> #include <strings.h>
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#include <signal.h> #include <signal.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <libgen.h> #include <libgen.h>
#if defined(sun)
#include <libproc.h> #include <libproc.h>
#endif
typedef struct dtrace_cmd { typedef struct dtrace_cmd {
void (*dc_func)(struct dtrace_cmd *); /* function to compile arg */ void (*dc_func)(struct dtrace_cmd *); /* function to compile arg */
@ -97,9 +92,8 @@ static int g_mode = DMODE_EXEC;
static int g_status = E_SUCCESS; static int g_status = E_SUCCESS;
static int g_grabanon = 0; static int g_grabanon = 0;
static const char *g_ofile = NULL; static const char *g_ofile = NULL;
static FILE *g_ofp; static FILE *g_ofp = stdout;
static dtrace_hdl_t *g_dtp; static dtrace_hdl_t *g_dtp;
#if defined(sun)
static char *g_etcfile = "/etc/system"; static char *g_etcfile = "/etc/system";
static const char *g_etcbegin = "* vvvv Added by DTrace"; static const char *g_etcbegin = "* vvvv Added by DTrace";
static const char *g_etcend = "* ^^^^ Added by DTrace"; static const char *g_etcend = "* ^^^^ Added by DTrace";
@ -114,7 +108,6 @@ static const char *g_etc[] = {
"* chapter of the Solaris Dynamic Tracing Guide for details.", "* chapter of the Solaris Dynamic Tracing Guide for details.",
"*", "*",
NULL }; NULL };
#endif
static int static int
usage(FILE *fp) usage(FILE *fp)
@ -202,10 +195,6 @@ fatal(const char *fmt, ...)
static void static void
dfatal(const char *fmt, ...) dfatal(const char *fmt, ...)
{ {
#if !defined(sun) && defined(NEED_ERRLOC)
char *p_errfile = NULL;
int errline = 0;
#endif
va_list ap; va_list ap;
va_start(ap, fmt); va_start(ap, fmt);
@ -223,11 +212,6 @@ dfatal(const char *fmt, ...)
(void) fprintf(stderr, "%s\n", (void) fprintf(stderr, "%s\n",
dtrace_errmsg(g_dtp, dtrace_errno(g_dtp))); dtrace_errmsg(g_dtp, dtrace_errno(g_dtp)));
} }
#if !defined(sun) && defined(NEED_ERRLOC)
dt_get_errloc(g_dtp, &p_errfile, &errline);
if (p_errfile != NULL)
printf("File '%s', line %d\n", p_errfile, errline);
#endif
/* /*
* Close the DTrace handle to ensure that any controlled processes are * Close the DTrace handle to ensure that any controlled processes are
@ -388,7 +372,6 @@ dof_prune(const char *fname)
free(buf); free(buf);
} }
#if defined(sun)
static void static void
etcsystem_prune(void) etcsystem_prune(void)
{ {
@ -499,7 +482,6 @@ etcsystem_add(void)
error("added forceload directives to %s\n", g_ofile); error("added forceload directives to %s\n", g_ofile);
} }
#endif
static void static void
print_probe_info(const dtrace_probeinfo_t *p) print_probe_info(const dtrace_probeinfo_t *p)
@ -629,26 +611,12 @@ anon_prog(const dtrace_cmd_t *dcp, dof_hdr_t *dof, int n)
p = (uchar_t *)dof; p = (uchar_t *)dof;
q = p + dof->dofh_loadsz; q = p + dof->dofh_loadsz;
#if defined(sun)
oprintf("dof-data-%d=0x%x", n, *p++); oprintf("dof-data-%d=0x%x", n, *p++);
while (p < q) while (p < q)
oprintf(",0x%x", *p++); oprintf(",0x%x", *p++);
oprintf(";\n"); oprintf(";\n");
#else
/*
* On FreeBSD, the DOF data is handled as a kernel environment (kenv)
* string. We use two hex characters per DOF byte.
*/
oprintf("dof-data-%d=%02x", n, *p++);
while (p < q)
oprintf("%02x", *p++);
oprintf("\n");
#endif
dtrace_dof_destroy(g_dtp, dof); dtrace_dof_destroy(g_dtp, dof);
} }
@ -773,8 +741,6 @@ compile_str(dtrace_cmd_t *dcp)
static void static void
prochandler(struct ps_prochandle *P, const char *msg, void *arg) prochandler(struct ps_prochandle *P, const char *msg, void *arg)
{ {
fatal("DOODAD in function %s, file %s, line %d\n",__FUNCTION__,__FILE__,__LINE__);
#ifdef DOODAD
const psinfo_t *prp = Ppsinfo(P); const psinfo_t *prp = Ppsinfo(P);
int pid = Pstatus(P)->pr_pid; int pid = Pstatus(P)->pr_pid;
char name[SIG2STR_MAX]; char name[SIG2STR_MAX];
@ -812,7 +778,6 @@ fatal("DOODAD in function %s, file %s, line %d\n",__FUNCTION__,__FILE__,__LINE__
g_pslive--; g_pslive--;
break; break;
} }
#endif
} }
/*ARGSUSED*/ /*ARGSUSED*/
@ -1194,10 +1159,9 @@ main(int argc, char *argv[])
dtrace_optval_t opt; dtrace_optval_t opt;
dtrace_cmd_t *dcp; dtrace_cmd_t *dcp;
g_ofp = stdout;
int done = 0, mode = 0; int done = 0, mode = 0;
int err, i, c; int err, i;
char *p, **v; char c, *p, **v;
struct ps_prochandle *P; struct ps_prochandle *P;
pid_t pid; pid_t pid;
@ -1224,7 +1188,7 @@ main(int argc, char *argv[])
* options into g_argv[], and abort if any invalid options are found. * options into g_argv[], and abort if any invalid options are found.
*/ */
for (optind = 1; optind < argc; optind++) { for (optind = 1; optind < argc; optind++) {
while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) { while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
switch (c) { switch (c) {
case '3': case '3':
if (strcmp(optarg, "2") != 0) { if (strcmp(optarg, "2") != 0) {
@ -1373,14 +1337,8 @@ main(int argc, char *argv[])
dtrace_errmsg(NULL, err)); dtrace_errmsg(NULL, err));
} }
#if defined(__i386__)
/* XXX The 32-bit seems to need more buffer space by default -sson */
(void) dtrace_setopt(g_dtp, "bufsize", "12m");
(void) dtrace_setopt(g_dtp, "aggsize", "12m");
#else
(void) dtrace_setopt(g_dtp, "bufsize", "4m"); (void) dtrace_setopt(g_dtp, "bufsize", "4m");
(void) dtrace_setopt(g_dtp, "aggsize", "4m"); (void) dtrace_setopt(g_dtp, "aggsize", "4m");
#endif
/* /*
* If -G is specified, enable -xlink=dynamic and -xunodefs to permit * If -G is specified, enable -xlink=dynamic and -xunodefs to permit
@ -1413,7 +1371,7 @@ main(int argc, char *argv[])
* this time; these will compiled as part of the fourth processing pass. * this time; these will compiled as part of the fourth processing pass.
*/ */
for (optind = 1; optind < argc; optind++) { for (optind = 1; optind < argc; optind++) {
while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) { while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
switch (c) { switch (c) {
case 'a': case 'a':
if (dtrace_setopt(g_dtp, "grabanon", 0) != 0) if (dtrace_setopt(g_dtp, "grabanon", 0) != 0)
@ -1570,7 +1528,7 @@ main(int argc, char *argv[])
* may been affected by any library options set by the second pass. * may been affected by any library options set by the second pass.
*/ */
for (optind = 1; optind < argc; optind++) { for (optind = 1; optind < argc; optind++) {
while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != -1) { while ((c = getopt(argc, argv, DTRACE_OPTSTR)) != EOF) {
switch (c) { switch (c) {
case 'c': case 'c':
if ((v = make_argv(optarg)) == NULL) if ((v = make_argv(optarg)) == NULL)
@ -1658,21 +1616,10 @@ main(int argc, char *argv[])
case DMODE_ANON: case DMODE_ANON:
if (g_ofile == NULL) if (g_ofile == NULL)
#if defined(sun)
g_ofile = "/kernel/drv/dtrace.conf"; g_ofile = "/kernel/drv/dtrace.conf";
#else
/*
* On FreeBSD, anonymous DOF data is written to
* the DTrace DOF file that the boot loader will
* read if booting with the DTrace option.
*/
g_ofile = "/boot/dtrace.dof";
#endif
dof_prune(g_ofile); /* strip out any old DOF directives */ dof_prune(g_ofile); /* strip out any old DOF directives */
#if defined(sun)
etcsystem_prune(); /* string out any forceload directives */ etcsystem_prune(); /* string out any forceload directives */
#endif
if (g_cmdc == 0) { if (g_cmdc == 0) {
dtrace_close(g_dtp); dtrace_close(g_dtp);
@ -1703,10 +1650,8 @@ main(int argc, char *argv[])
* that itself contains a #pragma D option quiet. * that itself contains a #pragma D option quiet.
*/ */
error("saved anonymous enabling in %s\n", g_ofile); error("saved anonymous enabling in %s\n", g_ofile);
#if defined(sun)
etcsystem_add(); etcsystem_add();
error("run update_drv(1M) or reboot to enable changes\n"); error("run update_drv(1M) or reboot to enable changes\n");
#endif
dtrace_close(g_dtp); dtrace_close(g_dtp);
return (g_status); return (g_status);
@ -1835,11 +1780,6 @@ main(int argc, char *argv[])
if (sigaction(SIGTERM, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN) if (sigaction(SIGTERM, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN)
(void) sigaction(SIGTERM, &act, NULL); (void) sigaction(SIGTERM, &act, NULL);
#if !defined(sun)
if (sigaction(SIGUSR1, NULL, &oact) == 0 && oact.sa_handler != SIG_IGN)
(void) sigaction(SIGUSR1, &act, NULL);
#endif
/* /*
* Now that tracing is active and we are ready to consume trace data, * Now that tracing is active and we are ready to consume trace data,
* continue any grabbed or created processes, setting them running * continue any grabbed or created processes, setting them running

View File

@ -1,4 +1,4 @@
#!/usr/local/bin/perl #!/usr/perl5/bin/perl
# #
# CDDL HEADER START # CDDL HEADER START
# #

View File

@ -1,4 +1,4 @@
#!/usr/local/bin/perl #!/usr/perl5/bin/perl
# #
# CDDL HEADER START # CDDL HEADER START
# #
@ -43,7 +43,7 @@ $USAGE = "Usage: $PNAME [-abfghjlnqs] [-d dir] [-i isa] "
@dtrace_argv = (); @dtrace_argv = ();
$ksh_path = '/bin/sh'; $ksh_path = '/usr/bin/ksh';
@files = (); @files = ();
%exceptions = (); %exceptions = ();
@ -273,7 +273,7 @@ sub run_tests {
} }
$fullname = "$dir/$name"; $fullname = "$dir/$name";
$exe = "./$base.exe"; $exe = "$dir/$base.exe";
$exe_pid = -1; $exe_pid = -1;
if ($opt_a && ($status != 0 || $tag != 0 || $droptag != 0 || if ($opt_a && ($status != 0 || $tag != 0 || $droptag != 0 ||
@ -592,7 +592,7 @@ if ($opt_g) {
# Ensure that $PATH contains a cc(1) so that we can execute the # Ensure that $PATH contains a cc(1) so that we can execute the
# test programs that require compilation of C code. # test programs that require compilation of C code.
# #
#$ENV{'PATH'} = $ENV{'PATH'} . ':/ws/onnv-tools/SUNWspro/SS11/bin'; $ENV{'PATH'} = $ENV{'PATH'} . ':/ws/onnv-tools/SUNWspro/SS11/bin';
if ($opt_b) { if ($opt_b) {
logmsg("badioctl'ing ... "); logmsg("badioctl'ing ... ");

View File

@ -40,8 +40,3 @@ BEGIN
x[123] = `kmem_flags; x[123] = `kmem_flags;
x[456] = *`rootvp; x[456] = *`rootvp;
} }
ERROR
{
exit(1);
}

View File

@ -40,8 +40,3 @@ BEGIN
self->x[123] = `kmem_flags; self->x[123] = `kmem_flags;
self->x[456] = *`rootvp; self->x[456] = *`rootvp;
} }
ERROR
{
exit(1);
}

View File

@ -53,8 +53,3 @@ tick-10ms
printf("address of process = %u\n", curpsinfo->pr_addr); printf("address of process = %u\n", curpsinfo->pr_addr);
exit (0); exit (0);
} }
ERROR
{
exit(1);
}

View File

@ -49,8 +49,3 @@ BEGIN
printf("address of process = %u\n", curpsinfo->pr_addr); printf("address of process = %u\n", curpsinfo->pr_addr);
exit (0); exit (0);
} }
ERROR
{
exit(1);
}

View File

@ -46,7 +46,7 @@ fi
dtrace=$1 dtrace=$1
$dtrace -qZm wassup'{printf("Iamkool");}' \ $dtrace -qZm wassup'{printf("Iamkool");}' \
-qm BEGIN'{printf("I am done"); exit(0);}' -qm unix'{printf("I am done"); exit(0);}'
status=$? status=$?

View File

@ -30,9 +30,7 @@
* ASSERTION: Test network byte-ordering routines. * ASSERTION: Test network byte-ordering routines.
*/ */
#if defined(__amd64__) || defined(__i386__) #include <sys/isa_defs.h>
#define _LITTLE_ENDIAN
#endif
BEGIN BEGIN
{ {

View File

@ -28,17 +28,17 @@
#pragma D option quiet #pragma D option quiet
in_addr_t *ip4a; ipaddr_t *ip4a;
in_addr_t *ip4b; ipaddr_t *ip4b;
in_addr_t *ip4c; ipaddr_t *ip4c;
in_addr_t *ip4d; ipaddr_t *ip4d;
BEGIN BEGIN
{ {
this->buf4a = alloca(sizeof (in_addr_t)); this->buf4a = alloca(sizeof (ipaddr_t));
this->buf4b = alloca(sizeof (in_addr_t)); this->buf4b = alloca(sizeof (ipaddr_t));
this->buf4c = alloca(sizeof (in_addr_t)); this->buf4c = alloca(sizeof (ipaddr_t));
this->buf4d = alloca(sizeof (in_addr_t)); this->buf4d = alloca(sizeof (ipaddr_t));
ip4a = this->buf4a; ip4a = this->buf4a;
ip4b = this->buf4b; ip4b = this->buf4b;
ip4c = this->buf4c; ip4c = this->buf4c;

View File

@ -53,35 +53,35 @@ BEGIN
ip6f = this->buf6f; ip6f = this->buf6f;
ip6g = this->buf6g; ip6g = this->buf6g;
ip6a->__u6_addr.__u6_addr8[0] = 0xfe; ip6a->_S6_un._S6_u8[0] = 0xfe;
ip6a->__u6_addr.__u6_addr8[1] = 0x80; ip6a->_S6_un._S6_u8[1] = 0x80;
ip6a->__u6_addr.__u6_addr8[8] = 0x02; ip6a->_S6_un._S6_u8[8] = 0x02;
ip6a->__u6_addr.__u6_addr8[9] = 0x14; ip6a->_S6_un._S6_u8[9] = 0x14;
ip6a->__u6_addr.__u6_addr8[10] = 0x4f; ip6a->_S6_un._S6_u8[10] = 0x4f;
ip6a->__u6_addr.__u6_addr8[11] = 0xff; ip6a->_S6_un._S6_u8[11] = 0xff;
ip6a->__u6_addr.__u6_addr8[12] = 0xfe; ip6a->_S6_un._S6_u8[12] = 0xfe;
ip6a->__u6_addr.__u6_addr8[13] = 0x0b; ip6a->_S6_un._S6_u8[13] = 0x0b;
ip6a->__u6_addr.__u6_addr8[14] = 0x76; ip6a->_S6_un._S6_u8[14] = 0x76;
ip6a->__u6_addr.__u6_addr8[15] = 0xc8; ip6a->_S6_un._S6_u8[15] = 0xc8;
ip6b->__u6_addr.__u6_addr8[0] = 0x10; ip6b->_S6_un._S6_u8[0] = 0x10;
ip6b->__u6_addr.__u6_addr8[1] = 0x80; ip6b->_S6_un._S6_u8[1] = 0x80;
ip6b->__u6_addr.__u6_addr8[10] = 0x08; ip6b->_S6_un._S6_u8[10] = 0x08;
ip6b->__u6_addr.__u6_addr8[11] = 0x08; ip6b->_S6_un._S6_u8[11] = 0x08;
ip6b->__u6_addr.__u6_addr8[13] = 0x20; ip6b->_S6_un._S6_u8[13] = 0x20;
ip6b->__u6_addr.__u6_addr8[13] = 0x0c; ip6b->_S6_un._S6_u8[13] = 0x0c;
ip6b->__u6_addr.__u6_addr8[14] = 0x41; ip6b->_S6_un._S6_u8[14] = 0x41;
ip6b->__u6_addr.__u6_addr8[15] = 0x7a; ip6b->_S6_un._S6_u8[15] = 0x7a;
ip6c->__u6_addr.__u6_addr8[15] = 0x01; ip6c->_S6_un._S6_u8[15] = 0x01;
ip6e->__u6_addr.__u6_addr8[12] = 0x7f; ip6e->_S6_un._S6_u8[12] = 0x7f;
ip6e->__u6_addr.__u6_addr8[15] = 0x01; ip6e->_S6_un._S6_u8[15] = 0x01;
ip6f->__u6_addr.__u6_addr8[10] = 0xff; ip6f->_S6_un._S6_u8[10] = 0xff;
ip6f->__u6_addr.__u6_addr8[11] = 0xff; ip6f->_S6_un._S6_u8[11] = 0xff;
ip6f->__u6_addr.__u6_addr8[12] = 0x7f; ip6f->_S6_un._S6_u8[12] = 0x7f;
ip6f->__u6_addr.__u6_addr8[15] = 0x01; ip6f->_S6_un._S6_u8[15] = 0x01;
ip6g->__u6_addr.__u6_addr8[10] = 0xff; ip6g->_S6_un._S6_u8[10] = 0xff;
ip6g->__u6_addr.__u6_addr8[11] = 0xfe; ip6g->_S6_un._S6_u8[11] = 0xfe;
ip6g->__u6_addr.__u6_addr8[12] = 0x7f; ip6g->_S6_un._S6_u8[12] = 0x7f;
ip6g->__u6_addr.__u6_addr8[15] = 0x01; ip6g->_S6_un._S6_u8[15] = 0x01;
printf("%s\n", inet_ntoa6(ip6a)); printf("%s\n", inet_ntoa6(ip6a));
printf("%s\n", inet_ntoa6(ip6b)); printf("%s\n", inet_ntoa6(ip6b));

View File

@ -28,13 +28,10 @@
#pragma D option quiet #pragma D option quiet
inline int AF_INET = 2; ipaddr_t *ip4a;
inline int AF_INET6 = 28; ipaddr_t *ip4b;
ipaddr_t *ip4c;
in_addr_t *ip4a; ipaddr_t *ip4d;
in_addr_t *ip4b;
in_addr_t *ip4c;
in_addr_t *ip4d;
struct in6_addr *ip6a; struct in6_addr *ip6a;
struct in6_addr *ip6b; struct in6_addr *ip6b;
struct in6_addr *ip6c; struct in6_addr *ip6c;
@ -46,10 +43,10 @@ struct in6_addr *ip6h;
BEGIN BEGIN
{ {
this->buf4a = alloca(sizeof (in_addr_t)); this->buf4a = alloca(sizeof (ipaddr_t));
this->buf4b = alloca(sizeof (in_addr_t)); this->buf4b = alloca(sizeof (ipaddr_t));
this->buf4c = alloca(sizeof (in_addr_t)); this->buf4c = alloca(sizeof (ipaddr_t));
this->buf4d = alloca(sizeof (in_addr_t)); this->buf4d = alloca(sizeof (ipaddr_t));
this->buf6a = alloca(sizeof (struct in6_addr)); this->buf6a = alloca(sizeof (struct in6_addr));
this->buf6b = alloca(sizeof (struct in6_addr)); this->buf6b = alloca(sizeof (struct in6_addr));
this->buf6c = alloca(sizeof (struct in6_addr)); this->buf6c = alloca(sizeof (struct in6_addr));
@ -75,51 +72,51 @@ BEGIN
*ip4b = htonl(0x7f000001); *ip4b = htonl(0x7f000001);
*ip4c = htonl(0xffffffff); *ip4c = htonl(0xffffffff);
*ip4d = htonl(0x00000000); *ip4d = htonl(0x00000000);
ip6a->__u6_addr.__u6_addr8[0] = 0xfe; ip6a->_S6_un._S6_u8[0] = 0xfe;
ip6a->__u6_addr.__u6_addr8[1] = 0x80; ip6a->_S6_un._S6_u8[1] = 0x80;
ip6a->__u6_addr.__u6_addr8[8] = 0x02; ip6a->_S6_un._S6_u8[8] = 0x02;
ip6a->__u6_addr.__u6_addr8[9] = 0x14; ip6a->_S6_un._S6_u8[9] = 0x14;
ip6a->__u6_addr.__u6_addr8[10] = 0x4f; ip6a->_S6_un._S6_u8[10] = 0x4f;
ip6a->__u6_addr.__u6_addr8[11] = 0xff; ip6a->_S6_un._S6_u8[11] = 0xff;
ip6a->__u6_addr.__u6_addr8[12] = 0xfe; ip6a->_S6_un._S6_u8[12] = 0xfe;
ip6a->__u6_addr.__u6_addr8[13] = 0x0b; ip6a->_S6_un._S6_u8[13] = 0x0b;
ip6a->__u6_addr.__u6_addr8[14] = 0x76; ip6a->_S6_un._S6_u8[14] = 0x76;
ip6a->__u6_addr.__u6_addr8[15] = 0xc8; ip6a->_S6_un._S6_u8[15] = 0xc8;
ip6b->__u6_addr.__u6_addr8[0] = 0x10; ip6b->_S6_un._S6_u8[0] = 0x10;
ip6b->__u6_addr.__u6_addr8[1] = 0x80; ip6b->_S6_un._S6_u8[1] = 0x80;
ip6b->__u6_addr.__u6_addr8[10] = 0x08; ip6b->_S6_un._S6_u8[10] = 0x08;
ip6b->__u6_addr.__u6_addr8[11] = 0x08; ip6b->_S6_un._S6_u8[11] = 0x08;
ip6b->__u6_addr.__u6_addr8[13] = 0x20; ip6b->_S6_un._S6_u8[13] = 0x20;
ip6b->__u6_addr.__u6_addr8[13] = 0x0c; ip6b->_S6_un._S6_u8[13] = 0x0c;
ip6b->__u6_addr.__u6_addr8[14] = 0x41; ip6b->_S6_un._S6_u8[14] = 0x41;
ip6b->__u6_addr.__u6_addr8[15] = 0x7a; ip6b->_S6_un._S6_u8[15] = 0x7a;
ip6c->__u6_addr.__u6_addr8[15] = 0x01; ip6c->_S6_un._S6_u8[15] = 0x01;
ip6e->__u6_addr.__u6_addr8[12] = 0x7f; ip6e->_S6_un._S6_u8[12] = 0x7f;
ip6e->__u6_addr.__u6_addr8[15] = 0x01; ip6e->_S6_un._S6_u8[15] = 0x01;
ip6f->__u6_addr.__u6_addr8[10] = 0xff; ip6f->_S6_un._S6_u8[10] = 0xff;
ip6f->__u6_addr.__u6_addr8[11] = 0xff; ip6f->_S6_un._S6_u8[11] = 0xff;
ip6f->__u6_addr.__u6_addr8[12] = 0x7f; ip6f->_S6_un._S6_u8[12] = 0x7f;
ip6f->__u6_addr.__u6_addr8[15] = 0x01; ip6f->_S6_un._S6_u8[15] = 0x01;
ip6g->__u6_addr.__u6_addr8[10] = 0xff; ip6g->_S6_un._S6_u8[10] = 0xff;
ip6g->__u6_addr.__u6_addr8[11] = 0xfe; ip6g->_S6_un._S6_u8[11] = 0xfe;
ip6g->__u6_addr.__u6_addr8[12] = 0x7f; ip6g->_S6_un._S6_u8[12] = 0x7f;
ip6g->__u6_addr.__u6_addr8[15] = 0x01; ip6g->_S6_un._S6_u8[15] = 0x01;
ip6h->__u6_addr.__u6_addr8[0] = 0xff; ip6h->_S6_un._S6_u8[0] = 0xff;
ip6h->__u6_addr.__u6_addr8[1] = 0xff; ip6h->_S6_un._S6_u8[1] = 0xff;
ip6h->__u6_addr.__u6_addr8[2] = 0xff; ip6h->_S6_un._S6_u8[2] = 0xff;
ip6h->__u6_addr.__u6_addr8[3] = 0xff; ip6h->_S6_un._S6_u8[3] = 0xff;
ip6h->__u6_addr.__u6_addr8[4] = 0xff; ip6h->_S6_un._S6_u8[4] = 0xff;
ip6h->__u6_addr.__u6_addr8[5] = 0xff; ip6h->_S6_un._S6_u8[5] = 0xff;
ip6h->__u6_addr.__u6_addr8[6] = 0xff; ip6h->_S6_un._S6_u8[6] = 0xff;
ip6h->__u6_addr.__u6_addr8[7] = 0xff; ip6h->_S6_un._S6_u8[7] = 0xff;
ip6h->__u6_addr.__u6_addr8[8] = 0xff; ip6h->_S6_un._S6_u8[8] = 0xff;
ip6h->__u6_addr.__u6_addr8[9] = 0xff; ip6h->_S6_un._S6_u8[9] = 0xff;
ip6h->__u6_addr.__u6_addr8[10] = 0xff; ip6h->_S6_un._S6_u8[10] = 0xff;
ip6h->__u6_addr.__u6_addr8[11] = 0xff; ip6h->_S6_un._S6_u8[11] = 0xff;
ip6h->__u6_addr.__u6_addr8[12] = 0xff; ip6h->_S6_un._S6_u8[12] = 0xff;
ip6h->__u6_addr.__u6_addr8[13] = 0xff; ip6h->_S6_un._S6_u8[13] = 0xff;
ip6h->__u6_addr.__u6_addr8[14] = 0xff; ip6h->_S6_un._S6_u8[14] = 0xff;
ip6h->__u6_addr.__u6_addr8[15] = 0xff; ip6h->_S6_un._S6_u8[15] = 0xff;
printf("%s\n", inet_ntop(AF_INET, ip4a)); printf("%s\n", inet_ntop(AF_INET, ip4a));
printf("%s\n", inet_ntop(AF_INET, ip4b)); printf("%s\n", inet_ntop(AF_INET, ip4b));

View File

@ -38,8 +38,8 @@
lockstat:::adaptive-acquire lockstat:::adaptive-acquire
{ {
this->owned = mutex_owned((struct mtx *)arg0); this->owned = mutex_owned((kmutex_t *)arg0);
this->owner = mutex_owner((struct mtx *)arg0); this->owner = mutex_owner((kmutex_t *)arg0);
} }
lockstat:::adaptive-acquire lockstat:::adaptive-acquire

View File

@ -41,17 +41,17 @@
#pragma D option quiet #pragma D option quiet
struct thread *ptr; kthread_t *ptr;
BEGIN BEGIN
{ {
i = 0; i = 0;
} }
lockstat::mtx_lock:adaptive-acquire lockstat:genunix:mutex_enter:adaptive-acquire
{ {
ptr = mutex_owner((struct mtx *)arg0); ptr = mutex_owner((kmutex_t *)arg0);
i++; i++;
} }

View File

@ -44,9 +44,9 @@ BEGIN
ret = -99; ret = -99;
} }
mtx_lock:adaptive-acquire mutex_enter:adaptive-acquire
{ {
ret = mutex_type_adaptive((struct mtx *)arg0); ret = mutex_type_adaptive((kmutex_t *)arg0);
i++; i++;
} }

View File

@ -20,20 +20,18 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#pragma D option quiet #pragma D option quiet
#pragma D option strsize=32
struct { struct {
int index; int index;
int length; int length;
int nolen; int nolen;
int alt;
} command[int]; } command[int];
int i; int i;
@ -41,9 +39,6 @@ int i;
BEGIN BEGIN
{ {
str = "foobarbazbop"; str = "foobarbazbop";
str2 = "";
altstr = "CRAIG: Positioned them, I don't ";
altstr2 = "know... I'm fairly wide guy.";
command[i].index = 3; command[i].index = 3;
command[i].nolen = 1; command[i].nolen = 1;
@ -113,18 +108,6 @@ BEGIN
command[i].length = -1; command[i].length = -1;
i++; i++;
command[i].index = 3;
command[i].length = -4;
i++;
command[i].index = 3;
command[i].length = -20;
i++;
command[i].index = -10;
command[i].length = -5;
i++;
command[i].index = 0; command[i].index = 0;
command[i].length = 400; command[i].length = 400;
i++; i++;
@ -161,16 +144,6 @@ BEGIN
command[i].length = strlen(str) - 1; command[i].length = strlen(str) - 1;
i++; i++;
command[i].index = 100;
command[i].length = 10;
command[i].alt = 1;
i++;
command[i].index = 100;
command[i].nolen = 1;
command[i].alt = 1;
i++;
end = i; end = i;
i = 0; i = 0;
printf("#!/usr/perl5/bin/perl\n\nBEGIN {\n"); printf("#!/usr/perl5/bin/perl\n\nBEGIN {\n");
@ -180,21 +153,17 @@ BEGIN
tick-1ms tick-1ms
/i < end && command[i].nolen/ /i < end && command[i].nolen/
{ {
this->str = command[i].alt ? altstr : str; this->result = substr(str, command[i].index);
this->str2 = command[i].alt ? altstr2 : str2;
this->result = substr(command[i].alt ? printf("\tif (substr(\"%s\", %d) != \"%s\") {\n",
"CRAIG: Positioned them, I don't know... I'm fairly wide guy." : str, command[i].index, this->result);
printf("\t\tprintf(\"perl => substr(\\\"%s\\\", %d) = ",
str, command[i].index);
printf("\\\"%%s\\\"\\n\",\n\t\t substr(\"%s\", %d));\n",
str, command[i].index);
printf("\t\tprintf(\" D => substr(\\\"%s\\\", %d) = ",
str, command[i].index); str, command[i].index);
printf("\tif (substr(\"%s%s\", %d) ne \"%s\") {\n",
this->str, this->str2, command[i].index, this->result);
printf("\t\tprintf(\"perl => substr(\\\"%s%s\\\", %d) = ",
this->str, this->str2, command[i].index);
printf("\\\"%%s\\\"\\n\",\n\t\t substr(\"%s%s\", %d));\n",
this->str, this->str2, command[i].index);
printf("\t\tprintf(\" D => substr(\\\"%s%s\\\", %d) = ",
this->str, this->str2, command[i].index);
printf("\\\"%%s\\\"\\n\",\n\t\t \"%s\");\n", this->result); printf("\\\"%%s\\\"\\n\",\n\t\t \"%s\");\n", this->result);
printf("\t\t$failed++;\n"); printf("\t\t$failed++;\n");
printf("\t}\n\n"); printf("\t}\n\n");
@ -203,21 +172,16 @@ tick-1ms
tick-1ms tick-1ms
/i < end && !command[i].nolen/ /i < end && !command[i].nolen/
{ {
this->str = command[i].alt ? altstr : str; this->result = substr(str, command[i].index, command[i].length);
this->str2 = command[i].alt ? altstr2 : str2;
this->result = substr(command[i].alt ?
"CRAIG: Positioned them, I don't know... I'm fairly wide guy." :
str, command[i].index, command[i].length);
printf("\tif (substr(\"%s%s\", %d, %d) ne \"%s\") {\n", printf("\tif (substr(\"%s\", %d, %d) != \"%s\") {\n",
this->str, this->str2, command[i].index, command[i].length, str, command[i].index, command[i].length, this->result);
this->result); printf("\t\tprintf(\"perl => substr(\\\"%s\\\", %d, %d) = ",
printf("\t\tprintf(\"perl => substr(\\\"%s%s\\\", %d, %d) = ", str, command[i].index, command[i].length);
this->str, this->str2, command[i].index, command[i].length); printf("\\\"%%s\\\"\\n\",\n\t\t substr(\"%s\", %d, %d));\n",
printf("\\\"%%s\\\"\\n\",\n\t\t substr(\"%s%s\", %d, %d));\n", str, command[i].index, command[i].length);
this->str, this->str2, command[i].index, command[i].length); printf("\t\tprintf(\" D => substr(\\\"%s\\\", %d, %d) = ",
printf("\t\tprintf(\" D => substr(\\\"%s%s\\\", %d, %d) = ", str, command[i].index, command[i].length);
this->str, this->str2, command[i].index, command[i].length);
printf("\\\"%%s\\\"\\n\",\n\t\t \"%s\");\n", this->result); printf("\\\"%%s\\\"\\n\",\n\t\t \"%s\");\n", this->result);
printf("\t\t$failed++;\n"); printf("\t\t$failed++;\n");
printf("\t}\n\n"); printf("\t}\n\n");

View File

@ -1,7 +1,7 @@
#!/usr/perl5/bin/perl #!/usr/perl5/bin/perl
BEGIN { BEGIN {
if (substr("foobarbazbop", 3) ne "barbazbop") { if (substr("foobarbazbop", 3) != "barbazbop") {
printf("perl => substr(\"foobarbazbop\", 3) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 3) = \"%s\"\n",
substr("foobarbazbop", 3)); substr("foobarbazbop", 3));
printf(" D => substr(\"foobarbazbop\", 3) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 3) = \"%s\"\n",
@ -9,7 +9,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 300) ne "") { if (substr("foobarbazbop", 300) != "") {
printf("perl => substr(\"foobarbazbop\", 300) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 300) = \"%s\"\n",
substr("foobarbazbop", 300)); substr("foobarbazbop", 300));
printf(" D => substr(\"foobarbazbop\", 300) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 300) = \"%s\"\n",
@ -17,7 +17,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -10) ne "obarbazbop") { if (substr("foobarbazbop", -10) != "obarbazbop") {
printf("perl => substr(\"foobarbazbop\", -10) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -10) = \"%s\"\n",
substr("foobarbazbop", -10)); substr("foobarbazbop", -10));
printf(" D => substr(\"foobarbazbop\", -10) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -10) = \"%s\"\n",
@ -25,7 +25,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 0) ne "foobarbazbop") { if (substr("foobarbazbop", 0) != "foobarbazbop") {
printf("perl => substr(\"foobarbazbop\", 0) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 0) = \"%s\"\n",
substr("foobarbazbop", 0)); substr("foobarbazbop", 0));
printf(" D => substr(\"foobarbazbop\", 0) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 0) = \"%s\"\n",
@ -33,7 +33,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 1) ne "oobarbazbop") { if (substr("foobarbazbop", 1) != "oobarbazbop") {
printf("perl => substr(\"foobarbazbop\", 1) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 1) = \"%s\"\n",
substr("foobarbazbop", 1)); substr("foobarbazbop", 1));
printf(" D => substr(\"foobarbazbop\", 1) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 1) = \"%s\"\n",
@ -41,7 +41,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 11) ne "p") { if (substr("foobarbazbop", 11) != "p") {
printf("perl => substr(\"foobarbazbop\", 11) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 11) = \"%s\"\n",
substr("foobarbazbop", 11)); substr("foobarbazbop", 11));
printf(" D => substr(\"foobarbazbop\", 11) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 11) = \"%s\"\n",
@ -49,7 +49,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 12) ne "") { if (substr("foobarbazbop", 12) != "") {
printf("perl => substr(\"foobarbazbop\", 12) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 12) = \"%s\"\n",
substr("foobarbazbop", 12)); substr("foobarbazbop", 12));
printf(" D => substr(\"foobarbazbop\", 12) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 12) = \"%s\"\n",
@ -57,7 +57,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 13) ne "") { if (substr("foobarbazbop", 13) != "") {
printf("perl => substr(\"foobarbazbop\", 13) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 13) = \"%s\"\n",
substr("foobarbazbop", 13)); substr("foobarbazbop", 13));
printf(" D => substr(\"foobarbazbop\", 13) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 13) = \"%s\"\n",
@ -65,7 +65,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 8, 20) ne "zbop") { if (substr("foobarbazbop", 8, 20) != "zbop") {
printf("perl => substr(\"foobarbazbop\", 8, 20) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 8, 20) = \"%s\"\n",
substr("foobarbazbop", 8, 20)); substr("foobarbazbop", 8, 20));
printf(" D => substr(\"foobarbazbop\", 8, 20) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 8, 20) = \"%s\"\n",
@ -73,7 +73,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 4, 4) ne "arba") { if (substr("foobarbazbop", 4, 4) != "arba") {
printf("perl => substr(\"foobarbazbop\", 4, 4) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 4, 4) = \"%s\"\n",
substr("foobarbazbop", 4, 4)); substr("foobarbazbop", 4, 4));
printf(" D => substr(\"foobarbazbop\", 4, 4) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 4, 4) = \"%s\"\n",
@ -81,7 +81,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 5, 8) ne "rbazbop") { if (substr("foobarbazbop", 5, 8) != "rbazbop") {
printf("perl => substr(\"foobarbazbop\", 5, 8) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 5, 8) = \"%s\"\n",
substr("foobarbazbop", 5, 8)); substr("foobarbazbop", 5, 8));
printf(" D => substr(\"foobarbazbop\", 5, 8) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 5, 8) = \"%s\"\n",
@ -89,7 +89,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 5, 9) ne "rbazbop") { if (substr("foobarbazbop", 5, 9) != "rbazbop") {
printf("perl => substr(\"foobarbazbop\", 5, 9) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 5, 9) = \"%s\"\n",
substr("foobarbazbop", 5, 9)); substr("foobarbazbop", 5, 9));
printf(" D => substr(\"foobarbazbop\", 5, 9) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 5, 9) = \"%s\"\n",
@ -97,7 +97,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 400, 20) ne "") { if (substr("foobarbazbop", 400, 20) != "") {
printf("perl => substr(\"foobarbazbop\", 400, 20) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 400, 20) = \"%s\"\n",
substr("foobarbazbop", 400, 20)); substr("foobarbazbop", 400, 20));
printf(" D => substr(\"foobarbazbop\", 400, 20) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 400, 20) = \"%s\"\n",
@ -105,7 +105,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 400, 0) ne "") { if (substr("foobarbazbop", 400, 0) != "") {
printf("perl => substr(\"foobarbazbop\", 400, 0) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 400, 0) = \"%s\"\n",
substr("foobarbazbop", 400, 0)); substr("foobarbazbop", 400, 0));
printf(" D => substr(\"foobarbazbop\", 400, 0) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 400, 0) = \"%s\"\n",
@ -113,7 +113,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 400, -1) ne "") { if (substr("foobarbazbop", 400, -1) != "") {
printf("perl => substr(\"foobarbazbop\", 400, -1) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 400, -1) = \"%s\"\n",
substr("foobarbazbop", 400, -1)); substr("foobarbazbop", 400, -1));
printf(" D => substr(\"foobarbazbop\", 400, -1) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 400, -1) = \"%s\"\n",
@ -121,7 +121,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 3, 0) ne "") { if (substr("foobarbazbop", 3, 0) != "") {
printf("perl => substr(\"foobarbazbop\", 3, 0) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 3, 0) = \"%s\"\n",
substr("foobarbazbop", 3, 0)); substr("foobarbazbop", 3, 0));
printf(" D => substr(\"foobarbazbop\", 3, 0) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 3, 0) = \"%s\"\n",
@ -129,39 +129,15 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", 3, -1) ne "barbazbo") { if (substr("foobarbazbop", 3, -1) != "") {
printf("perl => substr(\"foobarbazbop\", 3, -1) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 3, -1) = \"%s\"\n",
substr("foobarbazbop", 3, -1)); substr("foobarbazbop", 3, -1));
printf(" D => substr(\"foobarbazbop\", 3, -1) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 3, -1) = \"%s\"\n",
"barbazbo");
$failed++;
}
if (substr("foobarbazbop", 3, -4) ne "barba") {
printf("perl => substr(\"foobarbazbop\", 3, -4) = \"%s\"\n",
substr("foobarbazbop", 3, -4));
printf(" D => substr(\"foobarbazbop\", 3, -4) = \"%s\"\n",
"barba");
$failed++;
}
if (substr("foobarbazbop", 3, -20) ne "") {
printf("perl => substr(\"foobarbazbop\", 3, -20) = \"%s\"\n",
substr("foobarbazbop", 3, -20));
printf(" D => substr(\"foobarbazbop\", 3, -20) = \"%s\"\n",
""); "");
$failed++; $failed++;
} }
if (substr("foobarbazbop", -10, -5) ne "obarb") { if (substr("foobarbazbop", 0, 400) != "foobarbazbop") {
printf("perl => substr(\"foobarbazbop\", -10, -5) = \"%s\"\n",
substr("foobarbazbop", -10, -5));
printf(" D => substr(\"foobarbazbop\", -10, -5) = \"%s\"\n",
"obarb");
$failed++;
}
if (substr("foobarbazbop", 0, 400) ne "foobarbazbop") {
printf("perl => substr(\"foobarbazbop\", 0, 400) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", 0, 400) = \"%s\"\n",
substr("foobarbazbop", 0, 400)); substr("foobarbazbop", 0, 400));
printf(" D => substr(\"foobarbazbop\", 0, 400) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", 0, 400) = \"%s\"\n",
@ -169,7 +145,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -1, 400) ne "p") { if (substr("foobarbazbop", -1, 400) != "p") {
printf("perl => substr(\"foobarbazbop\", -1, 400) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -1, 400) = \"%s\"\n",
substr("foobarbazbop", -1, 400)); substr("foobarbazbop", -1, 400));
printf(" D => substr(\"foobarbazbop\", -1, 400) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -1, 400) = \"%s\"\n",
@ -177,7 +153,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -1, 0) ne "") { if (substr("foobarbazbop", -1, 0) != "") {
printf("perl => substr(\"foobarbazbop\", -1, 0) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -1, 0) = \"%s\"\n",
substr("foobarbazbop", -1, 0)); substr("foobarbazbop", -1, 0));
printf(" D => substr(\"foobarbazbop\", -1, 0) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -1, 0) = \"%s\"\n",
@ -185,7 +161,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -1, -1) ne "") { if (substr("foobarbazbop", -1, -1) != "") {
printf("perl => substr(\"foobarbazbop\", -1, -1) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -1, -1) = \"%s\"\n",
substr("foobarbazbop", -1, -1)); substr("foobarbazbop", -1, -1));
printf(" D => substr(\"foobarbazbop\", -1, -1) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -1, -1) = \"%s\"\n",
@ -193,7 +169,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -24, 24) ne "foobarbazbop") { if (substr("foobarbazbop", -24, 24) != "foobarbazbop") {
printf("perl => substr(\"foobarbazbop\", -24, 24) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -24, 24) = \"%s\"\n",
substr("foobarbazbop", -24, 24)); substr("foobarbazbop", -24, 24));
printf(" D => substr(\"foobarbazbop\", -24, 24) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -24, 24) = \"%s\"\n",
@ -201,7 +177,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -24, 12) ne "") { if (substr("foobarbazbop", -24, 12) != "") {
printf("perl => substr(\"foobarbazbop\", -24, 12) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -24, 12) = \"%s\"\n",
substr("foobarbazbop", -24, 12)); substr("foobarbazbop", -24, 12));
printf(" D => substr(\"foobarbazbop\", -24, 12) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -24, 12) = \"%s\"\n",
@ -209,7 +185,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -24, 13) ne "f") { if (substr("foobarbazbop", -24, 13) != "f") {
printf("perl => substr(\"foobarbazbop\", -24, 13) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -24, 13) = \"%s\"\n",
substr("foobarbazbop", -24, 13)); substr("foobarbazbop", -24, 13));
printf(" D => substr(\"foobarbazbop\", -24, 13) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -24, 13) = \"%s\"\n",
@ -217,7 +193,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -12, 12) ne "foobarbazbop") { if (substr("foobarbazbop", -12, 12) != "foobarbazbop") {
printf("perl => substr(\"foobarbazbop\", -12, 12) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -12, 12) = \"%s\"\n",
substr("foobarbazbop", -12, 12)); substr("foobarbazbop", -12, 12));
printf(" D => substr(\"foobarbazbop\", -12, 12) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -12, 12) = \"%s\"\n",
@ -225,7 +201,7 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("foobarbazbop", -12, 11) ne "foobarbazbo") { if (substr("foobarbazbop", -12, 11) != "foobarbazbo") {
printf("perl => substr(\"foobarbazbop\", -12, 11) = \"%s\"\n", printf("perl => substr(\"foobarbazbop\", -12, 11) = \"%s\"\n",
substr("foobarbazbop", -12, 11)); substr("foobarbazbop", -12, 11));
printf(" D => substr(\"foobarbazbop\", -12, 11) = \"%s\"\n", printf(" D => substr(\"foobarbazbop\", -12, 11) = \"%s\"\n",
@ -233,22 +209,6 @@ BEGIN {
$failed++; $failed++;
} }
if (substr("CRAIG: Positioned them, I don't know... I'm fairly wide guy.", 100, 10) ne "") {
printf("perl => substr(\"CRAIG: Positioned them, I don't know... I'm fairly wide guy.\", 100, 10) = \"%s\"\n",
substr("CRAIG: Positioned them, I don't know... I'm fairly wide guy.", 100, 10));
printf(" D => substr(\"CRAIG: Positioned them, I don't know... I'm fairly wide guy.\", 100, 10) = \"%s\"\n",
"");
$failed++;
}
if (substr("CRAIG: Positioned them, I don't know... I'm fairly wide guy.", 100) ne "") {
printf("perl => substr(\"CRAIG: Positioned them, I don't know... I'm fairly wide guy.\", 100) = \"%s\"\n",
substr("CRAIG: Positioned them, I don't know... I'm fairly wide guy.", 100));
printf(" D => substr(\"CRAIG: Positioned them, I don't know... I'm fairly wide guy.\", 100) = \"%s\"\n",
"");
$failed++;
}
exit($failed); exit($failed);
} }

View File

@ -36,7 +36,7 @@ script()
{ {
$dtrace -s /dev/stdin <<EOF $dtrace -s /dev/stdin <<EOF
proc:::create proc:::create
/args[0]->p_pptr->p_pid == $child && pid == $child/ /args[0]->pr_ppid == $child && pid == $child/
{ {
exit(0); exit(0);
} }
@ -46,7 +46,7 @@ EOF
sleeper() sleeper()
{ {
while true; do while true; do
/bin/sleep 1 /usr/bin/sleep 1
done done
} }

View File

@ -36,12 +36,12 @@ script()
{ {
$dtrace -s /dev/stdin <<EOF $dtrace -s /dev/stdin <<EOF
proc:::exec proc:::exec
/curpsinfo->pr_ppid == $child && args[0] == "/bin/sleep"/ /curpsinfo->pr_ppid == $child && args[0] == "/usr/bin/sleep"/
{ {
self->exec = 1; self->exec = 1;
} }
proc:::exec_success proc:::exec-success
/self->exec/ /self->exec/
{ {
exit(0); exit(0);
@ -52,7 +52,7 @@ EOF
sleeper() sleeper()
{ {
while true; do while true; do
/bin/sleep 1 /usr/bin/sleep 1
done done
} }

View File

@ -42,7 +42,7 @@ script()
self->exec = 1; self->exec = 1;
} }
proc:::exec_failure proc:::exec-failure
/self->exec && args[0] == ENOENT/ /self->exec && args[0] == ENOENT/
{ {
exit(0); exit(0);
@ -53,7 +53,7 @@ EOF
sleeper() sleeper()
{ {
while true; do while true; do
/bin/sleep 1 /usr/bin/sleep 1
$badexec $badexec
done done
} }

View File

@ -45,7 +45,7 @@ script()
self->exec = 1; self->exec = 1;
} }
proc:::exec_failure proc:::exec-failure
/self->exec/ /self->exec/
{ {
exit(0); exit(0);
@ -56,7 +56,7 @@ EOF
sleeper() sleeper()
{ {
while true; do while true; do
/bin/sleep 1 /usr/bin/sleep 1
$badexec $badexec
done done
} }

View File

@ -43,16 +43,18 @@ script()
$dtrace -s /dev/stdin <<EOF $dtrace -s /dev/stdin <<EOF
proc:::exit proc:::exit
/curpsinfo->pr_ppid == $child && /curpsinfo->pr_ppid == $child &&
execargs == "$longsleep" && args[0] == CLD_DUMPED/ curpsinfo->pr_psargs == "$longsleep" && args[0] == CLD_DUMPED/
{ {
exit(0); exit(0);
} }
proc:::exit proc:::exit
/curpsinfo->pr_ppid == $child && /curpsinfo->pr_ppid == $child &&
execargs == "$longsleep" && args[0] != CLD_DUMPED/ curpsinfo->pr_psargs == "$longsleep" && args[0] != CLD_DUMPED/
{ {
printf("Child process could did dump core."); printf("Child process could not dump core. Check coreadm(1M)");
printf(" settings; either per-process or global core dumps ");
printf("must be enabled for this test to work properly.");
exit(1); exit(1);
} }
EOF EOF
@ -60,12 +62,13 @@ EOF
sleeper() sleeper()
{ {
/usr/bin/coreadm -p $corefile
while true; do while true; do
$longsleep & $longsleep &
/bin/sleep 1 /usr/bin/sleep 1
kill -SEGV $! kill -SEGV $!
done done
/bin/rm -f $corefile /usr/bin/rm -f $corefile
} }
if [ $# != 1 ]; then if [ $# != 1 ]; then
@ -74,8 +77,8 @@ if [ $# != 1 ]; then
fi fi
dtrace=$1 dtrace=$1
longsleep="/bin/sleep 10000" longsleep="/usr/bin/sleep 10000"
corefile=/tmp/sleep.core corefile=/tmp/core.$$
sleeper & sleeper &
child=$! child=$!
@ -83,10 +86,10 @@ child=$!
script script
status=$? status=$?
#pstop $child pstop $child
#pkill -P $child pkill -P $child
kill $child kill $child
#prun $child prun $child
/bin/rm -f $corefile /usr/bin/rm -f $corefile
exit $status exit $status

View File

@ -46,7 +46,7 @@ EOF
sleeper() sleeper()
{ {
while true; do while true; do
/bin/sleep 1 /usr/bin/sleep 1
done done
} }

View File

@ -33,8 +33,6 @@
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#define NANOSEC 1000000000
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
@ -43,7 +41,6 @@ main(int argc, char **argv)
sigset_t set; sigset_t set;
timer_t tid; timer_t tid;
char *cmd = argv[0]; char *cmd = argv[0];
int sig;
ev.sigev_notify = SIGEV_SIGNAL; ev.sigev_notify = SIGEV_SIGNAL;
ev.sigev_signo = SIGUSR1; ev.sigev_signo = SIGUSR1;
@ -69,9 +66,9 @@ main(int argc, char **argv)
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
do { for (;;) {
(void) sigwait(&set, &sig); (void) sigwait(&set);
} while(sig != SIGUSR1); }
/*NOTREACHED*/ /*NOTREACHED*/
return (0); return (0);

View File

@ -28,13 +28,13 @@
#pragma D option destructive #pragma D option destructive
proc:::signal_send proc:::signal-send
/args[1]->p_pid == $1 && args[2] == SIGUSR1/ /pid == 0 && args[1]->pr_pid == $1 && args[2] == SIGUSR1/
{ {
sent = 1; sent = 1;
} }
proc:::signal_clear proc:::signal-clear
/pid == $1 && args[0] == SIGUSR1 && sent/ /pid == $1 && args[0] == SIGUSR1 && sent/
{ {
exit(0); exit(0);

View File

@ -54,7 +54,7 @@ syscall::getpid:entry
timeout = timestamp + 500000000; timeout = timestamp + 500000000;
} }
syscall::exit:entry syscall::rexit:entry
{ {
exit(0); exit(0);
} }

View File

@ -28,7 +28,6 @@
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <stdlib.h>
static void static void
handle(int sig) handle(int sig)

View File

@ -54,7 +54,7 @@ syscall::getpid:return
timeout = timestamp + 500000000; timeout = timestamp + 500000000;
} }
syscall::exit:entry syscall::rexit:entry
{ {
exit(0); exit(0);
} }

View File

@ -28,7 +28,6 @@
#include <unistd.h> #include <unistd.h>
#include <signal.h> #include <signal.h>
#include <stdlib.h>
static void static void
handle(int sig) handle(int sig)

View File

@ -54,7 +54,7 @@ syscall::getpid:entry
timeout = timestamp + 500000000; timeout = timestamp + 500000000;
} }
syscall::exit:entry syscall::rexit:entry
{ {
exit(0); exit(0);
} }

View File

@ -38,22 +38,22 @@ fbt:::
fbt::: fbt:::
/on/ /on/
{ {
@[rw_read_held((struct rwlock *)&`unp_global_rwlock)] = count(); @[rw_read_held((krwlock_t *)&`clock)] = count();
@[rw_read_held((struct rwlock *)rand())] = count(); @[rw_read_held((krwlock_t *)rand())] = count();
} }
fbt::: fbt:::
/on/ /on/
{ {
@[rw_write_held((struct rwlock *)&`unp_global_rwlock)] = count(); @[rw_write_held((krwlock_t *)&`clock)] = count();
@[rw_write_held((struct rwlock *)rand())] = count(); @[rw_write_held((krwlock_t *)rand())] = count();
} }
fbt::: fbt:::
/on/ /on/
{ {
@[rw_iswriter((struct rwlock *)&`unp_global_rwlock)] = count(); @[rw_iswriter((krwlock_t *)&`clock)] = count();
@[rw_iswriter((struct rwlock *)rand())] = count(); @[rw_iswriter((krwlock_t *)rand())] = count();
} }
tick-1sec tick-1sec

View File

@ -61,8 +61,3 @@ tick-1
{ {
exit(0); exit(0);
} }
ERROR
{
exit(1);
}

View File

@ -52,8 +52,3 @@ tick-1
{ {
exit(0); exit(0);
} }
ERROR
{
exit(1);
}

View File

@ -40,9 +40,6 @@ die(char *format, ...)
{ {
va_list ap; va_list ap;
int err = errno; int err = errno;
#if !defined(sun)
const char *progname = getprogname();
#endif
(void) fprintf(stderr, "%s: ", progname); (void) fprintf(stderr, "%s: ", progname);
@ -54,20 +51,13 @@ die(char *format, ...)
if (format[strlen(format) - 1] != '\n') if (format[strlen(format) - 1] != '\n')
(void) fprintf(stderr, ": %s\n", strerror(err)); (void) fprintf(stderr, ": %s\n", strerror(err));
#if defined(__FreeBSD__)
exit(0);
#else
exit(1); exit(1);
#endif
} }
void void
elfdie(char *format, ...) elfdie(char *format, ...)
{ {
va_list ap; va_list ap;
#if !defined(sun)
const char *progname = getprogname();
#endif
(void) fprintf(stderr, "%s: ", progname); (void) fprintf(stderr, "%s: ", progname);
@ -79,9 +69,5 @@ elfdie(char *format, ...)
if (format[strlen(format) - 1] != '\n') if (format[strlen(format) - 1] != '\n')
(void) fprintf(stderr, ": %s\n", elf_errmsg(elf_errno())); (void) fprintf(stderr, ": %s\n", elf_errmsg(elf_errno()));
#if defined(__FreeBSD__)
exit(0);
#else
exit(1); exit(1);
#endif
} }

View File

@ -40,9 +40,7 @@ extern int findelfsecidx(Elf *, char *);
extern void die(char *, ...); extern void die(char *, ...);
extern void elfdie(char *, ...); extern void elfdie(char *, ...);
#if defined(sun)
extern const char *progname; extern const char *progname;
#endif
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -39,11 +39,7 @@ extern "C" {
#endif #endif
#include <sys/types.h> #include <sys/types.h>
#if defined(sun)
#include <sys/machelf.h> #include <sys/machelf.h>
#else
#include <sys/elf.h>
#endif
/* /*
* An Alist implements array lists. The functionality is similar to * An Alist implements array lists. The functionality is similar to

View File

@ -405,7 +405,6 @@ extern uintptr_t Dbg_setup(const char *, Dbg_desc *);
#define Dbg_unused_file Dbg64_unused_file #define Dbg_unused_file Dbg64_unused_file
#define Dbg_unused_lcinterface Dbg64_unused_lcinterface #define Dbg_unused_lcinterface Dbg64_unused_lcinterface
#define Dbg_unused_path Dbg64_unused_path
#define Dbg_unused_sec Dbg64_unused_sec #define Dbg_unused_sec Dbg64_unused_sec
#define Dbg_unused_unref Dbg64_unused_unref #define Dbg_unused_unref Dbg64_unused_unref
@ -608,7 +607,6 @@ extern uintptr_t Dbg_setup(const char *, Dbg_desc *);
#define Dbg_unused_file Dbg32_unused_file #define Dbg_unused_file Dbg32_unused_file
#define Dbg_unused_lcinterface Dbg32_unused_lcinterface #define Dbg_unused_lcinterface Dbg32_unused_lcinterface
#define Dbg_unused_path Dbg32_unused_path
#define Dbg_unused_sec Dbg32_unused_sec #define Dbg_unused_sec Dbg32_unused_sec
#define Dbg_unused_unref Dbg32_unused_unref #define Dbg_unused_unref Dbg32_unused_unref
@ -678,7 +676,7 @@ extern void Dbg_file_del_rescan(Lm_list *);
extern void Dbg_file_delete(Rt_map *); extern void Dbg_file_delete(Rt_map *);
extern void Dbg_file_dlclose(Lm_list *, const char *, int); extern void Dbg_file_dlclose(Lm_list *, const char *, int);
extern void Dbg_file_dldump(Rt_map *, const char *, int); extern void Dbg_file_dldump(Rt_map *, const char *, int);
extern void Dbg_file_dlopen(Rt_map *, const char *, int *, int); extern void Dbg_file_dlopen(Rt_map *, const char *, int);
extern void Dbg_file_elf(Lm_list *, const char *, ulong_t, ulong_t, extern void Dbg_file_elf(Lm_list *, const char *, ulong_t, ulong_t,
ulong_t, ulong_t, const char *, Aliste); ulong_t, ulong_t, const char *, Aliste);
extern void Dbg_file_filtee(Lm_list *, const char *, const char *, int); extern void Dbg_file_filtee(Lm_list *, const char *, const char *, int);
@ -710,7 +708,7 @@ extern void Dbg_libs_found(Lm_list *, const char *, int);
extern void Dbg_libs_ignore(Lm_list *, const char *); extern void Dbg_libs_ignore(Lm_list *, const char *);
extern void Dbg_libs_init(Lm_list *, List *, List *); extern void Dbg_libs_init(Lm_list *, List *, List *);
extern void Dbg_libs_l(Lm_list *, const char *, const char *); extern void Dbg_libs_l(Lm_list *, const char *, const char *);
extern void Dbg_libs_path(Lm_list *, const char *, uint_t, const char *); extern void Dbg_libs_path(Lm_list *, const char *, Half, const char *);
extern void Dbg_libs_req(Lm_list *, const char *, const char *, extern void Dbg_libs_req(Lm_list *, const char *, const char *,
const char *); const char *);
extern void Dbg_libs_update(Lm_list *, List *, List *); extern void Dbg_libs_update(Lm_list *, List *, List *);
@ -807,8 +805,7 @@ extern void Dbg_syms_ar_resolve(Lm_list *, Xword, Elf_Arsym *,
extern void Dbg_syms_ar_title(Lm_list *, const char *, int); extern void Dbg_syms_ar_title(Lm_list *, const char *, int);
extern void Dbg_syms_created(Lm_list *, const char *); extern void Dbg_syms_created(Lm_list *, const char *);
extern void Dbg_syms_discarded(Lm_list *, Sym_desc *); extern void Dbg_syms_discarded(Lm_list *, Sym_desc *);
extern void Dbg_syms_dlsym(Rt_map *, const char *, int *, const char *, extern void Dbg_syms_dlsym(Rt_map *, const char *, const char *, int);
int);
extern void Dbg_syms_dup_sort_addr(Lm_list *, const char *, const char *, extern void Dbg_syms_dup_sort_addr(Lm_list *, const char *, const char *,
const char *, Addr); const char *, Addr);
extern void Dbg_syms_entered(Ofl_desc *, Sym *, Sym_desc *); extern void Dbg_syms_entered(Ofl_desc *, Sym *, Sym_desc *);
@ -861,8 +858,6 @@ extern void Dbg_util_wait(Rt_map *, Rt_map *, int);
extern void Dbg_unused_file(Lm_list *, const char *, int, uint_t); extern void Dbg_unused_file(Lm_list *, const char *, int, uint_t);
extern void Dbg_unused_lcinterface(Rt_map *, Rt_map *, int); extern void Dbg_unused_lcinterface(Rt_map *, Rt_map *, int);
extern void Dbg_unused_path(Lm_list *, const char *, uint_t, uint_t,
const char *);
extern void Dbg_unused_sec(Lm_list *, Is_desc *); extern void Dbg_unused_sec(Lm_list *, Is_desc *);
extern void Dbg_unused_unref(Rt_map *, const char *); extern void Dbg_unused_unref(Rt_map *, const char *);

View File

@ -24,7 +24,7 @@
* All Rights Reserved * All Rights Reserved
* *
* *
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
* *
* Global include file for all sgs. * Global include file for all sgs.
@ -35,6 +35,7 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
@ -48,11 +49,7 @@ extern "C" {
#ifndef _ASM #ifndef _ASM
#include <sys/types.h> #include <sys/types.h>
#if defined(sun)
#include <sys/machelf.h> #include <sys/machelf.h>
#else
#include <elf.h>
#endif
#include <stdlib.h> #include <stdlib.h>
#include <libelf.h> #include <libelf.h>
#include <assert.h> #include <assert.h>
@ -69,14 +66,8 @@ extern "C" {
#ifndef _ASM #ifndef _ASM
/* extern const char link_ver_string[]; /* Linker version id */
* link_ver_string[] contains a version string for use by the link-editor /* see libconv/{plat}/vernote.s */
* and all other linker components. It is found in libconv, and is
* generated by sgs/libconv/common/bld_vernote.ksh. That script produces
* libconv/{plat}/vernote.s, which is in turn assembled/linked into
* libconv.
*/
extern const char link_ver_string[];
/* /*
* Macro to round to next double word boundary. * Macro to round to next double word boundary.
*/ */

View File

@ -27,7 +27,6 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h> #include <sys/types.h>
#include <sgs.h>
/* /*
* function that will find a prime'ish number. Usefull for * function that will find a prime'ish number. Usefull for

View File

@ -29,25 +29,18 @@
#include <sys/types.h> #include <sys/types.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/zmod.h>
#include <ctf_impl.h> #include <ctf_impl.h>
#include <unistd.h> #include <unistd.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#if defined(sun)
#include <dlfcn.h> #include <dlfcn.h>
#else
#include <zlib.h>
#endif
#include <gelf.h> #include <gelf.h>
#if defined(sun)
#ifdef _LP64 #ifdef _LP64
static const char *_libctf_zlib = "/usr/lib/64/libz.so"; static const char *_libctf_zlib = "/usr/lib/64/libz.so";
#else #else
static const char *_libctf_zlib = "/usr/lib/libz.so"; static const char *_libctf_zlib = "/usr/lib/libz.so";
#endif #endif
#endif
static struct { static struct {
int (*z_uncompress)(uchar_t *, ulong_t *, const uchar_t *, ulong_t); int (*z_uncompress)(uchar_t *, ulong_t *, const uchar_t *, ulong_t);
@ -58,20 +51,14 @@ static struct {
static size_t _PAGESIZE; static size_t _PAGESIZE;
static size_t _PAGEMASK; static size_t _PAGEMASK;
#if defined(sun)
#pragma init(_libctf_init) #pragma init(_libctf_init)
#else
void _libctf_init(void) __attribute__ ((constructor));
#endif
void void
_libctf_init(void) _libctf_init(void)
{ {
#if defined(sun)
const char *p = getenv("LIBCTF_DECOMPRESSOR"); const char *p = getenv("LIBCTF_DECOMPRESSOR");
if (p != NULL) if (p != NULL)
_libctf_zlib = p; /* use alternate decompression library */ _libctf_zlib = p; /* use alternate decompression library */
#endif
_libctf_debug = getenv("LIBCTF_DEBUG") != NULL; _libctf_debug = getenv("LIBCTF_DEBUG") != NULL;
@ -87,7 +74,6 @@ _libctf_init(void)
void * void *
ctf_zopen(int *errp) ctf_zopen(int *errp)
{ {
#if defined(sun)
ctf_dprintf("decompressing CTF data using %s\n", _libctf_zlib); ctf_dprintf("decompressing CTF data using %s\n", _libctf_zlib);
if (zlib.z_dlp != NULL) if (zlib.z_dlp != NULL)
@ -99,21 +85,14 @@ ctf_zopen(int *errp)
if ((zlib.z_dlp = dlopen(_libctf_zlib, RTLD_LAZY | RTLD_LOCAL)) == NULL) if ((zlib.z_dlp = dlopen(_libctf_zlib, RTLD_LAZY | RTLD_LOCAL)) == NULL)
return (ctf_set_open_errno(errp, ECTF_ZINIT)); return (ctf_set_open_errno(errp, ECTF_ZINIT));
zlib.z_uncompress = (int (*)(uchar_t *, ulong_t *, const uchar_t *, ulong_t)) dlsym(zlib.z_dlp, "uncompress"); zlib.z_uncompress = (int (*)()) dlsym(zlib.z_dlp, "uncompress");
zlib.z_error = (const char *(*)(int)) dlsym(zlib.z_dlp, "zError"); zlib.z_error = (const char *(*)()) dlsym(zlib.z_dlp, "zError");
if (zlib.z_uncompress == NULL || zlib.z_error == NULL) { if (zlib.z_uncompress == NULL || zlib.z_error == NULL) {
(void) dlclose(zlib.z_dlp); (void) dlclose(zlib.z_dlp);
bzero(&zlib, sizeof (zlib)); bzero(&zlib, sizeof (zlib));
return (ctf_set_open_errno(errp, ECTF_ZINIT)); return (ctf_set_open_errno(errp, ECTF_ZINIT));
} }
#else
zlib.z_uncompress = uncompress;
zlib.z_error = zError;
/* Dummy return variable as 'no error' */
zlib.z_dlp = (void *) (uintptr_t) 1;
#endif
return (zlib.z_dlp); return (zlib.z_dlp);
} }
@ -241,7 +220,7 @@ ctf_fdopen(int fd, int *errp)
* If we have read enough bytes to form a CTF header and the magic * If we have read enough bytes to form a CTF header and the magic
* string matches, attempt to interpret the file as raw CTF. * string matches, attempt to interpret the file as raw CTF.
*/ */
if (nbytes >= (ssize_t) sizeof (ctf_preamble_t) && if (nbytes >= sizeof (ctf_preamble_t) &&
hdr.ctf.ctp_magic == CTF_MAGIC) { hdr.ctf.ctp_magic == CTF_MAGIC) {
if (hdr.ctf.ctp_version > CTF_VERSION) if (hdr.ctf.ctp_version > CTF_VERSION)
return (ctf_set_open_errno(errp, ECTF_CTFVERS)); return (ctf_set_open_errno(errp, ECTF_CTFVERS));
@ -271,7 +250,7 @@ ctf_fdopen(int fd, int *errp)
* do our own largefile ELF processing, and convert everything to * do our own largefile ELF processing, and convert everything to
* GElf structures so that clients can operate on any data model. * GElf structures so that clients can operate on any data model.
*/ */
if (nbytes >= (ssize_t) sizeof (Elf32_Ehdr) && if (nbytes >= sizeof (Elf32_Ehdr) &&
bcmp(&hdr.e32.e_ident[EI_MAG0], ELFMAG, SELFMAG) == 0) { bcmp(&hdr.e32.e_ident[EI_MAG0], ELFMAG, SELFMAG) == 0) {
#ifdef _BIG_ENDIAN #ifdef _BIG_ENDIAN
uchar_t order = ELFDATA2MSB; uchar_t order = ELFDATA2MSB;
@ -283,7 +262,7 @@ ctf_fdopen(int fd, int *errp)
void *strs_map; void *strs_map;
size_t strs_mapsz; size_t strs_mapsz;
char *strs; const char *strs;
if (hdr.e32.e_ident[EI_DATA] != order) if (hdr.e32.e_ident[EI_DATA] != order)
return (ctf_set_open_errno(errp, ECTF_ENDIAN)); return (ctf_set_open_errno(errp, ECTF_ENDIAN));
@ -291,7 +270,7 @@ ctf_fdopen(int fd, int *errp)
return (ctf_set_open_errno(errp, ECTF_ELFVERS)); return (ctf_set_open_errno(errp, ECTF_ELFVERS));
if (hdr.e32.e_ident[EI_CLASS] == ELFCLASS64) { if (hdr.e32.e_ident[EI_CLASS] == ELFCLASS64) {
if (nbytes < (ssize_t) sizeof (GElf_Ehdr)) if (nbytes < sizeof (GElf_Ehdr))
return (ctf_set_open_errno(errp, ECTF_FMT)); return (ctf_set_open_errno(errp, ECTF_FMT));
} else { } else {
Elf32_Ehdr e32 = hdr.e32; Elf32_Ehdr e32 = hdr.e32;
@ -342,7 +321,7 @@ ctf_fdopen(int fd, int *errp)
strs_map = mmap64(NULL, strs_mapsz, PROT_READ, MAP_PRIVATE, strs_map = mmap64(NULL, strs_mapsz, PROT_READ, MAP_PRIVATE,
fd, sp[hdr.e64.e_shstrndx].sh_offset & _PAGEMASK); fd, sp[hdr.e64.e_shstrndx].sh_offset & _PAGEMASK);
strs = (char *)strs_map + strs = (const char *)strs_map +
(sp[hdr.e64.e_shstrndx].sh_offset & ~_PAGEMASK); (sp[hdr.e64.e_shstrndx].sh_offset & ~_PAGEMASK);
if (strs_map == MAP_FAILED) { if (strs_map == MAP_FAILED) {

View File

@ -27,6 +27,7 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#include <ctf_impl.h> #include <ctf_impl.h>
#include <libctf.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <stdarg.h> #include <stdarg.h>
@ -57,7 +58,7 @@ ctf_alloc(size_t size)
/*ARGSUSED*/ /*ARGSUSED*/
void void
ctf_free(void *buf, __unused size_t size) ctf_free(void *buf, size_t size)
{ {
free(buf); free(buf);
} }
@ -65,7 +66,7 @@ ctf_free(void *buf, __unused size_t size)
const char * const char *
ctf_strerror(int err) ctf_strerror(int err)
{ {
return ((const char *) strerror(err)); return (strerror(err));
} }
/*PRINTFLIKE1*/ /*PRINTFLIKE1*/

View File

@ -55,7 +55,7 @@
* DTRACE_DOF_INIT_DEVNAME set the path to the helper node * DTRACE_DOF_INIT_DEVNAME set the path to the helper node
*/ */
static const char *devnamep = "/dev/dtrace/helper"; static const char *devname = "/dev/dtrace/helper";
static const char *olddevname = "/devices/pseudo/dtrace@0:helper"; static const char *olddevname = "/devices/pseudo/dtrace@0:helper";
static const char *modname; /* Name of this load object */ static const char *modname; /* Name of this load object */
@ -85,12 +85,7 @@ dprintf(int debug, const char *fmt, ...)
va_end(ap); va_end(ap);
} }
#if defined(sun)
#pragma init(dtrace_dof_init) #pragma init(dtrace_dof_init)
#else
static void dtrace_dof_init(void) __attribute__ ((constructor));
#endif
static void static void
dtrace_dof_init(void) dtrace_dof_init(void)
{ {
@ -101,13 +96,8 @@ dtrace_dof_init(void)
Elf32_Ehdr *elf; Elf32_Ehdr *elf;
#endif #endif
dof_helper_t dh; dof_helper_t dh;
#if defined(sun)
Link_map *lmp; Link_map *lmp;
Lmid_t lmid; Lmid_t lmid;
#else
struct link_map *lmp;
u_long lmid = 0;
#endif
int fd; int fd;
const char *p; const char *p;
@ -119,12 +109,10 @@ dtrace_dof_init(void)
return; return;
} }
#if defined(sun)
if (dlinfo(RTLD_SELF, RTLD_DI_LMID, &lmid) == -1) { if (dlinfo(RTLD_SELF, RTLD_DI_LMID, &lmid) == -1) {
dprintf(1, "couldn't discover link map ID\n"); dprintf(1, "couldn't discover link map ID\n");
return; return;
} }
#endif
if ((modname = strrchr(lmp->l_name, '/')) == NULL) if ((modname = strrchr(lmp->l_name, '/')) == NULL)
modname = lmp->l_name; modname = lmp->l_name;
@ -142,7 +130,7 @@ dtrace_dof_init(void)
elf = (void *)lmp->l_addr; elf = (void *)lmp->l_addr;
dh.dofhp_dof = (uintptr_t)dof; dh.dofhp_dof = (uintptr_t)dof;
dh.dofhp_addr = elf->e_type == ET_DYN ? (uintptr_t) lmp->l_addr : 0; dh.dofhp_addr = elf->e_type == ET_DYN ? lmp->l_addr : 0;
if (lmid == 0) { if (lmid == 0) {
(void) snprintf(dh.dofhp_mod, sizeof (dh.dofhp_mod), (void) snprintf(dh.dofhp_mod, sizeof (dh.dofhp_mod),
@ -153,10 +141,10 @@ dtrace_dof_init(void)
} }
if ((p = getenv("DTRACE_DOF_INIT_DEVNAME")) != NULL) if ((p = getenv("DTRACE_DOF_INIT_DEVNAME")) != NULL)
devnamep = p; devname = p;
if ((fd = open64(devnamep, O_RDWR)) < 0) { if ((fd = open64(devname, O_RDWR)) < 0) {
dprintf(1, "failed to open helper device %s", devnamep); dprintf(1, "failed to open helper device %s", devname);
/* /*
* If the device path wasn't explicitly set, try again with * If the device path wasn't explicitly set, try again with
@ -165,10 +153,10 @@ dtrace_dof_init(void)
if (p != NULL) if (p != NULL)
return; return;
devnamep = olddevname; devname = olddevname;
if ((fd = open64(devnamep, O_RDWR)) < 0) { if ((fd = open64(devname, O_RDWR)) < 0) {
dprintf(1, "failed to open helper device %s", devnamep); dprintf(1, "failed to open helper device %s", devname);
return; return;
} }
} }
@ -181,19 +169,14 @@ dtrace_dof_init(void)
(void) close(fd); (void) close(fd);
} }
#if defined(sun)
#pragma fini(dtrace_dof_fini) #pragma fini(dtrace_dof_fini)
#else
static void dtrace_dof_fini(void) __attribute__ ((destructor));
#endif
static void static void
dtrace_dof_fini(void) dtrace_dof_fini(void)
{ {
int fd; int fd;
if ((fd = open64(devnamep, O_RDWR)) < 0) { if ((fd = open64(devname, O_RDWR)) < 0) {
dprintf(1, "failed to open helper device %s", devnamep); dprintf(1, "failed to open helper device %s", devname);
return; return;
} }

View File

@ -32,11 +32,7 @@
#include <unistd.h> #include <unistd.h>
#include <dt_impl.h> #include <dt_impl.h>
#include <assert.h> #include <assert.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#else
#include <sys/sysctl.h>
#endif
#include <limits.h> #include <limits.h>
#define DTRACE_AHASHSIZE 32779 /* big 'ol prime */ #define DTRACE_AHASHSIZE 32779 /* big 'ol prime */
@ -58,7 +54,7 @@ static int dt_keypos;
static void static void
dt_aggregate_count(int64_t *existing, int64_t *new, size_t size) dt_aggregate_count(int64_t *existing, int64_t *new, size_t size)
{ {
uint_t i; int i;
for (i = 0; i < size / sizeof (int64_t); i++) for (i = 0; i < size / sizeof (int64_t); i++)
existing[i] = existing[i] + new[i]; existing[i] = existing[i] + new[i];
@ -211,10 +207,9 @@ dt_aggregate_lquantizedcmp(int64_t *lhs, int64_t *rhs)
static int static int
dt_aggregate_quantizedcmp(int64_t *lhs, int64_t *rhs) dt_aggregate_quantizedcmp(int64_t *lhs, int64_t *rhs)
{ {
int nbuckets = DTRACE_QUANTIZE_NBUCKETS; int nbuckets = DTRACE_QUANTIZE_NBUCKETS, i;
long double ltotal = 0, rtotal = 0; long double ltotal = 0, rtotal = 0;
int64_t lzero, rzero; int64_t lzero, rzero;
uint_t i;
for (i = 0; i < nbuckets; i++) { for (i = 0; i < nbuckets; i++) {
int64_t bucketval = DTRACE_QUANTIZE_BUCKETVAL(i); int64_t bucketval = DTRACE_QUANTIZE_BUCKETVAL(i);
@ -264,11 +259,7 @@ dt_aggregate_usym(dtrace_hdl_t *dtp, uint64_t *data)
dt_proc_lock(dtp, P); dt_proc_lock(dtp, P);
#if defined(sun)
if (Plookup_by_addr(P, *pc, NULL, 0, &sym) == 0) if (Plookup_by_addr(P, *pc, NULL, 0, &sym) == 0)
#else
if (proc_addr2sym(P, *pc, NULL, 0, &sym) == 0)
#endif
*pc = sym.st_value; *pc = sym.st_value;
dt_proc_unlock(dtp, P); dt_proc_unlock(dtp, P);
@ -291,11 +282,7 @@ dt_aggregate_umod(dtrace_hdl_t *dtp, uint64_t *data)
dt_proc_lock(dtp, P); dt_proc_lock(dtp, P);
#if defined(sun)
if ((map = Paddr_to_map(P, *pc)) != NULL) if ((map = Paddr_to_map(P, *pc)) != NULL)
#else
if ((map = proc_addr2map(P, *pc)) != NULL)
#endif
*pc = map->pr_vaddr; *pc = map->pr_vaddr;
dt_proc_unlock(dtp, P); dt_proc_unlock(dtp, P);
@ -380,11 +367,7 @@ dt_aggregate_snap_cpu(dtrace_hdl_t *dtp, processorid_t cpu)
buf->dtbd_cpu = cpu; buf->dtbd_cpu = cpu;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_AGGSNAP, buf) == -1) { if (dt_ioctl(dtp, DTRACEIOC_AGGSNAP, buf) == -1) {
#else
if (dt_ioctl(dtp, DTRACEIOC_AGGSNAP, &buf) == -1) {
#endif
if (errno == ENOENT) { if (errno == ENOENT) {
/* /*
* If that failed with ENOENT, it may be because the * If that failed with ENOENT, it may be because the
@ -653,7 +636,7 @@ dtrace_aggregate_snap(dtrace_hdl_t *dtp)
return (0); return (0);
for (i = 0; i < agp->dtat_ncpus; i++) { for (i = 0; i < agp->dtat_ncpus; i++) {
if ((rval = dt_aggregate_snap_cpu(dtp, agp->dtat_cpus[i]))) if (rval = dt_aggregate_snap_cpu(dtp, agp->dtat_cpus[i]))
return (rval); return (rval);
} }
@ -1131,7 +1114,7 @@ dt_aggwalk_rval(dtrace_hdl_t *dtp, dt_ahashent_t *h, int rval)
case DTRACE_AGGWALK_REMOVE: { case DTRACE_AGGWALK_REMOVE: {
dtrace_aggdata_t *aggdata = &h->dtahe_data; dtrace_aggdata_t *aggdata = &h->dtahe_data;
int max_cpus = agp->dtat_maxcpu; int i, max_cpus = agp->dtat_maxcpu;
/* /*
* First, remove this hash entry from its hash chain. * First, remove this hash entry from its hash chain.

View File

@ -20,7 +20,7 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
@ -87,7 +87,6 @@
#include <sys/wait.h> #include <sys/wait.h>
#include <assert.h> #include <assert.h>
#include <string.h>
#include <strings.h> #include <strings.h>
#include <signal.h> #include <signal.h>
#include <unistd.h> #include <unistd.h>
@ -948,77 +947,6 @@ dt_action_speculate(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
ap->dtad_kind = DTRACEACT_SPECULATE; ap->dtad_kind = DTRACEACT_SPECULATE;
} }
static void
dt_action_printm(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
{
dtrace_actdesc_t *ap = dt_stmt_action(dtp, sdp);
dt_node_t *size = dnp->dn_args;
dt_node_t *addr = dnp->dn_args->dn_list;
char n[DT_TYPE_NAMELEN];
if (dt_node_is_posconst(size) == 0) {
dnerror(size, D_PRINTM_SIZE, "printm( ) argument #1 must "
"be a non-zero positive integral constant expression\n");
}
if (dt_node_is_pointer(addr) == 0) {
dnerror(addr, D_PRINTM_ADDR,
"printm( ) argument #2 is incompatible with "
"prototype:\n\tprototype: pointer\n"
"\t argument: %s\n",
dt_node_type_name(addr, n, sizeof (n)));
}
dt_cg(yypcb, addr);
ap->dtad_difo = dt_as(yypcb);
ap->dtad_kind = DTRACEACT_PRINTM;
ap->dtad_difo->dtdo_rtype.dtdt_flags |= DIF_TF_BYREF;
ap->dtad_difo->dtdo_rtype.dtdt_size = size->dn_value + sizeof(uintptr_t);
}
static void
dt_action_printt(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
{
dtrace_actdesc_t *ap = dt_stmt_action(dtp, sdp);
dt_node_t *size = dnp->dn_args;
dt_node_t *addr = dnp->dn_args->dn_list;
char n[DT_TYPE_NAMELEN];
if (dt_node_is_posconst(size) == 0) {
dnerror(size, D_PRINTT_SIZE, "printt( ) argument #1 must "
"be a non-zero positive integral constant expression\n");
}
if (addr == NULL || addr->dn_kind != DT_NODE_FUNC ||
addr->dn_ident != dt_idhash_lookup(dtp->dt_globals, "typeref")) {
dnerror(addr, D_PRINTT_ADDR,
"printt( ) argument #2 is incompatible with "
"prototype:\n\tprototype: typeref()\n"
"\t argument: %s\n",
dt_node_type_name(addr, n, sizeof (n)));
}
dt_cg(yypcb, addr);
ap->dtad_difo = dt_as(yypcb);
ap->dtad_kind = DTRACEACT_PRINTT;
ap->dtad_difo->dtdo_rtype.dtdt_flags |= DIF_TF_BYREF;
/*
* Allow additional buffer space for the data size, type size,
* type string length and a stab in the dark (32 bytes) for the
* type string. The type string is part of the typeref() that
* this action references.
*/
ap->dtad_difo->dtdo_rtype.dtdt_size = size->dn_value + 3 * sizeof(uintptr_t) + 32;
}
static void static void
dt_action_commit(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp) dt_action_commit(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
{ {
@ -1085,12 +1013,6 @@ dt_compile_fun(dtrace_hdl_t *dtp, dt_node_t *dnp, dtrace_stmtdesc_t *sdp)
case DT_ACT_PRINTF: case DT_ACT_PRINTF:
dt_action_printflike(dtp, dnp->dn_expr, sdp, DTRACEACT_PRINTF); dt_action_printflike(dtp, dnp->dn_expr, sdp, DTRACEACT_PRINTF);
break; break;
case DT_ACT_PRINTM:
dt_action_printm(dtp, dnp->dn_expr, sdp);
break;
case DT_ACT_PRINTT:
dt_action_printt(dtp, dnp->dn_expr, sdp);
break;
case DT_ACT_RAISE: case DT_ACT_RAISE:
dt_action_raise(dtp, dnp->dn_expr, sdp); dt_action_raise(dtp, dnp->dn_expr, sdp);
break; break;
@ -1667,9 +1589,7 @@ dt_preproc(dtrace_hdl_t *dtp, FILE *ifp)
char **argv = malloc(sizeof (char *) * (argc + 5)); char **argv = malloc(sizeof (char *) * (argc + 5));
FILE *ofp = tmpfile(); FILE *ofp = tmpfile();
#if defined(sun)
char ipath[20], opath[20]; /* big enough for /dev/fd/ + INT_MAX + \0 */ char ipath[20], opath[20]; /* big enough for /dev/fd/ + INT_MAX + \0 */
#endif
char verdef[32]; /* big enough for -D__SUNW_D_VERSION=0x%08x + \0 */ char verdef[32]; /* big enough for -D__SUNW_D_VERSION=0x%08x + \0 */
struct sigaction act, oact; struct sigaction act, oact;
@ -1677,11 +1597,7 @@ dt_preproc(dtrace_hdl_t *dtp, FILE *ifp)
int wstat, estat; int wstat, estat;
pid_t pid; pid_t pid;
#if defined(sun)
off64_t off; off64_t off;
#else
off_t off = 0;
#endif
int c; int c;
if (argv == NULL || ofp == NULL) { if (argv == NULL || ofp == NULL) {
@ -1708,10 +1624,8 @@ dt_preproc(dtrace_hdl_t *dtp, FILE *ifp)
(void) fseeko64(ifp, off, SEEK_SET); (void) fseeko64(ifp, off, SEEK_SET);
} }
#if defined(sun)
(void) snprintf(ipath, sizeof (ipath), "/dev/fd/%d", fileno(ifp)); (void) snprintf(ipath, sizeof (ipath), "/dev/fd/%d", fileno(ifp));
(void) snprintf(opath, sizeof (opath), "/dev/fd/%d", fileno(ofp)); (void) snprintf(opath, sizeof (opath), "/dev/fd/%d", fileno(ofp));
#endif
bcopy(dtp->dt_cpp_argv, argv, sizeof (char *) * argc); bcopy(dtp->dt_cpp_argv, argv, sizeof (char *) * argc);
@ -1719,7 +1633,6 @@ dt_preproc(dtrace_hdl_t *dtp, FILE *ifp)
"-D__SUNW_D_VERSION=0x%08x", dtp->dt_vmax); "-D__SUNW_D_VERSION=0x%08x", dtp->dt_vmax);
argv[argc++] = verdef; argv[argc++] = verdef;
#if defined(sun)
switch (dtp->dt_stdcmode) { switch (dtp->dt_stdcmode) {
case DT_STDC_XA: case DT_STDC_XA:
case DT_STDC_XT: case DT_STDC_XT:
@ -1732,9 +1645,6 @@ dt_preproc(dtrace_hdl_t *dtp, FILE *ifp)
argv[argc++] = ipath; argv[argc++] = ipath;
argv[argc++] = opath; argv[argc++] = opath;
#else
argv[argc++] = "-P";
#endif
argv[argc] = NULL; argv[argc] = NULL;
/* /*
@ -1761,12 +1671,6 @@ dt_preproc(dtrace_hdl_t *dtp, FILE *ifp)
} }
if (pid == 0) { if (pid == 0) {
#if !defined(sun)
if (isatty(fileno(ifp)) == 0)
lseek(fileno(ifp), off, SEEK_SET);
dup2(fileno(ifp), 0);
dup2(fileno(ofp), 1);
#endif
(void) execvp(dtp->dt_cpp_path, argv); (void) execvp(dtp->dt_cpp_path, argv);
_exit(errno == ENOENT ? 127 : 126); _exit(errno == ENOENT ? 127 : 126);
} }
@ -2106,10 +2010,8 @@ dt_load_libs_dir(dtrace_hdl_t *dtp, const char *path)
dt_dprintf("skipping library %s: %s\n", dt_dprintf("skipping library %s: %s\n",
dld->dtld_library, dld->dtld_library,
dtrace_errmsg(dtp, dtrace_errno(dtp))); dtrace_errmsg(dtp, dtrace_errno(dtp)));
} else { } else
dld->dtld_loaded = B_TRUE;
dt_program_destroy(dtp, pgp); dt_program_destroy(dtp, pgp);
}
} }
dt_lib_depend_free(dtp); dt_lib_depend_free(dtp);

View File

@ -267,7 +267,7 @@ dt_cg_field_get(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
* properties are used to compute shift as USHIFT or SSHIFT, below. * properties are used to compute shift as USHIFT or SSHIFT, below.
*/ */
if (dnp->dn_flags & DT_NF_SIGNED) { if (dnp->dn_flags & DT_NF_SIGNED) {
#if BYTE_ORDER == _BIG_ENDIAN #ifdef _BIG_ENDIAN
shift = clp2(P2ROUNDUP(e.cte_bits, NBBY) / NBBY) * NBBY - shift = clp2(P2ROUNDUP(e.cte_bits, NBBY) / NBBY) * NBBY -
mp->ctm_offset % NBBY; mp->ctm_offset % NBBY;
#else #else
@ -281,7 +281,7 @@ dt_cg_field_get(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp,
instr = DIF_INSTR_FMT(DIF_OP_SRA, r1, r2, r1); instr = DIF_INSTR_FMT(DIF_OP_SRA, r1, r2, r1);
dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr)); dt_irlist_append(dlp, dt_cg_node_alloc(DT_LBL_NONE, instr));
} else { } else {
#if BYTE_ORDER == _BIG_ENDIAN #ifdef _BIG_ENDIAN
shift = clp2(P2ROUNDUP(e.cte_bits, NBBY) / NBBY) * NBBY - shift = clp2(P2ROUNDUP(e.cte_bits, NBBY) / NBBY) * NBBY -
(mp->ctm_offset % NBBY + e.cte_bits); (mp->ctm_offset % NBBY + e.cte_bits);
#else #else
@ -369,7 +369,7 @@ dt_cg_field_set(dt_node_t *src, dt_irlist_t *dlp,
* input register to width cte_bits, and cmask as the mask used to * input register to width cte_bits, and cmask as the mask used to
* pass through the containing bits and zero the field bits. * pass through the containing bits and zero the field bits.
*/ */
#if BYTE_ORDER == _BIG_ENDIAN #ifdef _BIG_ENDIAN
shift = clp2(P2ROUNDUP(e.cte_bits, NBBY) / NBBY) * NBBY - shift = clp2(P2ROUNDUP(e.cte_bits, NBBY) / NBBY) * NBBY -
(m.ctm_offset % NBBY + e.cte_bits); (m.ctm_offset % NBBY + e.cte_bits);
#else #else
@ -1338,40 +1338,6 @@ dt_cg_inline(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
} }
} }
static void
dt_cg_func_typeref(dtrace_hdl_t *dtp, dt_node_t *dnp)
{
dtrace_typeinfo_t dtt;
dt_node_t *addr = dnp->dn_args;
dt_node_t *nelm = addr->dn_list;
dt_node_t *strp = nelm->dn_list;
dt_node_t *typs = strp->dn_list;
char buf[DT_TYPE_NAMELEN];
char *p;
ctf_type_name(addr->dn_ctfp, addr->dn_type, buf, sizeof (buf));
/*
* XXX Hack alert! XXX
* The prototype has two dummy args that we munge to represent
* the type string and the type size.
*
* Yes, I hear your grumble, but it works for now. We'll come
* up with a more elegant implementation later. :-)
*/
free(strp->dn_string);
if ((p = strchr(buf, '*')) != NULL)
*p = '\0';
strp->dn_string = strdup(buf);
if (dtrace_lookup_by_type(dtp, DTRACE_OBJ_EVERY, buf, &dtt) < 0)
return;
typs->dn_value = ctf_type_size(dtt.dtt_ctfp, dtt.dtt_type);
}
static void static void
dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp) dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
{ {
@ -1827,9 +1793,7 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
} }
switch (dnp->dn_kind) { switch (dnp->dn_kind) {
case DT_NODE_FUNC: { case DT_NODE_FUNC:
dtrace_hdl_t *dtp = yypcb->pcb_hdl;
if ((idp = dnp->dn_ident)->di_kind != DT_IDENT_FUNC) { if ((idp = dnp->dn_ident)->di_kind != DT_IDENT_FUNC) {
dnerror(dnp, D_CG_EXPR, "%s %s( ) may not be " dnerror(dnp, D_CG_EXPR, "%s %s( ) may not be "
"called from a D expression (D program " "called from a D expression (D program "
@ -1837,15 +1801,6 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
dt_idkind_name(idp->di_kind), idp->di_name); dt_idkind_name(idp->di_kind), idp->di_name);
} }
switch (idp->di_id) {
case DIF_SUBR_TYPEREF:
dt_cg_func_typeref(dtp, dnp);
break;
default:
break;
}
dt_cg_arglist(dnp->dn_ident, dnp->dn_args, dlp, drp); dt_cg_arglist(dnp->dn_ident, dnp->dn_args, dlp, drp);
if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1) if ((dnp->dn_reg = dt_regset_alloc(drp)) == -1)
@ -1858,7 +1813,6 @@ dt_cg_node(dt_node_t *dnp, dt_irlist_t *dlp, dt_regset_t *drp)
dt_cg_node_alloc(DT_LBL_NONE, instr)); dt_cg_node_alloc(DT_LBL_NONE, instr));
break; break;
}
case DT_NODE_VAR: case DT_NODE_VAR:
if (dnp->dn_ident->di_kind == DT_IDENT_XLSOU || if (dnp->dn_ident->di_kind == DT_IDENT_XLSOU ||

View File

@ -32,9 +32,7 @@
#include <limits.h> #include <limits.h>
#include <assert.h> #include <assert.h>
#include <ctype.h> #include <ctype.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <dt_impl.h> #include <dt_impl.h>
#define DT_MASK_LO 0x00000000FFFFFFFFULL #define DT_MASK_LO 0x00000000FFFFFFFFULL
@ -712,7 +710,7 @@ dt_print_stddev(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
/*ARGSUSED*/ /*ARGSUSED*/
int int
dt_print_bytes(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr, dt_print_bytes(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
size_t nbytes, int width, int quiet, int raw) size_t nbytes, int width, int quiet)
{ {
/* /*
* If the byte stream is a series of printable characters, followed by * If the byte stream is a series of printable characters, followed by
@ -725,7 +723,7 @@ dt_print_bytes(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr,
if (nbytes == 0) if (nbytes == 0)
return (0); return (0);
if (raw || dtp->dt_options[DTRACEOPT_RAWBYTES] != DTRACEOPT_UNSET) if (dtp->dt_options[DTRACEOPT_RAWBYTES] != DTRACEOPT_UNSET)
goto raw; goto raw;
for (i = 0; i < nbytes; i++) { for (i = 0; i < nbytes; i++) {
@ -860,7 +858,7 @@ dt_print_stack(dtrace_hdl_t *dtp, FILE *fp, const char *format,
return (dt_set_errno(dtp, EDT_BADSTACKPC)); return (dt_set_errno(dtp, EDT_BADSTACKPC));
} }
if (pc == 0) if (pc == NULL)
break; break;
addr += size; addr += size;
@ -948,23 +946,15 @@ dt_print_ustack(dtrace_hdl_t *dtp, FILE *fp, const char *format,
if (P != NULL) if (P != NULL)
dt_proc_lock(dtp, P); /* lock handle while we perform lookups */ dt_proc_lock(dtp, P); /* lock handle while we perform lookups */
for (i = 0; i < depth && pc[i] != 0; i++) { for (i = 0; i < depth && pc[i] != NULL; i++) {
const prmap_t *map; const prmap_t *map;
if ((err = dt_printf(dtp, fp, "%*s", indent, "")) < 0) if ((err = dt_printf(dtp, fp, "%*s", indent, "")) < 0)
break; break;
#if defined(sun)
if (P != NULL && Plookup_by_addr(P, pc[i], if (P != NULL && Plookup_by_addr(P, pc[i],
#else
if (P != NULL && proc_addr2sym(P, pc[i],
#endif
name, sizeof (name), &sym) == 0) { name, sizeof (name), &sym) == 0) {
#if defined(sun)
(void) Pobjname(P, pc[i], objname, sizeof (objname)); (void) Pobjname(P, pc[i], objname, sizeof (objname));
#else
(void) proc_objname(P, pc[i], objname, sizeof (objname));
#endif
if (pc[i] > sym.st_value) { if (pc[i] > sym.st_value) {
(void) snprintf(c, sizeof (c), (void) snprintf(c, sizeof (c),
@ -975,12 +965,8 @@ dt_print_ustack(dtrace_hdl_t *dtp, FILE *fp, const char *format,
"%s`%s", dt_basename(objname), name); "%s`%s", dt_basename(objname), name);
} }
} else if (str != NULL && str[0] != '\0' && str[0] != '@' && } else if (str != NULL && str[0] != '\0' && str[0] != '@' &&
#if defined(sun)
(P != NULL && ((map = Paddr_to_map(P, pc[i])) == NULL || (P != NULL && ((map = Paddr_to_map(P, pc[i])) == NULL ||
(map->pr_mflags & MA_WRITE)))) { (map->pr_mflags & MA_WRITE)))) {
#else
(P != NULL && ((map = proc_addr2map(P, pc[i])) == NULL))) {
#endif
/* /*
* If the current string pointer in the string table * If the current string pointer in the string table
* does not point to an empty string _and_ the program * does not point to an empty string _and_ the program
@ -996,12 +982,8 @@ dt_print_ustack(dtrace_hdl_t *dtp, FILE *fp, const char *format,
*/ */
(void) snprintf(c, sizeof (c), "%s", str); (void) snprintf(c, sizeof (c), "%s", str);
} else { } else {
#if defined(sun)
if (P != NULL && Pobjname(P, pc[i], objname, if (P != NULL && Pobjname(P, pc[i], objname,
#else sizeof (objname)) != NULL) {
if (P != NULL && proc_objname(P, pc[i], objname,
#endif
sizeof (objname)) != 0) {
(void) snprintf(c, sizeof (c), "%s`0x%llx", (void) snprintf(c, sizeof (c), "%s`0x%llx",
dt_basename(objname), (u_longlong_t)pc[i]); dt_basename(objname), (u_longlong_t)pc[i]);
} else { } else {
@ -1070,11 +1052,7 @@ dt_print_usym(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr, dtrace_actkind_t act)
dt_proc_lock(dtp, P); dt_proc_lock(dtp, P);
#if defined(sun)
if (Plookup_by_addr(P, pc, NULL, 0, &sym) == 0) if (Plookup_by_addr(P, pc, NULL, 0, &sym) == 0)
#else
if (proc_addr2sym(P, pc, NULL, 0, &sym) == 0)
#endif
pc = sym.st_value; pc = sym.st_value;
dt_proc_unlock(dtp, P); dt_proc_unlock(dtp, P);
@ -1117,11 +1095,7 @@ dt_print_umod(dtrace_hdl_t *dtp, FILE *fp, const char *format, caddr_t addr)
if (P != NULL) if (P != NULL)
dt_proc_lock(dtp, P); /* lock handle while we perform lookups */ dt_proc_lock(dtp, P); /* lock handle while we perform lookups */
#if defined(sun) if (P != NULL && Pobjname(P, pc, objname, sizeof (objname)) != NULL) {
if (P != NULL && Pobjname(P, pc, objname, sizeof (objname)) != 0) {
#else
if (P != NULL && proc_objname(P, pc, objname, sizeof (objname)) != 0) {
#endif
(void) snprintf(c, sizeof (c), "%s", dt_basename(objname)); (void) snprintf(c, sizeof (c), "%s", dt_basename(objname));
} else { } else {
(void) snprintf(c, sizeof (c), "0x%llx", (u_longlong_t)pc); (void) snprintf(c, sizeof (c), "0x%llx", (u_longlong_t)pc);
@ -1137,314 +1111,6 @@ dt_print_umod(dtrace_hdl_t *dtp, FILE *fp, const char *format, caddr_t addr)
return (err); return (err);
} }
int
dt_print_memory(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr)
{
int quiet = (dtp->dt_options[DTRACEOPT_QUIET] != DTRACEOPT_UNSET);
size_t nbytes = *((uintptr_t *) addr);
return (dt_print_bytes(dtp, fp, addr + sizeof(uintptr_t),
nbytes, 50, quiet, 1));
}
typedef struct dt_type_cbdata {
dtrace_hdl_t *dtp;
dtrace_typeinfo_t dtt;
caddr_t addr;
caddr_t addrend;
const char *name;
int f_type;
int indent;
int type_width;
int name_width;
FILE *fp;
} dt_type_cbdata_t;
static int dt_print_type_data(dt_type_cbdata_t *, ctf_id_t);
static int
dt_print_type_member(const char *name, ctf_id_t type, ulong_t off, void *arg)
{
dt_type_cbdata_t cbdata;
dt_type_cbdata_t *cbdatap = arg;
ssize_t ssz;
if ((ssz = ctf_type_size(cbdatap->dtt.dtt_ctfp, type)) <= 0)
return (0);
off /= 8;
cbdata = *cbdatap;
cbdata.name = name;
cbdata.addr += off;
cbdata.addrend = cbdata.addr + ssz;
return (dt_print_type_data(&cbdata, type));
}
static int
dt_print_type_width(const char *name, ctf_id_t type, ulong_t off, void *arg)
{
char buf[DT_TYPE_NAMELEN];
char *p;
dt_type_cbdata_t *cbdatap = arg;
size_t sz = strlen(name);
ctf_type_name(cbdatap->dtt.dtt_ctfp, type, buf, sizeof (buf));
if ((p = strchr(buf, '[')) != NULL)
p[-1] = '\0';
else
p = "";
sz += strlen(p);
if (sz > cbdatap->name_width)
cbdatap->name_width = sz;
sz = strlen(buf);
if (sz > cbdatap->type_width)
cbdatap->type_width = sz;
return (0);
}
static int
dt_print_type_data(dt_type_cbdata_t *cbdatap, ctf_id_t type)
{
caddr_t addr = cbdatap->addr;
caddr_t addrend = cbdatap->addrend;
char buf[DT_TYPE_NAMELEN];
char *p;
int cnt = 0;
uint_t kind = ctf_type_kind(cbdatap->dtt.dtt_ctfp, type);
ssize_t ssz = ctf_type_size(cbdatap->dtt.dtt_ctfp, type);
ctf_type_name(cbdatap->dtt.dtt_ctfp, type, buf, sizeof (buf));
if ((p = strchr(buf, '[')) != NULL)
p[-1] = '\0';
else
p = "";
if (cbdatap->f_type) {
int type_width = roundup(cbdatap->type_width + 1, 4);
int name_width = roundup(cbdatap->name_width + 1, 4);
name_width -= strlen(cbdatap->name);
dt_printf(cbdatap->dtp, cbdatap->fp, "%*s%-*s%s%-*s = ",cbdatap->indent * 4,"",type_width,buf,cbdatap->name,name_width,p);
}
while (addr < addrend) {
dt_type_cbdata_t cbdata;
ctf_arinfo_t arinfo;
ctf_encoding_t cte;
uintptr_t *up;
void *vp = addr;
cbdata = *cbdatap;
cbdata.name = "";
cbdata.addr = addr;
cbdata.addrend = addr + ssz;
cbdata.f_type = 0;
cbdata.indent++;
cbdata.type_width = 0;
cbdata.name_width = 0;
if (cnt > 0)
dt_printf(cbdatap->dtp, cbdatap->fp, "%*s", cbdatap->indent * 4,"");
switch (kind) {
case CTF_K_INTEGER:
if (ctf_type_encoding(cbdatap->dtt.dtt_ctfp, type, &cte) != 0)
return (-1);
if ((cte.cte_format & CTF_INT_SIGNED) != 0)
switch (cte.cte_bits) {
case 8:
if (isprint(*((char *) vp)))
dt_printf(cbdatap->dtp, cbdatap->fp, "'%c', ", *((char *) vp));
dt_printf(cbdatap->dtp, cbdatap->fp, "%d (0x%x);\n", *((char *) vp), *((char *) vp));
break;
case 16:
dt_printf(cbdatap->dtp, cbdatap->fp, "%hd (0x%hx);\n", *((short *) vp), *((u_short *) vp));
break;
case 32:
dt_printf(cbdatap->dtp, cbdatap->fp, "%d (0x%x);\n", *((int *) vp), *((u_int *) vp));
break;
case 64:
dt_printf(cbdatap->dtp, cbdatap->fp, "%jd (0x%jx);\n", *((long long *) vp), *((unsigned long long *) vp));
break;
default:
dt_printf(cbdatap->dtp, cbdatap->fp, "CTF_K_INTEGER: format %x offset %u bits %u\n",cte.cte_format,cte.cte_offset,cte.cte_bits);
break;
}
else
switch (cte.cte_bits) {
case 8:
dt_printf(cbdatap->dtp, cbdatap->fp, "%u (0x%x);\n", *((uint8_t *) vp) & 0xff, *((uint8_t *) vp) & 0xff);
break;
case 16:
dt_printf(cbdatap->dtp, cbdatap->fp, "%hu (0x%hx);\n", *((u_short *) vp), *((u_short *) vp));
break;
case 32:
dt_printf(cbdatap->dtp, cbdatap->fp, "%u (0x%x);\n", *((u_int *) vp), *((u_int *) vp));
break;
case 64:
dt_printf(cbdatap->dtp, cbdatap->fp, "%ju (0x%jx);\n", *((unsigned long long *) vp), *((unsigned long long *) vp));
break;
default:
dt_printf(cbdatap->dtp, cbdatap->fp, "CTF_K_INTEGER: format %x offset %u bits %u\n",cte.cte_format,cte.cte_offset,cte.cte_bits);
break;
}
break;
case CTF_K_FLOAT:
dt_printf(cbdatap->dtp, cbdatap->fp, "CTF_K_FLOAT: format %x offset %u bits %u\n",cte.cte_format,cte.cte_offset,cte.cte_bits);
break;
case CTF_K_POINTER:
dt_printf(cbdatap->dtp, cbdatap->fp, "%p;\n", *((void **) addr));
break;
case CTF_K_ARRAY:
if (ctf_array_info(cbdatap->dtt.dtt_ctfp, type, &arinfo) != 0)
return (-1);
dt_printf(cbdatap->dtp, cbdatap->fp, "{\n%*s",cbdata.indent * 4,"");
dt_print_type_data(&cbdata, arinfo.ctr_contents);
dt_printf(cbdatap->dtp, cbdatap->fp, "%*s};\n",cbdatap->indent * 4,"");
break;
case CTF_K_FUNCTION:
dt_printf(cbdatap->dtp, cbdatap->fp, "CTF_K_FUNCTION:\n");
break;
case CTF_K_STRUCT:
cbdata.f_type = 1;
if (ctf_member_iter(cbdatap->dtt.dtt_ctfp, type,
dt_print_type_width, &cbdata) != 0)
return (-1);
dt_printf(cbdatap->dtp, cbdatap->fp, "{\n");
if (ctf_member_iter(cbdatap->dtt.dtt_ctfp, type,
dt_print_type_member, &cbdata) != 0)
return (-1);
dt_printf(cbdatap->dtp, cbdatap->fp, "%*s};\n",cbdatap->indent * 4,"");
break;
case CTF_K_UNION:
cbdata.f_type = 1;
if (ctf_member_iter(cbdatap->dtt.dtt_ctfp, type,
dt_print_type_width, &cbdata) != 0)
return (-1);
dt_printf(cbdatap->dtp, cbdatap->fp, "{\n");
if (ctf_member_iter(cbdatap->dtt.dtt_ctfp, type,
dt_print_type_member, &cbdata) != 0)
return (-1);
dt_printf(cbdatap->dtp, cbdatap->fp, "%*s};\n",cbdatap->indent * 4,"");
break;
case CTF_K_ENUM:
dt_printf(cbdatap->dtp, cbdatap->fp, "%s;\n", ctf_enum_name(cbdatap->dtt.dtt_ctfp, type, *((int *) vp)));
break;
case CTF_K_TYPEDEF:
dt_print_type_data(&cbdata, ctf_type_reference(cbdatap->dtt.dtt_ctfp,type));
break;
case CTF_K_VOLATILE:
if (cbdatap->f_type)
dt_printf(cbdatap->dtp, cbdatap->fp, "volatile ");
dt_print_type_data(&cbdata, ctf_type_reference(cbdatap->dtt.dtt_ctfp,type));
break;
case CTF_K_CONST:
if (cbdatap->f_type)
dt_printf(cbdatap->dtp, cbdatap->fp, "const ");
dt_print_type_data(&cbdata, ctf_type_reference(cbdatap->dtt.dtt_ctfp,type));
break;
case CTF_K_RESTRICT:
if (cbdatap->f_type)
dt_printf(cbdatap->dtp, cbdatap->fp, "restrict ");
dt_print_type_data(&cbdata, ctf_type_reference(cbdatap->dtt.dtt_ctfp,type));
break;
default:
break;
}
addr += ssz;
cnt++;
}
return (0);
}
static int
dt_print_type(dtrace_hdl_t *dtp, FILE *fp, caddr_t addr)
{
caddr_t addrend;
char *p;
dtrace_typeinfo_t dtt;
dt_type_cbdata_t cbdata;
int num = 0;
int quiet = (dtp->dt_options[DTRACEOPT_QUIET] != DTRACEOPT_UNSET);
ssize_t ssz;
if (!quiet)
dt_printf(dtp, fp, "\n");
/* Get the total number of bytes of data buffered. */
size_t nbytes = *((uintptr_t *) addr);
addr += sizeof(uintptr_t);
/*
* Get the size of the type so that we can check that it matches
* the CTF data we look up and so that we can figure out how many
* type elements are buffered.
*/
size_t typs = *((uintptr_t *) addr);
addr += sizeof(uintptr_t);
/*
* Point to the type string in the buffer. Get it's string
* length and round it up to become the offset to the start
* of the buffered type data which we would like to be aligned
* for easy access.
*/
char *strp = (char *) addr;
int offset = roundup(strlen(strp) + 1, sizeof(uintptr_t));
/*
* The type string might have a format such as 'int [20]'.
* Check if there is an array dimension present.
*/
if ((p = strchr(strp, '[')) != NULL) {
/* Strip off the array dimension. */
*p++ = '\0';
for (; *p != '\0' && *p != ']'; p++)
num = num * 10 + *p - '0';
} else
/* No array dimension, so default. */
num = 1;
/* Lookup the CTF type from the type string. */
if (dtrace_lookup_by_type(dtp, DTRACE_OBJ_EVERY, strp, &dtt) < 0)
return (-1);
/* Offset the buffer address to the start of the data... */
addr += offset;
ssz = ctf_type_size(dtt.dtt_ctfp, dtt.dtt_type);
if (typs != ssz) {
printf("Expected type size from buffer (%lu) to match type size looked up now (%ld)\n", (u_long) typs, (long) ssz);
return (-1);
}
cbdata.dtp = dtp;
cbdata.dtt = dtt;
cbdata.name = "";
cbdata.addr = addr;
cbdata.addrend = addr + nbytes;
cbdata.indent = 1;
cbdata.f_type = 1;
cbdata.type_width = 0;
cbdata.name_width = 0;
cbdata.fp = fp;
return (dt_print_type_data(&cbdata, dtt.dtt_type));
}
static int static int
dt_print_sym(dtrace_hdl_t *dtp, FILE *fp, const char *format, caddr_t addr) dt_print_sym(dtrace_hdl_t *dtp, FILE *fp, const char *format, caddr_t addr)
{ {
@ -1764,7 +1430,7 @@ dt_print_datum(dtrace_hdl_t *dtp, FILE *fp, dtrace_recdesc_t *rec,
(uint32_t)normal); (uint32_t)normal);
break; break;
default: default:
err = dt_print_bytes(dtp, fp, addr, size, 50, 0, 0); err = dt_print_bytes(dtp, fp, addr, size, 50, 0);
break; break;
} }
@ -2139,18 +1805,6 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, int cpu, dtrace_bufdesc_t *buf,
goto nextrec; goto nextrec;
} }
if (act == DTRACEACT_PRINTM) {
if (dt_print_memory(dtp, fp, addr) < 0)
return (-1);
goto nextrec;
}
if (act == DTRACEACT_PRINTT) {
if (dt_print_type(dtp, fp, addr) < 0)
return (-1);
goto nextrec;
}
if (DTRACEACT_ISPRINTFLIKE(act)) { if (DTRACEACT_ISPRINTFLIKE(act)) {
void *fmtdata; void *fmtdata;
int (*func)(dtrace_hdl_t *, FILE *, void *, int (*func)(dtrace_hdl_t *, FILE *, void *,
@ -2281,7 +1935,7 @@ dt_consume_cpu(dtrace_hdl_t *dtp, FILE *fp, int cpu, dtrace_bufdesc_t *buf,
break; break;
default: default:
n = dt_print_bytes(dtp, fp, addr, n = dt_print_bytes(dtp, fp, addr,
rec->dtrd_size, 33, quiet, 0); rec->dtrd_size, 33, quiet);
break; break;
} }
@ -2410,20 +2064,13 @@ dt_consume_begin(dtrace_hdl_t *dtp, FILE *fp, dtrace_bufdesc_t *buf,
dt_begin_t begin; dt_begin_t begin;
processorid_t cpu = dtp->dt_beganon; processorid_t cpu = dtp->dt_beganon;
dtrace_bufdesc_t nbuf; dtrace_bufdesc_t nbuf;
#if !defined(sun)
dtrace_bufdesc_t *pbuf;
#endif
int rval, i; int rval, i;
static int max_ncpus; static int max_ncpus;
dtrace_optval_t size; dtrace_optval_t size;
dtp->dt_beganon = -1; dtp->dt_beganon = -1;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, buf) == -1) { if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, buf) == -1) {
#else
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, &buf) == -1) {
#endif
/* /*
* We really don't expect this to fail, but it is at least * We really don't expect this to fail, but it is at least
* technically possible for this to fail with ENOENT. In this * technically possible for this to fail with ENOENT. In this
@ -2485,12 +2132,7 @@ dt_consume_begin(dtrace_hdl_t *dtp, FILE *fp, dtrace_bufdesc_t *buf,
if (i == cpu) if (i == cpu)
continue; continue;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, &nbuf) == -1) { if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, &nbuf) == -1) {
#else
pbuf = &nbuf;
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, &pbuf) == -1) {
#endif
/* /*
* If we failed with ENOENT, it may be because the * If we failed with ENOENT, it may be because the
* CPU was unconfigured -- this is okay. Any other * CPU was unconfigured -- this is okay. Any other
@ -2597,11 +2239,7 @@ dtrace_consume(dtrace_hdl_t *dtp, FILE *fp,
if (dtp->dt_stopped && (i == dtp->dt_endedon)) if (dtp->dt_stopped && (i == dtp->dt_endedon))
continue; continue;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, buf) == -1) { if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, buf) == -1) {
#else
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, &buf) == -1) {
#endif
/* /*
* If we failed with ENOENT, it may be because the * If we failed with ENOENT, it may be because the
* CPU was unconfigured -- this is okay. Any other * CPU was unconfigured -- this is okay. Any other
@ -2622,11 +2260,7 @@ dtrace_consume(dtrace_hdl_t *dtp, FILE *fp,
buf->dtbd_cpu = dtp->dt_endedon; buf->dtbd_cpu = dtp->dt_endedon;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, buf) == -1) { if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, buf) == -1) {
#else
if (dt_ioctl(dtp, DTRACEIOC_BUFSNAP, &buf) == -1) {
#endif
/* /*
* This _really_ shouldn't fail, but it is strictly speaking * This _really_ shouldn't fail, but it is strictly speaking
* possible for this to return ENOENT if the CPU that called * possible for this to return ENOENT if the CPU that called

View File

@ -27,14 +27,10 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h> #include <sys/types.h>
#if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#endif
#include <strings.h> #include <strings.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <assert.h> #include <assert.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h> #include <errno.h>

View File

@ -25,7 +25,6 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#include <string.h>
#include <strings.h> #include <strings.h>
#include <dt_impl.h> #include <dt_impl.h>
@ -139,29 +138,12 @@ dtrace_errno(dtrace_hdl_t *dtp)
return (dtp->dt_errno); return (dtp->dt_errno);
} }
#if defined(sun)
int int
dt_set_errno(dtrace_hdl_t *dtp, int err) dt_set_errno(dtrace_hdl_t *dtp, int err)
{ {
dtp->dt_errno = err; dtp->dt_errno = err;
return (-1); return (-1);
} }
#else
int
_dt_set_errno(dtrace_hdl_t *dtp, int err, const char *errfile, int errline)
{
dtp->dt_errno = err;
dtp->dt_errfile = errfile;
dtp->dt_errline = errline;
return (-1);
}
void dt_get_errloc(dtrace_hdl_t *dtp, const char **p_errfile, int *p_errline)
{
*p_errfile = dtp->dt_errfile;
*p_errline = dtp->dt_errline;
}
#endif
void void
dt_set_errmsg(dtrace_hdl_t *dtp, const char *errtag, const char *region, dt_set_errmsg(dtrace_hdl_t *dtp, const char *errtag, const char *region,

View File

@ -235,11 +235,7 @@ typedef enum {
D_FREOPEN_INVALID, /* frename() filename is invalid */ D_FREOPEN_INVALID, /* frename() filename is invalid */
D_LQUANT_MATCHBASE, /* lquantize() mismatch on base */ D_LQUANT_MATCHBASE, /* lquantize() mismatch on base */
D_LQUANT_MATCHLIM, /* lquantize() mismatch on limit */ D_LQUANT_MATCHLIM, /* lquantize() mismatch on limit */
D_LQUANT_MATCHSTEP, /* lquantize() mismatch on step */ D_LQUANT_MATCHSTEP /* lquantize() mismatch on step */
D_PRINTM_ADDR, /* printm() memref bad type */
D_PRINTM_SIZE, /* printm() size bad type */
D_PRINTT_ADDR, /* printt() typeref bad type */
D_PRINTT_SIZE /* printt() size bad type */
} dt_errtag_t; } dt_errtag_t;
extern const char *dt_errtag(dt_errtag_t); extern const char *dt_errtag(dt_errtag_t);

View File

@ -31,9 +31,7 @@
#include <errno.h> #include <errno.h>
#include <unistd.h> #include <unistd.h>
#include <assert.h> #include <assert.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <dt_impl.h> #include <dt_impl.h>
#include <dt_program.h> #include <dt_program.h>
@ -249,7 +247,7 @@ dt_handle_liberr(dtrace_hdl_t *dtp, const dtrace_probedata_t *data,
err.dteda_action = -1; err.dteda_action = -1;
err.dteda_offset = -1; err.dteda_offset = -1;
err.dteda_fault = DTRACEFLT_LIBRARY; err.dteda_fault = DTRACEFLT_LIBRARY;
err.dteda_addr = 0; err.dteda_addr = NULL;
len = strlen(faultstr) + len = strlen(faultstr) +
strlen(errpd->dtpd_provider) + strlen(errpd->dtpd_mod) + strlen(errpd->dtpd_provider) + strlen(errpd->dtpd_mod) +

View File

@ -26,20 +26,14 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#endif
#include <strings.h> #include <strings.h>
#include <stdlib.h> #include <stdlib.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <ctype.h> #include <ctype.h>
#if defined(sun)
#include <sys/procfs_isa.h> #include <sys/procfs_isa.h>
#endif
#include <limits.h> #include <limits.h>
#include <dt_ident.h> #include <dt_ident.h>

View File

@ -18,7 +18,6 @@
* *
* CDDL HEADER END * CDDL HEADER END
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
@ -31,13 +30,6 @@
#include <sys/param.h> #include <sys/param.h>
#include <sys/objfs.h> #include <sys/objfs.h>
#if !defined(sun)
#include <sys/bitmap.h>
#include <sys/utsname.h>
#include <sys/ioccom.h>
#include <sys/time.h>
#include <string.h>
#endif
#include <setjmp.h> #include <setjmp.h>
#include <libctf.h> #include <libctf.h>
#include <dtrace.h> #include <dtrace.h>
@ -135,9 +127,6 @@ typedef struct dt_module {
GElf_Addr dm_bss_va; /* virtual address of BSS */ GElf_Addr dm_bss_va; /* virtual address of BSS */
GElf_Xword dm_bss_size; /* size in bytes of BSS */ GElf_Xword dm_bss_size; /* size in bytes of BSS */
dt_idhash_t *dm_extern; /* external symbol definitions */ dt_idhash_t *dm_extern; /* external symbol definitions */
#if !defined(sun)
caddr_t dm_reloc_offset; /* Symbol relocation offset. */
#endif
} dt_module_t; } dt_module_t;
#define DT_DM_LOADED 0x1 /* module symbol and type data is loaded */ #define DT_DM_LOADED 0x1 /* module symbol and type data is loaded */
@ -194,7 +183,6 @@ typedef struct dt_lib_depend {
char *dtld_libpath; /* library pathname */ char *dtld_libpath; /* library pathname */
uint_t dtld_finish; /* completion time in tsort for lib */ uint_t dtld_finish; /* completion time in tsort for lib */
uint_t dtld_start; /* starting time in tsort for lib */ uint_t dtld_start; /* starting time in tsort for lib */
uint_t dtld_loaded; /* boolean: is this library loaded */
dt_list_t dtld_dependencies; /* linked-list of lib dependencies */ dt_list_t dtld_dependencies; /* linked-list of lib dependencies */
dt_list_t dtld_dependents; /* linked-list of lib dependents */ dt_list_t dtld_dependents; /* linked-list of lib dependents */
} dt_lib_depend_t; } dt_lib_depend_t;
@ -277,20 +265,12 @@ struct dtrace_hdl {
int dt_version; /* library version requested by client */ int dt_version; /* library version requested by client */
int dt_ctferr; /* error resulting from last CTF failure */ int dt_ctferr; /* error resulting from last CTF failure */
int dt_errno; /* error resulting from last failed operation */ int dt_errno; /* error resulting from last failed operation */
#if !defined(sun)
const char *dt_errfile;
int dt_errline;
#endif
int dt_fd; /* file descriptor for dtrace pseudo-device */ int dt_fd; /* file descriptor for dtrace pseudo-device */
int dt_ftfd; /* file descriptor for fasttrap pseudo-device */ int dt_ftfd; /* file descriptor for fasttrap pseudo-device */
int dt_fterr; /* saved errno from failed open of dt_ftfd */ int dt_fterr; /* saved errno from failed open of dt_ftfd */
int dt_cdefs_fd; /* file descriptor for C CTF debugging cache */ int dt_cdefs_fd; /* file descriptor for C CTF debugging cache */
int dt_ddefs_fd; /* file descriptor for D CTF debugging cache */ int dt_ddefs_fd; /* file descriptor for D CTF debugging cache */
#if defined(sun)
int dt_stdout_fd; /* file descriptor for saved stdout */ int dt_stdout_fd; /* file descriptor for saved stdout */
#else
FILE *dt_freopen_fp; /* file pointer for freopened stdout */
#endif
dtrace_handle_err_f *dt_errhdlr; /* error handler, if any */ dtrace_handle_err_f *dt_errhdlr; /* error handler, if any */
void *dt_errarg; /* error handler argument */ void *dt_errarg; /* error handler argument */
dtrace_prog_t *dt_errprog; /* error handler program, if any */ dtrace_prog_t *dt_errprog; /* error handler program, if any */
@ -432,8 +412,6 @@ struct dtrace_hdl {
#define DT_ACT_UMOD DT_ACT(26) /* umod() action */ #define DT_ACT_UMOD DT_ACT(26) /* umod() action */
#define DT_ACT_UADDR DT_ACT(27) /* uaddr() action */ #define DT_ACT_UADDR DT_ACT(27) /* uaddr() action */
#define DT_ACT_SETOPT DT_ACT(28) /* setopt() action */ #define DT_ACT_SETOPT DT_ACT(28) /* setopt() action */
#define DT_ACT_PRINTM DT_ACT(29) /* printm() action */
#define DT_ACT_PRINTT DT_ACT(30) /* printt() action */
/* /*
* Sentinel to tell freopen() to restore the saved stdout. This must not * Sentinel to tell freopen() to restore the saved stdout. This must not
@ -561,21 +539,11 @@ extern int dt_version_defined(dt_version_t);
extern char *dt_cpp_add_arg(dtrace_hdl_t *, const char *); extern char *dt_cpp_add_arg(dtrace_hdl_t *, const char *);
extern char *dt_cpp_pop_arg(dtrace_hdl_t *); extern char *dt_cpp_pop_arg(dtrace_hdl_t *);
#if defined(sun)
extern int dt_set_errno(dtrace_hdl_t *, int); extern int dt_set_errno(dtrace_hdl_t *, int);
#else
int _dt_set_errno(dtrace_hdl_t *, int, const char *, int);
void dt_get_errloc(dtrace_hdl_t *, const char **, int *);
#define dt_set_errno(_a,_b) _dt_set_errno(_a,_b,__FILE__,__LINE__)
#endif
extern void dt_set_errmsg(dtrace_hdl_t *, const char *, const char *, extern void dt_set_errmsg(dtrace_hdl_t *, const char *, const char *,
const char *, int, const char *, va_list); const char *, int, const char *, va_list);
#if defined(sun)
extern int dt_ioctl(dtrace_hdl_t *, int, void *); extern int dt_ioctl(dtrace_hdl_t *, int, void *);
#else
extern int dt_ioctl(dtrace_hdl_t *, u_long, void *);
#endif
extern int dt_status(dtrace_hdl_t *, processorid_t); extern int dt_status(dtrace_hdl_t *, processorid_t);
extern long dt_sysconf(dtrace_hdl_t *, int); extern long dt_sysconf(dtrace_hdl_t *, int);
extern ssize_t dt_write(dtrace_hdl_t *, int, const void *, size_t); extern ssize_t dt_write(dtrace_hdl_t *, int, const void *, size_t);

View File

@ -41,32 +41,12 @@
* We need to undefine lex's input and unput macros so that references to these * We need to undefine lex's input and unput macros so that references to these
* call the functions provided at the end of this source file. * call the functions provided at the end of this source file.
*/ */
#if defined(sun)
#undef input #undef input
#undef unput #undef unput
#else
/*
* Define YY_INPUT for flex since input() can't be re-defined.
*/
#define YY_INPUT(buf,result,max_size) \
if (yypcb->pcb_fileptr != NULL) { \
if (((result = fread(buf, 1, max_size, yypcb->pcb_fileptr)) == 0) \
&& ferror(yypcb->pcb_fileptr)) \
longjmp(yypcb->pcb_jmpbuf, EDT_FIO); \
} else { \
int n; \
for (n = 0; n < max_size && \
yypcb->pcb_strptr < yypcb->pcb_string + yypcb->pcb_strlen; n++) \
buf[n] = *yypcb->pcb_strptr++; \
result = n; \
}
#endif
static int id_or_type(const char *); static int id_or_type(const char *);
#if defined(sun)
static int input(void); static int input(void);
static void unput(int); static void unput(int);
#endif
/* /*
* We first define a set of labeled states for use in the D lexer and then a * We first define a set of labeled states for use in the D lexer and then a
@ -428,7 +408,7 @@ if (yypcb->pcb_token != 0) {
xyerror(D_CHR_OFLOW, "character constant is " xyerror(D_CHR_OFLOW, "character constant is "
"too long"); "too long");
} }
#if BYTE_ORDER == _LITTLE_ENDIAN #ifdef _LITTLE_ENDIAN
p = ((char *)&yylval.l_int) + nbytes - 1; p = ((char *)&yylval.l_int) + nbytes - 1;
for (q = s; nbytes != 0; nbytes--) for (q = s; nbytes != 0; nbytes--)
*p-- = *q++; *p-- = *q++;
@ -717,9 +697,7 @@ yyinit(dt_pcb_t *pcb)
yypcb = pcb; yypcb = pcb;
yylineno = 1; yylineno = 1;
yypragma = NULL; yypragma = NULL;
#if defined(sun)
yysptr = yysbuf; yysptr = yysbuf;
#endif
} }
/* /*
@ -815,7 +793,6 @@ id_or_type(const char *s)
return (ttok); return (ttok);
} }
#if defined(sun)
static int static int
input(void) input(void)
{ {
@ -857,4 +834,3 @@ unput(int c)
*yysptr++ = c; *yysptr++ = c;
yytchar = c; yytchar = c;
} }
#endif

View File

@ -20,7 +20,7 @@
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
@ -30,28 +30,18 @@
#include <elf.h> #include <elf.h>
#include <sys/types.h> #include <sys/types.h>
#if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#else
#define P2ROUNDUP(x, align) (-(-(x) & -(align)))
#endif
#include <unistd.h> #include <unistd.h>
#include <strings.h> #include <strings.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <limits.h> #include <limits.h>
#include <stddef.h> #include <stddef.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <fcntl.h> #include <fcntl.h>
#include <errno.h> #include <errno.h>
#if defined(sun)
#include <wait.h> #include <wait.h>
#else
#include <sys/wait.h>
#endif
#include <assert.h> #include <assert.h>
#include <sys/ipc.h> #include <sys/ipc.h>
@ -224,23 +214,11 @@ prepare_elf32(dtrace_hdl_t *dtp, const dof_hdr_t *dof, dof_elf32_t *dep)
s = &dofs[dofrh->dofr_tgtsec]; s = &dofs[dofrh->dofr_tgtsec];
for (j = 0; j < nrel; j++) { for (j = 0; j < nrel; j++) {
#if defined(__arm__) #if defined(__i386) || defined(__amd64)
/* XXX */
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#elif defined(__ia64__)
/* XXX */
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#elif defined(__i386) || defined(__amd64)
rel->r_offset = s->dofs_offset + rel->r_offset = s->dofs_offset +
dofr[j].dofr_offset; dofr[j].dofr_offset;
rel->r_info = ELF32_R_INFO(count + dep->de_global, rel->r_info = ELF32_R_INFO(count + dep->de_global,
R_386_32); R_386_32);
#elif defined(__mips__)
/* XXX */
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#elif defined(__powerpc__)
/* XXX */
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#elif defined(__sparc) #elif defined(__sparc)
/* /*
* Add 4 bytes to hit the low half of this 64-bit * Add 4 bytes to hit the low half of this 64-bit
@ -412,17 +390,7 @@ prepare_elf64(dtrace_hdl_t *dtp, const dof_hdr_t *dof, dof_elf64_t *dep)
s = &dofs[dofrh->dofr_tgtsec]; s = &dofs[dofrh->dofr_tgtsec];
for (j = 0; j < nrel; j++) { for (j = 0; j < nrel; j++) {
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__); #if defined(__i386) || defined(__amd64)
#ifdef DOODAD
#if defined(__arm__)
/* XXX */
#elif defined(__ia64__)
/* XXX */
#elif defined(__mips__)
/* XXX */
#elif defined(__powerpc__)
/* XXX */
#elif defined(__i386) || defined(__amd64)
rel->r_offset = s->dofs_offset + rel->r_offset = s->dofs_offset +
dofr[j].dofr_offset; dofr[j].dofr_offset;
rel->r_info = ELF64_R_INFO(count + dep->de_global, rel->r_info = ELF64_R_INFO(count + dep->de_global,
@ -434,7 +402,6 @@ printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
R_SPARC_64); R_SPARC_64);
#else #else
#error unknown ISA #error unknown ISA
#endif
#endif #endif
sym->st_name = base + dofr[j].dofr_name - 1; sym->st_name = base + dofr[j].dofr_name - 1;
@ -513,24 +480,13 @@ dump_elf32(dtrace_hdl_t *dtp, const dof_hdr_t *dof, int fd)
elf_file.ehdr.e_ident[EI_MAG3] = ELFMAG3; elf_file.ehdr.e_ident[EI_MAG3] = ELFMAG3;
elf_file.ehdr.e_ident[EI_VERSION] = EV_CURRENT; elf_file.ehdr.e_ident[EI_VERSION] = EV_CURRENT;
elf_file.ehdr.e_ident[EI_CLASS] = ELFCLASS32; elf_file.ehdr.e_ident[EI_CLASS] = ELFCLASS32;
#if BYTE_ORDER == _BIG_ENDIAN #if defined(_BIG_ENDIAN)
elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2MSB; elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2MSB;
#else #elif defined(_LITTLE_ENDIAN)
elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2LSB; elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2LSB;
#endif
#if defined(__FreeBSD__)
elf_file.ehdr.e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
#endif #endif
elf_file.ehdr.e_type = ET_REL; elf_file.ehdr.e_type = ET_REL;
#if defined(__arm__) #if defined(__sparc)
elf_file.ehdr.e_machine = EM_ARM;
#elif defined(__ia64__)
elf_file.ehdr.e_machine = EM_IA_64;
#elif defined(__mips__)
elf_file.ehdr.e_machine = EM_MIPS;
#elif defined(__powerpc__)
elf_file.ehdr.e_machine = EM_PPC;
#elif defined(__sparc)
elf_file.ehdr.e_machine = EM_SPARC; elf_file.ehdr.e_machine = EM_SPARC;
#elif defined(__i386) || defined(__amd64) #elif defined(__i386) || defined(__amd64)
elf_file.ehdr.e_machine = EM_386; elf_file.ehdr.e_machine = EM_386;
@ -661,24 +617,13 @@ dump_elf64(dtrace_hdl_t *dtp, const dof_hdr_t *dof, int fd)
elf_file.ehdr.e_ident[EI_MAG3] = ELFMAG3; elf_file.ehdr.e_ident[EI_MAG3] = ELFMAG3;
elf_file.ehdr.e_ident[EI_VERSION] = EV_CURRENT; elf_file.ehdr.e_ident[EI_VERSION] = EV_CURRENT;
elf_file.ehdr.e_ident[EI_CLASS] = ELFCLASS64; elf_file.ehdr.e_ident[EI_CLASS] = ELFCLASS64;
#if BYTE_ORDER == _BIG_ENDIAN #if defined(_BIG_ENDIAN)
elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2MSB; elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2MSB;
#else #elif defined(_LITTLE_ENDIAN)
elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2LSB; elf_file.ehdr.e_ident[EI_DATA] = ELFDATA2LSB;
#endif
#if defined(__FreeBSD__)
elf_file.ehdr.e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
#endif #endif
elf_file.ehdr.e_type = ET_REL; elf_file.ehdr.e_type = ET_REL;
#if defined(__arm__) #if defined(__sparc)
elf_file.ehdr.e_machine = EM_ARM;
#elif defined(__ia64__)
elf_file.ehdr.e_machine = EM_IA_64;
#elif defined(__mips__)
elf_file.ehdr.e_machine = EM_MIPS;
#elif defined(__powerpc__)
elf_file.ehdr.e_machine = EM_PPC;
#elif defined(__sparc)
elf_file.ehdr.e_machine = EM_SPARCV9; elf_file.ehdr.e_machine = EM_SPARCV9;
#elif defined(__i386) || defined(__amd64) #elif defined(__i386) || defined(__amd64)
elf_file.ehdr.e_machine = EM_AMD64; elf_file.ehdr.e_machine = EM_AMD64;
@ -794,44 +739,7 @@ dt_symtab_lookup(Elf_Data *data_sym, int nsym, uintptr_t addr, uint_t shn,
return (ret); return (ret);
} }
#if defined(__arm__) #if defined(__sparc)
/* XXX */
static int
dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
uint32_t *off)
{
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
return (0);
}
#elif defined(__ia64__)
/* XXX */
static int
dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
uint32_t *off)
{
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
return (0);
}
#elif defined(__mips__)
/* XXX */
static int
dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
uint32_t *off)
{
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
return (0);
}
#elif defined(__powerpc__)
/* XXX */
static int
dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
uint32_t *off)
{
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
return (0);
}
#elif defined(__sparc)
#define DT_OP_RET 0x81c7e008 #define DT_OP_RET 0x81c7e008
#define DT_OP_NOP 0x01000000 #define DT_OP_NOP 0x01000000
@ -942,9 +850,7 @@ dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
#elif defined(__i386) || defined(__amd64) #elif defined(__i386) || defined(__amd64)
#define DT_OP_NOP 0x90 #define DT_OP_NOP 0x90
#define DT_OP_RET 0xc3
#define DT_OP_CALL 0xe8 #define DT_OP_CALL 0xe8
#define DT_OP_JMP32 0xe9
#define DT_OP_REX_RAX 0x48 #define DT_OP_REX_RAX 0x48
#define DT_OP_XOR_EAX_0 0x33 #define DT_OP_XOR_EAX_0 0x33
#define DT_OP_XOR_EAX_1 0xc0 #define DT_OP_XOR_EAX_1 0xc0
@ -954,7 +860,6 @@ dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
uint32_t *off) uint32_t *off)
{ {
uint8_t *ip = (uint8_t *)(p + rela->r_offset - 1); uint8_t *ip = (uint8_t *)(p + rela->r_offset - 1);
uint8_t ret;
/* /*
* On x86, the first byte of the instruction is the call opcode and * On x86, the first byte of the instruction is the call opcode and
@ -978,43 +883,38 @@ dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
* We may have already processed this object file in an earlier linker * We may have already processed this object file in an earlier linker
* invocation. Check to see if the present instruction sequence matches * invocation. Check to see if the present instruction sequence matches
* the one we would install. For is-enabled probes, we advance the * the one we would install. For is-enabled probes, we advance the
* offset to the first nop instruction in the sequence to match the * offset to the first nop instruction in the sequence.
* text modification code below.
*/ */
if (!isenabled) { if (!isenabled) {
if ((ip[0] == DT_OP_NOP || ip[0] == DT_OP_RET) && if (ip[0] == DT_OP_NOP && ip[1] == DT_OP_NOP &&
ip[1] == DT_OP_NOP && ip[2] == DT_OP_NOP && ip[2] == DT_OP_NOP && ip[3] == DT_OP_NOP &&
ip[3] == DT_OP_NOP && ip[4] == DT_OP_NOP) ip[4] == DT_OP_NOP)
return (0); return (0);
} else if (dtp->dt_oflags & DTRACE_O_LP64) { } else if (dtp->dt_oflags & DTRACE_O_LP64) {
if (ip[0] == DT_OP_REX_RAX && if (ip[0] == DT_OP_REX_RAX &&
ip[1] == DT_OP_XOR_EAX_0 && ip[2] == DT_OP_XOR_EAX_1 && ip[1] == DT_OP_XOR_EAX_0 && ip[2] == DT_OP_XOR_EAX_1 &&
(ip[3] == DT_OP_NOP || ip[3] == DT_OP_RET) && ip[3] == DT_OP_NOP && ip[4] == DT_OP_NOP) {
ip[4] == DT_OP_NOP) {
(*off) += 3; (*off) += 3;
return (0); return (0);
} }
} else { } else {
if (ip[0] == DT_OP_XOR_EAX_0 && ip[1] == DT_OP_XOR_EAX_1 && if (ip[0] == DT_OP_XOR_EAX_0 && ip[1] == DT_OP_XOR_EAX_1 &&
(ip[2] == DT_OP_NOP || ip[2] == DT_OP_RET) && ip[2] == DT_OP_NOP && ip[3] == DT_OP_NOP &&
ip[3] == DT_OP_NOP && ip[4] == DT_OP_NOP) { ip[4] == DT_OP_NOP) {
(*off) += 2; (*off) += 2;
return (0); return (0);
} }
} }
/* /*
* We expect either a call instrution with a 32-bit displacement or a * We only expect a call instrution with a 32-bit displacement.
* jmp instruction with a 32-bit displacement acting as a tail-call.
*/ */
if (ip[0] != DT_OP_CALL && ip[0] != DT_OP_JMP32) { if (ip[0] != DT_OP_CALL) {
dt_dprintf("found %x instead of a call or jmp instruction at " dt_dprintf("found %x instead of a call instruction at %llx\n",
"%llx\n", ip[0], (u_longlong_t)rela->r_offset); ip[0], (u_longlong_t)rela->r_offset);
return (-1); return (-1);
} }
ret = (ip[0] == DT_OP_JMP32) ? DT_OP_RET : DT_OP_NOP;
/* /*
* Establish the instruction sequence -- all nops for probes, and an * Establish the instruction sequence -- all nops for probes, and an
* instruction to clear the return value register (%eax/%rax) followed * instruction to clear the return value register (%eax/%rax) followed
@ -1023,7 +923,7 @@ dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
* for more readable disassembly when the probe is enabled. * for more readable disassembly when the probe is enabled.
*/ */
if (!isenabled) { if (!isenabled) {
ip[0] = ret; ip[0] = DT_OP_NOP;
ip[1] = DT_OP_NOP; ip[1] = DT_OP_NOP;
ip[2] = DT_OP_NOP; ip[2] = DT_OP_NOP;
ip[3] = DT_OP_NOP; ip[3] = DT_OP_NOP;
@ -1032,13 +932,13 @@ dt_modtext(dtrace_hdl_t *dtp, char *p, int isenabled, GElf_Rela *rela,
ip[0] = DT_OP_REX_RAX; ip[0] = DT_OP_REX_RAX;
ip[1] = DT_OP_XOR_EAX_0; ip[1] = DT_OP_XOR_EAX_0;
ip[2] = DT_OP_XOR_EAX_1; ip[2] = DT_OP_XOR_EAX_1;
ip[3] = ret; ip[3] = DT_OP_NOP;
ip[4] = DT_OP_NOP; ip[4] = DT_OP_NOP;
(*off) += 3; (*off) += 3;
} else { } else {
ip[0] = DT_OP_XOR_EAX_0; ip[0] = DT_OP_XOR_EAX_0;
ip[1] = DT_OP_XOR_EAX_1; ip[1] = DT_OP_XOR_EAX_1;
ip[2] = ret; ip[2] = DT_OP_NOP;
ip[3] = DT_OP_NOP; ip[3] = DT_OP_NOP;
ip[4] = DT_OP_NOP; ip[4] = DT_OP_NOP;
(*off) += 2; (*off) += 2;
@ -1133,13 +1033,7 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp)
if (dtp->dt_oflags & DTRACE_O_LP64) { if (dtp->dt_oflags & DTRACE_O_LP64) {
eclass = ELFCLASS64; eclass = ELFCLASS64;
#if defined(__ia64__) #if defined(__sparc)
emachine1 = emachine2 = EM_IA_64;
#elif defined(__mips__)
emachine1 = emachine2 = EM_MIPS;
#elif defined(__powerpc__)
emachine1 = emachine2 = EM_PPC64;
#elif defined(__sparc)
emachine1 = emachine2 = EM_SPARCV9; emachine1 = emachine2 = EM_SPARCV9;
#elif defined(__i386) || defined(__amd64) #elif defined(__i386) || defined(__amd64)
emachine1 = emachine2 = EM_AMD64; emachine1 = emachine2 = EM_AMD64;
@ -1147,16 +1041,10 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp)
symsize = sizeof (Elf64_Sym); symsize = sizeof (Elf64_Sym);
} else { } else {
eclass = ELFCLASS32; eclass = ELFCLASS32;
#if defined(__arm__) #if defined(__sparc)
emachine1 = emachine2 = EM_ARM;
#elif defined(__mips__)
emachine1 = emachine2 = EM_MIPS;
#elif defined(__powerpc__)
emachine1 = emachine2 = EM_PPC;
#elif defined(__sparc)
emachine1 = EM_SPARC; emachine1 = EM_SPARC;
emachine2 = EM_SPARC32PLUS; emachine2 = EM_SPARC32PLUS;
#elif defined(__i386) || defined(__amd64) || defined(__ia64__) #elif defined(__i386) || defined(__amd64)
emachine1 = emachine2 = EM_386; emachine1 = emachine2 = EM_386;
#endif #endif
symsize = sizeof (Elf32_Sym); symsize = sizeof (Elf32_Sym);
@ -1519,13 +1407,10 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp)
* already been processed by an earlier link * already been processed by an earlier link
* invocation. * invocation.
*/ */
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#ifdef DOODAD
if (rsym.st_shndx != SHN_SUNW_IGNORE) { if (rsym.st_shndx != SHN_SUNW_IGNORE) {
rsym.st_shndx = SHN_SUNW_IGNORE; rsym.st_shndx = SHN_SUNW_IGNORE;
(void) gelf_update_sym(data_sym, ndx, &rsym); (void) gelf_update_sym(data_sym, ndx, &rsym);
} }
#endif
} }
} }
@ -1553,9 +1438,6 @@ int
dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags, dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
const char *file, int objc, char *const objv[]) const char *file, int objc, char *const objv[])
{ {
#if !defined(sun)
char tfile[PATH_MAX];
#endif
char drti[PATH_MAX]; char drti[PATH_MAX];
dof_hdr_t *dof; dof_hdr_t *dof;
int fd, status, i, cur; int fd, status, i, cur;
@ -1563,11 +1445,6 @@ dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
size_t len; size_t len;
int eprobes = 0, ret = 0; int eprobes = 0, ret = 0;
#if !defined(sun)
/* XXX Should get a temp file name here. */
snprintf(tfile, sizeof(tfile), "%s.tmp", file);
#endif
/* /*
* A NULL program indicates a special use in which we just link * A NULL program indicates a special use in which we just link
* together a bunch of object files specified in objv and then * together a bunch of object files specified in objv and then
@ -1629,7 +1506,6 @@ dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
if ((dof = dtrace_dof_create(dtp, pgp, dflags)) == NULL) if ((dof = dtrace_dof_create(dtp, pgp, dflags)) == NULL)
return (-1); /* errno is set for us */ return (-1); /* errno is set for us */
#if defined(sun)
/* /*
* Create a temporary file and then unlink it if we're going to * Create a temporary file and then unlink it if we're going to
* combine it with drti.o later. We can still refer to it in child * combine it with drti.o later. We can still refer to it in child
@ -1639,11 +1515,6 @@ dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
return (dt_link_error(dtp, NULL, -1, NULL, return (dt_link_error(dtp, NULL, -1, NULL,
"failed to open %s: %s", file, strerror(errno))); "failed to open %s: %s", file, strerror(errno)));
} }
#else
if ((fd = open(tfile, O_RDWR | O_CREAT | O_TRUNC, 0666)) == -1)
return (dt_link_error(dtp, NULL, -1, NULL,
"failed to open %s: %s", tfile, strerror(errno)));
#endif
/* /*
* If -xlinktype=DOF has been selected, just write out the DOF. * If -xlinktype=DOF has been selected, just write out the DOF.
@ -1673,10 +1544,8 @@ dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
} }
#if defined(sun)
if (!dtp->dt_lazyload) if (!dtp->dt_lazyload)
(void) unlink(file); (void) unlink(file);
#endif
if (dtp->dt_oflags & DTRACE_O_LP64) if (dtp->dt_oflags & DTRACE_O_LP64)
status = dump_elf64(dtp, dof, fd); status = dump_elf64(dtp, dof, fd);
@ -1689,7 +1558,6 @@ dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
} }
if (!dtp->dt_lazyload) { if (!dtp->dt_lazyload) {
#if defined(sun)
const char *fmt = "%s -o %s -r -Blocal -Breduce /dev/fd/%d %s"; const char *fmt = "%s -o %s -r -Blocal -Breduce /dev/fd/%d %s";
if (dtp->dt_oflags & DTRACE_O_LP64) { if (dtp->dt_oflags & DTRACE_O_LP64) {
@ -1706,37 +1574,6 @@ dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
cmd = alloca(len); cmd = alloca(len);
(void) snprintf(cmd, len, fmt, dtp->dt_ld_path, file, fd, drti); (void) snprintf(cmd, len, fmt, dtp->dt_ld_path, file, fd, drti);
#else
const char *fmt = "%s -o %s -r %s %s";
#if defined(__amd64__)
/*
* Arches which default to 64-bit need to explicitly use
* the 32-bit library path.
*/
int use_32 = !(dtp->dt_oflags & DTRACE_O_LP64);
#else
/*
* Arches which are 32-bit only just use the normal
* library path.
*/
#if defined(__i386__)
int use_32 = 1; /* use /usr/lib/... -sson */
#else
int use_32 = 0;
#endif
#endif
(void) snprintf(drti, sizeof (drti), "/usr/lib%s/dtrace/drti.o",
use_32 ? "":"32");
len = snprintf(&tmp, 1, fmt, dtp->dt_ld_path, file, tfile,
drti) + 1;
cmd = alloca(len);
(void) snprintf(cmd, len, fmt, dtp->dt_ld_path, file, tfile, drti);
#endif
if ((status = system(cmd)) == -1) { if ((status = system(cmd)) == -1) {
ret = dt_link_error(dtp, NULL, -1, NULL, ret = dt_link_error(dtp, NULL, -1, NULL,
@ -1766,9 +1603,5 @@ dtrace_program_link(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, uint_t dflags,
done: done:
dtrace_dof_destroy(dtp, dof); dtrace_dof_destroy(dtp, dof);
#if !defined(sun)
unlink(tfile);
#endif
return (ret); return (ret);
} }

View File

@ -82,11 +82,7 @@ dt_epid_add(dtrace_hdl_t *dtp, dtrace_epid_t id)
enabled->dtepd_epid = id; enabled->dtepd_epid = id;
enabled->dtepd_nrecs = 1; enabled->dtepd_nrecs = 1;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_EPROBE, enabled) == -1) { if (dt_ioctl(dtp, DTRACEIOC_EPROBE, enabled) == -1) {
#else
if (dt_ioctl(dtp, DTRACEIOC_EPROBE, &enabled) == -1) {
#endif
rval = dt_set_errno(dtp, errno); rval = dt_set_errno(dtp, errno);
free(enabled); free(enabled);
return (rval); return (rval);
@ -106,11 +102,7 @@ dt_epid_add(dtrace_hdl_t *dtp, dtrace_epid_t id)
if ((enabled = nenabled) == NULL) if ((enabled = nenabled) == NULL)
return (dt_set_errno(dtp, EDT_NOMEM)); return (dt_set_errno(dtp, EDT_NOMEM));
#if defined(sun)
rval = dt_ioctl(dtp, DTRACEIOC_EPROBE, enabled); rval = dt_ioctl(dtp, DTRACEIOC_EPROBE, enabled);
#else
rval = dt_ioctl(dtp, DTRACEIOC_EPROBE, &enabled);
#endif
if (rval == -1) { if (rval == -1) {
rval = dt_set_errno(dtp, errno); rval = dt_set_errno(dtp, errno);
@ -330,11 +322,7 @@ dt_aggid_add(dtrace_hdl_t *dtp, dtrace_aggid_t id)
agg->dtagd_id = id; agg->dtagd_id = id;
agg->dtagd_nrecs = 1; agg->dtagd_nrecs = 1;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_AGGDESC, agg) == -1) { if (dt_ioctl(dtp, DTRACEIOC_AGGDESC, agg) == -1) {
#else
if (dt_ioctl(dtp, DTRACEIOC_AGGDESC, &agg) == -1) {
#endif
rval = dt_set_errno(dtp, errno); rval = dt_set_errno(dtp, errno);
free(agg); free(agg);
return (rval); return (rval);
@ -353,11 +341,7 @@ dt_aggid_add(dtrace_hdl_t *dtp, dtrace_aggid_t id)
if ((agg = nagg) == NULL) if ((agg = nagg) == NULL)
return (dt_set_errno(dtp, EDT_NOMEM)); return (dt_set_errno(dtp, EDT_NOMEM));
#if defined(sun)
rval = dt_ioctl(dtp, DTRACEIOC_AGGDESC, agg); rval = dt_ioctl(dtp, DTRACEIOC_AGGDESC, agg);
#else
rval = dt_ioctl(dtp, DTRACEIOC_AGGDESC, &agg);
#endif
if (rval == -1) { if (rval == -1) {
rval = dt_set_errno(dtp, errno); rval = dt_set_errno(dtp, errno);
@ -375,7 +359,7 @@ dt_aggid_add(dtrace_hdl_t *dtp, dtrace_aggid_t id)
* provide the compiler-generated aggregation information. * provide the compiler-generated aggregation information.
*/ */
if (dtp->dt_options[DTRACEOPT_GRABANON] == DTRACEOPT_UNSET && if (dtp->dt_options[DTRACEOPT_GRABANON] == DTRACEOPT_UNSET &&
agg->dtagd_rec[0].dtrd_uarg != 0) { agg->dtagd_rec[0].dtrd_uarg != NULL) {
dtrace_stmtdesc_t *sdp; dtrace_stmtdesc_t *sdp;
dt_ident_t *aid; dt_ident_t *aid;

View File

@ -26,23 +26,15 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h> #include <sys/types.h>
#if defined(sun)
#include <sys/modctl.h> #include <sys/modctl.h>
#include <sys/kobj.h> #include <sys/kobj.h>
#include <sys/kobj_impl.h> #include <sys/kobj_impl.h>
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#include <sys/elf.h> #include <sys/elf.h>
#include <sys/task.h> #include <sys/task.h>
#else
#include <sys/param.h>
#include <sys/linker.h>
#include <sys/stat.h>
#endif
#include <unistd.h> #include <unistd.h>
#if defined(sun)
#include <project.h> #include <project.h>
#endif
#include <strings.h> #include <strings.h>
#include <stdlib.h> #include <stdlib.h>
#include <libelf.h> #include <libelf.h>
@ -50,9 +42,6 @@
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
#include <dirent.h> #include <dirent.h>
#if !defined(sun)
#include <fcntl.h>
#endif
#include <dt_strtab.h> #include <dt_strtab.h>
#include <dt_module.h> #include <dt_module.h>
@ -77,7 +66,7 @@ dt_module_symhash_insert(dt_module_t *dmp, const char *name, uint_t id)
static uint_t static uint_t
dt_module_syminit32(dt_module_t *dmp) dt_module_syminit32(dt_module_t *dmp)
{ {
Elf32_Sym *sym = dmp->dm_symtab.cts_data; const Elf32_Sym *sym = dmp->dm_symtab.cts_data;
const char *base = dmp->dm_strtab.cts_data; const char *base = dmp->dm_strtab.cts_data;
size_t ss_size = dmp->dm_strtab.cts_size; size_t ss_size = dmp->dm_strtab.cts_size;
uint_t i, n = dmp->dm_nsymelems; uint_t i, n = dmp->dm_nsymelems;
@ -94,14 +83,9 @@ dt_module_syminit32(dt_module_t *dmp)
continue; /* skip null or invalid names */ continue; /* skip null or invalid names */
if (sym->st_value != 0 && if (sym->st_value != 0 &&
(ELF32_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size)) { (ELF32_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size))
asrsv++; /* reserve space in the address map */ asrsv++; /* reserve space in the address map */
#if !defined(sun)
sym->st_value += (Elf_Addr) dmp->dm_reloc_offset;
#endif
}
dt_module_symhash_insert(dmp, name, i); dt_module_symhash_insert(dmp, name, i);
} }
@ -111,7 +95,7 @@ dt_module_syminit32(dt_module_t *dmp)
static uint_t static uint_t
dt_module_syminit64(dt_module_t *dmp) dt_module_syminit64(dt_module_t *dmp)
{ {
Elf64_Sym *sym = dmp->dm_symtab.cts_data; const Elf64_Sym *sym = dmp->dm_symtab.cts_data;
const char *base = dmp->dm_strtab.cts_data; const char *base = dmp->dm_strtab.cts_data;
size_t ss_size = dmp->dm_strtab.cts_size; size_t ss_size = dmp->dm_strtab.cts_size;
uint_t i, n = dmp->dm_nsymelems; uint_t i, n = dmp->dm_nsymelems;
@ -128,14 +112,9 @@ dt_module_syminit64(dt_module_t *dmp)
continue; /* skip null or invalid names */ continue; /* skip null or invalid names */
if (sym->st_value != 0 && if (sym->st_value != 0 &&
(ELF64_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size)) { (ELF64_ST_BIND(sym->st_info) != STB_LOCAL || sym->st_size))
asrsv++; /* reserve space in the address map */ asrsv++; /* reserve space in the address map */
#if !defined(sun)
sym->st_value += (Elf_Addr) dmp->dm_reloc_offset;
#endif
}
dt_module_symhash_insert(dmp, name, i); dt_module_symhash_insert(dmp, name, i);
} }
@ -510,13 +489,7 @@ dt_module_load_sect(dtrace_hdl_t *dtp, dt_module_t *dmp, ctf_sect_t *ctsp)
if (sp == NULL || (dp = elf_getdata(sp, NULL)) == NULL) if (sp == NULL || (dp = elf_getdata(sp, NULL)) == NULL)
return (0); return (0);
#if defined(sun)
ctsp->cts_data = dp->d_buf; ctsp->cts_data = dp->d_buf;
#else
if ((ctsp->cts_data = malloc(dp->d_size)) == NULL)
return (0);
memcpy(ctsp->cts_data, dp->d_buf, dp->d_size);
#endif
ctsp->cts_size = dp->d_size; ctsp->cts_size = dp->d_size;
dt_dprintf("loaded %s [%s] (%lu bytes)\n", dt_dprintf("loaded %s [%s] (%lu bytes)\n",
@ -692,18 +665,6 @@ dt_module_unload(dtrace_hdl_t *dtp, dt_module_t *dmp)
ctf_close(dmp->dm_ctfp); ctf_close(dmp->dm_ctfp);
dmp->dm_ctfp = NULL; dmp->dm_ctfp = NULL;
#if !defined(sun)
if (dmp->dm_ctdata.cts_data != NULL) {
free(dmp->dm_ctdata.cts_data);
}
if (dmp->dm_symtab.cts_data != NULL) {
free(dmp->dm_symtab.cts_data);
}
if (dmp->dm_strtab.cts_data != NULL) {
free(dmp->dm_strtab.cts_data);
}
#endif
bzero(&dmp->dm_ctdata, sizeof (ctf_sect_t)); bzero(&dmp->dm_ctdata, sizeof (ctf_sect_t));
bzero(&dmp->dm_symtab, sizeof (ctf_sect_t)); bzero(&dmp->dm_symtab, sizeof (ctf_sect_t));
bzero(&dmp->dm_strtab, sizeof (ctf_sect_t)); bzero(&dmp->dm_strtab, sizeof (ctf_sect_t));
@ -729,11 +690,11 @@ dt_module_unload(dtrace_hdl_t *dtp, dt_module_t *dmp)
dmp->dm_asrsv = 0; dmp->dm_asrsv = 0;
dmp->dm_aslen = 0; dmp->dm_aslen = 0;
dmp->dm_text_va = 0; dmp->dm_text_va = NULL;
dmp->dm_text_size = 0; dmp->dm_text_size = 0;
dmp->dm_data_va = 0; dmp->dm_data_va = NULL;
dmp->dm_data_size = 0; dmp->dm_data_size = 0;
dmp->dm_bss_va = 0; dmp->dm_bss_va = NULL;
dmp->dm_bss_size = 0; dmp->dm_bss_size = 0;
if (dmp->dm_extern != NULL) { if (dmp->dm_extern != NULL) {
@ -820,16 +781,9 @@ dt_module_modelname(dt_module_t *dmp)
/* /*
* Update our module cache by adding an entry for the specified module 'name'. * Update our module cache by adding an entry for the specified module 'name'.
* We create the dt_module_t and populate it using /system/object/<name>/. * We create the dt_module_t and populate it using /system/object/<name>/.
*
* On FreeBSD, the module name is passed as the full module file name,
* including the path.
*/ */
static void static void
#if defined(sun)
dt_module_update(dtrace_hdl_t *dtp, const char *name) dt_module_update(dtrace_hdl_t *dtp, const char *name)
#else
dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
#endif
{ {
char fname[MAXPATHLEN]; char fname[MAXPATHLEN];
struct stat64 st; struct stat64 st;
@ -842,17 +796,8 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
Elf_Data *dp; Elf_Data *dp;
Elf_Scn *sp; Elf_Scn *sp;
#if defined(sun)
(void) snprintf(fname, sizeof (fname), (void) snprintf(fname, sizeof (fname),
"%s/%s/object", OBJFS_ROOT, name); "%s/%s/object", OBJFS_ROOT, name);
#else
GElf_Phdr ph;
char name[MAXPATHLEN];
int i = 0;
(void) strlcpy(name, k_stat->name, sizeof(name));
(void) strlcpy(fname, k_stat->pathname, sizeof(fname));
#endif
if ((fd = open(fname, O_RDONLY)) == -1 || fstat64(fd, &st) == -1 || if ((fd = open(fname, O_RDONLY)) == -1 || fstat64(fd, &st) == -1 ||
(dmp = dt_module_create(dtp, name)) == NULL) { (dmp = dt_module_create(dtp, name)) == NULL) {
@ -924,23 +869,7 @@ dt_module_update(dtrace_hdl_t *dtp, struct kld_file_stat *k_stat)
} }
dmp->dm_flags |= DT_DM_KERNEL; dmp->dm_flags |= DT_DM_KERNEL;
#if defined(sun)
dmp->dm_modid = (int)OBJFS_MODID(st.st_ino); dmp->dm_modid = (int)OBJFS_MODID(st.st_ino);
#else
#if defined(__i386__)
/*
* Find the first load section and figure out the relocation
* offset for the symbols. The kernel module will not need
* relocation, but the kernel linker modules will.
*/
for (i = 0; gelf_getphdr(dmp->dm_elf, i, &ph) != NULL; i++) {
if (ph.p_type == PT_LOAD) {
dmp->dm_reloc_offset = k_stat->address - ph.p_vaddr;
break;
}
}
#endif
#endif
if (dmp->dm_info.objfs_info_primary) if (dmp->dm_info.objfs_info_primary)
dmp->dm_flags |= DT_DM_PRIMARY; dmp->dm_flags |= DT_DM_PRIMARY;
@ -958,15 +887,11 @@ dtrace_update(dtrace_hdl_t *dtp)
{ {
dt_module_t *dmp; dt_module_t *dmp;
DIR *dirp; DIR *dirp;
#if defined(__FreeBSD__)
int fileid;
#endif
for (dmp = dt_list_next(&dtp->dt_modlist); for (dmp = dt_list_next(&dtp->dt_modlist);
dmp != NULL; dmp = dt_list_next(dmp)) dmp != NULL; dmp = dt_list_next(dmp))
dt_module_unload(dtp, dmp); dt_module_unload(dtp, dmp);
#if defined(sun)
/* /*
* Open /system/object and attempt to create a libdtrace module for * Open /system/object and attempt to create a libdtrace module for
* each kernel module that is loaded on the current system. * each kernel module that is loaded on the current system.
@ -982,18 +907,6 @@ dtrace_update(dtrace_hdl_t *dtp)
(void) closedir(dirp); (void) closedir(dirp);
} }
#elif defined(__FreeBSD__)
/*
* Use FreeBSD's kernel loader interface to discover what kernel
* modules are loaded and create a libdtrace module for each one.
*/
for (fileid = kldnext(0); fileid > 0; fileid = kldnext(fileid)) {
struct kld_file_stat k_stat;
k_stat.version = sizeof(k_stat);
if (kldstat(fileid, &k_stat) == 0)
dt_module_update(dtp, &k_stat);
}
#endif
/* /*
* Look up all the macro identifiers and set di_id to the latest value. * Look up all the macro identifiers and set di_id to the latest value.
@ -1006,13 +919,9 @@ dtrace_update(dtrace_hdl_t *dtp)
dt_idhash_lookup(dtp->dt_macros, "pid")->di_id = getpid(); dt_idhash_lookup(dtp->dt_macros, "pid")->di_id = getpid();
dt_idhash_lookup(dtp->dt_macros, "pgid")->di_id = getpgid(0); dt_idhash_lookup(dtp->dt_macros, "pgid")->di_id = getpgid(0);
dt_idhash_lookup(dtp->dt_macros, "ppid")->di_id = getppid(); dt_idhash_lookup(dtp->dt_macros, "ppid")->di_id = getppid();
#if defined(sun)
dt_idhash_lookup(dtp->dt_macros, "projid")->di_id = getprojid(); dt_idhash_lookup(dtp->dt_macros, "projid")->di_id = getprojid();
#endif
dt_idhash_lookup(dtp->dt_macros, "sid")->di_id = getsid(0); dt_idhash_lookup(dtp->dt_macros, "sid")->di_id = getsid(0);
#if defined(sun)
dt_idhash_lookup(dtp->dt_macros, "taskid")->di_id = gettaskid(); dt_idhash_lookup(dtp->dt_macros, "taskid")->di_id = gettaskid();
#endif
dt_idhash_lookup(dtp->dt_macros, "uid")->di_id = getuid(); dt_idhash_lookup(dtp->dt_macros, "uid")->di_id = getuid();
/* /*

View File

@ -27,17 +27,13 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h> #include <sys/types.h>
#if defined(sun)
#include <sys/modctl.h> #include <sys/modctl.h>
#include <sys/systeminfo.h> #include <sys/systeminfo.h>
#endif
#include <sys/resource.h> #include <sys/resource.h>
#include <libelf.h> #include <libelf.h>
#include <strings.h> #include <strings.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <limits.h> #include <limits.h>
#include <unistd.h> #include <unistd.h>
#include <stdlib.h> #include <stdlib.h>
@ -56,13 +52,6 @@
#include <dt_printf.h> #include <dt_printf.h>
#include <dt_string.h> #include <dt_string.h>
#include <dt_provider.h> #include <dt_provider.h>
#if !defined(sun)
#include <sys/sysctl.h>
#include <string.h>
#endif
#if defined(__i386__)
#include <ieeefp.h>
#endif
/* /*
* Stability and versioning definitions. These #defines are used in the tables * Stability and versioning definitions. These #defines are used in the tables
@ -114,9 +103,8 @@
#define DT_VERS_1_4_1 DT_VERSION_NUMBER(1, 4, 1) #define DT_VERS_1_4_1 DT_VERSION_NUMBER(1, 4, 1)
#define DT_VERS_1_5 DT_VERSION_NUMBER(1, 5, 0) #define DT_VERS_1_5 DT_VERSION_NUMBER(1, 5, 0)
#define DT_VERS_1_6 DT_VERSION_NUMBER(1, 6, 0) #define DT_VERS_1_6 DT_VERSION_NUMBER(1, 6, 0)
#define DT_VERS_1_6_1 DT_VERSION_NUMBER(1, 6, 1) #define DT_VERS_LATEST DT_VERS_1_6
#define DT_VERS_LATEST DT_VERS_1_6_1 #define DT_VERS_STRING "Sun D 1.6"
#define DT_VERS_STRING "Sun D 1.6.1"
const dt_version_t _dtrace_versions[] = { const dt_version_t _dtrace_versions[] = {
DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */ DT_VERS_1_0, /* D API 1.0.0 (PSARC 2001/466) Solaris 10 FCS */
@ -129,21 +117,9 @@ const dt_version_t _dtrace_versions[] = {
DT_VERS_1_4_1, /* D API 1.4.1 Solaris Express 4/07 */ DT_VERS_1_4_1, /* D API 1.4.1 Solaris Express 4/07 */
DT_VERS_1_5, /* D API 1.5 Solaris Express 7/07 */ DT_VERS_1_5, /* D API 1.5 Solaris Express 7/07 */
DT_VERS_1_6, /* D API 1.6 */ DT_VERS_1_6, /* D API 1.6 */
DT_VERS_1_6_1, /* D API 1.6.1 */
0 0
}; };
/*
* Global variables that are formatted on FreeBSD based on the kernel file name.
*/
#if !defined(sun)
static char curthread_str[MAXPATHLEN];
static char intmtx_str[MAXPATHLEN];
static char threadmtx_str[MAXPATHLEN];
static char rwlock_str[MAXPATHLEN];
static char sxlock_str[MAXPATHLEN];
#endif
/* /*
* Table of global identifiers. This is used to populate the global identifier * Table of global identifiers. This is used to populate the global identifier
* hash when a new dtrace client open occurs. For more info see dt_ident.h. * hash when a new dtrace client open occurs. For more info see dt_ident.h.
@ -218,11 +194,7 @@ static const dt_ident_t _dtrace_globals[] = {
{ "curthread", DT_IDENT_SCALAR, 0, DIF_VAR_CURTHREAD, { "curthread", DT_IDENT_SCALAR, 0, DIF_VAR_CURTHREAD,
{ DTRACE_STABILITY_STABLE, DTRACE_STABILITY_PRIVATE, { DTRACE_STABILITY_STABLE, DTRACE_STABILITY_PRIVATE,
DTRACE_CLASS_COMMON }, DT_VERS_1_0, DTRACE_CLASS_COMMON }, DT_VERS_1_0,
#if defined(sun)
&dt_idops_type, "genunix`kthread_t *" }, &dt_idops_type, "genunix`kthread_t *" },
#else
&dt_idops_type, curthread_str },
#endif
{ "ddi_pathname", DT_IDENT_FUNC, 0, DIF_SUBR_DDI_PATHNAME, { "ddi_pathname", DT_IDENT_FUNC, 0, DIF_SUBR_DDI_PATHNAME,
DT_ATTR_EVOLCMN, DT_VERS_1_0, DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, "string(void *, int64_t)" }, &dt_idops_func, "string(void *, int64_t)" },
@ -236,8 +208,6 @@ static const dt_ident_t _dtrace_globals[] = {
&dt_idops_type, "uint_t" }, &dt_idops_type, "uint_t" },
{ "errno", DT_IDENT_SCALAR, 0, DIF_VAR_ERRNO, DT_ATTR_STABCMN, DT_VERS_1_0, { "errno", DT_IDENT_SCALAR, 0, DIF_VAR_ERRNO, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_type, "int" }, &dt_idops_type, "int" },
{ "execargs", DT_IDENT_SCALAR, 0, DIF_VAR_EXECARGS,
DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" },
{ "execname", DT_IDENT_SCALAR, 0, DIF_VAR_EXECNAME, { "execname", DT_IDENT_SCALAR, 0, DIF_VAR_EXECNAME,
DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" }, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" },
{ "exit", DT_IDENT_ACTFUNC, 0, DT_ACT_EXIT, DT_ATTR_STABCMN, DT_VERS_1_0, { "exit", DT_IDENT_ACTFUNC, 0, DT_ACT_EXIT, DT_ATTR_STABCMN, DT_VERS_1_0,
@ -267,25 +237,15 @@ static const dt_ident_t _dtrace_globals[] = {
{ "index", DT_IDENT_FUNC, 0, DIF_SUBR_INDEX, DT_ATTR_STABCMN, DT_VERS_1_1, { "index", DT_IDENT_FUNC, 0, DIF_SUBR_INDEX, DT_ATTR_STABCMN, DT_VERS_1_1,
&dt_idops_func, "int(const char *, const char *, [int])" }, &dt_idops_func, "int(const char *, const char *, [int])" },
{ "inet_ntoa", DT_IDENT_FUNC, 0, DIF_SUBR_INET_NTOA, DT_ATTR_STABCMN, { "inet_ntoa", DT_IDENT_FUNC, 0, DIF_SUBR_INET_NTOA, DT_ATTR_STABCMN,
#if defined(sun)
DT_VERS_1_5, &dt_idops_func, "string(ipaddr_t *)" }, DT_VERS_1_5, &dt_idops_func, "string(ipaddr_t *)" },
#else
DT_VERS_1_5, &dt_idops_func, "string(in_addr_t *)" },
#endif
{ "inet_ntoa6", DT_IDENT_FUNC, 0, DIF_SUBR_INET_NTOA6, DT_ATTR_STABCMN, { "inet_ntoa6", DT_IDENT_FUNC, 0, DIF_SUBR_INET_NTOA6, DT_ATTR_STABCMN,
#if defined(sun)
DT_VERS_1_5, &dt_idops_func, "string(in6_addr_t *)" }, DT_VERS_1_5, &dt_idops_func, "string(in6_addr_t *)" },
#else
DT_VERS_1_5, &dt_idops_func, "string(struct in6_addr *)" },
#endif
{ "inet_ntop", DT_IDENT_FUNC, 0, DIF_SUBR_INET_NTOP, DT_ATTR_STABCMN, { "inet_ntop", DT_IDENT_FUNC, 0, DIF_SUBR_INET_NTOP, DT_ATTR_STABCMN,
DT_VERS_1_5, &dt_idops_func, "string(int, void *)" }, DT_VERS_1_5, &dt_idops_func, "string(int, void *)" },
{ "ipl", DT_IDENT_SCALAR, 0, DIF_VAR_IPL, DT_ATTR_STABCMN, DT_VERS_1_0, { "ipl", DT_IDENT_SCALAR, 0, DIF_VAR_IPL, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_type, "uint_t" }, &dt_idops_type, "uint_t" },
#if defined(sun)
{ "jstack", DT_IDENT_ACTFUNC, 0, DT_ACT_JSTACK, DT_ATTR_STABCMN, DT_VERS_1_0, { "jstack", DT_IDENT_ACTFUNC, 0, DT_ACT_JSTACK, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "stack(...)" }, &dt_idops_func, "stack(...)" },
#endif
{ "lltostr", DT_IDENT_FUNC, 0, DIF_SUBR_LLTOSTR, DT_ATTR_STABCMN, DT_VERS_1_0, { "lltostr", DT_IDENT_FUNC, 0, DIF_SUBR_LLTOSTR, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "string(int64_t)" }, &dt_idops_func, "string(int64_t)" },
{ "lquantize", DT_IDENT_AGGFUNC, 0, DTRACEAGG_LQUANTIZE, { "lquantize", DT_IDENT_AGGFUNC, 0, DTRACEAGG_LQUANTIZE,
@ -293,8 +253,6 @@ static const dt_ident_t _dtrace_globals[] = {
&dt_idops_func, "void(@, int32_t, int32_t, ...)" }, &dt_idops_func, "void(@, int32_t, int32_t, ...)" },
{ "max", DT_IDENT_AGGFUNC, 0, DTRACEAGG_MAX, DT_ATTR_STABCMN, DT_VERS_1_0, { "max", DT_IDENT_AGGFUNC, 0, DTRACEAGG_MAX, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "void(@)" }, &dt_idops_func, "void(@)" },
{ "memref", DT_IDENT_FUNC, 0, DIF_SUBR_MEMREF, DT_ATTR_STABCMN, DT_VERS_1_1,
&dt_idops_func, "uintptr_t *(void *, size_t)" },
{ "min", DT_IDENT_AGGFUNC, 0, DTRACEAGG_MIN, DT_ATTR_STABCMN, DT_VERS_1_0, { "min", DT_IDENT_AGGFUNC, 0, DTRACEAGG_MIN, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "void(@)" }, &dt_idops_func, "void(@)" },
{ "mod", DT_IDENT_ACTFUNC, 0, DT_ACT_MOD, DT_ATTR_STABCMN, { "mod", DT_IDENT_ACTFUNC, 0, DT_ACT_MOD, DT_ATTR_STABCMN,
@ -305,7 +263,6 @@ static const dt_ident_t _dtrace_globals[] = {
{ "msgsize", DT_IDENT_FUNC, 0, DIF_SUBR_MSGSIZE, { "msgsize", DT_IDENT_FUNC, 0, DIF_SUBR_MSGSIZE,
DT_ATTR_STABCMN, DT_VERS_1_0, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "size_t(mblk_t *)" }, &dt_idops_func, "size_t(mblk_t *)" },
#if defined(sun)
{ "mutex_owned", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_OWNED, { "mutex_owned", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_OWNED,
DT_ATTR_EVOLCMN, DT_VERS_1_0, DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, "int(genunix`kmutex_t *)" }, &dt_idops_func, "int(genunix`kmutex_t *)" },
@ -318,20 +275,6 @@ static const dt_ident_t _dtrace_globals[] = {
{ "mutex_type_spin", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_TYPE_SPIN, { "mutex_type_spin", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_TYPE_SPIN,
DT_ATTR_EVOLCMN, DT_VERS_1_0, DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, "int(genunix`kmutex_t *)" }, &dt_idops_func, "int(genunix`kmutex_t *)" },
#else
{ "mutex_owned", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_OWNED,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, intmtx_str },
{ "mutex_owner", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_OWNER,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, threadmtx_str },
{ "mutex_type_adaptive", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_TYPE_ADAPTIVE,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, intmtx_str },
{ "mutex_type_spin", DT_IDENT_FUNC, 0, DIF_SUBR_MUTEX_TYPE_SPIN,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, intmtx_str },
#endif
{ "ntohl", DT_IDENT_FUNC, 0, DIF_SUBR_NTOHL, DT_ATTR_EVOLCMN, DT_VERS_1_3, { "ntohl", DT_IDENT_FUNC, 0, DIF_SUBR_NTOHL, DT_ATTR_EVOLCMN, DT_VERS_1_3,
&dt_idops_func, "uint32_t(uint32_t)" }, &dt_idops_func, "uint32_t(uint32_t)" },
{ "ntohll", DT_IDENT_FUNC, 0, DIF_SUBR_NTOHLL, DT_ATTR_EVOLCMN, DT_VERS_1_3, { "ntohll", DT_IDENT_FUNC, 0, DIF_SUBR_NTOHLL, DT_ATTR_EVOLCMN, DT_VERS_1_3,
@ -350,10 +293,6 @@ static const dt_ident_t _dtrace_globals[] = {
&dt_idops_func, "void(@, ...)" }, &dt_idops_func, "void(@, ...)" },
{ "printf", DT_IDENT_ACTFUNC, 0, DT_ACT_PRINTF, DT_ATTR_STABCMN, DT_VERS_1_0, { "printf", DT_IDENT_ACTFUNC, 0, DT_ACT_PRINTF, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "void(@, ...)" }, &dt_idops_func, "void(@, ...)" },
{ "printm", DT_IDENT_ACTFUNC, 0, DT_ACT_PRINTM, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "void(size_t, uintptr_t *)" },
{ "printt", DT_IDENT_ACTFUNC, 0, DT_ACT_PRINTT, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "void(size_t, uintptr_t *)" },
{ "probefunc", DT_IDENT_SCALAR, 0, DIF_VAR_PROBEFUNC, { "probefunc", DT_IDENT_SCALAR, 0, DIF_VAR_PROBEFUNC,
DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" }, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" },
{ "probemod", DT_IDENT_SCALAR, 0, DIF_VAR_PROBEMOD, { "probemod", DT_IDENT_SCALAR, 0, DIF_VAR_PROBEMOD,
@ -374,7 +313,6 @@ static const dt_ident_t _dtrace_globals[] = {
&dt_idops_func, "int()" }, &dt_idops_func, "int()" },
{ "rindex", DT_IDENT_FUNC, 0, DIF_SUBR_RINDEX, DT_ATTR_STABCMN, DT_VERS_1_1, { "rindex", DT_IDENT_FUNC, 0, DIF_SUBR_RINDEX, DT_ATTR_STABCMN, DT_VERS_1_1,
&dt_idops_func, "int(const char *, const char *, [int])" }, &dt_idops_func, "int(const char *, const char *, [int])" },
#if defined(sun)
{ "rw_iswriter", DT_IDENT_FUNC, 0, DIF_SUBR_RW_ISWRITER, { "rw_iswriter", DT_IDENT_FUNC, 0, DIF_SUBR_RW_ISWRITER,
DT_ATTR_EVOLCMN, DT_VERS_1_0, DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, "int(genunix`krwlock_t *)" }, &dt_idops_func, "int(genunix`krwlock_t *)" },
@ -384,17 +322,6 @@ static const dt_ident_t _dtrace_globals[] = {
{ "rw_write_held", DT_IDENT_FUNC, 0, DIF_SUBR_RW_WRITE_HELD, { "rw_write_held", DT_IDENT_FUNC, 0, DIF_SUBR_RW_WRITE_HELD,
DT_ATTR_EVOLCMN, DT_VERS_1_0, DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, "int(genunix`krwlock_t *)" }, &dt_idops_func, "int(genunix`krwlock_t *)" },
#else
{ "rw_iswriter", DT_IDENT_FUNC, 0, DIF_SUBR_RW_ISWRITER,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, rwlock_str },
{ "rw_read_held", DT_IDENT_FUNC, 0, DIF_SUBR_RW_READ_HELD,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, rwlock_str },
{ "rw_write_held", DT_IDENT_FUNC, 0, DIF_SUBR_RW_WRITE_HELD,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, rwlock_str },
#endif
{ "self", DT_IDENT_PTR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0, { "self", DT_IDENT_PTR, 0, 0, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_type, "void" }, &dt_idops_type, "void" },
{ "setopt", DT_IDENT_ACTFUNC, 0, DT_ACT_SETOPT, DT_ATTR_STABCMN, { "setopt", DT_IDENT_ACTFUNC, 0, DT_ACT_SETOPT, DT_ATTR_STABCMN,
@ -430,17 +357,6 @@ static const dt_ident_t _dtrace_globals[] = {
&dt_idops_func, "string(const char *, int, [int])" }, &dt_idops_func, "string(const char *, int, [int])" },
{ "sum", DT_IDENT_AGGFUNC, 0, DTRACEAGG_SUM, DT_ATTR_STABCMN, DT_VERS_1_0, { "sum", DT_IDENT_AGGFUNC, 0, DTRACEAGG_SUM, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_func, "void(@)" }, &dt_idops_func, "void(@)" },
#if !defined(sun)
{ "sx_isexclusive", DT_IDENT_FUNC, 0, DIF_SUBR_SX_ISEXCLUSIVE,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, sxlock_str },
{ "sx_shared_held", DT_IDENT_FUNC, 0, DIF_SUBR_SX_SHARED_HELD,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, sxlock_str },
{ "sx_exclusive_held", DT_IDENT_FUNC, 0, DIF_SUBR_SX_EXCLUSIVE_HELD,
DT_ATTR_EVOLCMN, DT_VERS_1_0,
&dt_idops_func, sxlock_str },
#endif
{ "sym", DT_IDENT_ACTFUNC, 0, DT_ACT_SYM, DT_ATTR_STABCMN, { "sym", DT_IDENT_ACTFUNC, 0, DT_ACT_SYM, DT_ATTR_STABCMN,
DT_VERS_1_2, &dt_idops_func, "_symaddr(uintptr_t)" }, DT_VERS_1_2, &dt_idops_func, "_symaddr(uintptr_t)" },
{ "system", DT_IDENT_ACTFUNC, 0, DT_ACT_SYSTEM, DT_ATTR_STABCMN, DT_VERS_1_0, { "system", DT_IDENT_ACTFUNC, 0, DT_ACT_SYSTEM, DT_ATTR_STABCMN, DT_VERS_1_0,
@ -459,19 +375,14 @@ static const dt_ident_t _dtrace_globals[] = {
&dt_idops_func, "void(@, size_t)" }, &dt_idops_func, "void(@, size_t)" },
{ "trunc", DT_IDENT_ACTFUNC, 0, DT_ACT_TRUNC, DT_ATTR_STABCMN, { "trunc", DT_IDENT_ACTFUNC, 0, DT_ACT_TRUNC, DT_ATTR_STABCMN,
DT_VERS_1_0, &dt_idops_func, "void(...)" }, DT_VERS_1_0, &dt_idops_func, "void(...)" },
{ "typeref", DT_IDENT_FUNC, 0, DIF_SUBR_TYPEREF, DT_ATTR_STABCMN, DT_VERS_1_1,
&dt_idops_func, "uintptr_t *(void *, size_t, string, size_t)" },
#if defined(sun)
{ "uaddr", DT_IDENT_ACTFUNC, 0, DT_ACT_UADDR, DT_ATTR_STABCMN, { "uaddr", DT_IDENT_ACTFUNC, 0, DT_ACT_UADDR, DT_ATTR_STABCMN,
DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" }, DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" },
{ "ucaller", DT_IDENT_SCALAR, 0, DIF_VAR_UCALLER, DT_ATTR_STABCMN, { "ucaller", DT_IDENT_SCALAR, 0, DIF_VAR_UCALLER, DT_ATTR_STABCMN,
DT_VERS_1_2, &dt_idops_type, "uint64_t" }, DT_VERS_1_2, &dt_idops_type, "uint64_t" },
{ "ufunc", DT_IDENT_ACTFUNC, 0, DT_ACT_USYM, DT_ATTR_STABCMN, { "ufunc", DT_IDENT_ACTFUNC, 0, DT_ACT_USYM, DT_ATTR_STABCMN,
DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" }, DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" },
#endif
{ "uid", DT_IDENT_SCALAR, 0, DIF_VAR_UID, DT_ATTR_STABCMN, DT_VERS_1_0, { "uid", DT_IDENT_SCALAR, 0, DIF_VAR_UID, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_type, "uid_t" }, &dt_idops_type, "uid_t" },
#if defined(sun)
{ "umod", DT_IDENT_ACTFUNC, 0, DT_ACT_UMOD, DT_ATTR_STABCMN, { "umod", DT_IDENT_ACTFUNC, 0, DT_ACT_UMOD, DT_ATTR_STABCMN,
DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" }, DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" },
{ "uregs", DT_IDENT_ARRAY, 0, DIF_VAR_UREGS, DT_ATTR_STABCMN, DT_VERS_1_0, { "uregs", DT_IDENT_ARRAY, 0, DIF_VAR_UREGS, DT_ATTR_STABCMN, DT_VERS_1_0,
@ -483,17 +394,14 @@ static const dt_ident_t _dtrace_globals[] = {
&dt_idops_type, "uint32_t" }, &dt_idops_type, "uint32_t" },
{ "usym", DT_IDENT_ACTFUNC, 0, DT_ACT_USYM, DT_ATTR_STABCMN, { "usym", DT_IDENT_ACTFUNC, 0, DT_ACT_USYM, DT_ATTR_STABCMN,
DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" }, DT_VERS_1_2, &dt_idops_func, "_usymaddr(uintptr_t)" },
#endif
{ "vtimestamp", DT_IDENT_SCALAR, 0, DIF_VAR_VTIMESTAMP, { "vtimestamp", DT_IDENT_SCALAR, 0, DIF_VAR_VTIMESTAMP,
DT_ATTR_STABCMN, DT_VERS_1_0, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_type, "uint64_t" }, &dt_idops_type, "uint64_t" },
{ "walltimestamp", DT_IDENT_SCALAR, 0, DIF_VAR_WALLTIMESTAMP, { "walltimestamp", DT_IDENT_SCALAR, 0, DIF_VAR_WALLTIMESTAMP,
DT_ATTR_STABCMN, DT_VERS_1_0, DT_ATTR_STABCMN, DT_VERS_1_0,
&dt_idops_type, "int64_t" }, &dt_idops_type, "int64_t" },
#if defined(sun)
{ "zonename", DT_IDENT_SCALAR, 0, DIF_VAR_ZONENAME, { "zonename", DT_IDENT_SCALAR, 0, DIF_VAR_ZONENAME,
DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" }, DT_ATTR_STABCMN, DT_VERS_1_0, &dt_idops_type, "string" },
#endif
{ NULL, 0, 0, 0, { 0, 0, 0 }, 0, NULL, NULL } { NULL, 0, 0, 0, { 0, 0, 0 }, 0, NULL, NULL }
}; };
@ -733,20 +641,11 @@ const dtrace_pattr_t _dtrace_prvdesc = {
{ DTRACE_STABILITY_UNSTABLE, DTRACE_STABILITY_UNSTABLE, DTRACE_CLASS_COMMON }, { DTRACE_STABILITY_UNSTABLE, DTRACE_STABILITY_UNSTABLE, DTRACE_CLASS_COMMON },
}; };
#if defined(sun)
const char *_dtrace_defcpp = "/usr/ccs/lib/cpp"; /* default cpp(1) to invoke */ const char *_dtrace_defcpp = "/usr/ccs/lib/cpp"; /* default cpp(1) to invoke */
const char *_dtrace_defld = "/usr/ccs/bin/ld"; /* default ld(1) to invoke */ const char *_dtrace_defld = "/usr/ccs/bin/ld"; /* default ld(1) to invoke */
#else
const char *_dtrace_defcpp = "cpp"; /* default cpp(1) to invoke */
const char *_dtrace_defld = "ld"; /* default ld(1) to invoke */
#endif
const char *_dtrace_libdir = "/usr/lib/dtrace"; /* default library directory */ const char *_dtrace_libdir = "/usr/lib/dtrace"; /* default library directory */
#if defined(sun)
const char *_dtrace_provdir = "/dev/dtrace/provider"; /* provider directory */ const char *_dtrace_provdir = "/dev/dtrace/provider"; /* provider directory */
#else
const char *_dtrace_provdir = "/dev/dtrace"; /* provider directory */
#endif
int _dtrace_strbuckets = 211; /* default number of hash buckets (prime) */ int _dtrace_strbuckets = 211; /* default number of hash buckets (prime) */
int _dtrace_intbuckets = 256; /* default number of integer buckets (Pof2) */ int _dtrace_intbuckets = 256; /* default number of integer buckets (Pof2) */
@ -759,9 +658,7 @@ int _dtrace_argmax = 32; /* default maximum number of probe arguments */
int _dtrace_debug = 0; /* debug messages enabled (off) */ int _dtrace_debug = 0; /* debug messages enabled (off) */
const char *const _dtrace_version = DT_VERS_STRING; /* API version string */ const char *const _dtrace_version = DT_VERS_STRING; /* API version string */
#if defined(sun)
int _dtrace_rdvers = RD_VERSION; /* rtld_db feature version */ int _dtrace_rdvers = RD_VERSION; /* rtld_db feature version */
#endif
typedef struct dt_fdlist { typedef struct dt_fdlist {
int *df_fds; /* array of provider driver file descriptors */ int *df_fds; /* array of provider driver file descriptors */
@ -769,26 +666,16 @@ typedef struct dt_fdlist {
uint_t df_size; /* size of df_fds[] */ uint_t df_size; /* size of df_fds[] */
} dt_fdlist_t; } dt_fdlist_t;
#if defined(sun)
#pragma init(_dtrace_init) #pragma init(_dtrace_init)
#else
void _dtrace_init(void) __attribute__ ((constructor));
#endif
void void
_dtrace_init(void) _dtrace_init(void)
{ {
_dtrace_debug = getenv("DTRACE_DEBUG") != NULL; _dtrace_debug = getenv("DTRACE_DEBUG") != NULL;
#if defined(sun)
for (; _dtrace_rdvers > 0; _dtrace_rdvers--) { for (; _dtrace_rdvers > 0; _dtrace_rdvers--) {
if (rd_init(_dtrace_rdvers) == RD_OK) if (rd_init(_dtrace_rdvers) == RD_OK)
break; break;
} }
#endif
#if defined(__i386__)
/* make long doubles 64 bits -sson */
(void) fpsetprec(FP_PE);
#endif
} }
static dtrace_hdl_t * static dtrace_hdl_t *
@ -806,10 +693,9 @@ dt_provmod_open(dt_provmod_t **provmod, dt_fdlist_t *dfp)
{ {
dt_provmod_t *prov; dt_provmod_t *prov;
char path[PATH_MAX]; char path[PATH_MAX];
int fd;
#if defined(sun)
struct dirent *dp, *ep; struct dirent *dp, *ep;
DIR *dirp; DIR *dirp;
int fd;
if ((dirp = opendir(_dtrace_provdir)) == NULL) if ((dirp = opendir(_dtrace_provdir)) == NULL)
return; /* failed to open directory; just skip it */ return; /* failed to open directory; just skip it */
@ -854,92 +740,6 @@ dt_provmod_open(dt_provmod_t **provmod, dt_fdlist_t *dfp)
} }
(void) closedir(dirp); (void) closedir(dirp);
#else
char *p;
char *p1;
char *p_providers = NULL;
int error;
size_t len = 0;
/*
* Loop to allocate/reallocate memory for the string of provider
* names and retry:
*/
while(1) {
/*
* The first time around, get the string length. The next time,
* hopefully we've allocated enough memory.
*/
error = sysctlbyname("debug.dtrace.providers",p_providers,&len,NULL,0);
if (len == 0)
/* No providers? That's strange. Where's dtrace? */
break;
else if (error == 0 && p_providers == NULL) {
/*
* Allocate the initial memory which should be enough
* unless another provider loads before we have
* time to go back and get the string.
*/
if ((p_providers = malloc(len)) == NULL)
/* How do we report errors here? */
return;
} else if (error == -1 && errno == ENOMEM) {
/*
* The current buffer isn't large enough, so
* reallocate it. We normally won't need to do this
* because providers aren't being loaded all the time.
*/
if ((p = realloc(p_providers,len)) == NULL)
/* How do we report errors here? */
return;
p_providers = p;
} else
break;
}
/* Check if we got a string of provider names: */
if (error == 0 && len > 0 && p_providers != NULL) {
p = p_providers;
/*
* Parse the string containing the space separated
* provider names.
*/
while ((p1 = strsep(&p," ")) != NULL) {
if (dfp->df_ents == dfp->df_size) {
uint_t size = dfp->df_size ? dfp->df_size * 2 : 16;
int *fds = realloc(dfp->df_fds, size * sizeof (int));
if (fds == NULL)
break;
dfp->df_fds = fds;
dfp->df_size = size;
}
(void) snprintf(path, sizeof (path), "/dev/dtrace/%s", p1);
if ((fd = open(path, O_RDONLY)) == -1)
continue; /* failed to open driver; just skip it */
if (((prov = malloc(sizeof (dt_provmod_t))) == NULL) ||
(prov->dp_name = malloc(strlen(p1) + 1)) == NULL) {
free(prov);
(void) close(fd);
break;
}
(void) strcpy(prov->dp_name, p1);
prov->dp_next = *provmod;
*provmod = prov;
dt_dprintf("opened provider %s\n", p1);
dfp->df_fds[dfp->df_ents++] = fd;
}
}
if (p_providers != NULL)
free(p_providers);
#endif
} }
static void static void
@ -956,7 +756,6 @@ dt_provmod_destroy(dt_provmod_t **provmod)
*provmod = NULL; *provmod = NULL;
} }
#if defined(sun)
static const char * static const char *
dt_get_sysinfo(int cmd, char *buf, size_t len) dt_get_sysinfo(int cmd, char *buf, size_t len)
{ {
@ -971,7 +770,6 @@ dt_get_sysinfo(int cmd, char *buf, size_t len)
return (buf); return (buf);
} }
#endif
static dtrace_hdl_t * static dtrace_hdl_t *
dt_vopen(int version, int flags, int *errp, dt_vopen(int version, int flags, int *errp,
@ -1059,11 +857,7 @@ dt_vopen(int version, int flags, int *errp,
dtfd = open("/dev/dtrace/dtrace", O_RDWR); dtfd = open("/dev/dtrace/dtrace", O_RDWR);
err = errno; /* save errno from opening dtfd */ err = errno; /* save errno from opening dtfd */
#if defined(sun)
ftfd = open("/dev/dtrace/provider/fasttrap", O_RDWR); ftfd = open("/dev/dtrace/provider/fasttrap", O_RDWR);
#else
ftfd = open("/dev/dtrace/fasttrap", O_RDWR);
#endif
fterr = ftfd == -1 ? errno : 0; /* save errno from open ftfd */ fterr = ftfd == -1 ? errno : 0; /* save errno from open ftfd */
while (df.df_ents-- != 0) while (df.df_ents-- != 0)
@ -1112,11 +906,7 @@ dt_vopen(int version, int flags, int *errp,
dtp->dt_fterr = fterr; dtp->dt_fterr = fterr;
dtp->dt_cdefs_fd = -1; dtp->dt_cdefs_fd = -1;
dtp->dt_ddefs_fd = -1; dtp->dt_ddefs_fd = -1;
#if defined(sun)
dtp->dt_stdout_fd = -1; dtp->dt_stdout_fd = -1;
#else
dtp->dt_freopen_fp = NULL;
#endif
dtp->dt_modbuckets = _dtrace_strbuckets; dtp->dt_modbuckets = _dtrace_strbuckets;
dtp->dt_mods = calloc(dtp->dt_modbuckets, sizeof (dt_module_t *)); dtp->dt_mods = calloc(dtp->dt_modbuckets, sizeof (dt_module_t *));
dtp->dt_provbuckets = _dtrace_strbuckets; dtp->dt_provbuckets = _dtrace_strbuckets;
@ -1144,7 +934,6 @@ dt_vopen(int version, int flags, int *errp,
dtp->dt_cpp_argv[0] = (char *)strbasename(dtp->dt_cpp_path); dtp->dt_cpp_argv[0] = (char *)strbasename(dtp->dt_cpp_path);
#if defined(sun)
(void) snprintf(isadef, sizeof (isadef), "-D__SUNW_D_%u", (void) snprintf(isadef, sizeof (isadef), "-D__SUNW_D_%u",
(uint_t)(sizeof (void *) * NBBY)); (uint_t)(sizeof (void *) * NBBY));
@ -1159,7 +948,6 @@ dt_vopen(int version, int flags, int *errp,
dt_cpp_add_arg(dtp, isadef) == NULL || dt_cpp_add_arg(dtp, isadef) == NULL ||
dt_cpp_add_arg(dtp, utsdef) == NULL) dt_cpp_add_arg(dtp, utsdef) == NULL)
return (set_open_errno(dtp, errp, EDT_NOMEM)); return (set_open_errno(dtp, errp, EDT_NOMEM));
#endif
if (flags & DTRACE_O_NODEV) if (flags & DTRACE_O_NODEV)
bcopy(&_dtrace_conf, &dtp->dt_conf, sizeof (_dtrace_conf)); bcopy(&_dtrace_conf, &dtp->dt_conf, sizeof (_dtrace_conf));
@ -1184,7 +972,6 @@ dt_vopen(int version, int flags, int *errp,
return (set_open_errno(dtp, errp, EDT_NOMEM)); return (set_open_errno(dtp, errp, EDT_NOMEM));
#endif #endif
#if defined(sun)
#ifdef __x86 #ifdef __x86
/* /*
* On x86 systems, __i386 is defined for <sys/isa_defs.h> for 32-bit * On x86 systems, __i386 is defined for <sys/isa_defs.h> for 32-bit
@ -1198,17 +985,6 @@ dt_vopen(int version, int flags, int *errp,
if (dt_cpp_add_arg(dtp, "-D__i386") == NULL) if (dt_cpp_add_arg(dtp, "-D__i386") == NULL)
return (set_open_errno(dtp, errp, EDT_NOMEM)); return (set_open_errno(dtp, errp, EDT_NOMEM));
} }
#endif
#else
#if defined(__amd64__) || defined(__i386__)
if (dtp->dt_conf.dtc_ctfmodel == CTF_MODEL_LP64) {
if (dt_cpp_add_arg(dtp, "-m64") == NULL)
return (set_open_errno(dtp, errp, EDT_NOMEM));
} else {
if (dt_cpp_add_arg(dtp, "-m32") == NULL)
return (set_open_errno(dtp, errp, EDT_NOMEM));
}
#endif
#endif #endif
if (dtp->dt_conf.dtc_difversion < DIF_VERSION) if (dtp->dt_conf.dtc_difversion < DIF_VERSION)
@ -1219,38 +995,6 @@ dt_vopen(int version, int flags, int *errp,
else else
bcopy(_dtrace_ints_64, dtp->dt_ints, sizeof (_dtrace_ints_64)); bcopy(_dtrace_ints_64, dtp->dt_ints, sizeof (_dtrace_ints_64));
/*
* On FreeBSD the kernel module name can't be hard-coded. The
* 'kern.bootfile' sysctl value tells us exactly which file is being
* used as the kernel.
*/
#if !defined(sun)
{
char bootfile[MAXPATHLEN];
char *p;
int i;
size_t len = sizeof(bootfile);
/* This call shouldn't fail, but use a default just in case. */
if (sysctlbyname("kern.bootfile", bootfile, &len, NULL, 0) != 0)
strlcpy(bootfile, "kernel", sizeof(bootfile));
if ((p = strrchr(bootfile, '/')) != NULL)
p++;
else
p = bootfile;
/*
* Format the global variables based on the kernel module name.
*/
snprintf(curthread_str, sizeof(curthread_str), "%s`struct thread *",p);
snprintf(intmtx_str, sizeof(intmtx_str), "int(%s`struct mtx *)",p);
snprintf(threadmtx_str, sizeof(threadmtx_str), "struct thread *(%s`struct mtx *)",p);
snprintf(rwlock_str, sizeof(rwlock_str), "int(%s`struct rwlock *)",p);
snprintf(sxlock_str, sizeof(sxlock_str), "int(%s`struct sxlock *)",p);
}
#endif
dtp->dt_macros = dt_idhash_create("macro", NULL, 0, UINT_MAX); dtp->dt_macros = dt_idhash_create("macro", NULL, 0, UINT_MAX);
dtp->dt_aggs = dt_idhash_create("aggregation", NULL, dtp->dt_aggs = dt_idhash_create("aggregation", NULL,
DTRACE_AGGVARIDNONE + 1, UINT_MAX); DTRACE_AGGVARIDNONE + 1, UINT_MAX);
@ -1547,9 +1291,6 @@ dtrace_close(dtrace_hdl_t *dtp)
dt_dirpath_t *dirp; dt_dirpath_t *dirp;
int i; int i;
if (dtp->dt_procs != NULL)
dt_proc_hash_destroy(dtp);
while ((pgp = dt_list_next(&dtp->dt_programs)) != NULL) while ((pgp = dt_list_next(&dtp->dt_programs)) != NULL)
dt_program_destroy(dtp, pgp); dt_program_destroy(dtp, pgp);
@ -1578,6 +1319,9 @@ dtrace_close(dtrace_hdl_t *dtp)
while ((pvp = dt_list_next(&dtp->dt_provlist)) != NULL) while ((pvp = dt_list_next(&dtp->dt_provlist)) != NULL)
dt_provider_destroy(dtp, pvp); dt_provider_destroy(dtp, pvp);
if (dtp->dt_procs != NULL)
dt_proc_hash_destroy(dtp);
if (dtp->dt_fd != -1) if (dtp->dt_fd != -1)
(void) close(dtp->dt_fd); (void) close(dtp->dt_fd);
if (dtp->dt_ftfd != -1) if (dtp->dt_ftfd != -1)
@ -1586,13 +1330,8 @@ dtrace_close(dtrace_hdl_t *dtp)
(void) close(dtp->dt_cdefs_fd); (void) close(dtp->dt_cdefs_fd);
if (dtp->dt_ddefs_fd != -1) if (dtp->dt_ddefs_fd != -1)
(void) close(dtp->dt_ddefs_fd); (void) close(dtp->dt_ddefs_fd);
#if defined(sun)
if (dtp->dt_stdout_fd != -1) if (dtp->dt_stdout_fd != -1)
(void) close(dtp->dt_stdout_fd); (void) close(dtp->dt_stdout_fd);
#else
if (dtp->dt_freopen_fp != NULL)
(void) fclose(dtp->dt_freopen_fp);
#endif
dt_epid_destroy(dtp); dt_epid_destroy(dtp);
dt_aggid_destroy(dtp); dt_aggid_destroy(dtp);

View File

@ -35,9 +35,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h> #include <unistd.h>
#include <limits.h> #include <limits.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
@ -797,12 +795,7 @@ dt_options_load(dtrace_hdl_t *dtp)
bzero(&hdr, sizeof (dof_hdr_t)); bzero(&hdr, sizeof (dof_hdr_t));
hdr.dofh_loadsz = sizeof (dof_hdr_t); hdr.dofh_loadsz = sizeof (dof_hdr_t);
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_DOFGET, &hdr) == -1) if (dt_ioctl(dtp, DTRACEIOC_DOFGET, &hdr) == -1)
#else
dof = &hdr;
if (dt_ioctl(dtp, DTRACEIOC_DOFGET, &dof) == -1)
#endif
return (dt_set_errno(dtp, errno)); return (dt_set_errno(dtp, errno));
if (hdr.dofh_loadsz < sizeof (dof_hdr_t)) if (hdr.dofh_loadsz < sizeof (dof_hdr_t))
@ -815,11 +808,7 @@ dt_options_load(dtrace_hdl_t *dtp)
for (i = 0; i < DTRACEOPT_MAX; i++) for (i = 0; i < DTRACEOPT_MAX; i++)
dtp->dt_options[i] = DTRACEOPT_UNSET; dtp->dt_options[i] = DTRACEOPT_UNSET;
#if defined(sun)
if (dt_ioctl(dtp, DTRACEIOC_DOFGET, dof) == -1) if (dt_ioctl(dtp, DTRACEIOC_DOFGET, dof) == -1)
#else
if (dt_ioctl(dtp, DTRACEIOC_DOFGET, &dof) == -1)
#endif
return (dt_set_errno(dtp, errno)); return (dt_set_errno(dtp, errno));
for (i = 0; i < dof->dofh_secnum; i++) { for (i = 0; i < dof->dofh_secnum; i++) {
@ -923,7 +912,7 @@ static const dt_option_t _dtrace_ctoptions[] = {
{ "verbose", dt_opt_cflags, DTRACE_C_DIFV }, { "verbose", dt_opt_cflags, DTRACE_C_DIFV },
{ "version", dt_opt_version }, { "version", dt_opt_version },
{ "zdefs", dt_opt_cflags, DTRACE_C_ZDEFS }, { "zdefs", dt_opt_cflags, DTRACE_C_ZDEFS },
{ NULL, NULL, 0 } { NULL }
}; };
/* /*
@ -947,7 +936,7 @@ static const dt_option_t _dtrace_rtoptions[] = {
{ "statusrate", dt_opt_rate, DTRACEOPT_STATUSRATE }, { "statusrate", dt_opt_rate, DTRACEOPT_STATUSRATE },
{ "strsize", dt_opt_strsize, DTRACEOPT_STRSIZE }, { "strsize", dt_opt_strsize, DTRACEOPT_STRSIZE },
{ "ustackframes", dt_opt_runtime, DTRACEOPT_USTACKFRAMES }, { "ustackframes", dt_opt_runtime, DTRACEOPT_USTACKFRAMES },
{ NULL, NULL, 0 } { NULL }
}; };
/* /*
@ -964,7 +953,7 @@ static const dt_option_t _dtrace_drtoptions[] = {
{ "rawbytes", dt_opt_runtime, DTRACEOPT_RAWBYTES }, { "rawbytes", dt_opt_runtime, DTRACEOPT_RAWBYTES },
{ "stackindent", dt_opt_runtime, DTRACEOPT_STACKINDENT }, { "stackindent", dt_opt_runtime, DTRACEOPT_STACKINDENT },
{ "switchrate", dt_opt_rate, DTRACEOPT_SWITCHRATE }, { "switchrate", dt_opt_rate, DTRACEOPT_SWITCHRATE },
{ NULL, NULL, 0 } { NULL }
}; };
int int

View File

@ -100,9 +100,7 @@
#include <setjmp.h> #include <setjmp.h>
#include <strings.h> #include <strings.h>
#include <assert.h> #include <assert.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <stdlib.h> #include <stdlib.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>

View File

@ -32,9 +32,7 @@
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <ctype.h> #include <ctype.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <libgen.h> #include <libgen.h>
#include <stddef.h> #include <stddef.h>
@ -68,14 +66,10 @@ typedef struct dt_pid_probe {
static void static void
dt_pid_objname(char *buf, size_t len, Lmid_t lmid, const char *obj) dt_pid_objname(char *buf, size_t len, Lmid_t lmid, const char *obj)
{ {
#if defined(sun)
if (lmid == LM_ID_BASE) if (lmid == LM_ID_BASE)
(void) strncpy(buf, obj, len); (void) strncpy(buf, obj, len);
else else
(void) snprintf(buf, len, "LM%lx`%s", lmid, obj); (void) snprintf(buf, len, "LM%lx`%s", lmid, obj);
#else
(void) strncpy(buf, obj, len);
#endif
} }
static int static int
@ -120,11 +114,7 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
int isdash = strcmp("-", func) == 0; int isdash = strcmp("-", func) == 0;
pid_t pid; pid_t pid;
#if defined(sun)
pid = Pstatus(pp->dpp_pr)->pr_pid; pid = Pstatus(pp->dpp_pr)->pr_pid;
#else
pid = proc_getpid(pp->dpp_pr);
#endif
dt_dprintf("creating probe pid%d:%s:%s:%s\n", (int)pid, pp->dpp_obj, dt_dprintf("creating probe pid%d:%s:%s:%s\n", (int)pid, pp->dpp_obj,
func, pp->dpp_name); func, pp->dpp_name);
@ -144,7 +134,6 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
pp->dpp_obj); pp->dpp_obj);
if (!isdash && gmatch("return", pp->dpp_name)) { if (!isdash && gmatch("return", pp->dpp_name)) {
#ifdef DOODAD
if (dt_pid_create_return_probe(pp->dpp_pr, dtp, ftp, symp, if (dt_pid_create_return_probe(pp->dpp_pr, dtp, ftp, symp,
pp->dpp_stret) < 0) { pp->dpp_stret) < 0) {
return (dt_pid_error(dtp, pcb, dpr, ftp, return (dt_pid_error(dtp, pcb, dpr, ftp,
@ -152,20 +141,17 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
"for '%s': %s", func, "for '%s': %s", func,
dtrace_errmsg(dtp, dtrace_errno(dtp)))); dtrace_errmsg(dtp, dtrace_errno(dtp))));
} }
#endif
nmatches++; nmatches++;
} }
if (!isdash && gmatch("entry", pp->dpp_name)) { if (!isdash && gmatch("entry", pp->dpp_name)) {
#ifdef DOODAD
if (dt_pid_create_entry_probe(pp->dpp_pr, dtp, ftp, symp) < 0) { if (dt_pid_create_entry_probe(pp->dpp_pr, dtp, ftp, symp) < 0) {
return (dt_pid_error(dtp, pcb, dpr, ftp, return (dt_pid_error(dtp, pcb, dpr, ftp,
D_PROC_CREATEFAIL, "failed to create entry probe " D_PROC_CREATEFAIL, "failed to create entry probe "
"for '%s': %s", func, "for '%s': %s", func,
dtrace_errmsg(dtp, dtrace_errno(dtp)))); dtrace_errmsg(dtp, dtrace_errno(dtp))));
} }
#endif
nmatches++; nmatches++;
} }
@ -184,10 +170,8 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
(u_longlong_t)off, func)); (u_longlong_t)off, func));
} }
#ifdef DOODAD
err = dt_pid_create_offset_probe(pp->dpp_pr, pp->dpp_dtp, ftp, err = dt_pid_create_offset_probe(pp->dpp_pr, pp->dpp_dtp, ftp,
symp, off); symp, off);
#endif
if (err == DT_PROC_ERR) { if (err == DT_PROC_ERR) {
return (dt_pid_error(dtp, pcb, dpr, ftp, return (dt_pid_error(dtp, pcb, dpr, ftp,
@ -205,7 +189,6 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
nmatches++; nmatches++;
} else if (glob && !isdash) { } else if (glob && !isdash) {
#ifdef DOODAD
if (dt_pid_create_glob_offset_probes(pp->dpp_pr, if (dt_pid_create_glob_offset_probes(pp->dpp_pr,
pp->dpp_dtp, ftp, symp, pp->dpp_name) < 0) { pp->dpp_dtp, ftp, symp, pp->dpp_name) < 0) {
return (dt_pid_error(dtp, pcb, dpr, ftp, return (dt_pid_error(dtp, pcb, dpr, ftp,
@ -213,7 +196,6 @@ dt_pid_per_sym(dt_pid_probe_t *pp, const GElf_Sym *symp, const char *func)
"failed to create offset probes in '%s': %s", func, "failed to create offset probes in '%s': %s", func,
dtrace_errmsg(dtp, dtrace_errno(dtp)))); dtrace_errmsg(dtp, dtrace_errno(dtp))));
} }
#endif
nmatches++; nmatches++;
} }
@ -272,17 +254,13 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
if (obj == NULL) if (obj == NULL)
return (0); return (0);
#if defined(sun)
(void) Plmid(pp->dpp_pr, pmp->pr_vaddr, &pp->dpp_lmid); (void) Plmid(pp->dpp_pr, pmp->pr_vaddr, &pp->dpp_lmid);
#endif
if ((pp->dpp_obj = strrchr(obj, '/')) == NULL) if ((pp->dpp_obj = strrchr(obj, '/')) == NULL)
pp->dpp_obj = obj; pp->dpp_obj = obj;
else else
pp->dpp_obj++; pp->dpp_obj++;
#if defined(sun)
if (Pxlookup_by_name(pp->dpp_pr, pp->dpp_lmid, obj, ".stret1", &sym, if (Pxlookup_by_name(pp->dpp_pr, pp->dpp_lmid, obj, ".stret1", &sym,
NULL) == 0) NULL) == 0)
pp->dpp_stret[0] = sym.st_value; pp->dpp_stret[0] = sym.st_value;
@ -306,27 +284,6 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
pp->dpp_stret[3] = sym.st_value; pp->dpp_stret[3] = sym.st_value;
else else
pp->dpp_stret[3] = 0; pp->dpp_stret[3] = 0;
#else
if (proc_name2sym(pp->dpp_pr, obj, ".stret1", &sym) == 0)
pp->dpp_stret[0] = sym.st_value;
else
pp->dpp_stret[0] = 0;
if (proc_name2sym(pp->dpp_pr, obj, ".stret2", &sym) == 0)
pp->dpp_stret[1] = sym.st_value;
else
pp->dpp_stret[1] = 0;
if (proc_name2sym(pp->dpp_pr, obj, ".stret4", &sym) == 0)
pp->dpp_stret[2] = sym.st_value;
else
pp->dpp_stret[2] = 0;
if (proc_name2sym(pp->dpp_pr, obj, ".stret8", &sym) == 0)
pp->dpp_stret[3] = sym.st_value;
else
pp->dpp_stret[3] = 0;
#endif
dt_dprintf("%s stret %llx %llx %llx %llx\n", obj, dt_dprintf("%s stret %llx %llx %llx %llx\n", obj,
(u_longlong_t)pp->dpp_stret[0], (u_longlong_t)pp->dpp_stret[1], (u_longlong_t)pp->dpp_stret[0], (u_longlong_t)pp->dpp_stret[1],
@ -347,24 +304,16 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
* just fail silently in the hopes that some other object will * just fail silently in the hopes that some other object will
* contain the desired symbol. * contain the desired symbol.
*/ */
#if defined(sun)
if (Pxlookup_by_name(pp->dpp_pr, pp->dpp_lmid, obj, if (Pxlookup_by_name(pp->dpp_pr, pp->dpp_lmid, obj,
pp->dpp_func, &sym, NULL) != 0) { pp->dpp_func, &sym, NULL) != 0) {
#else
if (proc_name2sym(pp->dpp_pr, obj, pp->dpp_func, &sym) != 0) {
#endif
if (strcmp("-", pp->dpp_func) == 0) { if (strcmp("-", pp->dpp_func) == 0) {
sym.st_name = 0; sym.st_name = 0;
sym.st_info = sym.st_info =
GELF_ST_INFO(STB_LOCAL, STT_FUNC); GELF_ST_INFO(STB_LOCAL, STT_FUNC);
sym.st_other = 0; sym.st_other = 0;
sym.st_value = 0; sym.st_value = 0;
#if defined(sun)
sym.st_size = Pstatus(pp->dpp_pr)->pr_dmodel == sym.st_size = Pstatus(pp->dpp_pr)->pr_dmodel ==
PR_MODEL_ILP32 ? -1U : -1ULL; PR_MODEL_ILP32 ? -1U : -1ULL;
#else
sym.st_size = ~((Elf64_Xword) 0);
#endif
} else if (!strisglob(pp->dpp_mod)) { } else if (!strisglob(pp->dpp_mod)) {
return (dt_pid_error(dtp, pcb, dpr, NULL, return (dt_pid_error(dtp, pcb, dpr, NULL,
@ -387,21 +336,14 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
* We don't instrument PLTs -- they're dynamically rewritten, * We don't instrument PLTs -- they're dynamically rewritten,
* and, so, inherently dicey to instrument. * and, so, inherently dicey to instrument.
*/ */
#ifdef DOODAD
if (Ppltdest(pp->dpp_pr, sym.st_value) != NULL) if (Ppltdest(pp->dpp_pr, sym.st_value) != NULL)
return (0); return (0);
#endif
#if defined(sun)
(void) Plookup_by_addr(pp->dpp_pr, sym.st_value, pp->dpp_func, (void) Plookup_by_addr(pp->dpp_pr, sym.st_value, pp->dpp_func,
#else
(void) proc_addr2sym(pp->dpp_pr, sym.st_value, pp->dpp_func,
#endif
DTRACE_FUNCNAMELEN, &sym); DTRACE_FUNCNAMELEN, &sym);
return (dt_pid_per_sym(pp, &sym, pp->dpp_func)); return (dt_pid_per_sym(pp, &sym, pp->dpp_func));
} else { } else {
#ifdef DOODAD
uint_t nmatches = pp->dpp_nmatches; uint_t nmatches = pp->dpp_nmatches;
if (Psymbol_iter_by_addr(pp->dpp_pr, obj, PR_SYMTAB, if (Psymbol_iter_by_addr(pp->dpp_pr, obj, PR_SYMTAB,
@ -417,7 +359,6 @@ dt_pid_per_mod(void *arg, const prmap_t *pmp, const char *obj)
BIND_ANY | TYPE_FUNC, dt_pid_sym_filt, pp) == 1) BIND_ANY | TYPE_FUNC, dt_pid_sym_filt, pp) == 1)
return (1); return (1);
} }
#endif
} }
return (0); return (0);
@ -432,11 +373,7 @@ dt_pid_mod_filt(void *arg, const prmap_t *pmp, const char *obj)
if (gmatch(obj, pp->dpp_mod)) if (gmatch(obj, pp->dpp_mod))
return (dt_pid_per_mod(pp, pmp, obj)); return (dt_pid_per_mod(pp, pmp, obj));
#if defined(sun)
(void) Plmid(pp->dpp_pr, pmp->pr_vaddr, &pp->dpp_lmid); (void) Plmid(pp->dpp_pr, pmp->pr_vaddr, &pp->dpp_lmid);
#else
pp->dpp_lmid = 0;
#endif
if ((pp->dpp_obj = strrchr(obj, '/')) == NULL) if ((pp->dpp_obj = strrchr(obj, '/')) == NULL)
pp->dpp_obj = obj; pp->dpp_obj = obj;
@ -454,14 +391,11 @@ dt_pid_mod_filt(void *arg, const prmap_t *pmp, const char *obj)
static const prmap_t * static const prmap_t *
dt_pid_fix_mod(dtrace_probedesc_t *pdp, struct ps_prochandle *P) dt_pid_fix_mod(dtrace_probedesc_t *pdp, struct ps_prochandle *P)
{ {
#ifdef DOODAD
char m[MAXPATHLEN]; char m[MAXPATHLEN];
Lmid_t lmid = PR_LMID_EVERY; Lmid_t lmid = PR_LMID_EVERY;
const char *obj; const char *obj;
#endif
const prmap_t *pmp; const prmap_t *pmp;
#ifdef DOODAD
/* /*
* Pick apart the link map from the library name. * Pick apart the link map from the library name.
*/ */
@ -493,11 +427,7 @@ dt_pid_fix_mod(dtrace_probedesc_t *pdp, struct ps_prochandle *P)
obj++; obj++;
(void) Plmid(P, pmp->pr_vaddr, &lmid); (void) Plmid(P, pmp->pr_vaddr, &lmid);
dt_pid_objname(pdp->dtpd_mod, sizeof (pdp->dtpd_mod), lmid, obj); dt_pid_objname(pdp->dtpd_mod, sizeof (pdp->dtpd_mod), lmid, obj);
#else
pmp = NULL;
#endif
return (pmp); return (pmp);
} }
@ -515,7 +445,6 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
pp.dpp_pr = dpr->dpr_proc; pp.dpp_pr = dpr->dpr_proc;
pp.dpp_pcb = pcb; pp.dpp_pcb = pcb;
#ifdef DOODAD
/* /*
* We can only trace dynamically-linked executables (since we've * We can only trace dynamically-linked executables (since we've
* hidden some magic in ld.so.1 as well as libc.so.1). * hidden some magic in ld.so.1 as well as libc.so.1).
@ -525,7 +454,6 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
"process %s is not a dynamically-linked executable", "process %s is not a dynamically-linked executable",
&pdp->dtpd_provider[3])); &pdp->dtpd_provider[3]));
} }
#endif
pp.dpp_mod = pdp->dtpd_mod[0] != '\0' ? pdp->dtpd_mod : "*"; pp.dpp_mod = pdp->dtpd_mod[0] != '\0' ? pdp->dtpd_mod : "*";
pp.dpp_func = pdp->dtpd_func[0] != '\0' ? pdp->dtpd_func : "*"; pp.dpp_func = pdp->dtpd_func[0] != '\0' ? pdp->dtpd_func : "*";
@ -539,13 +467,8 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
pp.dpp_mod = pdp->dtpd_mod; pp.dpp_mod = pdp->dtpd_mod;
(void) strcpy(pdp->dtpd_mod, "a.out"); (void) strcpy(pdp->dtpd_mod, "a.out");
} else if (strisglob(pp.dpp_mod) || } else if (strisglob(pp.dpp_mod) ||
#if defined(sun)
(aout = Pname_to_map(pp.dpp_pr, "a.out")) == NULL || (aout = Pname_to_map(pp.dpp_pr, "a.out")) == NULL ||
(pmp = Pname_to_map(pp.dpp_pr, pp.dpp_mod)) == NULL || (pmp = Pname_to_map(pp.dpp_pr, pp.dpp_mod)) == NULL ||
#else
(aout = proc_name2map(pp.dpp_pr, "a.out")) == NULL ||
(pmp = proc_name2map(pp.dpp_pr, pp.dpp_mod)) == NULL ||
#endif
aout->pr_vaddr != pmp->pr_vaddr) { aout->pr_vaddr != pmp->pr_vaddr) {
return (dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_LIB, return (dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_LIB,
"only the a.out module is valid with the " "only the a.out module is valid with the "
@ -564,7 +487,6 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
* to iterate over each module and compare its name against the * to iterate over each module and compare its name against the
* pattern. An empty module name is treated as '*'. * pattern. An empty module name is treated as '*'.
*/ */
#ifdef DOODAD
if (strisglob(pp.dpp_mod)) { if (strisglob(pp.dpp_mod)) {
ret = Pobject_iter(pp.dpp_pr, dt_pid_mod_filt, &pp); ret = Pobject_iter(pp.dpp_pr, dt_pid_mod_filt, &pp);
} else { } else {
@ -585,7 +507,6 @@ dt_pid_create_pid_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
ret = dt_pid_per_mod(&pp, pmp, obj); ret = dt_pid_per_mod(&pp, pmp, obj);
} }
} }
#endif
return (ret); return (ret);
} }
@ -595,9 +516,7 @@ dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname)
{ {
struct ps_prochandle *P = data; struct ps_prochandle *P = data;
GElf_Sym sym; GElf_Sym sym;
#if defined(sun)
prsyminfo_t sip; prsyminfo_t sip;
#endif
dof_helper_t dh; dof_helper_t dh;
GElf_Half e_type; GElf_Half e_type;
const char *mname; const char *mname;
@ -611,12 +530,8 @@ dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname)
* run the code to instantiate these providers. * run the code to instantiate these providers.
*/ */
for (i = 0; i < 2; i++) { for (i = 0; i < 2; i++) {
#if defined(sun)
if (Pxlookup_by_name(P, PR_LMID_EVERY, oname, syms[i], &sym, if (Pxlookup_by_name(P, PR_LMID_EVERY, oname, syms[i], &sym,
&sip) != 0) { &sip) != 0) {
#else
if (proc_name2sym(P, oname, syms[i], &sym) != 0) {
#endif
continue; continue;
} }
@ -627,25 +542,18 @@ dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname)
dt_dprintf("lookup of %s succeeded for %s\n", syms[i], mname); dt_dprintf("lookup of %s succeeded for %s\n", syms[i], mname);
#ifdef DOODAD
if (Pread(P, &e_type, sizeof (e_type), pmp->pr_vaddr + if (Pread(P, &e_type, sizeof (e_type), pmp->pr_vaddr +
offsetof(Elf64_Ehdr, e_type)) != sizeof (e_type)) { offsetof(Elf64_Ehdr, e_type)) != sizeof (e_type)) {
dt_dprintf("read of ELF header failed"); dt_dprintf("read of ELF header failed");
continue; continue;
} }
#endif
dh.dofhp_dof = sym.st_value; dh.dofhp_dof = sym.st_value;
dh.dofhp_addr = (e_type == ET_EXEC) ? 0 : pmp->pr_vaddr; dh.dofhp_addr = (e_type == ET_EXEC) ? 0 : pmp->pr_vaddr;
dt_pid_objname(dh.dofhp_mod, sizeof (dh.dofhp_mod), dt_pid_objname(dh.dofhp_mod, sizeof (dh.dofhp_mod),
#if defined(sun)
sip.prs_lmid, mname); sip.prs_lmid, mname);
#else
0, mname);
#endif
#ifdef DOODAD
if (fd == -1 && if (fd == -1 &&
(fd = pr_open(P, "/dev/dtrace/helper", O_RDWR, 0)) < 0) { (fd = pr_open(P, "/dev/dtrace/helper", O_RDWR, 0)) < 0) {
dt_dprintf("pr_open of helper device failed: %s\n", dt_dprintf("pr_open of helper device failed: %s\n",
@ -655,13 +563,10 @@ dt_pid_usdt_mapping(void *data, const prmap_t *pmp, const char *oname)
if (pr_ioctl(P, fd, DTRACEHIOC_ADDDOF, &dh, sizeof (dh)) < 0) if (pr_ioctl(P, fd, DTRACEHIOC_ADDDOF, &dh, sizeof (dh)) < 0)
dt_dprintf("DOF was rejected for %s\n", dh.dofhp_mod); dt_dprintf("DOF was rejected for %s\n", dh.dofhp_mod);
#endif
} }
#ifdef DOODAD
if (fd != -1) if (fd != -1)
(void) pr_close(P, fd); (void) pr_close(P, fd);
#endif
return (0); return (0);
} }
@ -675,19 +580,13 @@ dt_pid_create_usdt_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp,
assert(DT_MUTEX_HELD(&dpr->dpr_lock)); assert(DT_MUTEX_HELD(&dpr->dpr_lock));
#ifdef DOODAD
(void) Pupdate_maps(P); (void) Pupdate_maps(P);
if (Pobject_iter(P, dt_pid_usdt_mapping, P) != 0) { if (Pobject_iter(P, dt_pid_usdt_mapping, P) != 0) {
ret = -1; ret = -1;
(void) dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_USDT, (void) dt_pid_error(dtp, pcb, dpr, NULL, D_PROC_USDT,
"failed to instantiate probes for pid %d: %s", "failed to instantiate probes for pid %d: %s",
#if defined(sun)
(int)Pstatus(P)->pr_pid, strerror(errno)); (int)Pstatus(P)->pr_pid, strerror(errno));
#else
(int)proc_getpid(P), strerror(errno));
#endif
} }
#endif
/* /*
* Put the module name in its canonical form. * Put the module name in its canonical form.
@ -768,13 +667,7 @@ dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
assert(dpr != NULL); assert(dpr != NULL);
(void) pthread_mutex_lock(&dpr->dpr_lock); (void) pthread_mutex_lock(&dpr->dpr_lock);
if ((err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr)) == 0) { err = dt_pid_create_pid_probes(pdp, dtp, pcb, dpr);
/*
* Alert other retained enablings which may match
* against the newly created probes.
*/
(void) dt_ioctl(dtp, DTRACEIOC_ENABLE, NULL);
}
(void) pthread_mutex_unlock(&dpr->dpr_lock); (void) pthread_mutex_unlock(&dpr->dpr_lock);
dt_proc_release(dtp, P); dt_proc_release(dtp, P);
@ -809,7 +702,6 @@ dt_pid_create_probes(dtrace_probedesc_t *pdp, dtrace_hdl_t *dtp, dt_pcb_t *pcb)
int int
dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr) dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
{ {
dtrace_enable_io_t args;
dtrace_prog_t *pgp; dtrace_prog_t *pgp;
dt_stmt_t *stp; dt_stmt_t *stp;
dtrace_probedesc_t *pdp, pd; dtrace_probedesc_t *pdp, pd;
@ -854,9 +746,7 @@ dt_pid_create_probes_module(dtrace_hdl_t *dtp, dt_proc_t *dpr)
* Give DTrace a shot to the ribs to get it to check * Give DTrace a shot to the ribs to get it to check
* out the newly created probes. * out the newly created probes.
*/ */
args.dof = NULL; (void) dt_ioctl(dtp, DTRACEIOC_ENABLE, NULL);
args.n_matched = 0;
(void) dt_ioctl(dtp, DTRACEIOC_ENABLE, &args);
} }
return (ret); return (ret);

View File

@ -18,9 +18,8 @@
* *
* CDDL HEADER END * CDDL HEADER END
*/ */
/* /*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved. * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms. * Use is subject to license terms.
*/ */
@ -28,9 +27,7 @@
#include <assert.h> #include <assert.h>
#include <strings.h> #include <strings.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
@ -213,7 +210,6 @@ dt_pragma_depends(const char *prname, dt_node_t *cnp)
dt_node_t *nnp = cnp ? cnp->dn_list : NULL; dt_node_t *nnp = cnp ? cnp->dn_list : NULL;
int found; int found;
dt_lib_depend_t *dld; dt_lib_depend_t *dld;
char lib[MAXPATHLEN];
if (cnp == NULL || nnp == NULL || if (cnp == NULL || nnp == NULL ||
cnp->dn_kind != DT_NODE_IDENT || nnp->dn_kind != DT_NODE_IDENT) { cnp->dn_kind != DT_NODE_IDENT || nnp->dn_kind != DT_NODE_IDENT) {
@ -227,53 +223,29 @@ dt_pragma_depends(const char *prname, dt_node_t *cnp)
dt_module_t *mp = dt_module_lookup_by_name(dtp, nnp->dn_string); dt_module_t *mp = dt_module_lookup_by_name(dtp, nnp->dn_string);
found = mp != NULL && dt_module_getctf(dtp, mp) != NULL; found = mp != NULL && dt_module_getctf(dtp, mp) != NULL;
} else if (strcmp(cnp->dn_string, "library") == 0) { } else if (strcmp(cnp->dn_string, "library") == 0) {
if (yypcb->pcb_cflags & DTRACE_C_CTL) {
assert(dtp->dt_filetag != NULL);
/* /*
* We have the file we are working on in dtp->dt_filetag * We have the file we are working on in dtp->dt_filetag
* so find that node and add the dependency in. * so find that node and add the dependency in.
*/ */
if (yypcb->pcb_cflags & DTRACE_C_CTL) {
char lib[MAXPATHLEN];
dld = dt_lib_depend_lookup(&dtp->dt_lib_dep, dld = dt_lib_depend_lookup(&dtp->dt_lib_dep,
dtp->dt_filetag); dtp->dt_filetag);
assert(dld != NULL); assert(dld != NULL);
(void) snprintf(lib, sizeof (lib), "%s%s", (void) snprintf(lib, MAXPATHLEN, "%s%s",
dld->dtld_libpath, nnp->dn_string); dld->dtld_libpath, nnp->dn_string);
if ((dt_lib_depend_add(dtp, &dld->dtld_dependencies, if ((dt_lib_depend_add(dtp, &dld->dtld_dependencies,
lib)) != 0) { lib)) != 0) {
xyerror(D_PRAGMA_DEPEND, xyerror(D_PRAGMA_DEPEND,
"failed to add dependency %s:%s\n", lib, "failed to add dependency %s:%s\n",
lib,
dtrace_errmsg(dtp, dtrace_errno(dtp))); dtrace_errmsg(dtp, dtrace_errno(dtp)));
} }
} else {
/*
* By this point we have already performed a topological
* sort of the dependencies; we process this directive
* as satisfied as long as the dependency was properly
* loaded.
*/
if (dtp->dt_filetag == NULL)
xyerror(D_PRAGMA_DEPEND, "main program may "
"not explicitly depend on a library");
dld = dt_lib_depend_lookup(&dtp->dt_lib_dep,
dtp->dt_filetag);
assert(dld != NULL);
(void) snprintf(lib, sizeof (lib), "%s%s",
dld->dtld_libpath, nnp->dn_string);
dld = dt_lib_depend_lookup(&dtp->dt_lib_dep_sorted,
lib);
assert(dld != NULL);
if (!dld->dtld_loaded)
xyerror(D_PRAGMA_DEPEND, "program requires "
"library \"%s\" which failed to load",
lib);
} }
found = 1;
found = B_TRUE;
} else { } else {
xyerror(D_PRAGMA_INVAL, "invalid class %s " xyerror(D_PRAGMA_INVAL, "invalid class %s "
"specified by #pragma %s\n", cnp->dn_string, prname); "specified by #pragma %s\n", cnp->dn_string, prname);

View File

@ -26,17 +26,10 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#else
#define ABS(a) ((a) < 0 ? -(a) : (a))
#endif
#include <string.h>
#include <strings.h> #include <strings.h>
#include <stdlib.h> #include <stdlib.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <assert.h> #include <assert.h>
#include <ctype.h> #include <ctype.h>
#include <errno.h> #include <errno.h>
@ -306,11 +299,9 @@ pfprint_fp(dtrace_hdl_t *dtp, FILE *fp, const char *format,
case sizeof (double): case sizeof (double):
return (dt_printf(dtp, fp, format, return (dt_printf(dtp, fp, format,
*((double *)addr) / n)); *((double *)addr) / n));
#if !defined(__arm__) && !defined(__powerpc__)
case sizeof (long double): case sizeof (long double):
return (dt_printf(dtp, fp, format, return (dt_printf(dtp, fp, format,
*((long double *)addr) / ldn)); *((long double *)addr) / ldn));
#endif
default: default:
return (dt_set_errno(dtp, EDT_DMISMATCH)); return (dt_set_errno(dtp, EDT_DMISMATCH));
} }
@ -463,11 +454,7 @@ pfprint_time(dtrace_hdl_t *dtp, FILE *fp, const char *format,
* Below, we turn this into the canonical adb/mdb /[yY] format, * Below, we turn this into the canonical adb/mdb /[yY] format,
* "1973 Dec 3 17:20:00". * "1973 Dec 3 17:20:00".
*/ */
#if defined(sun)
(void) ctime_r(&sec, src, sizeof (src)); (void) ctime_r(&sec, src, sizeof (src));
#else
(void) ctime_r(&sec, src);
#endif
/* /*
* Place the 4-digit year at the head of the string... * Place the 4-digit year at the head of the string...
@ -1566,7 +1553,6 @@ dtrace_freopen(dtrace_hdl_t *dtp, FILE *fp, void *fmtdata,
if (rval == -1 || fp == NULL) if (rval == -1 || fp == NULL)
return (rval); return (rval);
#if defined(sun)
if (pfd->pfd_preflen != 0 && if (pfd->pfd_preflen != 0 &&
strcmp(pfd->pfd_prefix, DT_FREOPEN_RESTORE) == 0) { strcmp(pfd->pfd_prefix, DT_FREOPEN_RESTORE) == 0) {
/* /*
@ -1611,8 +1597,7 @@ dtrace_freopen(dtrace_hdl_t *dtp, FILE *fp, void *fmtdata,
* fails, we can fail the operation without destroying stdout. * fails, we can fail the operation without destroying stdout.
*/ */
if ((nfp = fopen(filename, "aF")) == NULL) { if ((nfp = fopen(filename, "aF")) == NULL) {
char *msg = strerror(errno); char *msg = strerror(errno), *faultstr;
char *faultstr;
int len = 80; int len = 80;
len += strlen(msg) + strlen(filename); len += strlen(msg) + strlen(filename);
@ -1648,82 +1633,6 @@ dtrace_freopen(dtrace_hdl_t *dtp, FILE *fp, void *fmtdata,
} }
(void) fclose(nfp); (void) fclose(nfp);
#else
/*
* The 'standard output' (which is not necessarily stdout)
* treatment on FreeBSD is implemented differently than on
* Solaris because FreeBSD's freopen() will attempt to re-use
* the current file descriptor, causing the previous file to
* be closed and thereby preventing it from be re-activated
* later.
*
* For FreeBSD we use the concept of setting an output file
* pointer in the DTrace handle if a dtrace_freopen() has
* enabled another output file and we leave the caller's
* file pointer untouched. If it was actually stdout, then
* stdout remains open. If it was another file, then that
* file remains open. While a dtrace_freopen() has activated
* another file, we keep a pointer to that which we use in
* the output functions by preference and only use the caller's
* file pointer if no dtrace_freopen() call has been made.
*
* The check to see if we're re-activating the caller's
* output file is much the same as on Solaris.
*/
if (pfd->pfd_preflen != 0 &&
strcmp(pfd->pfd_prefix, DT_FREOPEN_RESTORE) == 0) {
/*
* The only way to have the format string set to the value
* DT_FREOPEN_RESTORE is via the empty freopen() string --
* denoting that we should restore the old stdout.
*/
assert(strcmp(dtp->dt_sprintf_buf, DT_FREOPEN_RESTORE) == 0);
if (dtp->dt_freopen_fp == NULL) {
/*
* We could complain here by generating an error,
* but it seems like overkill: it seems that calling
* freopen() to restore stdout when freopen() has
* never before been called should just be a no-op,
* so we just return in this case.
*/
return (rval);
}
/*
* At this point, to re-active the original output file,
* on FreeBSD we only code the current file that this
* function opened previously.
*/
(void) fclose(dtp->dt_freopen_fp);
dtp->dt_freopen_fp = NULL;
return (rval);
}
if ((nfp = fopen(dtp->dt_sprintf_buf, "a")) == NULL) {
char *msg = strerror(errno);
char *faultstr;
int len = 80;
len += strlen(msg) + strlen(dtp->dt_sprintf_buf);
faultstr = alloca(len);
(void) snprintf(faultstr, len, "couldn't freopen() \"%s\": %s",
dtp->dt_sprintf_buf, strerror(errno));
if ((errval = dt_handle_liberr(dtp, data, faultstr)) == 0)
return (rval);
return (errval);
}
if (dtp->dt_freopen_fp != NULL)
(void) fclose(dtp->dt_freopen_fp);
/* Remember that the output has been redirected to the new file. */
dtp->dt_freopen_fp = nfp;
#endif
return (rval); return (rval);
} }

View File

@ -79,9 +79,7 @@
*/ */
#include <sys/wait.h> #include <sys/wait.h>
#if defined(sun)
#include <sys/lwp.h> #include <sys/lwp.h>
#endif
#include <strings.h> #include <strings.h>
#include <signal.h> #include <signal.h>
#include <assert.h> #include <assert.h>
@ -95,7 +93,6 @@
#define IS_SYS_FORK(w) (w == SYS_vfork || w == SYS_fork1 || \ #define IS_SYS_FORK(w) (w == SYS_vfork || w == SYS_fork1 || \
w == SYS_forkall || w == SYS_forksys) w == SYS_forkall || w == SYS_forksys)
#ifdef DOODAD
static dt_bkpt_t * static dt_bkpt_t *
dt_proc_bpcreate(dt_proc_t *dpr, uintptr_t addr, dt_bkpt_f *func, void *data) dt_proc_bpcreate(dt_proc_t *dpr, uintptr_t addr, dt_bkpt_f *func, void *data)
{ {
@ -117,36 +114,27 @@ dt_proc_bpcreate(dt_proc_t *dpr, uintptr_t addr, dt_bkpt_f *func, void *data)
return (dbp); return (dbp);
} }
#endif
static void static void
dt_proc_bpdestroy(dt_proc_t *dpr, int delbkpts) dt_proc_bpdestroy(dt_proc_t *dpr, int delbkpts)
{ {
#if defined(sun)
int state = Pstate(dpr->dpr_proc); int state = Pstate(dpr->dpr_proc);
#else
int state = proc_state(dpr->dpr_proc);
#endif
dt_bkpt_t *dbp, *nbp; dt_bkpt_t *dbp, *nbp;
assert(DT_MUTEX_HELD(&dpr->dpr_lock)); assert(DT_MUTEX_HELD(&dpr->dpr_lock));
for (dbp = dt_list_next(&dpr->dpr_bps); dbp != NULL; dbp = nbp) { for (dbp = dt_list_next(&dpr->dpr_bps); dbp != NULL; dbp = nbp) {
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#ifdef DOODAD
if (delbkpts && dbp->dbp_active && if (delbkpts && dbp->dbp_active &&
state != PS_LOST && state != PS_UNDEAD) { state != PS_LOST && state != PS_UNDEAD) {
(void) Pdelbkpt(dpr->dpr_proc, (void) Pdelbkpt(dpr->dpr_proc,
dbp->dbp_addr, dbp->dbp_instr); dbp->dbp_addr, dbp->dbp_instr);
} }
#endif
nbp = dt_list_next(dbp); nbp = dt_list_next(dbp);
dt_list_delete(&dpr->dpr_bps, dbp); dt_list_delete(&dpr->dpr_bps, dbp);
dt_free(dpr->dpr_hdl, dbp); dt_free(dpr->dpr_hdl, dbp);
} }
} }
#ifdef DOODAD
static void static void
dt_proc_bpmatch(dtrace_hdl_t *dtp, dt_proc_t *dpr) dt_proc_bpmatch(dtrace_hdl_t *dtp, dt_proc_t *dpr)
{ {
@ -173,7 +161,6 @@ dt_proc_bpmatch(dtrace_hdl_t *dtp, dt_proc_t *dpr)
dbp->dbp_func(dtp, dpr, dbp->dbp_data); dbp->dbp_func(dtp, dpr, dbp->dbp_data);
(void) Pxecbkpt(dpr->dpr_proc, dbp->dbp_instr); (void) Pxecbkpt(dpr->dpr_proc, dbp->dbp_instr);
} }
#endif
static void static void
dt_proc_bpenable(dt_proc_t *dpr) dt_proc_bpenable(dt_proc_t *dpr)
@ -184,12 +171,9 @@ dt_proc_bpenable(dt_proc_t *dpr)
for (dbp = dt_list_next(&dpr->dpr_bps); for (dbp = dt_list_next(&dpr->dpr_bps);
dbp != NULL; dbp = dt_list_next(dbp)) { dbp != NULL; dbp = dt_list_next(dbp)) {
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#ifdef DOODAD
if (!dbp->dbp_active && Psetbkpt(dpr->dpr_proc, if (!dbp->dbp_active && Psetbkpt(dpr->dpr_proc,
dbp->dbp_addr, &dbp->dbp_instr) == 0) dbp->dbp_addr, &dbp->dbp_instr) == 0)
dbp->dbp_active = B_TRUE; dbp->dbp_active = B_TRUE;
#endif
} }
dt_dprintf("breakpoints enabled\n"); dt_dprintf("breakpoints enabled\n");
@ -204,12 +188,9 @@ dt_proc_bpdisable(dt_proc_t *dpr)
for (dbp = dt_list_next(&dpr->dpr_bps); for (dbp = dt_list_next(&dpr->dpr_bps);
dbp != NULL; dbp = dt_list_next(dbp)) { dbp != NULL; dbp = dt_list_next(dbp)) {
printf("%s:%s(%d): DOODAD\n",__FUNCTION__,__FILE__,__LINE__);
#ifdef DOODAD
if (dbp->dbp_active && Pdelbkpt(dpr->dpr_proc, if (dbp->dbp_active && Pdelbkpt(dpr->dpr_proc,
dbp->dbp_addr, dbp->dbp_instr) == 0) dbp->dbp_addr, dbp->dbp_instr) == 0)
dbp->dbp_active = B_FALSE; dbp->dbp_active = B_FALSE;
#endif
} }
dt_dprintf("breakpoints disabled\n"); dt_dprintf("breakpoints disabled\n");
@ -282,7 +263,6 @@ dt_proc_bpmain(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *fname)
dt_proc_stop(dpr, DT_PROC_STOP_MAIN); dt_proc_stop(dpr, DT_PROC_STOP_MAIN);
} }
#if defined(sun)
static void static void
dt_proc_rdevent(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *evname) dt_proc_rdevent(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *evname)
{ {
@ -459,7 +439,6 @@ dt_proc_waitrun(dt_proc_t *dpr)
(void) pthread_mutex_lock(&dpr->dpr_lock); (void) pthread_mutex_lock(&dpr->dpr_lock);
} }
#endif
typedef struct dt_proc_control_data { typedef struct dt_proc_control_data {
dtrace_hdl_t *dpcd_hdl; /* DTrace handle */ dtrace_hdl_t *dpcd_hdl; /* DTrace handle */
@ -486,13 +465,11 @@ dt_proc_control(void *arg)
dt_proc_t *dpr = datap->dpcd_proc; dt_proc_t *dpr = datap->dpcd_proc;
dt_proc_hash_t *dph = dpr->dpr_hdl->dt_procs; dt_proc_hash_t *dph = dpr->dpr_hdl->dt_procs;
struct ps_prochandle *P = dpr->dpr_proc; struct ps_prochandle *P = dpr->dpr_proc;
int pfd = Pctlfd(P);
int pid = dpr->dpr_pid; int pid = dpr->dpr_pid;
#if defined(sun)
int pfd = Pctlfd(P);
const long wstop = PCWSTOP; const long wstop = PCWSTOP;
#endif
int notify = B_FALSE; int notify = B_FALSE;
/* /*
@ -510,7 +487,6 @@ dt_proc_control(void *arg)
*/ */
(void) pthread_mutex_lock(&dpr->dpr_lock); (void) pthread_mutex_lock(&dpr->dpr_lock);
#if defined(sun)
(void) Punsetflags(P, PR_ASYNC); /* require synchronous mode */ (void) Punsetflags(P, PR_ASYNC); /* require synchronous mode */
(void) Psetflags(P, PR_BPTADJ); /* always adjust eip on x86 */ (void) Psetflags(P, PR_BPTADJ); /* always adjust eip on x86 */
(void) Punsetflags(P, PR_FORK); /* do not inherit on fork */ (void) Punsetflags(P, PR_FORK); /* do not inherit on fork */
@ -556,20 +532,6 @@ dt_proc_control(void *arg)
dt_dprintf("pid %d: failed to set running: %s\n", dt_dprintf("pid %d: failed to set running: %s\n",
(int)dpr->dpr_pid, strerror(errno)); (int)dpr->dpr_pid, strerror(errno));
} }
#else
/*
* If PR_KLC is set, we created the process; otherwise we grabbed it.
* Check for an appropriate stop request and wait for dt_proc_continue.
*/
if (proc_getflags(P) & PR_KLC)
dt_proc_stop(dpr, DT_PROC_STOP_CREATE);
else
dt_proc_stop(dpr, DT_PROC_STOP_GRAB);
if (proc_continue(P) != 0)
dt_dprintf("pid %d: failed to set running: %s\n",
(int)dpr->dpr_pid, strerror(errno));
#endif
(void) pthread_mutex_unlock(&dpr->dpr_lock); (void) pthread_mutex_unlock(&dpr->dpr_lock);
@ -583,33 +545,20 @@ dt_proc_control(void *arg)
* Pwait() (which will return immediately) and do our processing. * Pwait() (which will return immediately) and do our processing.
*/ */
while (!dpr->dpr_quit) { while (!dpr->dpr_quit) {
#if defined(sun)
const lwpstatus_t *psp; const lwpstatus_t *psp;
if (write(pfd, &wstop, sizeof (wstop)) == -1 && errno == EINTR) if (write(pfd, &wstop, sizeof (wstop)) == -1 && errno == EINTR)
continue; /* check dpr_quit and continue waiting */ continue; /* check dpr_quit and continue waiting */
#else
/* Wait for the process to report status. */
proc_wait(P);
#endif
(void) pthread_mutex_lock(&dpr->dpr_lock); (void) pthread_mutex_lock(&dpr->dpr_lock);
#if defined(sun)
pwait_locked: pwait_locked:
if (Pstopstatus(P, PCNULL, 0) == -1 && errno == EINTR) { if (Pstopstatus(P, PCNULL, 0) == -1 && errno == EINTR) {
(void) pthread_mutex_unlock(&dpr->dpr_lock); (void) pthread_mutex_unlock(&dpr->dpr_lock);
continue; /* check dpr_quit and continue waiting */ continue; /* check dpr_quit and continue waiting */
} }
#endif
#if defined(sun)
switch (Pstate(P)) { switch (Pstate(P)) {
#else
switch (proc_state(P)) {
#endif
case PS_STOP: case PS_STOP:
#ifdef DOODAD
psp = &Pstatus(P)->pr_lwp; psp = &Pstatus(P)->pr_lwp;
dt_dprintf("pid %d: proc stopped showing %d/%d\n", dt_dprintf("pid %d: proc stopped showing %d/%d\n",
@ -652,14 +601,11 @@ dt_proc_control(void *arg)
else if (psp->pr_why == PR_SYSEXIT && else if (psp->pr_why == PR_SYSEXIT &&
IS_SYS_EXEC(psp->pr_what)) IS_SYS_EXEC(psp->pr_what))
dt_proc_attach(dpr, B_TRUE); dt_proc_attach(dpr, B_TRUE);
#endif
break; break;
case PS_LOST: case PS_LOST:
#if defined(sun)
if (Preopen(P) == 0) if (Preopen(P) == 0)
goto pwait_locked; goto pwait_locked;
#endif
dt_dprintf("pid %d: proc lost: %s\n", dt_dprintf("pid %d: proc lost: %s\n",
pid, strerror(errno)); pid, strerror(errno));
@ -675,12 +621,10 @@ dt_proc_control(void *arg)
break; break;
} }
#if defined(sun)
if (Pstate(P) != PS_UNDEAD && Psetrun(P, 0, 0) == -1) { if (Pstate(P) != PS_UNDEAD && Psetrun(P, 0, 0) == -1) {
dt_dprintf("pid %d: failed to set running: %s\n", dt_dprintf("pid %d: failed to set running: %s\n",
(int)dpr->dpr_pid, strerror(errno)); (int)dpr->dpr_pid, strerror(errno));
} }
#endif
(void) pthread_mutex_unlock(&dpr->dpr_lock); (void) pthread_mutex_unlock(&dpr->dpr_lock);
} }
@ -720,11 +664,7 @@ dt_proc_error(dtrace_hdl_t *dtp, dt_proc_t *dpr, const char *format, ...)
va_end(ap); va_end(ap);
if (dpr->dpr_proc != NULL) if (dpr->dpr_proc != NULL)
#if defined(sun)
Prelease(dpr->dpr_proc, 0); Prelease(dpr->dpr_proc, 0);
#else
proc_detach(dpr->dpr_proc);
#endif
dt_free(dtp, dpr); dt_free(dtp, dpr);
(void) dt_set_errno(dtp, EDT_COMPILER); (void) dt_set_errno(dtp, EDT_COMPILER);
@ -735,11 +675,7 @@ dt_proc_t *
dt_proc_lookup(dtrace_hdl_t *dtp, struct ps_prochandle *P, int remove) dt_proc_lookup(dtrace_hdl_t *dtp, struct ps_prochandle *P, int remove)
{ {
dt_proc_hash_t *dph = dtp->dt_procs; dt_proc_hash_t *dph = dtp->dt_procs;
#if defined(sun)
pid_t pid = Pstatus(P)->pr_pid; pid_t pid = Pstatus(P)->pr_pid;
#else
pid_t pid = proc_getpid(P);
#endif
dt_proc_t *dpr, **dpp = &dph->dph_hash[pid & (dph->dph_hashlen - 1)]; dt_proc_t *dpr, **dpp = &dph->dph_hash[pid & (dph->dph_hashlen - 1)];
for (dpr = *dpp; dpr != NULL; dpr = dpr->dpr_hash) { for (dpr = *dpp; dpr != NULL; dpr = dpr->dpr_hash) {
@ -773,17 +709,9 @@ dt_proc_destroy(dtrace_hdl_t *dtp, struct ps_prochandle *P)
* an external debugger and we were waiting in dt_proc_waitrun(). * an external debugger and we were waiting in dt_proc_waitrun().
* Leave the process in this condition using PRELEASE_HANG. * Leave the process in this condition using PRELEASE_HANG.
*/ */
#if defined(sun)
if (!(Pstatus(dpr->dpr_proc)->pr_flags & (PR_KLC | PR_RLC))) { if (!(Pstatus(dpr->dpr_proc)->pr_flags & (PR_KLC | PR_RLC))) {
#else
if (!(proc_getflags(dpr->dpr_proc) & (PR_KLC | PR_RLC))) {
#endif
dt_dprintf("abandoning pid %d\n", (int)dpr->dpr_pid); dt_dprintf("abandoning pid %d\n", (int)dpr->dpr_pid);
#if defined(sun)
rflag = PRELEASE_HANG; rflag = PRELEASE_HANG;
#else
rflag = 0 /* XXX */;
#endif
} else { } else {
dt_dprintf("releasing pid %d\n", (int)dpr->dpr_pid); dt_dprintf("releasing pid %d\n", (int)dpr->dpr_pid);
rflag = 0; /* apply kill or run-on-last-close */ rflag = 0; /* apply kill or run-on-last-close */
@ -806,11 +734,7 @@ dt_proc_destroy(dtrace_hdl_t *dtp, struct ps_prochandle *P)
*/ */
(void) pthread_mutex_lock(&dpr->dpr_lock); (void) pthread_mutex_lock(&dpr->dpr_lock);
dpr->dpr_quit = B_TRUE; dpr->dpr_quit = B_TRUE;
#if defined(sun)
(void) _lwp_kill(dpr->dpr_tid, SIGCANCEL); (void) _lwp_kill(dpr->dpr_tid, SIGCANCEL);
#else
(void) pthread_kill(dpr->dpr_tid, SIGUSR1);
#endif
/* /*
* If the process is currently idling in dt_proc_stop(), re- * If the process is currently idling in dt_proc_stop(), re-
@ -858,11 +782,7 @@ dt_proc_destroy(dtrace_hdl_t *dtp, struct ps_prochandle *P)
} }
dt_list_delete(&dph->dph_lrulist, dpr); dt_list_delete(&dph->dph_lrulist, dpr);
#if defined(sun)
Prelease(dpr->dpr_proc, rflag); Prelease(dpr->dpr_proc, rflag);
#else
proc_detach(dpr->dpr_proc);
#endif
dt_free(dtp, dpr); dt_free(dtp, dpr);
} }
@ -882,11 +802,7 @@ dt_proc_create_thread(dtrace_hdl_t *dtp, dt_proc_t *dpr, uint_t stop)
(void) sigfillset(&nset); (void) sigfillset(&nset);
(void) sigdelset(&nset, SIGABRT); /* unblocked for assert() */ (void) sigdelset(&nset, SIGABRT); /* unblocked for assert() */
#if defined(sun)
(void) sigdelset(&nset, SIGCANCEL); /* see dt_proc_destroy() */ (void) sigdelset(&nset, SIGCANCEL); /* see dt_proc_destroy() */
#else
(void) sigdelset(&nset, SIGUSR1); /* see dt_proc_destroy() */
#endif
data.dpcd_hdl = dtp; data.dpcd_hdl = dtp;
data.dpcd_proc = dpr; data.dpcd_proc = dpr;
@ -914,21 +830,14 @@ dt_proc_create_thread(dtrace_hdl_t *dtp, dt_proc_t *dpr, uint_t stop)
* small amount of useful information to help figure it out. * small amount of useful information to help figure it out.
*/ */
if (dpr->dpr_done) { if (dpr->dpr_done) {
#if defined(sun)
const psinfo_t *prp = Ppsinfo(dpr->dpr_proc); const psinfo_t *prp = Ppsinfo(dpr->dpr_proc);
int stat = prp ? prp->pr_wstat : 0; int stat = prp ? prp->pr_wstat : 0;
#endif
int pid = dpr->dpr_pid; int pid = dpr->dpr_pid;
#if defined(sun)
if (Pstate(dpr->dpr_proc) == PS_LOST) { if (Pstate(dpr->dpr_proc) == PS_LOST) {
#else
if (proc_state(dpr->dpr_proc) == PS_LOST) {
#endif
(void) dt_proc_error(dpr->dpr_hdl, dpr, (void) dt_proc_error(dpr->dpr_hdl, dpr,
"failed to control pid %d: process exec'd " "failed to control pid %d: process exec'd "
"set-id or unobservable program\n", pid); "set-id or unobservable program\n", pid);
#if defined(sun)
} else if (WIFSIGNALED(stat)) { } else if (WIFSIGNALED(stat)) {
(void) dt_proc_error(dpr->dpr_hdl, dpr, (void) dt_proc_error(dpr->dpr_hdl, dpr,
"failed to control pid %d: process died " "failed to control pid %d: process died "
@ -937,7 +846,6 @@ dt_proc_create_thread(dtrace_hdl_t *dtp, dt_proc_t *dpr, uint_t stop)
(void) dt_proc_error(dpr->dpr_hdl, dpr, (void) dt_proc_error(dpr->dpr_hdl, dpr,
"failed to control pid %d: process exited " "failed to control pid %d: process exited "
"with status %d\n", pid, WEXITSTATUS(stat)); "with status %d\n", pid, WEXITSTATUS(stat));
#endif
} }
err = ESRCH; /* cause grab() or create() to fail */ err = ESRCH; /* cause grab() or create() to fail */
@ -967,7 +875,6 @@ dt_proc_create(dtrace_hdl_t *dtp, const char *file, char *const *argv)
(void) pthread_mutex_init(&dpr->dpr_lock, NULL); (void) pthread_mutex_init(&dpr->dpr_lock, NULL);
(void) pthread_cond_init(&dpr->dpr_cv, NULL); (void) pthread_cond_init(&dpr->dpr_cv, NULL);
#if defined(sun)
if ((dpr->dpr_proc = Pcreate(file, argv, &err, NULL, 0)) == NULL) { if ((dpr->dpr_proc = Pcreate(file, argv, &err, NULL, 0)) == NULL) {
return (dt_proc_error(dtp, dpr, return (dt_proc_error(dtp, dpr,
"failed to execute %s: %s\n", file, Pcreate_error(err))); "failed to execute %s: %s\n", file, Pcreate_error(err)));
@ -978,21 +885,8 @@ dt_proc_create(dtrace_hdl_t *dtp, const char *file, char *const *argv)
(void) Punsetflags(dpr->dpr_proc, PR_RLC); (void) Punsetflags(dpr->dpr_proc, PR_RLC);
(void) Psetflags(dpr->dpr_proc, PR_KLC); (void) Psetflags(dpr->dpr_proc, PR_KLC);
#else
(void) proc_clearflags(dpr->dpr_proc, PR_RLC);
(void) proc_setflags(dpr->dpr_proc, PR_KLC);
if ((err = proc_create(file, argv, &dpr->dpr_proc)) != 0)
return (dt_proc_error(dtp, dpr,
"failed to execute %s: %s\n", file, strerror(err)));
dpr->dpr_hdl = dtp;
dpr->dpr_pid = proc_getpid(dpr->dpr_proc);
#endif
#if defined(sun)
if (dt_proc_create_thread(dtp, dpr, dtp->dt_prcmode) != 0) if (dt_proc_create_thread(dtp, dpr, dtp->dt_prcmode) != 0)
#else
if (dt_proc_create_thread(dtp, dpr, DT_PROC_STOP_IDLE) != 0)
#endif
return (NULL); /* dt_proc_error() has been called for us */ return (NULL); /* dt_proc_error() has been called for us */
dpr->dpr_hash = dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)]; dpr->dpr_hash = dph->dph_hash[dpr->dpr_pid & (dph->dph_hashlen - 1)];
@ -1048,27 +942,16 @@ dt_proc_grab(dtrace_hdl_t *dtp, pid_t pid, int flags, int nomonitor)
(void) pthread_mutex_init(&dpr->dpr_lock, NULL); (void) pthread_mutex_init(&dpr->dpr_lock, NULL);
(void) pthread_cond_init(&dpr->dpr_cv, NULL); (void) pthread_cond_init(&dpr->dpr_cv, NULL);
#if defined(sun)
if ((dpr->dpr_proc = Pgrab(pid, flags, &err)) == NULL) { if ((dpr->dpr_proc = Pgrab(pid, flags, &err)) == NULL) {
return (dt_proc_error(dtp, dpr, return (dt_proc_error(dtp, dpr,
"failed to grab pid %d: %s\n", (int)pid, Pgrab_error(err))); "failed to grab pid %d: %s\n", (int)pid, Pgrab_error(err)));
} }
#else
if ((err = proc_attach(pid, flags, &dpr->dpr_proc)) != 0)
return (dt_proc_error(dtp, dpr,
"failed to grab pid %d: %s\n", (int) pid, strerror(err)));
#endif
dpr->dpr_hdl = dtp; dpr->dpr_hdl = dtp;
dpr->dpr_pid = pid; dpr->dpr_pid = pid;
#if defined(sun)
(void) Punsetflags(dpr->dpr_proc, PR_KLC); (void) Punsetflags(dpr->dpr_proc, PR_KLC);
(void) Psetflags(dpr->dpr_proc, PR_RLC); (void) Psetflags(dpr->dpr_proc, PR_RLC);
#else
(void) proc_clearflags(dpr->dpr_proc, PR_KLC);
(void) proc_setflags(dpr->dpr_proc, PR_RLC);
#endif
/* /*
* If we are attempting to grab the process without a monitor * If we are attempting to grab the process without a monitor
@ -1189,11 +1072,7 @@ dtrace_proc_create(dtrace_hdl_t *dtp, const char *file, char *const *argv)
struct ps_prochandle *P = dt_proc_create(dtp, file, argv); struct ps_prochandle *P = dt_proc_create(dtp, file, argv);
if (P != NULL && idp != NULL && idp->di_id == 0) if (P != NULL && idp != NULL && idp->di_id == 0)
#if defined(sun)
idp->di_id = Pstatus(P)->pr_pid; /* $target = created pid */ idp->di_id = Pstatus(P)->pr_pid; /* $target = created pid */
#else
idp->di_id = proc_getpid(P); /* $target = created pid */
#endif
return (P); return (P);
} }

View File

@ -44,9 +44,7 @@ typedef struct dt_proc {
dtrace_hdl_t *dpr_hdl; /* back pointer to libdtrace handle */ dtrace_hdl_t *dpr_hdl; /* back pointer to libdtrace handle */
struct ps_prochandle *dpr_proc; /* proc handle for libproc calls */ struct ps_prochandle *dpr_proc; /* proc handle for libproc calls */
char dpr_errmsg[BUFSIZ]; /* error message */ char dpr_errmsg[BUFSIZ]; /* error message */
#if defined(sun)
rd_agent_t *dpr_rtld; /* rtld handle for librtld_db calls */ rd_agent_t *dpr_rtld; /* rtld handle for librtld_db calls */
#endif
pthread_mutex_t dpr_lock; /* lock for manipulating dpr_hdl */ pthread_mutex_t dpr_lock; /* lock for manipulating dpr_hdl */
pthread_cond_t dpr_cv; /* cond for dpr_stop/quit/done */ pthread_cond_t dpr_cv; /* cond for dpr_stop/quit/done */
pid_t dpr_pid; /* pid of process */ pid_t dpr_pid; /* pid of process */

View File

@ -32,9 +32,7 @@
#include <errno.h> #include <errno.h>
#include <assert.h> #include <assert.h>
#include <ctype.h> #include <ctype.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <dt_impl.h> #include <dt_impl.h>
#include <dt_program.h> #include <dt_program.h>
@ -153,7 +151,6 @@ int
dtrace_program_exec(dtrace_hdl_t *dtp, dtrace_prog_t *pgp, dtrace_program_exec(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
dtrace_proginfo_t *pip) dtrace_proginfo_t *pip)
{ {
dtrace_enable_io_t args;
void *dof; void *dof;
int n, err; int n, err;
@ -162,9 +159,7 @@ dtrace_program_exec(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
if ((dof = dtrace_dof_create(dtp, pgp, DTRACE_D_STRIP)) == NULL) if ((dof = dtrace_dof_create(dtp, pgp, DTRACE_D_STRIP)) == NULL)
return (-1); return (-1);
args.dof = dof; n = dt_ioctl(dtp, DTRACEIOC_ENABLE, dof);
args.n_matched = 0;
n = dt_ioctl(dtp, DTRACEIOC_ENABLE, &args);
dtrace_dof_destroy(dtp, dof); dtrace_dof_destroy(dtp, dof);
if (n == -1) { if (n == -1) {
@ -186,7 +181,7 @@ dtrace_program_exec(dtrace_hdl_t *dtp, dtrace_prog_t *pgp,
} }
if (pip != NULL) if (pip != NULL)
pip->dpi_matches += args.n_matched; pip->dpi_matches += n;
return (0); return (0);
} }

View File

@ -27,17 +27,13 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#include <sys/types.h> #include <sys/types.h>
#if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#endif
#include <assert.h> #include <assert.h>
#include <limits.h> #include <limits.h>
#include <strings.h> #include <strings.h>
#include <stdlib.h> #include <stdlib.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>

View File

@ -26,9 +26,7 @@
#pragma ident "%Z%%M% %I% %E% SMI" #pragma ident "%Z%%M% %I% %E% SMI"
#if defined(sun)
#include <sys/sysmacros.h> #include <sys/sysmacros.h>
#endif
#include <strings.h> #include <strings.h>
#include <unistd.h> #include <unistd.h>
@ -38,11 +36,7 @@
#include <stdio.h> #include <stdio.h>
#include <errno.h> #include <errno.h>
#include <ctype.h> #include <ctype.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#else
#include <sys/sysctl.h>
#endif
#include <assert.h> #include <assert.h>
#include <libgen.h> #include <libgen.h>
#include <limits.h> #include <limits.h>
@ -473,19 +467,10 @@ dt_dprintf(const char *format, ...)
} }
int int
#if defined(sun)
dt_ioctl(dtrace_hdl_t *dtp, int val, void *arg) dt_ioctl(dtrace_hdl_t *dtp, int val, void *arg)
#else
dt_ioctl(dtrace_hdl_t *dtp, u_long val, void *arg)
#endif
{ {
const dtrace_vector_t *v = dtp->dt_vector; const dtrace_vector_t *v = dtp->dt_vector;
#if !defined(sun)
/* Avoid sign extension. */
val &= 0xffffffff;
#endif
if (v != NULL) if (v != NULL)
return (v->dtv_ioctl(dtp->dt_varg, val, arg)); return (v->dtv_ioctl(dtp->dt_varg, val, arg));
@ -501,18 +486,8 @@ dt_status(dtrace_hdl_t *dtp, processorid_t cpu)
{ {
const dtrace_vector_t *v = dtp->dt_vector; const dtrace_vector_t *v = dtp->dt_vector;
if (v == NULL) { if (v == NULL)
#if defined(sun)
return (p_online(cpu, P_STATUS)); return (p_online(cpu, P_STATUS));
#else
int maxid = 0;
size_t len = sizeof(maxid);
if (sysctlbyname("kern.smp.maxid", &maxid, &len, NULL, 0) != 0)
return (cpu == 0 ? 1 : -1);
else
return (cpu <= maxid ? 1 : -1);
#endif
}
return (v->dtv_status(dtp->dt_varg, cpu)); return (v->dtv_status(dtp->dt_varg, cpu));
} }
@ -579,16 +554,6 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
va_list ap; va_list ap;
int n; int n;
#if !defined(sun)
/*
* On FreeBSD, check if output is currently being re-directed
* to another file. If so, output to that file instead of the
* one the caller has specified.
*/
if (dtp->dt_freopen_fp != NULL)
fp = dtp->dt_freopen_fp;
#endif
va_start(ap, format); va_start(ap, format);
if (dtp->dt_sprintf_buflen != 0) { if (dtp->dt_sprintf_buflen != 0) {
@ -679,7 +644,6 @@ dt_printf(dtrace_hdl_t *dtp, FILE *fp, const char *format, ...)
} }
n = vfprintf(fp, format, ap); n = vfprintf(fp, format, ap);
fflush(fp);
va_end(ap); va_end(ap);
if (n < 0) { if (n < 0) {
@ -729,11 +693,6 @@ dt_zalloc(dtrace_hdl_t *dtp, size_t size)
{ {
void *data; void *data;
if (size > 16 * 1024 * 1024) {
(void) dt_set_errno(dtp, EDT_NOMEM);
return (NULL);
}
if ((data = malloc(size)) == NULL) if ((data = malloc(size)) == NULL)
(void) dt_set_errno(dtp, EDT_NOMEM); (void) dt_set_errno(dtp, EDT_NOMEM);
else else
@ -747,11 +706,6 @@ dt_alloc(dtrace_hdl_t *dtp, size_t size)
{ {
void *data; void *data;
if (size > 16 * 1024 * 1024) {
(void) dt_set_errno(dtp, EDT_NOMEM);
return (NULL);
}
if ((data = malloc(size)) == NULL) if ((data = malloc(size)) == NULL)
(void) dt_set_errno(dtp, EDT_NOMEM); (void) dt_set_errno(dtp, EDT_NOMEM);
@ -849,7 +803,6 @@ dt_popcb(const ulong_t *bp, ulong_t n)
return (popc + dt_popc(bp[maxw] & ((1UL << maxb) - 1))); return (popc + dt_popc(bp[maxw] & ((1UL << maxb) - 1)));
} }
#if defined(sun)
struct _rwlock; struct _rwlock;
struct _lwp_mutex; struct _lwp_mutex;
@ -866,17 +819,12 @@ dt_rw_write_held(pthread_rwlock_t *lock)
extern int _rw_write_held(struct _rwlock *); extern int _rw_write_held(struct _rwlock *);
return (_rw_write_held((struct _rwlock *)lock)); return (_rw_write_held((struct _rwlock *)lock));
} }
#endif
int int
dt_mutex_held(pthread_mutex_t *lock) dt_mutex_held(pthread_mutex_t *lock)
{ {
#if defined(sun)
extern int _mutex_held(struct _lwp_mutex *); extern int _mutex_held(struct _lwp_mutex *);
return (_mutex_held((struct _lwp_mutex *)lock)); return (_mutex_held((struct _lwp_mutex *)lock));
#else
return (1);
#endif
} }
static int static int
@ -963,13 +911,8 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid,
dt_proc_lock(dtp, P); dt_proc_lock(dtp, P);
#if defined(sun)
if (Plookup_by_addr(P, addr, name, sizeof (name), &sym) == 0) { if (Plookup_by_addr(P, addr, name, sizeof (name), &sym) == 0) {
(void) Pobjname(P, addr, objname, sizeof (objname)); (void) Pobjname(P, addr, objname, sizeof (objname));
#else
if (proc_addr2sym(P, addr, name, sizeof (name), &sym) == 0) {
(void) proc_objname(P, addr, objname, sizeof (objname));
#endif
obj = dt_basename(objname); obj = dt_basename(objname);
@ -979,11 +922,7 @@ dtrace_uaddr2str(dtrace_hdl_t *dtp, pid_t pid,
} else { } else {
(void) snprintf(c, sizeof (c), "%s`%s", obj, name); (void) snprintf(c, sizeof (c), "%s`%s", obj, name);
} }
#if defined(sun) } else if (Pobjname(P, addr, objname, sizeof (objname)) != NULL) {
} else if (Pobjname(P, addr, objname, sizeof (objname)) != 0) {
#else
} else if (proc_objname(P, addr, objname, sizeof (objname)) != 0) {
#endif
(void) snprintf(c, sizeof (c), "%s`0x%llx", (void) snprintf(c, sizeof (c), "%s`0x%llx",
dt_basename(objname), addr); dt_basename(objname), addr);
} else { } else {

View File

@ -82,7 +82,6 @@ dtrace_sleep(dtrace_hdl_t *dtp)
return; /* sleep duration has already past */ return; /* sleep duration has already past */
} }
#if defined(sun)
tv.tv_sec = (earliest - now) / NANOSEC; tv.tv_sec = (earliest - now) / NANOSEC;
tv.tv_nsec = (earliest - now) % NANOSEC; tv.tv_nsec = (earliest - now) % NANOSEC;
@ -92,23 +91,6 @@ dtrace_sleep(dtrace_hdl_t *dtp)
* awaken, iterate over any pending notifications and process them. * awaken, iterate over any pending notifications and process them.
*/ */
(void) pthread_cond_reltimedwait_np(&dph->dph_cv, &dph->dph_lock, &tv); (void) pthread_cond_reltimedwait_np(&dph->dph_cv, &dph->dph_lock, &tv);
#else
earliest -= now;
clock_gettime(CLOCK_REALTIME,&tv);
tv.tv_sec += earliest / NANOSEC;
tv.tv_nsec += earliest % NANOSEC;
while (tv.tv_nsec > NANOSEC) {
tv.tv_sec += 1;
tv.tv_nsec -= NANOSEC;
}
/*
* Wait for either 'tv' nanoseconds to pass or to receive notification
* that a process is in an interesting state. Regardless of why we
* awaken, iterate over any pending notifications and process them.
*/
(void) pthread_cond_timedwait(&dph->dph_cv, &dph->dph_lock, &tv);
#endif
while ((dprn = dph->dph_notify) != NULL) { while ((dprn = dph->dph_notify) != NULL) {
if (dtp->dt_prochdlr != NULL) { if (dtp->dt_prochdlr != NULL) {
@ -182,7 +164,6 @@ dtrace_status(dtrace_hdl_t *dtp)
int int
dtrace_go(dtrace_hdl_t *dtp) dtrace_go(dtrace_hdl_t *dtp)
{ {
dtrace_enable_io_t args;
void *dof; void *dof;
int err; int err;
@ -204,9 +185,7 @@ dtrace_go(dtrace_hdl_t *dtp)
if ((dof = dtrace_getopt_dof(dtp)) == NULL) if ((dof = dtrace_getopt_dof(dtp)) == NULL)
return (-1); /* dt_errno has been set for us */ return (-1); /* dt_errno has been set for us */
args.dof = dof; err = dt_ioctl(dtp, DTRACEIOC_ENABLE, dof);
args.n_matched = 0;
err = dt_ioctl(dtp, DTRACEIOC_ENABLE, &args);
dtrace_dof_destroy(dtp, dof); dtrace_dof_destroy(dtp, dof);
if (err == -1 && (errno != ENOTTY || dtp->dt_vector == NULL)) if (err == -1 && (errno != ENOTTY || dtp->dt_vector == NULL))

View File

@ -148,7 +148,7 @@ typedef struct dtrace_stmtdesc {
dtrace_actdesc_t *dtsd_action_last; /* last action in action list */ dtrace_actdesc_t *dtsd_action_last; /* last action in action list */
void *dtsd_aggdata; /* aggregation data */ void *dtsd_aggdata; /* aggregation data */
void *dtsd_fmtdata; /* type-specific output data */ void *dtsd_fmtdata; /* type-specific output data */
void (*dtsd_callback)(void); /* callback function for EPID */ void (*dtsd_callback)(); /* callback function for EPID */
void *dtsd_data; /* callback data pointer */ void *dtsd_data; /* callback data pointer */
dtrace_attribute_t dtsd_descattr; /* probedesc attributes */ dtrace_attribute_t dtsd_descattr; /* probedesc attributes */
dtrace_attribute_t dtsd_stmtattr; /* statement attributes */ dtrace_attribute_t dtsd_stmtattr; /* statement attributes */
@ -521,11 +521,7 @@ extern int dtrace_probe_info(dtrace_hdl_t *,
* entry point to obtain a library handle. * entry point to obtain a library handle.
*/ */
struct dtrace_vector { struct dtrace_vector {
#if defined(sun)
int (*dtv_ioctl)(void *, int, void *); int (*dtv_ioctl)(void *, int, void *);
#else
int (*dtv_ioctl)(void *, u_long, void *);
#endif
int (*dtv_lookup_by_addr)(void *, GElf_Addr, GElf_Sym *, int (*dtv_lookup_by_addr)(void *, GElf_Addr, GElf_Sym *,
dtrace_syminfo_t *); dtrace_syminfo_t *);
int (*dtv_status)(void *, processorid_t); int (*dtv_status)(void *, processorid_t);
@ -572,9 +568,4 @@ extern int _dtrace_debug;
} }
#endif #endif
#if !defined(sun)
#define _SC_CPUID_MAX _SC_NPROCESSORS_CONF
#define _SC_NPROCESSORS_MAX _SC_NPROCESSORS_CONF
#endif
#endif /* _DTRACE_H */ #endif /* _DTRACE_H */

View File

@ -26,9 +26,7 @@
# #
#ident "%Z%%M% %I% %E% SMI" #ident "%Z%%M% %I% %E% SMI"
BSDECHO=-e echo "\
echo ${BSDECHO} "\
/*\n\ /*\n\
* Copyright 2003 Sun Microsystems, Inc. All rights reserved.\n\ * Copyright 2003 Sun Microsystems, Inc. All rights reserved.\n\
* Use is subject to license terms.\n\ * Use is subject to license terms.\n\
@ -45,7 +43,7 @@ replace=' "\1",'
sed -n "s/$pattern/$replace/p" || exit 1 sed -n "s/$pattern/$replace/p" || exit 1
echo ${BSDECHO} "\ echo "\
};\n\ };\n\
\n\ \n\
static const int _dt_ntag = sizeof (_dt_errtags) / sizeof (_dt_errtags[0]);\n\ static const int _dt_ntag = sizeof (_dt_errtags) / sizeof (_dt_errtags[0]);\n\

View File

@ -26,9 +26,7 @@
# #
#ident "%Z%%M% %I% %E% SMI" #ident "%Z%%M% %I% %E% SMI"
BSDECHO=-e echo "\
echo ${BSDECHO} "\
/*\n\ /*\n\
* Copyright 2005 Sun Microsystems, Inc. All rights reserved.\n\ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.\n\
* Use is subject to license terms.\n\ * Use is subject to license terms.\n\
@ -49,7 +47,7 @@ nawk '
printf("\tcase %s: return (\"%s\");\n", $2, tolower(substr($2, 10))); printf("\tcase %s: return (\"%s\");\n", $2, tolower(substr($2, 10)));
}' }'
echo ${BSDECHO} "\ echo "\
default: return (\"unknown\");\n\ default: return (\"unknown\");\n\
}\n\ }\n\
}" }"

View File

@ -32,28 +32,15 @@
/*LINTLIBRARY*/ /*LINTLIBRARY*/
#if defined(sun)
#pragma weak gmatch = _gmatch #pragma weak gmatch = _gmatch
#endif
#if defined(sun)
#include "gen_synonyms.h" #include "gen_synonyms.h"
#endif
#include <sys/types.h> #include <sys/types.h>
#include <libgen.h> #include <libgen.h>
#include <stdlib.h> #include <stdlib.h>
#include <limits.h> #include <limits.h>
#if defined(sun)
#include <widec.h> #include <widec.h>
#include "_range.h" #include "_range.h"
#else
/* DOODAD */ static int multibyte = 0;
#define WCHAR_CSMASK 0x30000000
#define valid_range(c1, c2) \
(((c1) & WCHAR_CSMASK) == ((c2) & WCHAR_CSMASK) && \
((c1) > 0xff || !iscntrl((int)c1)) && ((c2) > 0xff || \
!iscntrl((int)c2)))
#endif
#define Popwchar(p, c) \ #define Popwchar(p, c) \
n = mbtowc(&cl, p, MB_LEN_MAX); \ n = mbtowc(&cl, p, MB_LEN_MAX); \

View File

@ -70,7 +70,7 @@ slist_add(list_t **list, void *data, int (*cmp)(void *, void *))
/*ARGSUSED2*/ /*ARGSUSED2*/
static int static int
list_defcmp(void *d1, void *d2, void *private __unused) list_defcmp(void *d1, void *d2, void *private)
{ {
return (d1 != d2); return (d1 != d2);
} }
@ -135,7 +135,7 @@ list_iter(list_t *list, int (*func)(void *, void *), void *private)
/*ARGSUSED*/ /*ARGSUSED*/
static int static int
list_count_cb(void *data __unused, void *private __unused) list_count_cb(void *data, void *private)
{ {
return (1); return (1);
} }

View File

@ -35,7 +35,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <strings.h> #include <strings.h>
#include "memory.h"
static void static void
memory_bailout(void) memory_bailout(void)

View File

@ -52,19 +52,16 @@ typedef struct alist_el {
} alist_el_t; } alist_el_t;
static int static int
alist_hash(int nbuckets, void *arg) alist_hash(int nbuckets, alist_el_t *el)
{ {
alist_el_t *el = arg;
uintptr_t num = (uintptr_t)el->ale_name; uintptr_t num = (uintptr_t)el->ale_name;
return (num % nbuckets); return (num % nbuckets);
} }
static int static int
alist_cmp(void *arg1, void *arg2) alist_cmp(alist_el_t *el1, alist_el_t *el2)
{ {
alist_el_t *el1 = arg1;
alist_el_t *el2 = arg2;
return ((uintptr_t)el1->ale_name != (uintptr_t)el2->ale_name); return ((uintptr_t)el1->ale_name != (uintptr_t)el2->ale_name);
} }
@ -87,14 +84,12 @@ alist_t *
alist_new(void (*namefree)(void *), void (*valfree)(void *)) alist_new(void (*namefree)(void *), void (*valfree)(void *))
{ {
return (alist_xnew(ALIST_HASH_SIZE, namefree, valfree, return (alist_xnew(ALIST_HASH_SIZE, namefree, valfree,
alist_hash, alist_cmp)); (int (*)())alist_hash, (int (*)())alist_cmp));
} }
static void static void
alist_free_cb(void *arg1, void *arg2) alist_free_cb(alist_el_t *el, alist_t *alist)
{ {
alist_el_t *el = arg1;
alist_t *alist = arg2;
if (alist->al_namefree) if (alist->al_namefree)
alist->al_namefree(el->ale_name); alist->al_namefree(el->ale_name);
if (alist->al_valfree) if (alist->al_valfree)
@ -105,7 +100,7 @@ alist_free_cb(void *arg1, void *arg2)
void void
alist_free(alist_t *alist) alist_free(alist_t *alist)
{ {
hash_free(alist->al_elements, alist_free_cb, alist); hash_free(alist->al_elements, (void (*)())alist_free_cb, alist);
free(alist); free(alist);
} }
@ -123,17 +118,14 @@ alist_add(alist_t *alist, void *name, void *value)
int int
alist_find(alist_t *alist, void *name, void **value) alist_find(alist_t *alist, void *name, void **value)
{ {
alist_el_t template, *retx; alist_el_t template, *ret;
void *ret;
template.ale_name = name; template.ale_name = name;
if (!hash_find(alist->al_elements, &template, &ret)) if (!hash_find(alist->al_elements, &template, (void **)&ret))
return (0); return (0);
if (value) { if (value)
retx = ret; *value = ret->ale_value;
*value = retx->ale_value;
}
return (1); return (1);
} }
@ -144,10 +136,8 @@ typedef struct alist_iter_data {
} alist_iter_data_t; } alist_iter_data_t;
static int static int
alist_iter_cb(void *arg1, void *arg2) alist_iter_cb(alist_el_t *el, alist_iter_data_t *aid)
{ {
alist_el_t *el = arg1;
alist_iter_data_t *aid = arg2;
return (aid->aid_func(el->ale_name, el->ale_value, aid->aid_priv)); return (aid->aid_func(el->ale_name, el->ale_value, aid->aid_priv));
} }
@ -159,7 +149,7 @@ alist_iter(alist_t *alist, int (*func)(void *, void *, void *), void *private)
aid.aid_func = func; aid.aid_func = func;
aid.aid_priv = private; aid.aid_priv = private;
return (hash_iter(alist->al_elements, alist_iter_cb, &aid)); return (hash_iter(alist->al_elements, (int (*)())alist_iter_cb, &aid));
} }
/* /*
@ -181,13 +171,13 @@ alist_def_print_cb(void *key, void *value)
{ {
printf("Key: "); printf("Key: ");
if (alist_def_print_cb_key_int == 1) if (alist_def_print_cb_key_int == 1)
printf("%5lu ", (ulong_t)key); printf("%5d ", (int)key);
else else
printf("%s\n", (char *)key); printf("%s\n", (char *)key);
printf("Value: "); printf("Value: ");
if (alist_def_print_cb_value_int == 1) if (alist_def_print_cb_value_int == 1)
printf("%5lu\n", (ulong_t)value); printf("%5d\n", (int)value);
else else
printf("%s\n", (char *)key); printf("%s\n", (char *)key);
@ -197,7 +187,7 @@ alist_def_print_cb(void *key, void *value)
static int static int
alist_dump_cb(void *node, void *private) alist_dump_cb(void *node, void *private)
{ {
int (*printer)(void *, void *) = private; int (*printer)(void *, void *) = (int (*)())private;
alist_el_t *el = node; alist_el_t *el = node;
printer(el->ale_name, el->ale_value); printer(el->ale_name, el->ale_value);

View File

@ -48,7 +48,6 @@ void alist_add(alist_t *, void *, void *);
int alist_find(alist_t *, void *, void **); int alist_find(alist_t *, void *, void **);
int alist_iter(alist_t *, int (*)(void *, void *, void *), void *); int alist_iter(alist_t *, int (*)(void *, void *, void *), void *);
void alist_stats(alist_t *, int); void alist_stats(alist_t *, int);
int alist_dump(alist_t *, int (*)(void *, void *));
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -38,9 +38,7 @@
*/ */
#include <pthread.h> #include <pthread.h>
#if defined(sun)
#include <synch.h> #include <synch.h>
#endif
#include <stdio.h> #include <stdio.h>
#include "barrier.h" #include "barrier.h"
@ -49,11 +47,7 @@ void
barrier_init(barrier_t *bar, int nthreads) barrier_init(barrier_t *bar, int nthreads)
{ {
pthread_mutex_init(&bar->bar_lock, NULL); pthread_mutex_init(&bar->bar_lock, NULL);
#if defined(sun)
sema_init(&bar->bar_sem, 0, USYNC_THREAD, NULL); sema_init(&bar->bar_sem, 0, USYNC_THREAD, NULL);
#else
sem_init(&bar->bar_sem, 0, 0);
#endif
bar->bar_numin = 0; bar->bar_numin = 0;
bar->bar_nthr = nthreads; bar->bar_nthr = nthreads;
@ -66,11 +60,7 @@ barrier_wait(barrier_t *bar)
if (++bar->bar_numin < bar->bar_nthr) { if (++bar->bar_numin < bar->bar_nthr) {
pthread_mutex_unlock(&bar->bar_lock); pthread_mutex_unlock(&bar->bar_lock);
#if defined(sun)
sema_wait(&bar->bar_sem); sema_wait(&bar->bar_sem);
#else
sem_wait(&bar->bar_sem);
#endif
return (0); return (0);
@ -80,11 +70,7 @@ barrier_wait(barrier_t *bar)
/* reset for next use */ /* reset for next use */
bar->bar_numin = 0; bar->bar_numin = 0;
for (i = 1; i < bar->bar_nthr; i++) for (i = 1; i < bar->bar_nthr; i++)
#if defined(sun)
sema_post(&bar->bar_sem); sema_post(&bar->bar_sem);
#else
sem_post(&bar->bar_sem);
#endif
pthread_mutex_unlock(&bar->bar_lock); pthread_mutex_unlock(&bar->bar_lock);
return (1); return (1);

View File

@ -33,12 +33,7 @@
* APIs for the barrier synchronization primitive. * APIs for the barrier synchronization primitive.
*/ */
#if defined(sun)
#include <synch.h> #include <synch.h>
#else
#include <semaphore.h>
typedef sem_t sema_t;
#endif
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {

View File

@ -66,7 +66,7 @@ struct ctf_buf {
/*PRINTFLIKE1*/ /*PRINTFLIKE1*/
static void static void
parseterminate(const char *fmt, ...) parseterminate(char *fmt, ...)
{ {
static char msgbuf[1024]; /* sigh */ static char msgbuf[1024]; /* sigh */
va_list ap; va_list ap;
@ -78,7 +78,7 @@ parseterminate(const char *fmt, ...)
terminate("%s: %s\n", curfile, msgbuf); terminate("%s: %s\n", curfile, msgbuf);
} }
static void void
ctf_buf_grow(ctf_buf_t *b) ctf_buf_grow(ctf_buf_t *b)
{ {
off_t ptroff = b->ctb_ptr - b->ctb_base; off_t ptroff = b->ctb_ptr - b->ctb_base;
@ -89,7 +89,7 @@ ctf_buf_grow(ctf_buf_t *b)
b->ctb_ptr = b->ctb_base + ptroff; b->ctb_ptr = b->ctb_base + ptroff;
} }
static ctf_buf_t * ctf_buf_t *
ctf_buf_new(void) ctf_buf_new(void)
{ {
ctf_buf_t *b = xcalloc(sizeof (ctf_buf_t)); ctf_buf_t *b = xcalloc(sizeof (ctf_buf_t));
@ -100,7 +100,7 @@ ctf_buf_new(void)
return (b); return (b);
} }
static void void
ctf_buf_free(ctf_buf_t *b) ctf_buf_free(ctf_buf_t *b)
{ {
strtab_destroy(&b->ctb_strtab); strtab_destroy(&b->ctb_strtab);
@ -108,14 +108,14 @@ ctf_buf_free(ctf_buf_t *b)
free(b); free(b);
} }
static uint_t uint_t
ctf_buf_cur(ctf_buf_t *b) ctf_buf_cur(ctf_buf_t *b)
{ {
return (b->ctb_ptr - b->ctb_base); return (b->ctb_ptr - b->ctb_base);
} }
static void void
ctf_buf_write(ctf_buf_t *b, void const *p, size_t n) ctf_buf_write(ctf_buf_t *b, const void *p, size_t n)
{ {
size_t len; size_t len;
@ -127,16 +127,14 @@ ctf_buf_write(ctf_buf_t *b, void const *p, size_t n)
bcopy(p, b->ctb_ptr, len); bcopy(p, b->ctb_ptr, len);
b->ctb_ptr += len; b->ctb_ptr += len;
p = (char const *)p + len; p = (char *)p + len;
n -= len; n -= len;
} }
} }
static int static int
write_label(void *arg1, void *arg2) write_label(labelent_t *le, ctf_buf_t *b)
{ {
labelent_t *le = arg1;
ctf_buf_t *b = arg2;
ctf_lblent_t ctl; ctf_lblent_t ctl;
ctl.ctl_label = strtab_insert(&b->ctb_strtab, le->le_name); ctl.ctl_label = strtab_insert(&b->ctb_strtab, le->le_name);
@ -222,10 +220,8 @@ write_unsized_type_rec(ctf_buf_t *b, ctf_type_t *ctt)
} }
static int static int
write_type(void *arg1, void *arg2) write_type(tdesc_t *tp, ctf_buf_t *b)
{ {
tdesc_t *tp = arg1;
ctf_buf_t *b = arg2;
elist_t *ep; elist_t *ep;
mlist_t *mp; mlist_t *mp;
intr_t *ip; intr_t *ip;
@ -396,7 +392,7 @@ write_type(void *arg1, void *arg2)
ctt.ctt_type = tp->t_fndef->fn_ret->t_id; ctt.ctt_type = tp->t_fndef->fn_ret->t_id;
write_unsized_type_rec(b, &ctt); write_unsized_type_rec(b, &ctt);
for (i = 0; i < (int) tp->t_fndef->fn_nargs; i++) { for (i = 0; i < tp->t_fndef->fn_nargs; i++) {
id = tp->t_fndef->fn_args[i]->t_id; id = tp->t_fndef->fn_args[i]->t_id;
ctf_buf_write(b, &id, sizeof (id)); ctf_buf_write(b, &id, sizeof (id));
} }
@ -461,14 +457,14 @@ compress_start(resbuf_t *rb)
} }
static ssize_t static ssize_t
compress_buffer(void *buf, size_t n, void *data) compress_buffer(const void *buf, size_t n, void *data)
{ {
resbuf_t *rb = (resbuf_t *)data; resbuf_t *rb = (resbuf_t *)data;
int rc; int rc;
rb->rb_zstr.next_out = (Bytef *)rb->rb_ptr; rb->rb_zstr.next_out = (Bytef *)rb->rb_ptr;
rb->rb_zstr.avail_out = rb->rb_size - (rb->rb_ptr - rb->rb_base); rb->rb_zstr.avail_out = rb->rb_size - (rb->rb_ptr - rb->rb_base);
rb->rb_zstr.next_in = buf; rb->rb_zstr.next_in = (Bytef *)buf;
rb->rb_zstr.avail_in = n; rb->rb_zstr.avail_in = n;
while (rb->rb_zstr.avail_in) { while (rb->rb_zstr.avail_in) {
@ -530,7 +526,7 @@ pad_buffer(ctf_buf_t *buf, int align)
} }
static ssize_t static ssize_t
bcopy_data(void *buf, size_t n, void *data) bcopy_data(const void *buf, size_t n, void *data)
{ {
caddr_t *posp = (caddr_t *)data; caddr_t *posp = (caddr_t *)data;
bcopy(buf, *posp, n); bcopy(buf, *posp, n);
@ -605,7 +601,7 @@ ctf_gen(iiburst_t *iiburst, size_t *resszp, int do_compress)
iiburst->iib_td->td_parname); iiburst->iib_td->td_parname);
h.cth_lbloff = 0; h.cth_lbloff = 0;
(void) list_iter(iiburst->iib_td->td_labels, write_label, (void) list_iter(iiburst->iib_td->td_labels, (int (*)())write_label,
buf); buf);
pad_buffer(buf, 2); pad_buffer(buf, 2);
@ -620,7 +616,7 @@ ctf_gen(iiburst_t *iiburst, size_t *resszp, int do_compress)
pad_buffer(buf, 4); pad_buffer(buf, 4);
h.cth_typeoff = ctf_buf_cur(buf); h.cth_typeoff = ctf_buf_cur(buf);
(void) list_iter(iiburst->iib_types, write_type, buf); (void) list_iter(iiburst->iib_types, (int (*)())write_type, buf);
debug(2, "CTF wrote %d types\n", list_count(iiburst->iib_types)); debug(2, "CTF wrote %d types\n", list_count(iiburst->iib_types));
@ -641,7 +637,7 @@ ctf_gen(iiburst_t *iiburst, size_t *resszp, int do_compress)
return (outbuf); return (outbuf);
} }
static void void
get_ctt_size(ctf_type_t *ctt, size_t *sizep, size_t *incrementp) get_ctt_size(ctf_type_t *ctt, size_t *sizep, size_t *incrementp)
{ {
if (ctt->ctt_size == CTF_LSIZE_SENT) { if (ctt->ctt_size == CTF_LSIZE_SENT) {
@ -661,8 +657,8 @@ count_types(ctf_header_t *h, caddr_t data)
dptr = data + h->cth_typeoff; dptr = data + h->cth_typeoff;
while (dptr < data + h->cth_stroff) { while (dptr < data + h->cth_stroff) {
void *v = (void *) dptr; /* LINTED - pointer alignment */
ctf_type_t *ctt = v; ctf_type_t *ctt = (ctf_type_t *)dptr;
size_t vlen = CTF_INFO_VLEN(ctt->ctt_info); size_t vlen = CTF_INFO_VLEN(ctt->ctt_info);
size_t size, increment; size_t size, increment;
@ -731,11 +727,11 @@ resurrect_labels(ctf_header_t *h, tdata_t *td, caddr_t ctfdata, char *matchlbl)
caddr_t sbuf = ctfdata + h->cth_stroff; caddr_t sbuf = ctfdata + h->cth_stroff;
size_t bufsz = h->cth_objtoff - h->cth_lbloff; size_t bufsz = h->cth_objtoff - h->cth_lbloff;
int lastidx = 0, baseidx = -1; int lastidx = 0, baseidx = -1;
char *baselabel = NULL; char *baselabel;
ctf_lblent_t *ctl; ctf_lblent_t *ctl;
void *v = (void *) buf;
for (ctl = v; (caddr_t)ctl < buf + bufsz; ctl++) { /* LINTED - pointer alignment */
for (ctl = (ctf_lblent_t *)buf; (caddr_t)ctl < buf + bufsz; ctl++) {
char *label = sbuf + ctl->ctl_label; char *label = sbuf + ctl->ctl_label;
lastidx = ctl->ctl_typeidx; lastidx = ctl->ctl_typeidx;
@ -779,8 +775,8 @@ resurrect_objects(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
symit_reset(si); symit_reset(si);
for (dptr = buf; dptr < buf + bufsz; dptr += 2) { for (dptr = buf; dptr < buf + bufsz; dptr += 2) {
void *v = (void *) dptr; /* LINTED - pointer alignment */
ushort_t id = *((ushort_t *)v); ushort_t id = *((ushort_t *)dptr);
iidesc_t *ii; iidesc_t *ii;
GElf_Sym *sym; GElf_Sym *sym;
@ -827,8 +823,8 @@ resurrect_functions(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
symit_reset(si); symit_reset(si);
while (dptr < buf + bufsz) { while (dptr < buf + bufsz) {
void *v = (void *) dptr; /* LINTED - pointer alignment */
info = *((ushort_t *)v); info = *((ushort_t *)dptr);
dptr += 2; dptr += 2;
if (!(sym = symit_next(si, STT_FUNC)) && info != 0) if (!(sym = symit_next(si, STT_FUNC)) && info != 0)
@ -840,8 +836,8 @@ resurrect_functions(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
continue; continue;
} }
v = (void *) dptr; /* LINTED - pointer alignment */
retid = *((ushort_t *)v); retid = *((ushort_t *)dptr);
dptr += 2; dptr += 2;
if (retid >= tdsize) if (retid >= tdsize)
@ -860,8 +856,8 @@ resurrect_functions(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
xmalloc(sizeof (tdesc_t *) * ii->ii_nargs); xmalloc(sizeof (tdesc_t *) * ii->ii_nargs);
for (i = 0; i < ii->ii_nargs; i++, dptr += 2) { for (i = 0; i < ii->ii_nargs; i++, dptr += 2) {
v = (void *) dptr; /* LINTED - pointer alignment */
ushort_t id = *((ushort_t *)v); ushort_t id = *((ushort_t *)dptr);
if (id >= tdsize) if (id >= tdsize)
parseterminate("Reference to invalid type %d", parseterminate("Reference to invalid type %d",
id); id);
@ -921,8 +917,8 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
if (tid >= tdsize) if (tid >= tdsize)
parseterminate("Reference to invalid type %d", tid); parseterminate("Reference to invalid type %d", tid);
void *v = (void *) dptr; /* LINTED - pointer alignment */
ctt = v; ctt = (ctf_type_t *)dptr;
get_ctt_size(ctt, &size, &increment); get_ctt_size(ctt, &size, &increment);
dptr += increment; dptr += increment;
@ -946,8 +942,8 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
tdp->t_type = INTRINSIC; tdp->t_type = INTRINSIC;
tdp->t_size = size; tdp->t_size = size;
v = (void *) dptr; /* LINTED - pointer alignment */
data = *((uint_t *)v); data = *((uint_t *)dptr);
dptr += sizeof (uint_t); dptr += sizeof (uint_t);
encoding = CTF_INT_ENCODING(data); encoding = CTF_INT_ENCODING(data);
@ -973,8 +969,8 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
tdp->t_type = INTRINSIC; tdp->t_type = INTRINSIC;
tdp->t_size = size; tdp->t_size = size;
v = (void *) dptr; /* LINTED - pointer alignment */
data = *((uint_t *)v); data = *((uint_t *)dptr);
dptr += sizeof (uint_t); dptr += sizeof (uint_t);
ip = xcalloc(sizeof (intr_t)); ip = xcalloc(sizeof (intr_t));
@ -994,8 +990,8 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
tdp->t_type = ARRAY; tdp->t_type = ARRAY;
tdp->t_size = size; tdp->t_size = size;
v = (void *) dptr; /* LINTED - pointer alignment */
cta = v; cta = (ctf_array_t *)dptr;
dptr += sizeof (ctf_array_t); dptr += sizeof (ctf_array_t);
tdp->t_ardef = xmalloc(sizeof (ardef_t)); tdp->t_ardef = xmalloc(sizeof (ardef_t));
@ -1012,8 +1008,9 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
if (size < CTF_LSTRUCT_THRESH) { if (size < CTF_LSTRUCT_THRESH) {
for (i = 0, mpp = &tdp->t_members; i < vlen; for (i = 0, mpp = &tdp->t_members; i < vlen;
i++, mpp = &((*mpp)->ml_next)) { i++, mpp = &((*mpp)->ml_next)) {
v = (void *) dptr; /* LINTED - pointer alignment */
ctf_member_t *ctm = v; ctf_member_t *ctm = (ctf_member_t *)
dptr;
dptr += sizeof (ctf_member_t); dptr += sizeof (ctf_member_t);
*mpp = xmalloc(sizeof (mlist_t)); *mpp = xmalloc(sizeof (mlist_t));
@ -1026,8 +1023,9 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
} else { } else {
for (i = 0, mpp = &tdp->t_members; i < vlen; for (i = 0, mpp = &tdp->t_members; i < vlen;
i++, mpp = &((*mpp)->ml_next)) { i++, mpp = &((*mpp)->ml_next)) {
v = (void *) dptr; /* LINTED - pointer alignment */
ctf_lmember_t *ctlm = v; ctf_lmember_t *ctlm = (ctf_lmember_t *)
dptr;
dptr += sizeof (ctf_lmember_t); dptr += sizeof (ctf_lmember_t);
*mpp = xmalloc(sizeof (mlist_t)); *mpp = xmalloc(sizeof (mlist_t));
@ -1050,8 +1048,8 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
for (i = 0, epp = &tdp->t_emem; i < vlen; for (i = 0, epp = &tdp->t_emem; i < vlen;
i++, epp = &((*epp)->el_next)) { i++, epp = &((*epp)->el_next)) {
v = (void *) dptr; /* LINTED - pointer alignment */
cte = v; cte = (ctf_enum_t *)dptr;
dptr += sizeof (ctf_enum_t); dptr += sizeof (ctf_enum_t);
*epp = xmalloc(sizeof (elist_t)); *epp = xmalloc(sizeof (elist_t));
@ -1086,8 +1084,9 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
tdp->t_fndef = xcalloc(sizeof (fndef_t)); tdp->t_fndef = xcalloc(sizeof (fndef_t));
tdp->t_fndef->fn_ret = tdarr[ctt->ctt_type]; tdp->t_fndef->fn_ret = tdarr[ctt->ctt_type];
v = (void *) (dptr + (sizeof (ushort_t) * (vlen - 1))); /* LINTED - pointer alignment */
if (vlen > 0 && *(ushort_t *)v == 0) if (vlen > 0 && *(ushort_t *)(dptr +
(sizeof (ushort_t) * (vlen - 1))) == 0)
tdp->t_fndef->fn_vargs = 1; tdp->t_fndef->fn_vargs = 1;
tdp->t_fndef->fn_nargs = vlen - tdp->t_fndef->fn_vargs; tdp->t_fndef->fn_nargs = vlen - tdp->t_fndef->fn_vargs;
@ -1095,8 +1094,8 @@ resurrect_types(ctf_header_t *h, tdata_t *td, tdesc_t **tdarr, int tdsize,
vlen - tdp->t_fndef->fn_vargs); vlen - tdp->t_fndef->fn_vargs);
for (i = 0; i < vlen; i++) { for (i = 0; i < vlen; i++) {
v = (void *) dptr; /* LINTED - pointer alignment */
argid = *(ushort_t *)v; argid = *(ushort_t *)dptr;
dptr += sizeof (ushort_t); dptr += sizeof (ushort_t);
if (argid != 0) if (argid != 0)
@ -1197,7 +1196,7 @@ decompress_ctf(caddr_t cbuf, size_t cbufsz, caddr_t dbuf, size_t dbufsz)
(rc = inflate(&zstr, Z_NO_FLUSH)) != Z_STREAM_END || (rc = inflate(&zstr, Z_NO_FLUSH)) != Z_STREAM_END ||
(rc = inflateEnd(&zstr)) != Z_OK) { (rc = inflateEnd(&zstr)) != Z_OK) {
warning("CTF decompress zlib error %s\n", zError(rc)); warning("CTF decompress zlib error %s\n", zError(rc));
return (0); return (NULL);
} }
debug(3, "reflated %lu bytes to %lu, pointer at %d\n", debug(3, "reflated %lu bytes to %lu, pointer at %d\n",
@ -1226,8 +1225,8 @@ ctf_load(char *file, caddr_t buf, size_t bufsz, symit_data_t *si, char *label)
if (bufsz < sizeof (ctf_header_t)) if (bufsz < sizeof (ctf_header_t))
parseterminate("Corrupt CTF - short header"); parseterminate("Corrupt CTF - short header");
void *v = (void *) buf; /* LINTED - pointer alignment */
h = v; h = (ctf_header_t *)buf;
buf += sizeof (ctf_header_t); buf += sizeof (ctf_header_t);
bufsz -= sizeof (ctf_header_t); bufsz -= sizeof (ctf_header_t);

View File

@ -46,7 +46,7 @@
const char *progname; const char *progname;
int debug_level = DEBUG_LEVEL; int debug_level = DEBUG_LEVEL;
static char *infile = NULL; static const char *infile = NULL;
static const char *outfile = NULL; static const char *outfile = NULL;
static int dynsym; static int dynsym;
@ -64,12 +64,10 @@ usage(void)
static void static void
terminate_cleanup(void) terminate_cleanup(void)
{ {
#if !defined(__FreeBSD__)
if (!outfile) { if (!outfile) {
fprintf(stderr, "Removing %s\n", infile); fprintf(stderr, "Removing %s\n", infile);
unlink(infile); unlink(infile);
} }
#endif
} }
static void static void
@ -79,10 +77,10 @@ handle_sig(int sig)
} }
static int static int
file_read(tdata_t *td, char *filename, int ignore_non_c) file_read(tdata_t *td, const char *filename, int ignore_non_c)
{ {
typedef int (*reader_f)(tdata_t *, Elf *, char *); typedef int (*reader_f)(tdata_t *, Elf *, const char *);
static reader_f readers[] = { static const reader_f readers[] = {
stabs_read, stabs_read,
dw_read, dw_read,
NULL NULL
@ -149,17 +147,15 @@ int
main(int argc, char **argv) main(int argc, char **argv)
{ {
tdata_t *filetd, *mstrtd; tdata_t *filetd, *mstrtd;
const char *label = NULL; char *label = NULL;
int verbose = 0; int verbose = 0;
int ignore_non_c = 0; int ignore_non_c = 0;
int keep_stabs = 0; int keep_stabs = 0;
int c; int c;
#if defined(sun)
sighold(SIGINT); sighold(SIGINT);
sighold(SIGQUIT); sighold(SIGQUIT);
sighold(SIGTERM); sighold(SIGTERM);
#endif
progname = basename(argv[0]); progname = basename(argv[0]);
@ -221,15 +217,9 @@ main(int argc, char **argv)
*/ */
set_terminate_cleanup(terminate_cleanup); set_terminate_cleanup(terminate_cleanup);
#if defined(sun)
sigset(SIGINT, handle_sig); sigset(SIGINT, handle_sig);
sigset(SIGQUIT, handle_sig); sigset(SIGQUIT, handle_sig);
sigset(SIGTERM, handle_sig); sigset(SIGTERM, handle_sig);
#else
signal(SIGINT, handle_sig);
signal(SIGQUIT, handle_sig);
signal(SIGTERM, handle_sig);
#endif
filetd = tdata_new(); filetd = tdata_new();
@ -253,6 +243,7 @@ main(int argc, char **argv)
write_ctf(mstrtd, infile, outfile, dynsym | keep_stabs); write_ctf(mstrtd, infile, outfile, dynsym | keep_stabs);
} else { } else {
char *tmpname = mktmpname(infile, ".ctf"); char *tmpname = mktmpname(infile, ".ctf");
write_ctf(mstrtd, infile, tmpname, dynsym | keep_stabs); write_ctf(mstrtd, infile, tmpname, dynsym | keep_stabs);
if (rename(tmpname, infile) != 0) if (rename(tmpname, infile) != 0)
terminate("Couldn't rename temp file %s", tmpname); terminate("Couldn't rename temp file %s", tmpname);

View File

@ -176,22 +176,16 @@
#include <unistd.h> #include <unistd.h>
#include <pthread.h> #include <pthread.h>
#include <assert.h> #include <assert.h>
#if defined(sun)
#include <synch.h> #include <synch.h>
#endif
#include <signal.h> #include <signal.h>
#include <libgen.h> #include <libgen.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#if defined(sun)
#include <alloca.h> #include <alloca.h>
#endif
#include <sys/param.h> #include <sys/param.h>
#include <sys/types.h> #include <sys/types.h>
#include <sys/mman.h> #include <sys/mman.h>
#if defined(sun)
#include <sys/sysconf.h> #include <sys/sysconf.h>
#endif
#include "ctf_headers.h" #include "ctf_headers.h"
#include "ctftools.h" #include "ctftools.h"
@ -232,7 +226,6 @@ usage(void)
progname, progname); progname, progname);
} }
#if defined(sun)
static void static void
bigheap(void) bigheap(void)
{ {
@ -280,7 +273,6 @@ bigheap(void)
(void) memcntl(NULL, 0, MC_HAT_ADVISE, (caddr_t)&mha, 0, 0); (void) memcntl(NULL, 0, MC_HAT_ADVISE, (caddr_t)&mha, 0, 0);
} }
#endif
static void static void
finalize_phase_one(workqueue_t *wq) finalize_phase_one(workqueue_t *wq)
@ -603,12 +595,10 @@ terminate_cleanup(void)
if (outfile == NULL) if (outfile == NULL)
return; return;
#if !defined(__FreeBSD__)
if (dounlink) { if (dounlink) {
fprintf(stderr, "Removing %s\n", outfile); fprintf(stderr, "Removing %s\n", outfile);
unlink(outfile); unlink(outfile);
} }
#endif
} }
static void static void
@ -707,15 +697,9 @@ start_threads(workqueue_t *wq)
wq); wq);
} }
#if defined(sun)
sigset(SIGINT, handle_sig); sigset(SIGINT, handle_sig);
sigset(SIGQUIT, handle_sig); sigset(SIGQUIT, handle_sig);
sigset(SIGTERM, handle_sig); sigset(SIGTERM, handle_sig);
#else
signal(SIGINT, handle_sig);
signal(SIGQUIT, handle_sig);
signal(SIGTERM, handle_sig);
#endif
pthread_sigmask(SIG_UNBLOCK, &sets, NULL); pthread_sigmask(SIG_UNBLOCK, &sets, NULL);
} }

View File

@ -91,7 +91,7 @@ extern "C" {
extern const char *progname; extern const char *progname;
extern int debug_level; extern int debug_level;
extern int debug_parse; extern int debug_parse;
extern char *curhdr; extern const char *curhdr;
/* /*
* This is a partial copy of the stab.h that DevPro includes with their * This is a partial copy of the stab.h that DevPro includes with their
@ -354,11 +354,11 @@ tdata_t *ctf_load(char *, caddr_t, size_t, symit_data_t *, char *);
iidesc_t *iidesc_new(char *); iidesc_t *iidesc_new(char *);
int iidesc_hash(int, void *); int iidesc_hash(int, void *);
void iter_iidescs_by_name(tdata_t *, const char *, void iter_iidescs_by_name(tdata_t *, const char *,
int (*)(void *, void *), void *); int (*)(iidesc_t *, void *), void *);
iidesc_t *iidesc_dup(iidesc_t *); iidesc_t *iidesc_dup(iidesc_t *);
iidesc_t *iidesc_dup_rename(iidesc_t *, char const *, char const *); iidesc_t *iidesc_dup_rename(iidesc_t *, char const *, char const *);
void iidesc_add(hash_t *, iidesc_t *); void iidesc_add(hash_t *, iidesc_t *);
void iidesc_free(void *, void *); void iidesc_free(iidesc_t *, void *);
int iidesc_count_type(void *, void *); int iidesc_count_type(void *, void *);
void iidesc_stats(hash_t *); void iidesc_stats(hash_t *);
int iidesc_dump(iidesc_t *); int iidesc_dump(iidesc_t *);
@ -404,10 +404,10 @@ void check_hash(void);
void resolve_typed_bitfields(void); void resolve_typed_bitfields(void);
/* stabs.c */ /* stabs.c */
int stabs_read(tdata_t *, Elf *, char *); int stabs_read(tdata_t *, Elf *, const char *);
/* dwarf.c */ /* dwarf.c */
int dw_read(tdata_t *, Elf *, char *); int dw_read(tdata_t *, Elf *, const char *);
const char *dw_tag2str(uint_t); const char *dw_tag2str(uint_t);
/* tdata.c */ /* tdata.c */
@ -422,7 +422,7 @@ int tdesc_namecmp(void *, void *);
int tdesc_layouthash(int, void *); int tdesc_layouthash(int, void *);
int tdesc_layoutcmp(void *, void *); int tdesc_layoutcmp(void *, void *);
void tdesc_free(tdesc_t *); void tdesc_free(tdesc_t *);
void tdata_label_add(tdata_t *, const char *, int); void tdata_label_add(tdata_t *, char *, int);
labelent_t *tdata_label_top(tdata_t *); labelent_t *tdata_label_top(tdata_t *);
int tdata_label_find(tdata_t *, char *); int tdata_label_find(tdata_t *, char *);
void tdata_label_free(tdata_t *); void tdata_label_free(tdata_t *);
@ -434,17 +434,13 @@ int streq(const char *, const char *);
int findelfsecidx(Elf *, const char *, const char *); int findelfsecidx(Elf *, const char *, const char *);
size_t elf_ptrsz(Elf *); size_t elf_ptrsz(Elf *);
char *mktmpname(const char *, const char *); char *mktmpname(const char *, const char *);
void terminate(const char *, ...); void terminate(char *, ...);
void aborterr(const char *, ...); void aborterr(char *, ...);
void set_terminate_cleanup(void (*)(void)); void set_terminate_cleanup(void (*)());
void elfterminate(const char *, const char *, ...); void elfterminate(const char *, const char *, ...);
void warning(const char *, ...); void warning(char *, ...);
void vadebug(int, const char *, va_list); void vadebug(int, char *, va_list);
void debug(int, const char *, ...); void debug(int, char *, ...);
void watch_dump(int);
void watch_set(void *, int);
#ifdef __cplusplus #ifdef __cplusplus
} }

View File

@ -84,7 +84,6 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h>
#include <strings.h> #include <strings.h>
#include <errno.h> #include <errno.h>
#include <libelf.h> #include <libelf.h>
@ -129,7 +128,7 @@
typedef struct dwarf { typedef struct dwarf {
Dwarf_Debug dw_dw; /* for libdwarf */ Dwarf_Debug dw_dw; /* for libdwarf */
Dwarf_Error dw_err; /* for libdwarf */ Dwarf_Error dw_err; /* for libdwarf */
Dwarf_Off dw_maxoff; /* highest legal offset in this cu */ Dwarf_Unsigned dw_maxoff; /* highest legal offset in this cu */
tdata_t *dw_td; /* root of the tdesc/iidesc tree */ tdata_t *dw_td; /* root of the tdesc/iidesc tree */
hash_t *dw_tidhash; /* hash of tdescs by t_id */ hash_t *dw_tidhash; /* hash of tdescs by t_id */
hash_t *dw_fwdhash; /* hash of fwd decls by name */ hash_t *dw_fwdhash; /* hash of fwd decls by name */
@ -160,12 +159,11 @@ tdesc_add(dwarf_t *dw, tdesc_t *tdp)
static tdesc_t * static tdesc_t *
tdesc_lookup(dwarf_t *dw, int tid) tdesc_lookup(dwarf_t *dw, int tid)
{ {
tdesc_t tmpl; tdesc_t tmpl, *tdp;
void *tdp;
tmpl.t_id = tid; tmpl.t_id = tid;
if (hash_find(dw->dw_tidhash, &tmpl, &tdp)) if (hash_find(dw->dw_tidhash, &tmpl, (void **)&tdp))
return (tdp); return (tdp);
else else
return (NULL); return (NULL);
@ -273,7 +271,7 @@ die_off(dwarf_t *dw, Dwarf_Die die)
return (off); return (off);
terminate("failed to get offset for die: %s\n", terminate("failed to get offset for die: %s\n",
dwarf_errmsg(&dw->dw_err)); dwarf_errmsg(dw->dw_err));
/*NOTREACHED*/ /*NOTREACHED*/
return (0); return (0);
} }
@ -291,7 +289,7 @@ die_sibling(dwarf_t *dw, Dwarf_Die die)
return (NULL); return (NULL);
terminate("die %llu: failed to find type sibling: %s\n", terminate("die %llu: failed to find type sibling: %s\n",
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); die_off(dw, die), dwarf_errmsg(dw->dw_err));
/*NOTREACHED*/ /*NOTREACHED*/
return (NULL); return (NULL);
} }
@ -308,7 +306,7 @@ die_child(dwarf_t *dw, Dwarf_Die die)
return (NULL); return (NULL);
terminate("die %llu: failed to find type child: %s\n", terminate("die %llu: failed to find type child: %s\n",
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); die_off(dw, die), dwarf_errmsg(dw->dw_err));
/*NOTREACHED*/ /*NOTREACHED*/
return (NULL); return (NULL);
} }
@ -322,7 +320,7 @@ die_tag(dwarf_t *dw, Dwarf_Die die)
return (tag); return (tag);
terminate("die %llu: failed to get tag for type: %s\n", terminate("die %llu: failed to get tag for type: %s\n",
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); die_off(dw, die), dwarf_errmsg(dw->dw_err));
/*NOTREACHED*/ /*NOTREACHED*/
return (0); return (0);
} }
@ -345,23 +343,43 @@ die_attr(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, int req)
} }
terminate("die %llu: failed to get attribute for type: %s\n", terminate("die %llu: failed to get attribute for type: %s\n",
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); die_off(dw, die), dwarf_errmsg(dw->dw_err));
/*NOTREACHED*/ /*NOTREACHED*/
return (NULL); return (NULL);
} }
static Dwarf_Half
die_attr_form(dwarf_t *dw, Dwarf_Attribute attr)
{
Dwarf_Half form;
if (dwarf_whatform(attr, &form, &dw->dw_err) == DW_DLV_OK)
return (form);
terminate("failed to get attribute form for type: %s\n",
dwarf_errmsg(dw->dw_err));
/*NOTREACHED*/
return (0);
}
static int static int
die_signed(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Signed *valp, die_signed(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Signed *valp,
int req) int req)
{ {
*valp = 0; Dwarf_Attribute attr;
if (dwarf_attrval_signed(die, name, valp, &dw->dw_err) != DWARF_E_NONE) { Dwarf_Signed val;
if (req)
terminate("die %llu: failed to get signed: %s\n", if ((attr = die_attr(dw, die, name, req)) == NULL)
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); return (0); /* die_attr will terminate for us if necessary */
return (0);
if (dwarf_formsdata(attr, &val, &dw->dw_err) != DW_DLV_OK) {
terminate("die %llu: failed to get signed (form 0x%x)\n",
die_off(dw, die), die_attr_form(dw, attr));
} }
dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
*valp = val;
return (1); return (1);
} }
@ -369,47 +387,59 @@ static int
die_unsigned(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Unsigned *valp, die_unsigned(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Unsigned *valp,
int req) int req)
{ {
*valp = 0; Dwarf_Attribute attr;
if (dwarf_attrval_unsigned(die, name, valp, &dw->dw_err) != DWARF_E_NONE) { Dwarf_Unsigned val;
if (req)
terminate("die %llu: failed to get unsigned: %s\n", if ((attr = die_attr(dw, die, name, req)) == NULL)
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); return (0); /* die_attr will terminate for us if necessary */
return (0);
if (dwarf_formudata(attr, &val, &dw->dw_err) != DW_DLV_OK) {
terminate("die %llu: failed to get unsigned (form 0x%x)\n",
die_off(dw, die), die_attr_form(dw, attr));
} }
dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
*valp = val;
return (1); return (1);
} }
static int static int
die_bool(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Bool *valp, int req) die_bool(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, Dwarf_Bool *valp, int req)
{ {
*valp = 0; Dwarf_Attribute attr;
Dwarf_Bool val;
if (dwarf_attrval_flag(die, name, valp, &dw->dw_err) != DWARF_E_NONE) { if ((attr = die_attr(dw, die, name, req)) == NULL)
if (req) return (0); /* die_attr will terminate for us if necessary */
terminate("die %llu: failed to get flag: %s\n",
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); if (dwarf_formflag(attr, &val, &dw->dw_err) != DW_DLV_OK) {
return (0); terminate("die %llu: failed to get bool (form 0x%x)\n",
die_off(dw, die), die_attr_form(dw, attr));
} }
dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
*valp = val;
return (1); return (1);
} }
static int static int
die_string(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, char **strp, int req) die_string(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, char **strp, int req)
{ {
const char *str = NULL; Dwarf_Attribute attr;
char *str;
if (dwarf_attrval_string(die, name, &str, &dw->dw_err) != DWARF_E_NONE || if ((attr = die_attr(dw, die, name, req)) == NULL)
str == NULL) { return (0); /* die_attr will terminate for us if necessary */
if (req)
terminate("die %llu: failed to get string: %s\n", if (dwarf_formstring(attr, &str, &dw->dw_err) != DW_DLV_OK) {
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); terminate("die %llu: failed to get string (form 0x%x)\n",
else die_off(dw, die), die_attr_form(dw, attr));
*strp = NULL; }
return (0);
} else *strp = xstrdup(str);
*strp = xstrdup(str); dwarf_dealloc(dw->dw_dw, str, DW_DLA_STRING);
return (1); return (1);
} }
@ -417,13 +447,18 @@ die_string(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, char **strp, int req)
static Dwarf_Off static Dwarf_Off
die_attr_ref(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name) die_attr_ref(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name)
{ {
Dwarf_Attribute attr;
Dwarf_Off off; Dwarf_Off off;
if (dwarf_attrval_unsigned(die, name, &off, &dw->dw_err) != DWARF_E_NONE) { attr = die_attr(dw, die, name, DW_ATTR_REQ);
terminate("die %llu: failed to get ref: %s\n",
die_off(dw, die), dwarf_errmsg(&dw->dw_err)); if (dwarf_formref(attr, &off, &dw->dw_err) != DW_DLV_OK) {
terminate("die %llu: failed to get ref (form 0x%x)\n",
die_off(dw, die), die_attr_form(dw, attr));
} }
dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
return (off); return (off);
} }
@ -487,13 +522,21 @@ die_lookup_pass1(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name)
static int static int
die_mem_offset(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name, die_mem_offset(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name,
Dwarf_Unsigned *valp, int req __unused) Dwarf_Unsigned *valp, int req)
{ {
Dwarf_Locdesc *loc = NULL; Dwarf_Attribute attr;
Dwarf_Signed locnum = 0; Dwarf_Locdesc *loc;
Dwarf_Signed locnum;
if (dwarf_locdesc(die, name, &loc, &locnum, &dw->dw_err) != DW_DLV_OK) if ((attr = die_attr(dw, die, name, req)) == NULL)
return (0); return (0); /* die_attr will terminate for us if necessary */
if (dwarf_loclist(attr, &loc, &locnum, &dw->dw_err) != DW_DLV_OK) {
terminate("die %llu: failed to get mem offset location list\n",
die_off(dw, die));
}
dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
if (locnum != 1 || loc->ld_s->lr_atom != DW_OP_plus_uconst) { if (locnum != 1 || loc->ld_s->lr_atom != DW_OP_plus_uconst) {
terminate("die %llu: cannot parse member offset\n", terminate("die %llu: cannot parse member offset\n",
@ -502,10 +545,8 @@ die_mem_offset(dwarf_t *dw, Dwarf_Die die, Dwarf_Half name,
*valp = loc->ld_s->lr_number; *valp = loc->ld_s->lr_number;
if (loc != NULL) dwarf_dealloc(dw->dw_dw, loc->ld_s, DW_DLA_LOC_BLOCK);
if (dwarf_locdesc_free(loc, &dw->dw_err) != DW_DLV_OK) dwarf_dealloc(dw->dw_dw, loc, DW_DLA_LOCDESC);
terminate("die %llu: cannot free location descriptor: %s\n",
die_off(dw, die), dwarf_errmsg(&dw->dw_err));
return (1); return (1);
} }
@ -599,7 +640,7 @@ tdesc_array_create(dwarf_t *dw, Dwarf_Die dim, tdesc_t *arrtdp,
{ {
Dwarf_Unsigned uval; Dwarf_Unsigned uval;
Dwarf_Signed sval; Dwarf_Signed sval;
tdesc_t *ctdp = NULL; tdesc_t *ctdp;
Dwarf_Die dim2; Dwarf_Die dim2;
ardef_t *ar; ardef_t *ar;
@ -662,7 +703,7 @@ die_array_create(dwarf_t *dw, Dwarf_Die arr, Dwarf_Off off, tdesc_t *tdp)
Dwarf_Unsigned uval; Dwarf_Unsigned uval;
Dwarf_Die dim; Dwarf_Die dim;
debug(3, "die %llu <%llx>: creating array\n", off, off); debug(3, "die %llu: creating array\n", off);
if ((dim = die_child(dw, arr)) == NULL || if ((dim = die_child(dw, arr)) == NULL ||
die_tag(dw, dim) != DW_TAG_subrange_type) die_tag(dw, dim) != DW_TAG_subrange_type)
@ -693,13 +734,13 @@ die_array_create(dwarf_t *dw, Dwarf_Die arr, Dwarf_Off off, tdesc_t *tdp)
tdp->t_flags |= flags; tdp->t_flags |= flags;
} }
debug(3, "die %llu <%llx>: array nelems %u size %u\n", off, off, debug(3, "die %llu: array nelems %u size %u\n", off,
tdp->t_ardef->ad_nelems, tdp->t_size); tdp->t_ardef->ad_nelems, tdp->t_size);
} }
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
die_array_resolve(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private) die_array_resolve(tdesc_t *tdp, tdesc_t **tdpp, void *private)
{ {
dwarf_t *dw = private; dwarf_t *dw = private;
size_t sz; size_t sz;
@ -729,7 +770,7 @@ die_array_resolve(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
die_array_failed(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private __unused) die_array_failed(tdesc_t *tdp, tdesc_t **tdpp, void *private)
{ {
tdesc_t *cont = tdp->t_ardef->ad_contents; tdesc_t *cont = tdp->t_ardef->ad_contents;
@ -825,7 +866,7 @@ die_enum_match(void *arg1, void *arg2)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
die_enum_resolve(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private) die_enum_resolve(tdesc_t *tdp, tdesc_t **tdpp, void *private)
{ {
dwarf_t *dw = private; dwarf_t *dw = private;
tdesc_t *full = NULL; tdesc_t *full = NULL;
@ -897,9 +938,8 @@ die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
/* /*
* GCC allows empty SOUs as an extension. * GCC allows empty SOUs as an extension.
*/ */
if ((mem = die_child(dw, str)) == NULL) { if ((mem = die_child(dw, str)) == NULL)
goto out; goto out;
}
mlastp = &tdp->t_members; mlastp = &tdp->t_members;
@ -926,7 +966,7 @@ die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
* bug 11816). * bug 11816).
*/ */
if ((ml->ml_name = die_name(dw, mem)) == NULL) if ((ml->ml_name = die_name(dw, mem)) == NULL)
ml->ml_name = NULL; ml->ml_name = "";
ml->ml_type = die_lookup_pass1(dw, mem, DW_AT_type); ml->ml_type = die_lookup_pass1(dw, mem, DW_AT_type);
@ -943,7 +983,7 @@ die_sou_create(dwarf_t *dw, Dwarf_Die str, Dwarf_Off off, tdesc_t *tdp,
ml->ml_size = tdesc_bitsize(ml->ml_type); ml->ml_size = tdesc_bitsize(ml->ml_type);
if (die_unsigned(dw, mem, DW_AT_bit_offset, &bitoff, 0)) { if (die_unsigned(dw, mem, DW_AT_bit_offset, &bitoff, 0)) {
#if BYTE_ORDER == _BIG_ENDIAN #ifdef _BIG_ENDIAN
ml->ml_offset += bitoff; ml->ml_offset += bitoff;
#else #else
ml->ml_offset += tdesc_bitsize(ml->ml_type) - bitoff - ml->ml_offset += tdesc_bitsize(ml->ml_type) - bitoff -
@ -1017,7 +1057,7 @@ die_union_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
die_sou_resolve(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private) die_sou_resolve(tdesc_t *tdp, tdesc_t **tdpp, void *private)
{ {
dwarf_t *dw = private; dwarf_t *dw = private;
mlist_t *ml; mlist_t *ml;
@ -1076,7 +1116,7 @@ die_sou_resolve(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
die_sou_failed(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private __unused) die_sou_failed(tdesc_t *tdp, tdesc_t **tdpp, void *private)
{ {
const char *typename = (tdp->t_type == STRUCT ? "struct" : "union"); const char *typename = (tdp->t_type == STRUCT ? "struct" : "union");
mlist_t *ml; mlist_t *ml;
@ -1086,11 +1126,10 @@ die_sou_failed(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private __unused)
for (ml = tdp->t_members; ml != NULL; ml = ml->ml_next) { for (ml = tdp->t_members; ml != NULL; ml = ml->ml_next) {
if (ml->ml_size == 0) { if (ml->ml_size == 0) {
fprintf(stderr, "%s %d <%x>: failed to size member \"%s\" " fprintf(stderr, "%s %d: failed to size member \"%s\" "
"of type %s (%d <%x>)\n", typename, tdp->t_id, "of type %s (%d)\n", typename, tdp->t_id,
tdp->t_id,
ml->ml_name, tdesc_name(ml->ml_type), ml->ml_name, tdesc_name(ml->ml_type),
ml->ml_type->t_id, ml->ml_type->t_id); ml->ml_type->t_id);
} }
} }
@ -1106,7 +1145,7 @@ die_funcptr_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
fndef_t *fn; fndef_t *fn;
int i; int i;
debug(3, "die %llu <%llx>: creating function pointer\n", off, off); debug(3, "die %llu: creating function pointer\n", off);
/* /*
* We'll begin by processing any type definition nodes that may be * We'll begin by processing any type definition nodes that may be
@ -1136,6 +1175,7 @@ die_funcptr_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
tdp->t_type = FUNCTION; tdp->t_type = FUNCTION;
if ((attr = die_attr(dw, die, DW_AT_type, 0)) != NULL) { if ((attr = die_attr(dw, die, DW_AT_type, 0)) != NULL) {
dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
fn->fn_ret = die_lookup_pass1(dw, die, DW_AT_type); fn->fn_ret = die_lookup_pass1(dw, die, DW_AT_type);
} else { } else {
fn->fn_ret = tdesc_intr_void(dw); fn->fn_ret = tdesc_intr_void(dw);
@ -1159,7 +1199,7 @@ die_funcptr_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
fn->fn_args = xcalloc(sizeof (tdesc_t *) * fn->fn_nargs); fn->fn_args = xcalloc(sizeof (tdesc_t *) * fn->fn_nargs);
for (i = 0, arg = die_child(dw, die); for (i = 0, arg = die_child(dw, die);
arg != NULL && i < (int) fn->fn_nargs; arg != NULL && i < fn->fn_nargs;
arg = die_sibling(dw, arg)) { arg = die_sibling(dw, arg)) {
if (die_tag(dw, arg) != DW_TAG_formal_parameter) if (die_tag(dw, arg) != DW_TAG_formal_parameter)
continue; continue;
@ -1184,8 +1224,7 @@ static intr_t *
die_base_name_parse(const char *name, char **newp) die_base_name_parse(const char *name, char **newp)
{ {
char buf[100]; char buf[100];
char const *base; char *base, *c;
char *c;
int nlong = 0, nshort = 0, nchar = 0, nint = 0; int nlong = 0, nshort = 0, nchar = 0, nint = 0;
int sign = 1; int sign = 1;
char fmt = '\0'; char fmt = '\0';
@ -1269,7 +1308,7 @@ static const fp_size_map_t fp_encodings[] = {
#else #else
{ { 12, 16 }, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } }, { { 12, 16 }, { CTF_FP_LDOUBLE, CTF_FP_LDCPLX, CTF_FP_LDIMAGRY } },
#endif #endif
{ { 0, 0 }, { 0, 0, 0 } } { { 0, 0 } }
}; };
static uint_t static uint_t
@ -1282,11 +1321,8 @@ die_base_type2enc(dwarf_t *dw, Dwarf_Off off, Dwarf_Signed enc, size_t sz)
if (enc == DW_ATE_complex_float) { if (enc == DW_ATE_complex_float) {
mult = 2; mult = 2;
col = 1; col = 1;
} else if (enc == DW_ATE_imaginary_float } else if (enc == DW_ATE_imaginary_float ||
#if defined(sun) enc == DW_ATE_SUN_imaginary_float)
|| enc == DW_ATE_SUN_imaginary_float
#endif
)
col = 2; col = 2;
while (map->fsm_typesz[szidx] != 0) { while (map->fsm_typesz[szidx] != 0) {
@ -1334,10 +1370,8 @@ die_base_from_dwarf(dwarf_t *dw, Dwarf_Die base, Dwarf_Off off, size_t sz)
case DW_ATE_float: case DW_ATE_float:
case DW_ATE_complex_float: case DW_ATE_complex_float:
case DW_ATE_imaginary_float: case DW_ATE_imaginary_float:
#if defined(sun)
case DW_ATE_SUN_imaginary_float: case DW_ATE_SUN_imaginary_float:
case DW_ATE_SUN_interval_float: case DW_ATE_SUN_interval_float:
#endif
intr->intr_type = INTR_REAL; intr->intr_type = INTR_REAL;
intr->intr_signed = 1; intr->intr_signed = 1;
intr->intr_fformat = die_base_type2enc(dw, off, enc, sz); intr->intr_fformat = die_base_type2enc(dw, off, enc, sz);
@ -1407,11 +1441,12 @@ die_through_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp,
{ {
Dwarf_Attribute attr; Dwarf_Attribute attr;
debug(3, "die %llu <%llx>: creating %s type %d\n", off, off, typename, type); debug(3, "die %llu: creating %s\n", off, typename);
tdp->t_type = type; tdp->t_type = type;
if ((attr = die_attr(dw, die, DW_AT_type, 0)) != NULL) { if ((attr = die_attr(dw, die, DW_AT_type, 0)) != NULL) {
dwarf_dealloc(dw->dw_dw, attr, DW_DLA_ATTR);
tdp->t_tdesc = die_lookup_pass1(dw, die, DW_AT_type); tdp->t_tdesc = die_lookup_pass1(dw, die, DW_AT_type);
} else { } else {
tdp->t_tdesc = tdesc_intr_void(dw); tdp->t_tdesc = tdesc_intr_void(dw);
@ -1464,14 +1499,14 @@ die_volatile_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
/*ARGSUSED3*/ /*ARGSUSED3*/
static void static void
die_function_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp __unused) die_function_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
{ {
Dwarf_Die arg; Dwarf_Die arg;
Dwarf_Half tag; Dwarf_Half tag;
iidesc_t *ii; iidesc_t *ii;
char *name; char *name;
debug(3, "die %llu <%llx>: creating function definition\n", off, off); debug(3, "die %llu: creating function definition\n", off);
/* /*
* We'll begin by processing any type definition nodes that may be * We'll begin by processing any type definition nodes that may be
@ -1510,7 +1545,7 @@ die_function_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp __un
for (arg = die_child(dw, die); arg != NULL; for (arg = die_child(dw, die); arg != NULL;
arg = die_sibling(dw, arg)) { arg = die_sibling(dw, arg)) {
char *name1; char *name;
debug(3, "die %llu: looking at sub member at %llu\n", debug(3, "die %llu: looking at sub member at %llu\n",
off, die_off(dw, die)); off, die_off(dw, die));
@ -1518,13 +1553,13 @@ die_function_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp __un
if (die_tag(dw, arg) != DW_TAG_formal_parameter) if (die_tag(dw, arg) != DW_TAG_formal_parameter)
continue; continue;
if ((name1 = die_name(dw, arg)) == NULL) { if ((name = die_name(dw, arg)) == NULL) {
terminate("die %llu: func arg %d has no name\n", terminate("die %llu: func arg %d has no name\n",
off, ii->ii_nargs + 1); off, ii->ii_nargs + 1);
} }
if (strcmp(name1, "...") == 0) { if (strcmp(name, "...") == 0) {
free(name1); free(name);
ii->ii_vargs = 1; ii->ii_vargs = 1;
continue; continue;
} }
@ -1556,7 +1591,7 @@ die_function_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp __un
/*ARGSUSED3*/ /*ARGSUSED3*/
static void static void
die_variable_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp __unused) die_variable_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
{ {
iidesc_t *ii; iidesc_t *ii;
char *name; char *name;
@ -1578,7 +1613,7 @@ die_variable_create(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp __un
/*ARGSUSED2*/ /*ARGSUSED2*/
static int static int
die_fwd_resolve(tdesc_t *fwd, tdesc_t **fwdp, void *private __unused) die_fwd_resolve(tdesc_t *fwd, tdesc_t **fwdp, void *private)
{ {
if (fwd->t_flags & TDESC_F_RESOLVED) if (fwd->t_flags & TDESC_F_RESOLVED)
return (1); return (1);
@ -1596,7 +1631,7 @@ die_fwd_resolve(tdesc_t *fwd, tdesc_t **fwdp, void *private __unused)
/*ARGSUSED*/ /*ARGSUSED*/
static void static void
die_lexblk_descend(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off __unused, tdesc_t *tdp __unused) die_lexblk_descend(dwarf_t *dw, Dwarf_Die die, Dwarf_Off off, tdesc_t *tdp)
{ {
Dwarf_Die child = die_child(dw, die); Dwarf_Die child = die_child(dw, die);
@ -1634,7 +1669,7 @@ static const die_creator_t die_creators[] = {
{ DW_TAG_variable, DW_F_NOTDP, die_variable_create }, { DW_TAG_variable, DW_F_NOTDP, die_variable_create },
{ DW_TAG_volatile_type, 0, die_volatile_create }, { DW_TAG_volatile_type, 0, die_volatile_create },
{ DW_TAG_restrict_type, 0, die_restrict_create }, { DW_TAG_restrict_type, 0, die_restrict_create },
{ 0, 0, NULL } { 0, NULL }
}; };
static const die_creator_t * static const die_creator_t *
@ -1658,7 +1693,7 @@ die_create_one(dwarf_t *dw, Dwarf_Die die)
Dwarf_Half tag; Dwarf_Half tag;
tdesc_t *tdp; tdesc_t *tdp;
debug(3, "die %llu <%llx>: create_one\n", off, off); debug(3, "die %llu: create_one\n", off);
if (off > dw->dw_maxoff) { if (off > dw->dw_maxoff) {
terminate("illegal die offset %llu (max %llu)\n", off, terminate("illegal die offset %llu (max %llu)\n", off,
@ -1742,7 +1777,7 @@ die_resolve(dwarf_t *dw)
debug(3, "resolve: pass %d, %u left\n", pass, dw->dw_nunres); debug(3, "resolve: pass %d, %u left\n", pass, dw->dw_nunres);
if ((int) dw->dw_nunres == last) { if (dw->dw_nunres == last) {
fprintf(stderr, "%s: failed to resolve the following " fprintf(stderr, "%s: failed to resolve the following "
"types:\n", progname); "types:\n", progname);
@ -1760,12 +1795,11 @@ die_resolve(dwarf_t *dw)
/*ARGSUSED*/ /*ARGSUSED*/
int int
dw_read(tdata_t *td, Elf *elf, char *filename __unused) dw_read(tdata_t *td, Elf *elf, const char *filename)
{ {
Dwarf_Unsigned abboff, hdrlen, nxthdr; Dwarf_Unsigned abboff, hdrlen, nxthdr;
Dwarf_Half vers, addrsz; Dwarf_Half vers, addrsz;
Dwarf_Die cu = 0; Dwarf_Die cu, child;
Dwarf_Die child = 0;
dwarf_t dw; dwarf_t dw;
char *prod = NULL; char *prod = NULL;
int rc; int rc;
@ -1780,12 +1814,12 @@ dw_read(tdata_t *td, Elf *elf, char *filename __unused)
dw.dw_enumhash = hash_new(TDESC_HASH_BUCKETS, tdesc_namehash, dw.dw_enumhash = hash_new(TDESC_HASH_BUCKETS, tdesc_namehash,
tdesc_namecmp); tdesc_namecmp);
if ((rc = dwarf_elf_init(elf, DW_DLC_READ, &dw.dw_dw, if ((rc = dwarf_elf_init(elf, DW_DLC_READ, NULL, NULL, &dw.dw_dw,
&dw.dw_err)) == DW_DLV_NO_ENTRY) { &dw.dw_err)) == DW_DLV_NO_ENTRY) {
errno = ENOENT; errno = ENOENT;
return (-1); return (-1);
} else if (rc != DW_DLV_OK) { } else if (rc != DW_DLV_OK) {
if (dwarf_errno(&dw.dw_err) == DW_DLE_DEBUG_INFO_NULL) { if (dwarf_errno(dw.dw_err) == DW_DLE_DEBUG_INFO_NULL) {
/* /*
* There's no type data in the DWARF section, but * There's no type data in the DWARF section, but
* libdwarf is too clever to handle that properly. * libdwarf is too clever to handle that properly.
@ -1794,14 +1828,13 @@ dw_read(tdata_t *td, Elf *elf, char *filename __unused)
} }
terminate("failed to initialize DWARF: %s\n", terminate("failed to initialize DWARF: %s\n",
dwarf_errmsg(&dw.dw_err)); dwarf_errmsg(dw.dw_err));
} }
if ((rc = dwarf_next_cu_header(dw.dw_dw, &hdrlen, &vers, &abboff, if ((rc = dwarf_next_cu_header(dw.dw_dw, &hdrlen, &vers, &abboff,
&addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_OK) &addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_OK ||
terminate("rc = %d %s\n", rc, dwarf_errmsg(&dw.dw_err)); (cu = die_sibling(&dw, NULL)) == NULL ||
(child = die_child(&dw, cu)) == NULL)
if ((cu = die_sibling(&dw, NULL)) == NULL)
terminate("file does not contain dwarf type data " terminate("file does not contain dwarf type data "
"(try compiling with -g)\n"); "(try compiling with -g)\n");
@ -1829,14 +1862,13 @@ dw_read(tdata_t *td, Elf *elf, char *filename __unused)
debug(1, "CU name: %s\n", dw.dw_cuname); debug(1, "CU name: %s\n", dw.dw_cuname);
} }
if ((child = die_child(&dw, cu)) != NULL) die_create(&dw, child);
die_create(&dw, child);
if ((rc = dwarf_next_cu_header(dw.dw_dw, &hdrlen, &vers, &abboff, if ((rc = dwarf_next_cu_header(dw.dw_dw, &hdrlen, &vers, &abboff,
&addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_NO_ENTRY) &addrsz, &nxthdr, &dw.dw_err)) != DW_DLV_NO_ENTRY)
terminate("multiple compilation units not supported\n"); terminate("multiple compilation units not supported\n");
(void) dwarf_finish(&dw.dw_dw, &dw.dw_err); (void) dwarf_finish(dw.dw_dw, &dw.dw_err);
die_resolve(&dw); die_resolve(&dw);

View File

@ -52,17 +52,17 @@
static void static void
fix_ptrptr_to_struct(tdata_t *td) fix_ptrptr_to_struct(tdata_t *td)
{ {
const char *strs[2] = { "as", "fdbuffer" }; char *strs[2] = { "as", "fdbuffer" };
const char *mems[2] = { "a_objectdir", "fd_shadow" }; char *mems[2] = { "a_objectdir", "fd_shadow" };
const char *acts[2] = { "vnode", "page" }; char *acts[2] = { "vnode", "page" };
const char *tgts[2] = { "vnode_t", "page_t" }; char *tgts[2] = { "vnode_t", "page_t" };
tdesc_t *str; tdesc_t *str;
tdesc_t *act, *tgt; tdesc_t *act, *tgt;
tdesc_t *p1, *p2; tdesc_t *p1, *p2;
mlist_t *ml; mlist_t *ml;
int i; int i;
for (i = 0; i < (int) (sizeof (strs) / sizeof (strs[0])); i++) { for (i = 0; i < sizeof (strs) / sizeof (strs[0]); i++) {
if (!(str = lookupname(strs[i])) || str->t_type != STRUCT) if (!(str = lookupname(strs[i])) || str->t_type != STRUCT)
continue; continue;
@ -106,8 +106,8 @@ fix_ptrptr_to_struct(tdata_t *td)
static void static void
fix_ptr_to_struct(tdata_t *td) fix_ptr_to_struct(tdata_t *td)
{ {
const char *strs[2] = { "vmem", "id_space" }; char *strs[2] = { "vmem", "id_space" };
const char *mems[2] = { NULL, "is_vmem" }; char *mems[2] = { NULL, "is_vmem" };
tdesc_t *ptr = NULL; tdesc_t *ptr = NULL;
tdesc_t *str, *vmt; tdesc_t *str, *vmt;
mlist_t *ml; mlist_t *ml;
@ -116,7 +116,7 @@ fix_ptr_to_struct(tdata_t *td)
if ((vmt = lookupname("vmem_t")) == NULL || vmt->t_type != TYPEDEF) if ((vmt = lookupname("vmem_t")) == NULL || vmt->t_type != TYPEDEF)
return; return;
for (i = 0; i < (int) (sizeof (strs) / sizeof (strs[0])); i++) { for (i = 0; i < sizeof (strs) / sizeof (strs[0]); i++) {
if (!(str = lookupname(strs[i])) || str->t_type != STRUCT) if (!(str = lookupname(strs[i])) || str->t_type != STRUCT)
continue; continue;
@ -163,10 +163,8 @@ struct match {
}; };
static int static int
matching_iidesc(void *arg1, void *arg2) matching_iidesc(iidesc_t *iidesc, struct match *match)
{ {
iidesc_t *iidesc = arg1;
struct match *match = arg2;
if (!streq(iidesc->ii_name, match->m_name)) if (!streq(iidesc->ii_name, match->m_name))
return (0); return (0);
@ -178,10 +176,10 @@ matching_iidesc(void *arg1, void *arg2)
} }
static tdesc_t * static tdesc_t *
lookup_tdesc(tdata_t *td, char const *name) lookup_tdesc(tdata_t *td, const char *name)
{ {
struct match match = { NULL, name }; struct match match = { NULL, name };
iter_iidescs_by_name(td, name, matching_iidesc, &match); iter_iidescs_by_name(td, name, (int (*)())matching_iidesc, &match);
return (match.m_ret); return (match.m_ret);
} }

View File

@ -50,7 +50,7 @@ struct hash {
struct hash_data { struct hash_data {
hash_t *hd_hash; hash_t *hd_hash;
int (*hd_fun)(void *, void *); int (*hd_fun)();
void *hd_key; void *hd_key;
void *hd_private; void *hd_private;
@ -58,14 +58,13 @@ struct hash_data {
}; };
static int static int
hash_def_hash(int nbuckets, void *arg) hash_def_hash(int nbuckets, uintptr_t data)
{ {
uintptr_t data = (uintptr_t) arg;
return (data % nbuckets); return (data % nbuckets);
} }
static int static int
hash_def_cmp(void *d1, void *d2) hash_def_cmp(uintptr_t d1, uintptr_t d2)
{ {
return (d1 != d2); return (d1 != d2);
} }
@ -97,8 +96,8 @@ hash_new(int nbuckets, int (*hashfn)(int, void *), int (*cmp)(void *, void *))
hash = xmalloc(sizeof (hash_t)); hash = xmalloc(sizeof (hash_t));
hash->h_buckets = xcalloc(sizeof (list_t *) * nbuckets); hash->h_buckets = xcalloc(sizeof (list_t *) * nbuckets);
hash->h_nbuckets = nbuckets; hash->h_nbuckets = nbuckets;
hash->h_hashfn = hashfn ? hashfn : hash_def_hash; hash->h_hashfn = hashfn ? hashfn : (int (*)())hash_def_hash;
hash->h_cmp = cmp ? cmp : hash_def_cmp; hash->h_cmp = cmp ? cmp : (int (*)())hash_def_cmp;
return (hash); return (hash);
} }
@ -125,9 +124,8 @@ hash_merge(hash_t *to, hash_t *from)
} }
static int static int
hash_remove_cb(void *key1, void *key2, void *arg) hash_remove_cb(void *key1, void *key2, hash_t *hash)
{ {
hash_t *hash = arg;
return (hash->h_cmp(key1, key2)); return (hash->h_cmp(key1, key2));
} }
@ -137,7 +135,7 @@ hash_remove(hash_t *hash, void *key)
int bucket = hash->h_hashfn(hash->h_nbuckets, key); int bucket = hash->h_hashfn(hash->h_nbuckets, key);
(void) list_remove(&hash->h_buckets[bucket], key, (void) list_remove(&hash->h_buckets[bucket], key,
hash_remove_cb, hash); (int (*)())hash_remove_cb, hash);
} }
int int
@ -150,9 +148,8 @@ hash_match(hash_t *hash, void *key, int (*fun)(void *, void *),
} }
static int static int
hash_find_list_cb(void *node, void *arg) hash_find_list_cb(void *node, struct hash_data *hd)
{ {
struct hash_data *hd = arg;
int cbrc; int cbrc;
int rc = 0; int rc = 0;
@ -177,15 +174,14 @@ hash_find_iter(hash_t *hash, void *key, int (*fun)(void *, void *),
hd.hd_key = key; hd.hd_key = key;
hd.hd_private = private; hd.hd_private = private;
return (list_iter(hash->h_buckets[bucket], hash_find_list_cb, return (list_iter(hash->h_buckets[bucket], (int (*)())hash_find_list_cb,
&hd)); &hd));
} }
/* stop on first match */ /* stop on first match */
static int static int
hash_find_first_cb(void *node, void *arg) hash_find_first_cb(void *node, struct hash_data *hd)
{ {
struct hash_data *hd = arg;
if (hd->hd_hash->h_cmp(hd->hd_key, node) == 0) { if (hd->hd_hash->h_cmp(hd->hd_key, node) == 0) {
hd->hd_ret = node; hd->hd_ret = node;
return (-1); return (-1);
@ -204,7 +200,7 @@ hash_find(hash_t *hash, void *key, void **value)
hd.hd_fun = hash_find_first_cb; hd.hd_fun = hash_find_first_cb;
hd.hd_key = key; hd.hd_key = key;
ret = hash_match(hash, key, hash_find_first_cb, &hd); ret = hash_match(hash, key, (int (*)())hash_find_first_cb, &hd);
if (ret && value) if (ret && value)
*value = hd.hd_ret; *value = hd.hd_ret;

View File

@ -68,10 +68,8 @@ iidesc_hash(int nbuckets, void *arg)
} }
static int static int
iidesc_cmp(void *arg1, void *arg2) iidesc_cmp(iidesc_t *src, iidesc_find_t *find)
{ {
iidesc_t *src = arg1;
iidesc_find_t *find = arg2;
iidesc_t *tgt = find->iif_tgt; iidesc_t *tgt = find->iif_tgt;
if (src->ii_type != tgt->ii_type || if (src->ii_type != tgt->ii_type ||
@ -91,7 +89,7 @@ iidesc_add(hash_t *hash, iidesc_t *new)
find.iif_tgt = new; find.iif_tgt = new;
find.iif_ret = NULL; find.iif_ret = NULL;
(void) hash_match(hash, new, iidesc_cmp, &find); (void) hash_match(hash, new, (int (*)())iidesc_cmp, &find);
if (find.iif_ret != NULL) { if (find.iif_ret != NULL) {
iidesc_t *old = find.iif_ret; iidesc_t *old = find.iif_ret;
@ -109,14 +107,13 @@ iidesc_add(hash_t *hash, iidesc_t *new)
} }
void void
iter_iidescs_by_name(tdata_t *td, char const *name, iter_iidescs_by_name(tdata_t *td, const char *name,
int (*func)(void *, void *), void *data) int (*func)(iidesc_t *, void *), void *data)
{ {
iidesc_t tmpdesc; iidesc_t tmpdesc;
bzero(&tmpdesc, sizeof(tmpdesc)); bzero(&tmpdesc, sizeof (iidesc_t));
tmpdesc.ii_name = xstrdup(name); tmpdesc.ii_name = (char *)name;
(void) hash_match(td->td_iihash, &tmpdesc, func, data); (void) hash_match(td->td_iihash, &tmpdesc, (int (*)())func, data);
free(tmpdesc.ii_name);
} }
iidesc_t * iidesc_t *
@ -154,9 +151,8 @@ iidesc_dup_rename(iidesc_t *src, char const *name, char const *owner)
/*ARGSUSED*/ /*ARGSUSED*/
void void
iidesc_free(void *arg, void *private __unused) iidesc_free(iidesc_t *idp, void *private)
{ {
iidesc_t *idp = arg;
if (idp->ii_name) if (idp->ii_name)
free(idp->ii_name); free(idp->ii_name);
if (idp->ii_nargs) if (idp->ii_nargs)

View File

@ -71,7 +71,6 @@ built_source_types(Elf *elf, char const *file)
/* ignore */ /* ignore */
break; break;
case 's': case 's':
case 'S':
types |= SOURCE_S; types |= SOURCE_S;
break; break;
default: default:
@ -88,7 +87,7 @@ read_file(Elf *elf, char *file, char *label, read_cb_f *func, void *arg,
int require_ctf) int require_ctf)
{ {
Elf_Scn *ctfscn; Elf_Scn *ctfscn;
Elf_Data *ctfdata = NULL; Elf_Data *ctfdata;
symit_data_t *si = NULL; symit_data_t *si = NULL;
int ctfscnidx; int ctfscnidx;
tdata_t *td; tdata_t *td;
@ -221,7 +220,7 @@ read_ctf_common(char *file, char *label, read_cb_f *func, void *arg,
/*ARGSUSED*/ /*ARGSUSED*/
int int
read_ctf_save_cb(tdata_t *td, char *name __unused, void *retp) read_ctf_save_cb(tdata_t *td, char *name, void *retp)
{ {
tdata_t **tdp = retp; tdata_t **tdp = retp;

View File

@ -132,7 +132,7 @@ typedef struct merge_cb_data merge_cb_data_t;
* own traversal mechanism and ops vector here for those two cases. * own traversal mechanism and ops vector here for those two cases.
*/ */
typedef struct tdesc_ops { typedef struct tdesc_ops {
const char *name; char *name;
int (*equiv)(tdesc_t *, tdesc_t *, equiv_data_t *); int (*equiv)(tdesc_t *, tdesc_t *, equiv_data_t *);
tdesc_t *(*conjure)(tdesc_t *, int, merge_cb_data_t *); tdesc_t *(*conjure)(tdesc_t *, int, merge_cb_data_t *);
} tdesc_ops_t; } tdesc_ops_t;
@ -179,21 +179,21 @@ struct merge_cb_data {
static void static void
add_mapping(alist_t *ta, tid_t srcid, tid_t tgtid) add_mapping(alist_t *ta, tid_t srcid, tid_t tgtid)
{ {
debug(3, "Adding mapping %u <%x> => %u <%x>\n", srcid, srcid, tgtid, tgtid); debug(3, "Adding mapping %u => %u\n", srcid, tgtid);
assert(!alist_find(ta, (void *)(uintptr_t)srcid, NULL)); assert(!alist_find(ta, (void *)srcid, NULL));
assert(srcid != 0 && tgtid != 0); assert(srcid != 0 && tgtid != 0);
alist_add(ta, (void *)(uintptr_t)srcid, (void *)(uintptr_t)tgtid); alist_add(ta, (void *)srcid, (void *)tgtid);
} }
static tid_t static tid_t
get_mapping(alist_t *ta, int srcid) get_mapping(alist_t *ta, int srcid)
{ {
void *ltgtid; long ltgtid;
if (alist_find(ta, (void *)(uintptr_t)srcid, (void **)&ltgtid)) if (alist_find(ta, (void *)srcid, (void **)&ltgtid))
return ((uintptr_t)ltgtid); return ((int)ltgtid);
else else
return (0); return (0);
} }
@ -216,7 +216,7 @@ static int equiv_node(tdesc_t *, tdesc_t *, equiv_data_t *);
/*ARGSUSED2*/ /*ARGSUSED2*/
static int static int
equiv_intrinsic(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed __unused) equiv_intrinsic(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
{ {
intr_t *si = stdp->t_intr; intr_t *si = stdp->t_intr;
intr_t *ti = ttdp->t_intr; intr_t *ti = ttdp->t_intr;
@ -256,7 +256,7 @@ equiv_function(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
if (!equiv_node(fn1->fn_ret, fn2->fn_ret, ed)) if (!equiv_node(fn1->fn_ret, fn2->fn_ret, ed))
return (0); return (0);
for (i = 0; i < (int) fn1->fn_nargs; i++) { for (i = 0; i < fn1->fn_nargs; i++) {
if (!equiv_node(fn1->fn_args[i], fn2->fn_args[i], ed)) if (!equiv_node(fn1->fn_args[i], fn2->fn_args[i], ed))
return (0); return (0);
} }
@ -313,7 +313,7 @@ equiv_su(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
/*ARGSUSED2*/ /*ARGSUSED2*/
static int static int
equiv_enum(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed __unused) equiv_enum(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
{ {
elist_t *el1 = stdp->t_emem; elist_t *el1 = stdp->t_emem;
elist_t *el2 = ttdp->t_emem; elist_t *el2 = ttdp->t_emem;
@ -335,7 +335,7 @@ equiv_enum(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed __unused)
/*ARGSUSED*/ /*ARGSUSED*/
static int static int
equiv_assert(tdesc_t *stdp __unused, tdesc_t *ttdp __unused, equiv_data_t *ed __unused) equiv_assert(tdesc_t *stdp, tdesc_t *ttdp, equiv_data_t *ed)
{ {
/* foul, evil, and very bad - this is a "shouldn't happen" */ /* foul, evil, and very bad - this is a "shouldn't happen" */
assert(1 == 0); assert(1 == 0);
@ -354,7 +354,7 @@ fwd_equiv(tdesc_t *ctdp, tdesc_t *mtdp)
static int static int
equiv_node(tdesc_t *ctdp, tdesc_t *mtdp, equiv_data_t *ed) equiv_node(tdesc_t *ctdp, tdesc_t *mtdp, equiv_data_t *ed)
{ {
int (*equiv)(tdesc_t *, tdesc_t *, equiv_data_t *); int (*equiv)();
int mapping; int mapping;
if (ctdp->t_emark > ed->ed_clear_mark || if (ctdp->t_emark > ed->ed_clear_mark ||
@ -418,8 +418,7 @@ equiv_cb(void *bucket, void *arg)
ed->ed_cur_mark = ed->ed_clear_mark + 1; ed->ed_cur_mark = ed->ed_clear_mark + 1;
if (equiv_node(ctdp, mtdp, ed)) { if (equiv_node(ctdp, mtdp, ed)) {
debug(3, "equiv_node matched %d <%x> %d <%x>\n", debug(3, "equiv_node matched %d %d\n", ctdp->t_id, mtdp->t_id);
ctdp->t_id, ctdp->t_id, mtdp->t_id, mtdp->t_id);
ed->ed_tgt = mtdp; ed->ed_tgt = mtdp;
/* matched. stop looking */ /* matched. stop looking */
return (-1); return (-1);
@ -430,7 +429,7 @@ equiv_cb(void *bucket, void *arg)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
map_td_tree_pre(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private) map_td_tree_pre(tdesc_t *ctdp, tdesc_t **ctdpp, void *private)
{ {
merge_cb_data_t *mcd = private; merge_cb_data_t *mcd = private;
@ -442,7 +441,7 @@ map_td_tree_pre(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
map_td_tree_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private) map_td_tree_post(tdesc_t *ctdp, tdesc_t **ctdpp, void *private)
{ {
merge_cb_data_t *mcd = private; merge_cb_data_t *mcd = private;
equiv_data_t ed; equiv_data_t ed;
@ -453,7 +452,7 @@ map_td_tree_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private)
ed.ed_node = ctdp; ed.ed_node = ctdp;
ed.ed_selfuniquify = 0; ed.ed_selfuniquify = 0;
debug(3, "map_td_tree_post on %d <%x> %s\n", ctdp->t_id, ctdp->t_id,tdesc_name(ctdp)); debug(3, "map_td_tree_post on %d %s\n", ctdp->t_id, tdesc_name(ctdp));
if (hash_find_iter(mcd->md_parent->td_layouthash, ctdp, if (hash_find_iter(mcd->md_parent->td_layouthash, ctdp,
equiv_cb, &ed) < 0) { equiv_cb, &ed) < 0) {
@ -461,7 +460,7 @@ map_td_tree_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private)
if (ed.ed_tgt->t_type == FORWARD && ctdp->t_type != FORWARD) { if (ed.ed_tgt->t_type == FORWARD && ctdp->t_type != FORWARD) {
int id = mcd->md_tgt->td_nextid++; int id = mcd->md_tgt->td_nextid++;
debug(3, "Creating new defn type %d <%x>\n", id, id); debug(3, "Creating new defn type %d\n", id);
add_mapping(mcd->md_ta, ctdp->t_id, id); add_mapping(mcd->md_ta, ctdp->t_id, id);
alist_add(mcd->md_fdida, (void *)(ulong_t)ed.ed_tgt, alist_add(mcd->md_fdida, (void *)(ulong_t)ed.ed_tgt,
(void *)(ulong_t)id); (void *)(ulong_t)id);
@ -482,7 +481,7 @@ map_td_tree_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private)
} else { } else {
int id = mcd->md_tgt->td_nextid++; int id = mcd->md_tgt->td_nextid++;
debug(3, "Creating new type %d <%x>\n", id, id); debug(3, "Creating new type %d\n", id);
add_mapping(mcd->md_ta, ctdp->t_id, id); add_mapping(mcd->md_ta, ctdp->t_id, id);
hash_add(mcd->md_tdtba, ctdp); hash_add(mcd->md_tdtba, ctdp);
} }
@ -494,7 +493,7 @@ map_td_tree_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
map_td_tree_self_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private) map_td_tree_self_post(tdesc_t *ctdp, tdesc_t **ctdpp, void *private)
{ {
merge_cb_data_t *mcd = private; merge_cb_data_t *mcd = private;
equiv_data_t ed; equiv_data_t ed;
@ -507,8 +506,8 @@ map_td_tree_self_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private)
ed.ed_tgt = NULL; ed.ed_tgt = NULL;
if (hash_find_iter(mcd->md_tdtba, ctdp, equiv_cb, &ed) < 0) { if (hash_find_iter(mcd->md_tdtba, ctdp, equiv_cb, &ed) < 0) {
debug(3, "Self check found %d <%x> in %d <%x>\n", ctdp->t_id, debug(3, "Self check found %d in %d\n", ctdp->t_id,
ctdp->t_id, ed.ed_tgt->t_id, ed.ed_tgt->t_id); ed.ed_tgt->t_id);
add_mapping(mcd->md_ta, ctdp->t_id, add_mapping(mcd->md_ta, ctdp->t_id,
get_mapping(mcd->md_ta, ed.ed_tgt->t_id)); get_mapping(mcd->md_ta, ed.ed_tgt->t_id));
} else if (debug_level > 1 && hash_iter(mcd->md_tdtba, } else if (debug_level > 1 && hash_iter(mcd->md_tdtba,
@ -519,13 +518,12 @@ map_td_tree_self_post(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private)
* through the entire hash. This usually means that the hash * through the entire hash. This usually means that the hash
* function is broken. * function is broken.
*/ */
aborterr("Self-unique second pass for %d <%x> (%s) == %d <%x>\n", aborterr("Self-unique second pass for %d (%s) == %d\n",
ctdp->t_id, ctdp->t_id, tdesc_name(ctdp), ed.ed_tgt->t_id, ctdp->t_id, tdesc_name(ctdp), ed.ed_tgt->t_id);
ed.ed_tgt->t_id);
} else { } else {
int id = mcd->md_tgt->td_nextid++; int id = mcd->md_tgt->td_nextid++;
debug(3, "Creating new type %d <%x>\n", id, id); debug(3, "Creating new type %d\n", id);
add_mapping(mcd->md_ta, ctdp->t_id, id); add_mapping(mcd->md_ta, ctdp->t_id, id);
hash_add(mcd->md_tdtba, ctdp); hash_add(mcd->md_tdtba, ctdp);
} }
@ -698,14 +696,14 @@ remap_node(tdesc_t **tgtp, tdesc_t *oldtgt, int selftid, tdesc_t *newself,
} }
if ((template.t_id = get_mapping(mcd->md_ta, oldid)) == 0) if ((template.t_id = get_mapping(mcd->md_ta, oldid)) == 0)
aborterr("failed to get mapping for tid %d <%x>\n", oldid, oldid); aborterr("failed to get mapping for tid %d\n", oldid);
if (!hash_find(mcd->md_parent->td_idhash, (void *)&template, if (!hash_find(mcd->md_parent->td_idhash, (void *)&template,
(void *)&tgt) && (!(mcd->md_flags & MCD_F_REFMERGE) || (void *)&tgt) && (!(mcd->md_flags & MCD_F_REFMERGE) ||
!hash_find(mcd->md_tgt->td_idhash, (void *)&template, !hash_find(mcd->md_tgt->td_idhash, (void *)&template,
(void *)&tgt))) { (void *)&tgt))) {
debug(3, "Remap couldn't find %d <%x> (from %d <%x>)\n", template.t_id, debug(3, "Remap couldn't find %d (from %d)\n", template.t_id,
template.t_id, oldid, oldid); oldid);
*tgtp = oldtgt; *tgtp = oldtgt;
list_add(mcd->md_tdtbr, tgtp); list_add(mcd->md_tdtbr, tgtp);
return (0); return (0);
@ -731,7 +729,7 @@ conjure_template(tdesc_t *old, int newselfid)
/*ARGSUSED2*/ /*ARGSUSED2*/
static tdesc_t * static tdesc_t *
conjure_intrinsic(tdesc_t *old, int newselfid, merge_cb_data_t *mcd __unused) conjure_intrinsic(tdesc_t *old, int newselfid, merge_cb_data_t *mcd)
{ {
tdesc_t *new = conjure_template(old, newselfid); tdesc_t *new = conjure_template(old, newselfid);
@ -767,7 +765,7 @@ conjure_function(tdesc_t *old, int newselfid, merge_cb_data_t *mcd)
if (nfn->fn_nargs > 0) if (nfn->fn_nargs > 0)
nfn->fn_args = xcalloc(sizeof (tdesc_t *) * ofn->fn_nargs); nfn->fn_args = xcalloc(sizeof (tdesc_t *) * ofn->fn_nargs);
for (i = 0; i < (int) ofn->fn_nargs; i++) { for (i = 0; i < ofn->fn_nargs; i++) {
(void) remap_node(&nfn->fn_args[i], ofn->fn_args[i], old->t_id, (void) remap_node(&nfn->fn_args[i], ofn->fn_args[i], old->t_id,
new, mcd); new, mcd);
} }
@ -807,7 +805,7 @@ conjure_su(tdesc_t *old, int newselfid, merge_cb_data_t *mcd)
*nmemp = xmalloc(sizeof (mlist_t)); *nmemp = xmalloc(sizeof (mlist_t));
(*nmemp)->ml_offset = omem->ml_offset; (*nmemp)->ml_offset = omem->ml_offset;
(*nmemp)->ml_size = omem->ml_size; (*nmemp)->ml_size = omem->ml_size;
(*nmemp)->ml_name = xstrdup(omem->ml_name ? omem->ml_name : "empty omem->ml_name"); (*nmemp)->ml_name = xstrdup(omem->ml_name);
(void) remap_node(&((*nmemp)->ml_type), omem->ml_type, (void) remap_node(&((*nmemp)->ml_type), omem->ml_type,
old->t_id, new, mcd); old->t_id, new, mcd);
} }
@ -818,7 +816,7 @@ conjure_su(tdesc_t *old, int newselfid, merge_cb_data_t *mcd)
/*ARGSUSED2*/ /*ARGSUSED2*/
static tdesc_t * static tdesc_t *
conjure_enum(tdesc_t *old, int newselfid, merge_cb_data_t *mcd __unused) conjure_enum(tdesc_t *old, int newselfid, merge_cb_data_t *mcd)
{ {
tdesc_t *new = conjure_template(old, newselfid); tdesc_t *new = conjure_template(old, newselfid);
elist_t *oel, **nelp; elist_t *oel, **nelp;
@ -847,7 +845,7 @@ conjure_forward(tdesc_t *old, int newselfid, merge_cb_data_t *mcd)
/*ARGSUSED*/ /*ARGSUSED*/
static tdesc_t * static tdesc_t *
conjure_assert(tdesc_t *old __unused, int newselfid __unused, merge_cb_data_t *mcd __unused) conjure_assert(tdesc_t *old, int newselfid, merge_cb_data_t *mcd)
{ {
assert(1 == 0); assert(1 == 0);
return (NULL); return (NULL);
@ -872,7 +870,7 @@ static int
fwd_redir(tdesc_t *fwd, tdesc_t **fwdp, void *private) fwd_redir(tdesc_t *fwd, tdesc_t **fwdp, void *private)
{ {
alist_t *map = private; alist_t *map = private;
void *defn; tdesc_t *defn;
if (!alist_find(map, (void *)fwd, (void **)&defn)) if (!alist_find(map, (void *)fwd, (void **)&defn))
return (0); return (0);
@ -910,7 +908,7 @@ static int
redir_mstr_fwd_cb(void *name, void *value, void *arg) redir_mstr_fwd_cb(void *name, void *value, void *arg)
{ {
tdesc_t *fwd = name; tdesc_t *fwd = name;
int defnid = (uintptr_t)value; int defnid = (int)value;
redir_mstr_data_t *rmd = arg; redir_mstr_data_t *rmd = arg;
tdesc_t template; tdesc_t template;
tdesc_t *defn; tdesc_t *defn;
@ -989,9 +987,8 @@ add_tdesc(tdesc_t *oldtdp, int newid, merge_cb_data_t *mcd)
assert(hash_find(mcd->md_parent->td_idhash, assert(hash_find(mcd->md_parent->td_idhash,
(void *)&template, NULL) == 0); (void *)&template, NULL) == 0);
debug(3, "trying to conjure %d %s (%d, <%x>) as %d, <%x>\n", debug(3, "trying to conjure %d %s (%d) as %d\n",
oldtdp->t_type, tdesc_name(oldtdp), oldtdp->t_id, oldtdp->t_type, tdesc_name(oldtdp), oldtdp->t_id, newid);
oldtdp->t_id, newid, newid);
if ((newtdp = tdesc_ops[oldtdp->t_type].conjure(oldtdp, newid, if ((newtdp = tdesc_ops[oldtdp->t_type].conjure(oldtdp, newid,
mcd)) == NULL) mcd)) == NULL)
@ -1052,16 +1049,16 @@ merge_types(hash_t *src, merge_cb_data_t *mcd)
(void) hash_iter(src, merge_type_cb, mcd); (void) hash_iter(src, merge_type_cb, mcd);
tdrc = hash_iter(mcd->md_tdtba, add_tdtba_cb, mcd); tdrc = hash_iter(mcd->md_tdtba, add_tdtba_cb, (void *)mcd);
debug(3, "add_tdtba_cb added %d items\n", tdrc); debug(3, "add_tdtba_cb added %d items\n", tdrc);
iirc = list_iter(*mcd->md_iitba, add_iitba_cb, mcd); iirc = list_iter(*mcd->md_iitba, add_iitba_cb, (void *)mcd);
debug(3, "add_iitba_cb added %d items\n", iirc); debug(3, "add_iitba_cb added %d items\n", iirc);
assert(list_count(*mcd->md_iitba) == 0 && assert(list_count(*mcd->md_iitba) == 0 &&
hash_count(mcd->md_tdtba) == 0); hash_count(mcd->md_tdtba) == 0);
tdrc = list_iter(*mcd->md_tdtbr, add_tdtbr_cb, mcd); tdrc = list_iter(*mcd->md_tdtbr, add_tdtbr_cb, (void *)mcd);
debug(3, "add_tdtbr_cb added %d items\n", tdrc); debug(3, "add_tdtbr_cb added %d items\n", tdrc);
if (list_count(*mcd->md_tdtbr) != 0) if (list_count(*mcd->md_tdtbr) != 0)

View File

@ -79,7 +79,7 @@ burst_iitypes(void *data, void *arg)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
save_type_by_id(tdesc_t *tdp, tdesc_t **tdpp __unused, void *private) save_type_by_id(tdesc_t *tdp, tdesc_t **tdpp, void *private)
{ {
iiburst_t *iiburst = private; iiburst_t *iiburst = private;
@ -159,10 +159,8 @@ iiburst_free(iiburst_t *iiburst)
* a global type description. * a global type description.
*/ */
static int static int
matching_iidesc(void *arg1, void *arg2) matching_iidesc(iidesc_t *iidesc, iidesc_match_t *match)
{ {
iidesc_t *iidesc = arg1;
iidesc_match_t *match = arg2;
if (streq(iidesc->ii_name, match->iim_name) == 0) if (streq(iidesc->ii_name, match->iim_name) == 0)
return (0); return (0);
@ -187,8 +185,6 @@ matching_iidesc(void *arg1, void *arg2)
return (-1); return (-1);
} }
break; break;
default:
break;
} }
return (0); return (0);
} }
@ -198,7 +194,7 @@ find_iidesc(tdata_t *td, iidesc_match_t *match)
{ {
match->iim_ret = NULL; match->iim_ret = NULL;
iter_iidescs_by_name(td, match->iim_name, iter_iidescs_by_name(td, match->iim_name,
matching_iidesc, match); (int (*)())matching_iidesc, match);
return (match->iim_ret); return (match->iim_ret);
} }
@ -243,12 +239,10 @@ check_for_weak(GElf_Sym *weak, char const *weakfile,
GElf_Sym *retsym, char **curfilep) GElf_Sym *retsym, char **curfilep)
{ {
char *curfile = NULL; char *curfile = NULL;
char *tmpfile1 = NULL; char *tmpfile;
GElf_Sym tmpsym; GElf_Sym tmpsym;
int candidate = 0; int candidate = 0;
int i; int i;
tmpsym.st_info = 0;
tmpsym.st_name = 0;
if (GELF_ST_BIND(weak->st_info) != STB_WEAK) if (GELF_ST_BIND(weak->st_info) != STB_WEAK)
return (0); return (0);
@ -282,7 +276,7 @@ check_for_weak(GElf_Sym *weak, char const *weakfile,
(curfile == NULL || weakfile == NULL || (curfile == NULL || weakfile == NULL ||
strcmp(curfile, weakfile) != 0)) { strcmp(curfile, weakfile) != 0)) {
candidate = 1; candidate = 1;
tmpfile1 = curfile; tmpfile = curfile;
tmpsym = sym; tmpsym = sym;
continue; continue;
} }
@ -293,7 +287,7 @@ check_for_weak(GElf_Sym *weak, char const *weakfile,
} }
if (candidate) { if (candidate) {
*curfilep = tmpfile1; *curfilep = tmpfile;
*retsym = tmpsym; *retsym = tmpsym;
return (1); return (1);
} }
@ -502,14 +496,14 @@ write_file(Elf *src, const char *srcname, Elf *dst, const char *dstname,
secxlate = xmalloc(sizeof (int) * sehdr.e_shnum); secxlate = xmalloc(sizeof (int) * sehdr.e_shnum);
for (srcidx = dstidx = 0; srcidx < sehdr.e_shnum; srcidx++) { for (srcidx = dstidx = 0; srcidx < sehdr.e_shnum; srcidx++) {
Elf_Scn *scn = elf_getscn(src, srcidx); Elf_Scn *scn = elf_getscn(src, srcidx);
GElf_Shdr shdr1; GElf_Shdr shdr;
char *sname; char *sname;
gelf_getshdr(scn, &shdr1); gelf_getshdr(scn, &shdr);
sname = elf_strptr(src, sehdr.e_shstrndx, shdr1.sh_name); sname = elf_strptr(src, sehdr.e_shstrndx, shdr.sh_name);
if (sname == NULL) { if (sname == NULL) {
elfterminate(srcname, "Can't find string at %u", elfterminate(srcname, "Can't find string at %u",
shdr1.sh_name); shdr.sh_name);
} }
if (strcmp(sname, CTF_ELF_SCN_NAME) == 0) { if (strcmp(sname, CTF_ELF_SCN_NAME) == 0) {
@ -520,7 +514,7 @@ write_file(Elf *src, const char *srcname, Elf *dst, const char *dstname,
strncmp(sname, ".rel.debug", 10) == 0 || strncmp(sname, ".rel.debug", 10) == 0 ||
strncmp(sname, ".rela.debug", 11) == 0)) { strncmp(sname, ".rela.debug", 11) == 0)) {
secxlate[srcidx] = -1; secxlate[srcidx] = -1;
} else if (dynsym && shdr1.sh_type == SHT_SYMTAB) { } else if (dynsym && shdr.sh_type == SHT_SYMTAB) {
/* /*
* If we're building CTF against the dynsym, * If we're building CTF against the dynsym,
* we'll rip out the symtab so debuggers aren't * we'll rip out the symtab so debuggers aren't
@ -573,31 +567,11 @@ write_file(Elf *src, const char *srcname, Elf *dst, const char *dstname,
elfterminate(srcname, "Can't find string at %u", elfterminate(srcname, "Can't find string at %u",
shdr.sh_name); shdr.sh_name);
} }
#if !defined(sun)
if (gelf_update_shdr(dscn, &shdr) == 0)
elfterminate(dstname, "Cannot update sect %s", sname);
#endif
if ((sdata = elf_getdata(sscn, NULL)) == NULL) if ((sdata = elf_getdata(sscn, NULL)) == NULL)
elfterminate(srcname, "Cannot get sect %s data", sname); elfterminate(srcname, "Cannot get sect %s data", sname);
if ((ddata = elf_newdata(dscn)) == NULL) if ((ddata = elf_newdata(dscn)) == NULL)
elfterminate(dstname, "Can't make sect %s data", sname); elfterminate(dstname, "Can't make sect %s data", sname);
#if defined(sun)
bcopy(sdata, ddata, sizeof (Elf_Data)); bcopy(sdata, ddata, sizeof (Elf_Data));
#else
/*
* FreeBSD's Elf_Data has private fields which the
* elf_* routines manage. Simply copying the
* entire structure corrupts the data. So we need
* to copy the public fields explictly.
*/
ddata->d_align = sdata->d_align;
ddata->d_off = sdata->d_off;
ddata->d_size = sdata->d_size;
ddata->d_type = sdata->d_type;
ddata->d_version = sdata->d_version;
#endif
if (srcidx == sehdr.e_shstrndx) { if (srcidx == sehdr.e_shstrndx) {
char seclen = strlen(CTF_ELF_SCN_NAME); char seclen = strlen(CTF_ELF_SCN_NAME);
@ -627,8 +601,7 @@ write_file(Elf *src, const char *srcname, Elf *dst, const char *dstname,
GElf_Sym sym; GElf_Sym sym;
short newscn; short newscn;
if (gelf_getsym(ddata, i, &sym) == NULL) (void) gelf_getsym(ddata, i, &sym);
printf("Could not get symbol %d\n",i);
if (sym.st_shndx >= SHN_LORESERVE) if (sym.st_shndx >= SHN_LORESERVE)
continue; continue;
@ -643,14 +616,7 @@ write_file(Elf *src, const char *srcname, Elf *dst, const char *dstname,
} }
} }
#if !defined(sun) if (gelf_update_shdr(dscn, &shdr) == NULL)
if (ddata->d_buf == NULL) {
ddata->d_buf = xmalloc(shdr.sh_size);
bcopy(sdata->d_buf, ddata->d_buf, shdr.sh_size);
}
#endif
if (gelf_update_shdr(dscn, &shdr) == 0)
elfterminate(dstname, "Cannot update sect %s", sname); elfterminate(dstname, "Cannot update sect %s", sname);
new_offset = (off_t)shdr.sh_offset; new_offset = (off_t)shdr.sh_offset;
@ -685,7 +651,6 @@ write_file(Elf *src, const char *srcname, Elf *dst, const char *dstname,
ddata->d_buf = ctfdata; ddata->d_buf = ctfdata;
ddata->d_size = ctfsize; ddata->d_size = ctfsize;
ddata->d_align = shdr.sh_addralign; ddata->d_align = shdr.sh_addralign;
ddata->d_off = 0;
gelf_update_shdr(dscn, &shdr); gelf_update_shdr(dscn, &shdr);

View File

@ -76,11 +76,12 @@ static char *tdefdecl(char *cp, int h, tdesc_t **rtdp);
static char *intrinsic(char *cp, tdesc_t **rtdp); static char *intrinsic(char *cp, tdesc_t **rtdp);
static char *arraydef(char *cp, tdesc_t **rtdp); static char *arraydef(char *cp, tdesc_t **rtdp);
extern int debug_level;
int debug_parse = DEBUG_PARSE; int debug_parse = DEBUG_PARSE;
/*PRINTFLIKE3*/ /*PRINTFLIKE3*/
static void static void
parse_debug(int level, char *cp, const char *fmt, ...) parse_debug(int level, char *cp, char *fmt, ...)
{ {
va_list ap; va_list ap;
char buf[1024]; char buf[1024];
@ -112,9 +113,9 @@ parse_debug(int level, char *cp, const char *fmt, ...)
/* Report unexpected syntax in stabs. */ /* Report unexpected syntax in stabs. */
static void static void
_expected( _expected(
const char *who, /* what function, or part thereof, is reporting */ char *who, /* what function, or part thereof, is reporting */
const char *what, /* what was expected */ char *what, /* what was expected */
const char *where, /* where we were in the line of input */ char *where, /* where we were in the line of input */
int line) int line)
{ {
fprintf(stderr, "%s, expecting \"%s\" at \"%s\"\n", who, what, where); fprintf(stderr, "%s, expecting \"%s\" at \"%s\"\n", who, what, where);
@ -125,7 +126,7 @@ _expected(
/*ARGSUSED*/ /*ARGSUSED*/
void void
parse_init(tdata_t *td __unused) parse_init(tdata_t *td)
{ {
int i; int i;
@ -158,7 +159,7 @@ unres_new(int tid)
return (tdp); return (tdp);
} }
static char * char *
read_tid(char *cp, tdesc_t **tdpp) read_tid(char *cp, tdesc_t **tdpp)
{ {
tdesc_t *tdp; tdesc_t *tdp;
@ -189,7 +190,7 @@ read_tid(char *cp, tdesc_t **tdpp)
static iitype_t static iitype_t
parse_fun(char *cp, iidesc_t *ii) parse_fun(char *cp, iidesc_t *ii)
{ {
iitype_t iitype = 0; iitype_t iitype;
tdesc_t *tdp; tdesc_t *tdp;
tdesc_t **args = NULL; tdesc_t **args = NULL;
int nargs = 0; int nargs = 0;
@ -249,7 +250,7 @@ static iitype_t
parse_sym(char *cp, iidesc_t *ii) parse_sym(char *cp, iidesc_t *ii)
{ {
tdesc_t *tdp; tdesc_t *tdp;
iitype_t iitype = 0; iitype_t iitype;
/* /*
* name:G global variable * name:G global variable
@ -1037,14 +1038,14 @@ enumdef(char *cp, tdesc_t **rtdp)
} }
} }
static tdesc_t * tdesc_t *
lookup_name(tdesc_t **hash, const char *name1) lookup_name(tdesc_t **hash, const char *name)
{ {
int bucket = compute_sum(name1); int bucket = compute_sum(name);
tdesc_t *tdp, *ttdp = NULL; tdesc_t *tdp, *ttdp = NULL;
for (tdp = hash[bucket]; tdp != NULL; tdp = tdp->t_next) { for (tdp = hash[bucket]; tdp != NULL; tdp = tdp->t_next) {
if (tdp->t_name != NULL && strcmp(tdp->t_name, name1) == 0) { if (tdp->t_name != NULL && strcmp(tdp->t_name, name) == 0) {
if (tdp->t_type == STRUCT || tdp->t_type == UNION || if (tdp->t_type == STRUCT || tdp->t_type == UNION ||
tdp->t_type == ENUM || tdp->t_type == INTRINSIC) tdp->t_type == ENUM || tdp->t_type == INTRINSIC)
return (tdp); return (tdp);
@ -1056,9 +1057,9 @@ lookup_name(tdesc_t **hash, const char *name1)
} }
tdesc_t * tdesc_t *
lookupname(const char *name1) lookupname(const char *name)
{ {
return (lookup_name(name_table, name1)); return (lookup_name(name_table, name));
} }
/* /*
@ -1150,9 +1151,8 @@ check_hash(void)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
resolve_typed_bitfields_cb(void *arg, void *private __unused) resolve_typed_bitfields_cb(mlist_t *ml, void *private)
{ {
mlist_t *ml = arg;
tdesc_t *tdp = ml->ml_type; tdesc_t *tdp = ml->ml_type;
debug(3, "Resolving typed bitfields (member %s)\n", debug(3, "Resolving typed bitfields (member %s)\n",
@ -1194,5 +1194,5 @@ void
resolve_typed_bitfields(void) resolve_typed_bitfields(void)
{ {
(void) list_iter(typedbitfldmems, (void) list_iter(typedbitfldmems,
resolve_typed_bitfields_cb, NULL); (int (*)())resolve_typed_bitfields_cb, NULL);
} }

View File

@ -47,7 +47,7 @@
#include "memory.h" #include "memory.h"
#include "traverse.h" #include "traverse.h"
char *curhdr; const char *curhdr;
/* /*
* The stabs generator will sometimes reference types before they've been * The stabs generator will sometimes reference types before they've been
@ -59,7 +59,7 @@ char *curhdr;
*/ */
/*ARGSUSED2*/ /*ARGSUSED2*/
static int static int
resolve_tou_node(tdesc_t *node, tdesc_t **nodep, void *private __unused) resolve_tou_node(tdesc_t *node, tdesc_t **nodep, void *private)
{ {
tdesc_t *new; tdesc_t *new;
@ -79,7 +79,7 @@ resolve_tou_node(tdesc_t *node, tdesc_t **nodep, void *private __unused)
/*ARGSUSED*/ /*ARGSUSED*/
static int static int
resolve_fwd_node(tdesc_t *node, tdesc_t **nodep, void *private __unused) resolve_fwd_node(tdesc_t *node, tdesc_t **nodep, void *private)
{ {
tdesc_t *new = lookupname(node->t_name); tdesc_t *new = lookupname(node->t_name);
@ -174,7 +174,7 @@ fnarg_free(iidesc_t *ii)
* assembled under an iidesc list. * assembled under an iidesc list.
*/ */
int int
stabs_read(tdata_t *td, Elf *elf, char *file) stabs_read(tdata_t *td, Elf *elf, const char *file)
{ {
Elf_Scn *scn; Elf_Scn *scn;
Elf_Data *data; Elf_Data *data;
@ -200,7 +200,7 @@ stabs_read(tdata_t *td, Elf *elf, char *file)
file_stack = stack_new(free); file_stack = stack_new(free);
stack_push(file_stack, file); stack_push(file_stack, (void *)file);
curhdr = file; curhdr = file;
debug(3, "Found stabs in %d, strings in %d\n", stabidx, stabstridx); debug(3, "Found stabs in %d, strings in %d\n", stabidx, stabstridx);
@ -255,7 +255,7 @@ stabs_read(tdata_t *td, Elf *elf, char *file)
if (stab->n_type == N_BINCL) { if (stab->n_type == N_BINCL) {
curhdr = xstrdup(str); curhdr = xstrdup(str);
stack_push(file_stack, curhdr); stack_push(file_stack, (void *)curhdr);
continue; continue;
} else if (stab->n_type == N_SO) { } else if (stab->n_type == N_SO) {
if (str[strlen(str) - 1] != '/') { if (str[strlen(str) - 1] != '/') {

View File

@ -205,7 +205,7 @@ strtab_size(const strtab_t *sp)
ssize_t ssize_t
strtab_write(const strtab_t *sp, strtab_write(const strtab_t *sp,
ssize_t (*func)(void *, size_t, void *), void *priv) ssize_t (*func)(const void *, size_t, void *), void *priv)
{ {
ssize_t res, total = 0; ssize_t res, total = 0;
ulong_t i; ulong_t i;

View File

@ -59,7 +59,7 @@ extern void strtab_destroy(strtab_t *);
extern size_t strtab_insert(strtab_t *, const char *); extern size_t strtab_insert(strtab_t *, const char *);
extern size_t strtab_size(const strtab_t *); extern size_t strtab_size(const strtab_t *);
extern ssize_t strtab_write(const strtab_t *, extern ssize_t strtab_write(const strtab_t *,
ssize_t (*)(void *, size_t, void *), void *); ssize_t (*)(const void *, size_t, void *), void *);
extern void strtab_print(const strtab_t *); extern void strtab_print(const strtab_t *);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -174,10 +174,9 @@ tdesc_namecmp(void *arg1, void *arg2)
return (!streq(tdp1->t_name, tdp2->t_name)); return (!streq(tdp1->t_name, tdp2->t_name));
} }
#if defined(sun)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int int
tdesc_print(void *data, void *private __unused) tdesc_print(void *data, void *private)
{ {
tdesc_t *tdp = data; tdesc_t *tdp = data;
@ -185,7 +184,6 @@ tdesc_print(void *data, void *private __unused)
return (1); return (1);
} }
#endif
static void static void
free_intr(tdesc_t *tdp) free_intr(tdesc_t *tdp)
@ -249,42 +247,39 @@ static void (*free_cbs[])(tdesc_t *) = {
}; };
/*ARGSUSED1*/ /*ARGSUSED1*/
static void static int
tdesc_free_cb(void *arg, void *private __unused) tdesc_free_cb(tdesc_t *tdp, void *private)
{ {
tdesc_t *tdp = arg;
if (tdp->t_name) if (tdp->t_name)
free(tdp->t_name); free(tdp->t_name);
if (free_cbs[tdp->t_type]) if (free_cbs[tdp->t_type])
free_cbs[tdp->t_type](tdp); free_cbs[tdp->t_type](tdp);
free(tdp); free(tdp);
return; return (1);
} }
void void
tdesc_free(tdesc_t *tdp) tdesc_free(tdesc_t *tdp)
{ {
tdesc_free_cb(tdp, NULL); (void) tdesc_free_cb(tdp, NULL);
} }
static int static int
tdata_label_cmp(void *arg1, void *arg2) tdata_label_cmp(labelent_t *le1, labelent_t *le2)
{ {
labelent_t *le1 = arg1;
labelent_t *le2 = arg2;
return (le1->le_idx - le2->le_idx); return (le1->le_idx - le2->le_idx);
} }
void void
tdata_label_add(tdata_t *td, const char *label, int idx) tdata_label_add(tdata_t *td, char *label, int idx)
{ {
labelent_t *le = xmalloc(sizeof (*le)); labelent_t *le = xmalloc(sizeof (*le));
le->le_name = xstrdup(label); le->le_name = xstrdup(label);
le->le_idx = (idx == -1 ? td->td_nextid - 1 : idx); le->le_idx = (idx == -1 ? td->td_nextid - 1 : idx);
slist_add(&td->td_labels, le, tdata_label_cmp); slist_add(&td->td_labels, le, (int (*)())tdata_label_cmp);
} }
static int static int
@ -309,10 +304,8 @@ tdata_label_top(tdata_t *td)
} }
static int static int
tdata_label_find_cb(void *arg1, void *arg2) tdata_label_find_cb(labelent_t *le, labelent_t *tmpl)
{ {
labelent_t *le = arg1;
labelent_t *tmpl = arg2;
return (streq(le->le_name, tmpl->le_name)); return (streq(le->le_name, tmpl->le_name));
} }
@ -330,7 +323,7 @@ tdata_label_find(tdata_t *td, char *label)
let.le_name = label; let.le_name = label;
if (!(ret = (labelent_t *)list_find(td->td_labels, &let, if (!(ret = (labelent_t *)list_find(td->td_labels, &let,
tdata_label_find_cb))) (int (*)())tdata_label_find_cb)))
return (-1); return (-1);
return (ret->le_idx); return (ret->le_idx);
@ -358,9 +351,8 @@ tdata_label_newmax(tdata_t *td, int newmax)
/*ARGSUSED1*/ /*ARGSUSED1*/
static void static void
tdata_label_free_cb(void *arg, void *private __unused) tdata_label_free_cb(labelent_t *le, void *private)
{ {
labelent_t *le = arg;
if (le->le_name) if (le->le_name)
free(le->le_name); free(le->le_name);
free(le); free(le);
@ -369,7 +361,7 @@ tdata_label_free_cb(void *arg, void *private __unused)
void void
tdata_label_free(tdata_t *td) tdata_label_free(tdata_t *td)
{ {
list_free(td->td_labels, tdata_label_free_cb, NULL); list_free(td->td_labels, (void (*)())tdata_label_free_cb, NULL);
td->td_labels = NULL; td->td_labels = NULL;
} }
@ -399,8 +391,8 @@ tdata_new(void)
void void
tdata_free(tdata_t *td) tdata_free(tdata_t *td)
{ {
hash_free(td->td_iihash, iidesc_free, NULL); hash_free(td->td_iihash, (void (*)())iidesc_free, NULL);
hash_free(td->td_layouthash, tdesc_free_cb, NULL); hash_free(td->td_layouthash, (void (*)())tdesc_free_cb, NULL);
hash_free(td->td_idhash, NULL, NULL); hash_free(td->td_idhash, NULL, NULL);
list_free(td->td_fwdlist, NULL, NULL); list_free(td->td_fwdlist, NULL, NULL);
@ -416,7 +408,7 @@ tdata_free(tdata_t *td)
/*ARGSUSED1*/ /*ARGSUSED1*/
static int static int
build_hashes(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private) build_hashes(tdesc_t *ctdp, tdesc_t **ctdpp, void *private)
{ {
tdata_t *td = private; tdata_t *td = private;
@ -473,7 +465,7 @@ tdata_merge(tdata_t *td1, tdata_t *td2)
td2->td_fwdlist = NULL; td2->td_fwdlist = NULL;
slist_merge(&td1->td_labels, td2->td_labels, slist_merge(&td1->td_labels, td2->td_labels,
tdata_label_cmp); (int (*)())tdata_label_cmp);
td2->td_labels = NULL; td2->td_labels = NULL;
/* free the td2 hashes (data is now part of td1) */ /* free the td2 hashes (data is now part of td1) */

View File

@ -37,8 +37,10 @@
#include "traverse.h" #include "traverse.h"
#include "memory.h" #include "memory.h"
int (*tddescenders[])(tdesc_t *, tdtrav_data_t *); int (*tddescenders[])();
tdtrav_cb_f tdnops[]; int (*tdnops[])();
int tdtraverse(tdesc_t *, tdesc_t **, tdtrav_data_t *);
void void
tdtrav_init(tdtrav_data_t *tdtd, int *vgenp, tdtrav_cb_f *firstops, tdtrav_init(tdtrav_data_t *tdtd, int *vgenp, tdtrav_cb_f *firstops,
@ -66,7 +68,7 @@ tdtrav_func(tdesc_t *this, tdtrav_data_t *tdtd)
if ((rc = tdtraverse(fn->fn_ret, &fn->fn_ret, tdtd)) < 0) if ((rc = tdtraverse(fn->fn_ret, &fn->fn_ret, tdtd)) < 0)
return (rc); return (rc);
for (i = 0; i < (int) fn->fn_nargs; i++) { for (i = 0; i < fn->fn_nargs; i++) {
if ((rc = tdtraverse(fn->fn_args[i], &fn->fn_args[i], if ((rc = tdtraverse(fn->fn_args[i], &fn->fn_args[i],
tdtd)) < 0) tdtd)) < 0)
return (rc); return (rc);
@ -104,7 +106,7 @@ tdtrav_su(tdesc_t *this, tdtrav_data_t *tdtd)
/*ARGSUSED*/ /*ARGSUSED*/
int int
tdtrav_assert(tdesc_t *node __unused, tdesc_t **nodep __unused, void *private __unused) tdtrav_assert(tdesc_t *node, tdesc_t **nodep, void *private)
{ {
assert(1 == 0); assert(1 == 0);
@ -149,7 +151,7 @@ int
tdtraverse(tdesc_t *this, tdesc_t **thisp, tdtrav_data_t *tdtd) tdtraverse(tdesc_t *this, tdesc_t **thisp, tdtrav_data_t *tdtd)
{ {
tdtrav_cb_f travcb; tdtrav_cb_f travcb;
int (*descender)(tdesc_t *, tdtrav_data_t *); int (*descender)();
int descend = 1; int descend = 1;
int rc; int rc;
@ -185,10 +187,8 @@ tdtraverse(tdesc_t *this, tdesc_t **thisp, tdtrav_data_t *tdtd)
} }
int int
iitraverse_td(void *arg1, void *arg2) iitraverse_td(iidesc_t *ii, tdtrav_data_t *tdtd)
{ {
iidesc_t *ii = arg1;
tdtrav_data_t *tdtd = arg2;
int i, rc; int i, rc;
if ((rc = tdtraverse(ii->ii_dtype, &ii->ii_dtype, tdtd)) < 0) if ((rc = tdtraverse(ii->ii_dtype, &ii->ii_dtype, tdtd)) < 0)
@ -222,5 +222,5 @@ iitraverse_hash(hash_t *iihash, int *vgenp, tdtrav_cb_f *firstops,
tdtrav_init(&tdtd, vgenp, firstops, preops, postops, private); tdtrav_init(&tdtd, vgenp, firstops, preops, postops, private);
return (hash_iter(iihash, iitraverse_td, &tdtd)); return (hash_iter(iihash, (int (*)())iitraverse_td, &tdtd));
} }

View File

@ -60,7 +60,7 @@ int iitraverse(iidesc_t *, int *, tdtrav_cb_f *, tdtrav_cb_f *, tdtrav_cb_f *,
void *); void *);
int iitraverse_hash(hash_t *, int *, tdtrav_cb_f *, tdtrav_cb_f *, int iitraverse_hash(hash_t *, int *, tdtrav_cb_f *, tdtrav_cb_f *,
tdtrav_cb_f *, void *); tdtrav_cb_f *, void *);
int iitraverse_td(void *, void *); int iitraverse_td(iidesc_t *ii, tdtrav_data_t *);
int tdtrav_assert(tdesc_t *, tdesc_t **, void *); int tdtrav_assert(tdesc_t *, tdesc_t **, void *);

View File

@ -43,7 +43,7 @@
#include "ctftools.h" #include "ctftools.h"
#include "memory.h" #include "memory.h"
static void (*terminate_cleanup)(void) = NULL; static void (*terminate_cleanup)() = NULL;
/* returns 1 if s1 == s2, 0 otherwise */ /* returns 1 if s1 == s2, 0 otherwise */
int int
@ -116,7 +116,7 @@ elf_ptrsz(Elf *elf)
/*PRINTFLIKE2*/ /*PRINTFLIKE2*/
static void static void
whine(const char *type, const char *format, va_list ap) whine(char *type, char *format, va_list ap)
{ {
int error = errno; int error = errno;
@ -128,14 +128,14 @@ whine(const char *type, const char *format, va_list ap)
} }
void void
set_terminate_cleanup(void (*cleanup)(void)) set_terminate_cleanup(void (*cleanup)())
{ {
terminate_cleanup = cleanup; terminate_cleanup = cleanup;
} }
/*PRINTFLIKE1*/ /*PRINTFLIKE1*/
void void
terminate(const char *format, ...) terminate(char *format, ...)
{ {
va_list ap; va_list ap;
@ -148,22 +148,12 @@ terminate(const char *format, ...)
if (getenv("CTF_ABORT_ON_TERMINATE") != NULL) if (getenv("CTF_ABORT_ON_TERMINATE") != NULL)
abort(); abort();
#if defined(__FreeBSD__)
/*
* For the time being just output the termination message, but don't
* return an exit status that would cause the build to fail. We need
* to get as much stuff built as possible before going back and
* figuring out what is wrong with certain files.
*/
exit(0);
#else
exit(1); exit(1);
#endif
} }
/*PRINTFLIKE1*/ /*PRINTFLIKE1*/
void void
aborterr(const char *format, ...) aborterr(char *format, ...)
{ {
va_list ap; va_list ap;
@ -171,16 +161,12 @@ aborterr(const char *format, ...)
whine("ERROR", format, ap); whine("ERROR", format, ap);
va_end(ap); va_end(ap);
#if defined(sun)
abort(); abort();
#else
exit(0);
#endif
} }
/*PRINTFLIKE1*/ /*PRINTFLIKE1*/
void void
warning(const char *format, ...) warning(char *format, ...)
{ {
va_list ap; va_list ap;
@ -194,7 +180,7 @@ warning(const char *format, ...)
/*PRINTFLIKE2*/ /*PRINTFLIKE2*/
void void
vadebug(int level, const char *format, va_list ap) vadebug(int level, char *format, va_list ap)
{ {
if (level > debug_level) if (level > debug_level)
return; return;
@ -206,7 +192,7 @@ vadebug(int level, const char *format, va_list ap)
/*PRINTFLIKE2*/ /*PRINTFLIKE2*/
void void
debug(int level, const char *format, ...) debug(int level, char *format, ...)
{ {
va_list ap; va_list ap;
@ -248,36 +234,3 @@ tdesc_name(tdesc_t *tdp)
{ {
return (tdp->t_name == NULL ? "(anon)" : tdp->t_name); return (tdp->t_name == NULL ? "(anon)" : tdp->t_name);
} }
char *watch_address = NULL;
int watch_length = 0;
void
watch_set(void *addr, int len)
{
watch_address = addr;
watch_length = len;
}
void
watch_dump(int v)
{
char *p = watch_address;
int i;
if (watch_address == NULL || watch_length == 0)
return;
printf("%d: watch %p len %d\n",v,watch_address,watch_length);
for (i = 0; i < watch_length; i++) {
if (*p >= 0x20 && *p < 0x7f) {
printf(" %c",*p++ & 0xff);
} else {
printf(" %02x",*p++ & 0xff);
}
}
printf("\n");
}

View File

@ -203,8 +203,9 @@ print_header(const ctf_header_t *hp, const ctf_data_t *cd)
static int static int
print_labeltable(const ctf_header_t *hp, const ctf_data_t *cd) print_labeltable(const ctf_header_t *hp, const ctf_data_t *cd)
{ {
void *v = (void *) (cd->cd_ctfdata + hp->cth_lbloff); /* LINTED - pointer alignment */
const ctf_lblent_t *ctl = v; const ctf_lblent_t *ctl = (ctf_lblent_t *)(cd->cd_ctfdata +
hp->cth_lbloff);
ulong_t i, n = (hp->cth_objtoff - hp->cth_lbloff) / sizeof (*ctl); ulong_t i, n = (hp->cth_objtoff - hp->cth_lbloff) / sizeof (*ctl);
print_line("- Label Table "); print_line("- Label Table ");
@ -266,8 +267,8 @@ next_sym(const ctf_data_t *cd, const int symidx, const uchar_t matchtype,
static int static int
read_data(const ctf_header_t *hp, const ctf_data_t *cd) read_data(const ctf_header_t *hp, const ctf_data_t *cd)
{ {
void *v = (void *) (cd->cd_ctfdata + hp->cth_objtoff); /* LINTED - pointer alignment */
const ushort_t *idp = v; const ushort_t *idp = (ushort_t *)(cd->cd_ctfdata + hp->cth_objtoff);
ulong_t n = (hp->cth_funcoff - hp->cth_objtoff) / sizeof (ushort_t); ulong_t n = (hp->cth_funcoff - hp->cth_objtoff) / sizeof (ushort_t);
if (flags != F_STATS) if (flags != F_STATS)
@ -286,7 +287,7 @@ read_data(const ctf_header_t *hp, const ctf_data_t *cd)
int symidx, len, i; int symidx, len, i;
char *name = NULL; char *name = NULL;
for (symidx = -1, i = 0; i < (int) n; i++) { for (symidx = -1, i = 0; i < n; i++) {
int nextsym; int nextsym;
if (cd->cd_symdata == NULL || (nextsym = next_sym(cd, if (cd->cd_symdata == NULL || (nextsym = next_sym(cd,
@ -310,11 +311,11 @@ read_data(const ctf_header_t *hp, const ctf_data_t *cd)
static int static int
read_funcs(const ctf_header_t *hp, const ctf_data_t *cd) read_funcs(const ctf_header_t *hp, const ctf_data_t *cd)
{ {
void *v = (void *) (cd->cd_ctfdata + hp->cth_funcoff); /* LINTED - pointer alignment */
const ushort_t *fp = v; const ushort_t *fp = (ushort_t *)(cd->cd_ctfdata + hp->cth_funcoff);
v = (void *) (cd->cd_ctfdata + hp->cth_typeoff); /* LINTED - pointer alignment */
const ushort_t *end = v; const ushort_t *end = (ushort_t *)(cd->cd_ctfdata + hp->cth_typeoff);
ulong_t id; ulong_t id;
int symidx; int symidx;
@ -387,11 +388,11 @@ read_funcs(const ctf_header_t *hp, const ctf_data_t *cd)
static int static int
read_types(const ctf_header_t *hp, const ctf_data_t *cd) read_types(const ctf_header_t *hp, const ctf_data_t *cd)
{ {
void *v = (void *) (cd->cd_ctfdata + hp->cth_typeoff); /* LINTED - pointer alignment */
const ctf_type_t *tp = v; const ctf_type_t *tp = (ctf_type_t *)(cd->cd_ctfdata + hp->cth_typeoff);
v = (void *) (cd->cd_ctfdata + hp->cth_stroff); /* LINTED - pointer alignment */
const ctf_type_t *end = v; const ctf_type_t *end = (ctf_type_t *)(cd->cd_ctfdata + hp->cth_stroff);
ulong_t id; ulong_t id;
@ -418,7 +419,7 @@ read_types(const ctf_header_t *hp, const ctf_data_t *cd)
union { union {
const void *ptr; const void *ptr;
ctf_array_t *ap; const ctf_array_t *ap;
const ctf_member_t *mp; const ctf_member_t *mp;
const ctf_lmember_t *lmp; const ctf_lmember_t *lmp;
const ctf_enum_t *ep; const ctf_enum_t *ep;
@ -438,7 +439,7 @@ read_types(const ctf_header_t *hp, const ctf_data_t *cd)
increment = sizeof (ctf_stype_t); increment = sizeof (ctf_stype_t);
size = tp->ctt_size; size = tp->ctt_size;
} }
u.ptr = (const char *)tp + increment; u.ptr = (caddr_t)tp + increment;
switch (kind) { switch (kind) {
case CTF_K_INTEGER: case CTF_K_INTEGER:
@ -526,7 +527,7 @@ read_types(const ctf_header_t *hp, const ctf_data_t *cd)
} }
if (flags != F_STATS) { if (flags != F_STATS) {
(void) printf(" %s (%zd bytes)\n", (void) printf(" %s (%d bytes)\n",
ref_to_str(tp->ctt_name, hp, cd), size); ref_to_str(tp->ctt_name, hp, cd), size);
if (size >= CTF_LSTRUCT_THRESH) { if (size >= CTF_LSTRUCT_THRESH) {
@ -535,7 +536,6 @@ read_types(const ctf_header_t *hp, const ctf_data_t *cd)
"\t%s type=%u off=%llu\n", "\t%s type=%u off=%llu\n",
ref_to_str(u.lmp->ctlm_name, ref_to_str(u.lmp->ctlm_name,
hp, cd), u.lmp->ctlm_type, hp, cd), u.lmp->ctlm_type,
(unsigned long long)
CTF_LMEM_OFFSET(u.lmp)); CTF_LMEM_OFFSET(u.lmp));
} }
} else { } else {
@ -785,7 +785,7 @@ print_usage(FILE *fp, int verbose)
} }
static Elf_Scn * static Elf_Scn *
findelfscn(Elf *elf, GElf_Ehdr *ehdr, const char *secname) findelfscn(Elf *elf, GElf_Ehdr *ehdr, char *secname)
{ {
GElf_Shdr shdr; GElf_Shdr shdr;
Elf_Scn *scn; Elf_Scn *scn;
@ -811,7 +811,7 @@ main(int argc, char *argv[])
ctf_data_t cd; ctf_data_t cd;
const ctf_preamble_t *pp; const ctf_preamble_t *pp;
ctf_header_t *hp = NULL; ctf_header_t *hp;
Elf *elf; Elf *elf;
GElf_Ehdr ehdr; GElf_Ehdr ehdr;
@ -871,7 +871,7 @@ main(int argc, char *argv[])
if ((elf = elf_begin(fd, ELF_C_READ, NULL)) != NULL && if ((elf = elf_begin(fd, ELF_C_READ, NULL)) != NULL &&
gelf_getehdr(elf, &ehdr) != NULL) { gelf_getehdr(elf, &ehdr) != NULL) {
Elf_Data *dp = NULL; Elf_Data *dp;
Elf_Scn *ctfscn = findelfscn(elf, &ehdr, ".SUNW_ctf"); Elf_Scn *ctfscn = findelfscn(elf, &ehdr, ".SUNW_ctf");
Elf_Scn *symscn; Elf_Scn *symscn;
GElf_Shdr ctfshdr; GElf_Shdr ctfshdr;
@ -929,15 +929,15 @@ main(int argc, char *argv[])
if (cd.cd_ctflen < sizeof (ctf_preamble_t)) if (cd.cd_ctflen < sizeof (ctf_preamble_t))
die("%s does not contain a CTF preamble\n", filename); die("%s does not contain a CTF preamble\n", filename);
void *v = (void *) cd.cd_ctfdata; /* LINTED - pointer alignment */
pp = v; pp = (const ctf_preamble_t *)cd.cd_ctfdata;
if (pp->ctp_magic != CTF_MAGIC) if (pp->ctp_magic != CTF_MAGIC)
die("%s does not appear to contain CTF data\n", filename); die("%s does not appear to contain CTF data\n", filename);
if (pp->ctp_version == CTF_VERSION) { if (pp->ctp_version == CTF_VERSION) {
v = (void *) cd.cd_ctfdata; /* LINTED - pointer alignment */
hp = v; hp = (ctf_header_t *)cd.cd_ctfdata;
cd.cd_ctfdata = (caddr_t)cd.cd_ctfdata + sizeof (ctf_header_t); cd.cd_ctfdata = (caddr_t)cd.cd_ctfdata + sizeof (ctf_header_t);
if (cd.cd_ctflen < sizeof (ctf_header_t)) { if (cd.cd_ctflen < sizeof (ctf_header_t)) {
@ -1012,7 +1012,7 @@ main(int argc, char *argv[])
if ((ufd = open(ufile, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0 || if ((ufd = open(ufile, O_WRONLY|O_CREAT|O_TRUNC, 0666)) < 0 ||
write(ufd, &h, sizeof (h)) != sizeof (h) || write(ufd, &h, sizeof (h)) != sizeof (h) ||
write(ufd, cd.cd_ctfdata, cd.cd_ctflen) != (int) cd.cd_ctflen) { write(ufd, cd.cd_ctfdata, cd.cd_ctflen) != cd.cd_ctflen) {
warn("failed to write CTF data to '%s'", ufile); warn("failed to write CTF data to '%s'", ufile);
error |= E_ERROR; error |= E_ERROR;
} }