Lines Matching +full:smi +full:- +full:based

29 #pragma ident	"%Z%%M%	%I%	%E% SMI"
63 dt_idsig_t *isp = idp->di_data;
69 iskey = idp->di_kind == DT_IDENT_ARRAY || idp->di_kind == DT_IDENT_AGG;
71 if (isp->dis_varargs >= 0) {
72 mismatch = argc < isp->dis_varargs;
73 arglimit = isp->dis_varargs;
74 } else if (isp->dis_optargs >= 0) {
75 mismatch = (argc < isp->dis_optargs || argc > isp->dis_argc);
78 mismatch = argc != isp->dis_argc;
79 arglimit = isp->dis_argc;
84 "passed, %s%d expected\n", prefix, idp->di_name, suffix,
86 isp->dis_optargs >= 0 ? "at least " : "",
87 isp->dis_optargs >= 0 ? isp->dis_optargs : arglimit);
90 for (i = 0; i < arglimit; i++, args = args->dn_list) {
91 if (isp->dis_args[i].dn_ctfp != NULL)
92 compat = dt_node_is_argcompat(&isp->dis_args[i], args);
100 prefix, idp->di_name, suffix,
102 dt_node_type_name(&isp->dis_args[i], n1,
109 dt_node_type_assign(dnp, idp->di_ctfp, idp->di_type, B_FALSE);
114 * cooking this array, create its signature based on the argument list.
120 if (idp->di_data == NULL) {
121 dt_idsig_t *isp = idp->di_data = malloc(sizeof (dt_idsig_t));
126 longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
128 isp->dis_varargs = -1;
129 isp->dis_optargs = -1;
130 isp->dis_argc = argc;
131 isp->dis_args = NULL;
132 isp->dis_auxinfo = 0;
134 if (argc != 0 && (isp->dis_args = calloc(argc,
136 idp->di_data = NULL;
138 longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
146 * based on the result type of the first assignment statement.
148 if (!(idp->di_flags & DT_IDFLG_DECL)) {
149 idp->di_ctfp = DT_DYN_CTFP(yypcb->pcb_hdl);
150 idp->di_type = DT_DYN_TYPE(yypcb->pcb_hdl);
153 for (i = 0; i < argc; i++, args = args->dn_list) {
158 dt_idkind_name(idp->di_kind), i + 1);
161 dt_node_type_propagate(args, &isp->dis_args[i]);
162 isp->dis_args[i].dn_list = &isp->dis_args[i + 1];
166 isp->dis_args[argc - 1].dn_list = NULL;
168 dt_node_type_assign(dnp, idp->di_ctfp, idp->di_type, B_FALSE);
172 idp->di_kind == DT_IDENT_AGG ? "@" : "", "[ ]");
178 * identifier, create its type signature based on predefined prototype stored
184 if (idp->di_data == NULL) {
185 dtrace_hdl_t *dtp = yypcb->pcb_hdl;
191 assert(idp->di_iarg != NULL);
192 s = alloca(strlen(idp->di_iarg) + 1);
193 (void) strcpy(s, idp->di_iarg);
203 "for built-in function %s\n", idp->di_name);
223 if ((isp = idp->di_data = malloc(sizeof (dt_idsig_t))) == NULL)
224 longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
226 isp->dis_varargs = -1;
227 isp->dis_optargs = -1;
228 isp->dis_argc = i;
229 isp->dis_args = NULL;
230 isp->dis_auxinfo = 0;
232 if (i != 0 && (isp->dis_args = calloc(i,
234 idp->di_data = NULL;
236 longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
239 if (dt_type_lookup(s, &dtt) == -1) {
241 " %s\n", idp->di_name, s,
245 if (idp->di_kind == DT_IDENT_AGGFUNC) {
246 idp->di_ctfp = DT_DYN_CTFP(dtp);
247 idp->di_type = DT_DYN_TYPE(dtp);
249 idp->di_ctfp = dtt.dtt_ctfp;
250 idp->di_type = dtt.dtt_type;
254 * For each comma-delimited parameter in the prototype string,
266 * optional arguments may not follow varargs, and non-optional
269 for (i = 0; i < isp->dis_argc; i++, p1 = p2) {
279 isp->dis_args[i].dn_ctfp = NULL;
280 isp->dis_args[i].dn_type = CTF_ERR;
282 isp->dis_varargs = i;
286 if (*p1 == '[' && p1[strlen(p1) - 1] == ']') {
287 if (isp->dis_varargs != -1) {
290 i + 1, isp->dis_varargs + 1);
293 if (isp->dis_optargs == -1)
294 isp->dis_optargs = i;
296 p1[strlen(p1) - 1] = '\0';
298 } else if (isp->dis_optargs != -1) {
301 isp->dis_optargs + 1);
304 if (dt_type_lookup(p1, &dtt) == -1) {
306 "%s arg#%d (%s): %s\n", idp->di_name, i + 1,
310 dt_node_type_assign(&isp->dis_args[i],
326 dtrace_hdl_t *dtp = yypcb->pcb_hdl;
327 dt_probe_t *prp = yypcb->pcb_probe;
338 "passed, 1 expected\n", idp->di_name, argc,
342 if (ap->dn_kind != DT_NODE_INT) {
345 idp->di_name, "integer constant",
346 dt_type_name(ap->dn_ctfp, ap->dn_type, n1, sizeof (n1)));
349 if (yypcb->pcb_pdesc == NULL) {
351 "of a probe clause\n", idp->di_name);
357 "matches an unstable set of probes\n", idp->di_name,
358 dtrace_desc2str(yypcb->pcb_pdesc, n1, sizeof (n1)));
361 if (ap->dn_value >= prp->pr_argc) {
363 (longlong_t)ap->dn_value, dtrace_desc2str(yypcb->pcb_pdesc,
364 n1, sizeof (n1)), idp->di_name);
374 xnp = prp->pr_xargv[ap->dn_value];
375 nnp = prp->pr_nargv[prp->pr_mapping[ap->dn_value]];
377 if (xnp->dn_type == CTF_ERR) {
379 "%s[%lld]\n", idp->di_name, (longlong_t)ap->dn_value);
382 if (nnp->dn_type == CTF_ERR) {
384 "%s[%lld]\n", idp->di_name, (longlong_t)ap->dn_value);
387 if (dtp->dt_xlatemode == DT_XL_STATIC && (
389 dnp->dn_ident = dt_ident_create(idp->di_name, idp->di_kind,
390 idp->di_flags | DT_IDFLG_ORPHAN, idp->di_id, idp->di_attr,
391 idp->di_vers, idp->di_ops, idp->di_iarg, idp->di_gen);
393 if (dnp->dn_ident == NULL)
394 longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
397 prp->pr_argv[ap->dn_value].dtt_ctfp,
398 prp->pr_argv[ap->dn_value].dtt_type,
399 prp->pr_argv[ap->dn_value].dtt_flags & DTT_FL_USER ?
404 dxp = dt_xlator_lookup(dtp, dt_probe_tag(prp, ap->dn_value, &tag),
407 xidp = dt_xlator_ident(dxp, xnp->dn_ctfp, xnp->dn_type);
409 dnp->dn_ident = dt_ident_create(idp->di_name, xidp->di_kind,
410 xidp->di_flags | DT_IDFLG_ORPHAN, idp->di_id, idp->di_attr,
411 idp->di_vers, idp->di_ops, idp->di_iarg, idp->di_gen);
413 if (dnp->dn_ident == NULL)
414 longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
417 dxp->dx_arg = (int)ap->dn_value;
424 dnp->dn_ident->di_data = xidp->di_data;
425 dnp->dn_ident->di_ctfp = xidp->di_ctfp;
426 dnp->dn_ident->di_type = xidp->di_type;
433 "is not defined\n", idp->di_name, (longlong_t)ap->dn_value,
438 assert(dnp->dn_ident->di_flags & DT_IDFLG_ORPHAN);
439 assert(dnp->dn_ident->di_id == idp->di_id);
446 dtrace_hdl_t *dtp = yypcb->pcb_hdl;
451 "passed, 1 expected\n", idp->di_name,
455 if (ap->dn_kind != DT_NODE_INT) {
458 idp->di_name, "integer constant",
459 dt_type_name(ap->dn_ctfp, ap->dn_type, n, sizeof (n)));
462 if ((ap->dn_flags & DT_NF_SIGNED) && (int64_t)ap->dn_value < 0) {
464 (longlong_t)ap->dn_value, idp->di_name);
467 if (dt_type_lookup("uint64_t", &dtt) == -1) {
469 idp->di_name, dtrace_errmsg(dtp, dtrace_errno(dtp)));
472 idp->di_ctfp = dtt.dtt_ctfp;
473 idp->di_type = dtt.dtt_type;
475 dt_node_type_assign(dnp, idp->di_ctfp, idp->di_type, B_FALSE);
482 if (idp->di_type == CTF_ERR) {
483 dtrace_hdl_t *dtp = yypcb->pcb_hdl;
486 if (dt_type_lookup(idp->di_iarg, &dtt) == -1) {
489 (const char *)idp->di_iarg, idp->di_name,
493 idp->di_ctfp = dtt.dtt_ctfp;
494 idp->di_type = dtt.dtt_type;
497 dt_node_type_assign(dnp, idp->di_ctfp, idp->di_type, B_FALSE);
504 if (idp->di_ctfp != NULL && idp->di_type != CTF_ERR)
505 dt_node_type_assign(dnp, idp->di_ctfp, idp->di_type, B_FALSE);
511 if (idp->di_kind == DT_IDENT_ARRAY)
520 if (idp->di_data != NULL)
521 free(((dt_idsig_t *)idp->di_data)->dis_args);
522 free(idp->di_data);
528 free(idp->di_data);
534 dt_idnode_t *inp = idp->di_iarg;
537 dt_node_link_free(&inp->din_list);
539 if (inp->din_hash != NULL)
540 dt_idhash_destroy(inp->din_hash);
542 free(inp->din_argv);
546 if (idp->di_kind == DT_IDENT_ARRAY)
562 if (idp->di_data != NULL)
563 dt_probe_destroy(idp->di_data);
569 return (ctf_type_size(idp->di_ctfp, idp->di_type));
630 const dt_ident_t *idp = dhp->dh_tmpl;
632 dhp->dh_tmpl = NULL; /* clear dh_tmpl first to avoid recursion */
633 dt_dprintf("populating %s idhash from %p\n", dhp->dh_name, (void *)idp);
635 for (; idp->di_name != NULL; idp++) {
636 if (dt_idhash_insert(dhp, idp->di_name,
637 idp->di_kind, idp->di_flags, idp->di_id, idp->di_attr,
638 idp->di_vers, idp->di_ops ? idp->di_ops : &dt_idops_thaw,
639 idp->di_iarg, 0) == NULL)
640 longjmp(yypcb->pcb_jmpbuf, EDT_NOMEM);
654 sizeof (dt_ident_t *) * (_dtrace_strbuckets - 1);
660 dhp->dh_name = name;
661 dhp->dh_tmpl = tmpl;
662 dhp->dh_nextid = min;
663 dhp->dh_minid = min;
664 dhp->dh_maxid = max;
665 dhp->dh_hashsz = _dtrace_strbuckets;
685 for (i = 0; i < dhp->dh_hashsz; i++) {
686 for (idp = dhp->dh_hash[i]; idp != NULL; idp = next) {
687 next = idp->di_next;
688 idp->di_ops->di_dtor(idp);
692 for (i = 0; i < dhp->dh_hashsz; i++) {
693 for (idp = dhp->dh_hash[i]; idp != NULL; idp = next) {
694 next = idp->di_next;
695 free(idp->di_name);
706 uint_t nextid = dhp->dh_minid;
710 for (i = 0; i < dhp->dh_hashsz; i++) {
711 for (idp = dhp->dh_hash[i]; idp != NULL; idp = idp->di_next) {
716 if (idp->di_kind == DT_IDENT_ARRAY ||
717 idp->di_kind == DT_IDENT_SCALAR ||
718 idp->di_kind == DT_IDENT_AGG)
719 nextid = MAX(nextid, idp->di_id + 1);
723 dhp->dh_nextid = nextid;
730 ulong_t h = dt_strtab_hash(name, &len) % dhp->dh_hashsz;
733 if (dhp->dh_tmpl != NULL)
736 for (idp = dhp->dh_hash[h]; idp != NULL; idp = idp->di_next) {
737 if (strcmp(idp->di_name, name) == 0)
747 if (dhp->dh_nextid >= dhp->dh_maxid)
748 return (-1); /* no more id's are free to allocate */
750 *p = dhp->dh_nextid++;
757 return (dhp->dh_nelems);
763 return (dhp->dh_name);
774 if (dhp->dh_tmpl != NULL)
783 h = dt_strtab_hash(name, NULL) % dhp->dh_hashsz;
784 idp->di_next = dhp->dh_hash[h];
786 dhp->dh_hash[h] = idp;
787 dhp->dh_nelems++;
789 if (dhp->dh_defer != NULL)
790 dhp->dh_defer(dhp, idp);
800 if (dhp->dh_tmpl != NULL)
803 h = dt_strtab_hash(idp->di_name, NULL) % dhp->dh_hashsz;
804 idp->di_next = dhp->dh_hash[h];
805 idp->di_flags &= ~DT_IDFLG_ORPHAN;
807 dhp->dh_hash[h] = idp;
808 dhp->dh_nelems++;
810 if (dhp->dh_defer != NULL)
811 dhp->dh_defer(dhp, idp);
818 ulong_t h = dt_strtab_hash(key->di_name, &len) % dhp->dh_hashsz;
819 dt_ident_t **pp = &dhp->dh_hash[h];
822 for (idp = dhp->dh_hash[h]; idp != NULL; idp = idp->di_next) {
826 pp = &idp->di_next;
830 *pp = idp->di_next;
832 assert(dhp->dh_nelems != 0);
833 dhp->dh_nelems--;
835 if (!(idp->di_flags & DT_IDFLG_ORPHAN))
845 if (lhs->di_id != rhs->di_id)
846 return ((int)(lhs->di_id - rhs->di_id));
848 return (strcmp(lhs->di_name, rhs->di_name));
859 if (dhp->dh_tmpl != NULL)
862 n = dhp->dh_nelems;
865 for (i = 0, j = 0; i < dhp->dh_hashsz; i++) {
866 for (idp = dhp->dh_hash[i]; idp != NULL; idp = idp->di_next)
870 qsort(ids, dhp->dh_nelems, sizeof (dt_ident_t *), dt_idhash_comp);
886 for (dhp = dt_list_prev(&sp->dids_list);
898 dt_list_append(&sp->dids_list, dhp);
904 assert(dt_list_prev(&sp->dids_list) == dhp);
905 dt_list_delete(&sp->dids_list, dhp);
922 idp->di_name = s;
923 idp->di_kind = kind;
924 idp->di_flags = flags;
925 idp->di_id = id;
926 idp->di_attr = attr;
927 idp->di_vers = vers;
928 idp->di_ops = ops;
929 idp->di_iarg = iarg;
930 idp->di_data = NULL;
931 idp->di_ctfp = NULL;
932 idp->di_type = CTF_ERR;
933 idp->di_next = NULL;
934 idp->di_gen = gen;
935 idp->di_lineno = yylineno;
947 idp->di_ops->di_dtor(idp);
948 free(idp->di_name);
956 idp->di_ops->di_dtor(idp);
957 idp->di_kind = kind;
958 idp->di_ops = ops;
959 idp->di_iarg = iarg;
960 idp->di_data = NULL;
973 for (argp = args; argp != NULL; argp = argp->dn_list)
976 idp->di_ops->di_cook(dnp, idp, argc, args);
978 if (idp->di_flags & DT_IDFLG_USER)
979 dnp->dn_flags |= DT_NF_USERLAND;
981 return (dt_attr_min(attr, idp->di_attr));
987 idp->di_ctfp = fp;
988 idp->di_type = type;
994 while (idp->di_flags & DT_IDFLG_INLINE) {
995 const dt_node_t *dnp = ((dt_idnode_t *)idp->di_iarg)->din_root;
1000 switch (dnp->dn_kind) {
1007 idp = dnp->dn_ident;
1012 idp = dnp->dn_ident;
1024 return (idp->di_ops->di_size(idp));
1030 return (idp->di_gen == yypcb->pcb_hdl->dt_gen &&
1031 (idp->di_flags & (DT_IDFLG_REF|DT_IDFLG_MOD|DT_IDFLG_DECL)) == 0);