diff options
| author | Robert Mustacchi <rm@joyent.com> | 2015-07-27 00:35:52 +0000 | 
|---|---|---|
| committer | Robert Mustacchi <rm@joyent.com> | 2015-07-28 19:05:39 +0000 | 
| commit | 14c3d85bba96b10c225341f4c7f4af93c314b508 (patch) | |
| tree | 8ef3a2513e220291581564d4db16bd5b4fbf127e /usr/src/cmd/ctfdiff/ctfdiff.c | |
| parent | 9211d9b4c9ccc64292132e8e87c92ad6084b29a8 (diff) | |
| download | illumos-joyent-14c3d85bba96b10c225341f4c7f4af93c314b508.tar.gz | |
OS-4548 CTF Everywhere: Phase 1
OS-4549 ctfconvert should be implemented in terms of libctf
OS-4550 ctfconvert could convert multiple compilation units
OS-4553 want multi-threaded ctfmerge
OS-4552 Want general workq
OS-4551 Want general mergeq
OS-4554 ctfdiff doesn't properly handle unknown options
OS-4555 ctfdiff's symbols could be more consistently prefixed
OS-4048 new ctfmerge uses tmpfile after freeing it
OS-4556 ctfdump should drive on when incomplete files exist
OS-4557 ctf_add_encoded assigns() incorrect byte size to types
OS-4558 ctf_add_{struct,union,enum} can reuse forwards
OS-4559 ctf_add_{struct,union,enum} occasionally forget to dirty the ctf_file_t
OS-4560 ctf_add_member could better handle bitfields
OS-4561 ctf_type_size() reports wrong size for forwards
OS-4563 diffing CTF typedefs needs to walk multiple definitions
OS-4564 build scripts shouldn't hardcode CTF paths
OS-4565 ctf_fdcreate could be more flexible
OS-4566 Want libctf ctf_kind_name() function
OS-4567 Want libctf function to set struct/union size
OS-4568 Want ctfmerge altexec
Diffstat (limited to 'usr/src/cmd/ctfdiff/ctfdiff.c')
| -rw-r--r-- | usr/src/cmd/ctfdiff/ctfdiff.c | 76 | 
1 files changed, 43 insertions, 33 deletions
| diff --git a/usr/src/cmd/ctfdiff/ctfdiff.c b/usr/src/cmd/ctfdiff/ctfdiff.c index 2537c15bcb..8018761257 100644 --- a/usr/src/cmd/ctfdiff/ctfdiff.c +++ b/usr/src/cmd/ctfdiff/ctfdiff.c @@ -44,7 +44,7 @@ typedef enum ctf_diff_cmd {  typedef struct {  	int		dil_next;  	const char	**dil_labels; -} diff_label_t; +} ctfdiff_label_t;  static char *g_progname;  static const char *g_iname; @@ -78,7 +78,7 @@ ctfdiff_fatal(const char *fmt, ...)  }  static const char * -fp_to_name(ctf_file_t *fp) +ctfdiff_fp_to_name(ctf_file_t *fp)  {  	if (fp == g_ifp)  		return (g_iname); @@ -89,8 +89,8 @@ fp_to_name(ctf_file_t *fp)  /* ARGSUSED */  static void -diff_func_cb(ctf_file_t *ifp, ulong_t iidx, boolean_t similar, ctf_file_t *ofp, -    ulong_t oidx, void *arg) +ctfdiff_func_cb(ctf_file_t *ifp, ulong_t iidx, boolean_t similar, +    ctf_file_t *ofp, ulong_t oidx, void *arg)  {  	char namebuf[CTFDIFF_NAMELEN]; @@ -101,7 +101,7 @@ diff_func_cb(ctf_file_t *ifp, ulong_t iidx, boolean_t similar, ctf_file_t *ofp,  		if (g_nextfunc != 0)  			return;  		(void) printf("ctf container %s function %ld is different\n", -		    fp_to_name(ifp), iidx); +		    ctfdiff_fp_to_name(ifp), iidx);  	} else {  		if (g_nextfunc != 0) {  			int i; @@ -113,7 +113,7 @@ diff_func_cb(ctf_file_t *ifp, ulong_t iidx, boolean_t similar, ctf_file_t *ofp,  				return;  		}  		(void) printf("ctf container %s function %s (%ld) is " -		    "different\n", fp_to_name(ifp), namebuf, iidx); +		    "different\n", ctfdiff_fp_to_name(ifp), namebuf, iidx);  	}  	g_different = B_TRUE; @@ -121,7 +121,7 @@ diff_func_cb(ctf_file_t *ifp, ulong_t iidx, boolean_t similar, ctf_file_t *ofp,  /* ARGSUSED */  static void -diff_obj_cb(ctf_file_t *ifp, ulong_t iidx, ctf_id_t iid, boolean_t similar, +ctfdiff_obj_cb(ctf_file_t *ifp, ulong_t iidx, ctf_id_t iid, boolean_t similar,      ctf_file_t *ofp, ulong_t oidx, ctf_id_t oid, void *arg)  {  	char namebuf[CTFDIFF_NAMELEN]; @@ -133,7 +133,7 @@ diff_obj_cb(ctf_file_t *ifp, ulong_t iidx, ctf_id_t iid, boolean_t similar,  		if (g_nextobj != 0)  			return;  		(void) printf("ctf container %s object %ld is different\n", -		    fp_to_name(ifp), iidx); +		    ctfdiff_fp_to_name(ifp), iidx);  	} else {  		if (g_nextobj != 0) {  			int i; @@ -145,7 +145,7 @@ diff_obj_cb(ctf_file_t *ifp, ulong_t iidx, ctf_id_t iid, boolean_t similar,  				return;  		}  		(void) printf("ctf container %s object %s (%ld) is different\n", -		    fp_to_name(ifp), namebuf, iidx); +		    ctfdiff_fp_to_name(ifp), namebuf, iidx);  	}  	g_different = B_TRUE; @@ -153,7 +153,7 @@ diff_obj_cb(ctf_file_t *ifp, ulong_t iidx, ctf_id_t iid, boolean_t similar,  /* ARGSUSED */  static void -diff_cb(ctf_file_t *ifp, ctf_id_t iid, boolean_t similar, ctf_file_t *ofp, +ctfdiff_cb(ctf_file_t *ifp, ctf_id_t iid, boolean_t similar, ctf_file_t *ofp,      ctf_id_t oid, void *arg)  {  	if (similar == B_TRUE) @@ -173,7 +173,7 @@ diff_cb(ctf_file_t *ifp, ctf_id_t iid, boolean_t similar, ctf_file_t *ofp,  		    NULL) {  			ctfdiff_fatal("failed to obtain the name "  			    "of type %ld from %s: %s\n", -			    iid, fp_to_name(ifp), +			    iid, ctfdiff_fp_to_name(ifp),  			    ctf_errmsg(ctf_errno(ifp)));  		} @@ -192,12 +192,12 @@ diff_cb(ctf_file_t *ifp, ctf_id_t iid, boolean_t similar, ctf_file_t *ofp,  		return;  	(void) printf("ctf container %s type %ld is different\n", -	    fp_to_name(ifp), iid); +	    ctfdiff_fp_to_name(ifp), iid);  }  /* ARGSUSED */  static int -diff_labels_count(const char *name, const ctf_lblinfo_t *li, void *arg) +ctfdiff_labels_count(const char *name, const ctf_lblinfo_t *li, void *arg)  {  	uint32_t *count = arg;  	*count = *count + 1; @@ -207,9 +207,9 @@ diff_labels_count(const char *name, const ctf_lblinfo_t *li, void *arg)  /* ARGSUSED */  static int -diff_labels_fill(const char *name, const ctf_lblinfo_t *li, void *arg) +ctfdiff_labels_fill(const char *name, const ctf_lblinfo_t *li, void *arg)  { -	diff_label_t *dil = arg; +	ctfdiff_label_t *dil = arg;  	dil->dil_labels[dil->dil_next] = name;  	dil->dil_next++; @@ -218,24 +218,25 @@ diff_labels_fill(const char *name, const ctf_lblinfo_t *li, void *arg)  }  static int -diff_labels(ctf_file_t *ifp, ctf_file_t *ofp) +ctfdiff_labels(ctf_file_t *ifp, ctf_file_t *ofp)  {  	int ret;  	uint32_t nilabel, nolabel, i, j; -	diff_label_t idl, odl; +	ctfdiff_label_t idl, odl;  	const char **ilptr, **olptr;  	nilabel = nolabel = 0; -	ret = ctf_label_iter(ifp, diff_labels_count, &nilabel); +	ret = ctf_label_iter(ifp, ctfdiff_labels_count, &nilabel);  	if (ret == CTF_ERR)  		return (ret); -	ret = ctf_label_iter(ofp, diff_labels_count, &nolabel); +	ret = ctf_label_iter(ofp, ctfdiff_labels_count, &nolabel);  	if (ret == CTF_ERR)  		return (ret);  	if (nilabel != nolabel) {  		(void) printf("ctf container %s labels differ from ctf " -		    "container %s\n", fp_to_name(ifp), fp_to_name(ofp)); +		    "container %s\n", ctfdiff_fp_to_name(ifp), +		    ctfdiff_fp_to_name(ofp));  		g_different = B_TRUE;  		return (0);  	} @@ -255,9 +256,9 @@ diff_labels(ctf_file_t *ifp, ctf_file_t *ofp)  	odl.dil_next = 0;  	odl.dil_labels = olptr; -	if ((ret = ctf_label_iter(ifp, diff_labels_fill, &idl)) != 0) +	if ((ret = ctf_label_iter(ifp, ctfdiff_labels_fill, &idl)) != 0)  		goto out; -	if ((ret = ctf_label_iter(ofp, diff_labels_fill, &odl)) != 0) +	if ((ret = ctf_label_iter(ofp, ctfdiff_labels_fill, &odl)) != 0)  		goto out;  	for (i = 0; i < nilabel; i++) { @@ -268,7 +269,8 @@ diff_labels(ctf_file_t *ifp, ctf_file_t *ofp)  		if (j == nolabel) {  			(void) printf("ctf container %s labels differ from ctf " -			    "container %s\n", fp_to_name(ifp), fp_to_name(ofp)); +			    "container %s\n", ctfdiff_fp_to_name(ifp), +			    ctfdiff_fp_to_name(ofp));  			g_different = B_TRUE;  			break;  		} @@ -282,7 +284,7 @@ out:  }  static void -diff_usage(const char *fmt, ...) +ctfdiff_usage(const char *fmt, ...)  {  	if (fmt != NULL) {  		va_list ap; @@ -324,7 +326,7 @@ main(int argc, char *argv[])  	g_progname = basename(argv[0]); -	while ((c = getopt(argc, argv, "aqtfolIp:F:O:P:T:")) != -1) { +	while ((c = getopt(argc, argv, ":aqtfolIp:F:O:P:T:")) != -1) {  		switch (c) {  		case 'a':  			g_flag |= CTF_DIFF_ALL; @@ -417,6 +419,14 @@ main(int argc, char *argv[])  			}  			g_typelist[g_nexttype] = optarg;  			g_nexttype++; +			break; +		case ':': +			ctfdiff_usage("Option -%c requires an operand\n", +			    optopt); +			return (CTFDIFF_EXIT_USAGE); +		case '?': +			ctfdiff_usage("Unknown option: -%c\n", optopt); +			return (CTFDIFF_EXIT_USAGE);  		}  	} @@ -427,22 +437,22 @@ main(int argc, char *argv[])  		g_flag = CTF_DIFF_DEFAULT;  	if (argc != 3) { -		diff_usage(NULL); +		ctfdiff_usage(NULL);  		return (CTFDIFF_EXIT_USAGE);  	}  	if (g_nexttype != 0 && !(g_flag & CTF_DIFF_TYPES)) { -		diff_usage("-T cannot be used if not diffing types\n"); +		ctfdiff_usage("-T cannot be used if not diffing types\n");  		return (CTFDIFF_EXIT_USAGE);  	}  	if (g_nextfunc != 0 && !(g_flag & CTF_DIFF_FUNCS)) { -		diff_usage("-F cannot be used if not diffing functions\n"); +		ctfdiff_usage("-F cannot be used if not diffing functions\n");  		return (CTFDIFF_EXIT_USAGE);  	}  	if (g_nextobj != 0 && !(g_flag & CTF_DIFF_OBJS)) { -		diff_usage("-O cannot be used if not diffing objects\n"); +		ctfdiff_usage("-O cannot be used if not diffing objects\n");  		return (CTFDIFF_EXIT_USAGE);  	} @@ -489,13 +499,13 @@ main(int argc, char *argv[])  	err = 0;  	if ((g_flag & CTF_DIFF_TYPES) && err != CTF_ERR) -		err = ctf_diff_types(cdp, diff_cb, NULL); +		err = ctf_diff_types(cdp, ctfdiff_cb, NULL);  	if ((g_flag & CTF_DIFF_FUNCS) && err != CTF_ERR) -		err = ctf_diff_functions(cdp, diff_func_cb, NULL); +		err = ctf_diff_functions(cdp, ctfdiff_func_cb, NULL);  	if ((g_flag & CTF_DIFF_OBJS) && err != CTF_ERR) -		err = ctf_diff_objects(cdp, diff_obj_cb, NULL); +		err = ctf_diff_objects(cdp, ctfdiff_obj_cb, NULL);  	if ((g_flag & CTF_DIFF_LABEL) && err != CTF_ERR) -		err = diff_labels(ifp, ofp); +		err = ctfdiff_labels(ifp, ofp);  	ctf_diff_fini(cdp);  	if (err == CTF_ERR) { | 
