Print this page
4474 DTrace Userland CTF Support
4475 DTrace userland Keyword
4476 DTrace tests should be better citizens
4479 pid provider types
4480 dof emulation missing checks
Reviewed by: Bryan Cantrill <bryan@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/common/ctf/ctf_types.c
          +++ new/usr/src/common/ctf/ctf_types.c
↓ open down ↓ 17 lines elided ↑ open up ↑
  18   18   * information: Portions Copyright [yyyy] [name of copyright owner]
  19   19   *
  20   20   * CDDL HEADER END
  21   21   */
  22   22  
  23   23  /*
  24   24   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  25   25   * Use is subject to license terms.
  26   26   */
  27   27  
  28      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  29      -
  30   28  #include <ctf_impl.h>
  31   29  
  32   30  ssize_t
  33   31  ctf_get_ctt_size(const ctf_file_t *fp, const ctf_type_t *tp, ssize_t *sizep,
  34   32      ssize_t *incrementp)
  35   33  {
  36   34          ssize_t size, increment;
  37   35  
  38   36          if (fp->ctf_version > CTF_VERSION_1 &&
  39   37              tp->ctt_size == CTF_LSIZE_SENT) {
↓ open down ↓ 152 lines elided ↑ open up ↑
 192  190                  }
 193  191          }
 194  192  
 195  193          return (CTF_ERR); /* errno is set for us */
 196  194  }
 197  195  
 198  196  /*
 199  197   * Lookup the given type ID and print a string name for it into buf.  Return
 200  198   * the actual number of bytes (not including \0) needed to format the name.
 201  199   */
 202      -ssize_t
 203      -ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
      200 +static ssize_t
      201 +ctf_type_qlname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len,
      202 +    const char *qname)
 204  203  {
 205  204          ctf_decl_t cd;
 206  205          ctf_decl_node_t *cdp;
 207  206          ctf_decl_prec_t prec, lp, rp;
 208  207          int ptr, arr;
 209  208          uint_t k;
 210  209  
 211  210          if (fp == NULL && type == CTF_ERR)
 212  211                  return (-1); /* simplify caller code by permitting CTF_ERR */
 213  212  
↓ open down ↓ 34 lines elided ↑ open up ↑
 248  247  
 249  248                          if (lp == prec) {
 250  249                                  ctf_decl_sprintf(&cd, "(");
 251  250                                  lp = -1;
 252  251                          }
 253  252  
 254  253                          switch (cdp->cd_kind) {
 255  254                          case CTF_K_INTEGER:
 256  255                          case CTF_K_FLOAT:
 257  256                          case CTF_K_TYPEDEF:
      257 +                                if (qname != NULL)
      258 +                                        ctf_decl_sprintf(&cd, "%s`", qname);
 258  259                                  ctf_decl_sprintf(&cd, "%s", name);
 259  260                                  break;
 260  261                          case CTF_K_POINTER:
 261  262                                  ctf_decl_sprintf(&cd, "*");
 262  263                                  break;
 263  264                          case CTF_K_ARRAY:
 264  265                                  ctf_decl_sprintf(&cd, "[%u]", cdp->cd_n);
 265  266                                  break;
 266  267                          case CTF_K_FUNCTION:
 267  268                                  ctf_decl_sprintf(&cd, "()");
 268  269                                  break;
 269  270                          case CTF_K_STRUCT:
 270  271                          case CTF_K_FORWARD:
 271      -                                ctf_decl_sprintf(&cd, "struct %s", name);
      272 +                                ctf_decl_sprintf(&cd, "struct ");
      273 +                                if (qname != NULL)
      274 +                                        ctf_decl_sprintf(&cd, "%s`", qname);
      275 +                                ctf_decl_sprintf(&cd, "%s", name);
 272  276                                  break;
 273  277                          case CTF_K_UNION:
 274      -                                ctf_decl_sprintf(&cd, "union %s", name);
      278 +                                ctf_decl_sprintf(&cd, "union ");
      279 +                                if (qname != NULL)
      280 +                                        ctf_decl_sprintf(&cd, "%s`", qname);
      281 +                                ctf_decl_sprintf(&cd, "%s", name);
 275  282                                  break;
 276  283                          case CTF_K_ENUM:
 277      -                                ctf_decl_sprintf(&cd, "enum %s", name);
      284 +                                ctf_decl_sprintf(&cd, "enum ");
      285 +                                if (qname != NULL)
      286 +                                        ctf_decl_sprintf(&cd, "%s`", qname);
      287 +                                ctf_decl_sprintf(&cd, "%s", name);
 278  288                                  break;
 279  289                          case CTF_K_VOLATILE:
 280  290                                  ctf_decl_sprintf(&cd, "volatile");
 281  291                                  break;
 282  292                          case CTF_K_CONST:
 283  293                                  ctf_decl_sprintf(&cd, "const");
 284  294                                  break;
 285  295                          case CTF_K_RESTRICT:
 286  296                                  ctf_decl_sprintf(&cd, "restrict");
 287  297                                  break;
↓ open down ↓ 6 lines elided ↑ open up ↑
 294  304                          ctf_decl_sprintf(&cd, ")");
 295  305          }
 296  306  
 297  307          if (cd.cd_len >= len)
 298  308                  (void) ctf_set_errno(fp, ECTF_NAMELEN);
 299  309  
 300  310          ctf_decl_fini(&cd);
 301  311          return (cd.cd_len);
 302  312  }
 303  313  
      314 +ssize_t
      315 +ctf_type_lname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
      316 +{
      317 +        return (ctf_type_qlname(fp, type, buf, len, NULL));
      318 +}
      319 +
 304  320  /*
 305  321   * Lookup the given type ID and print a string name for it into buf.  If buf
 306  322   * is too small, return NULL: the ECTF_NAMELEN error is set on 'fp' for us.
 307  323   */
 308  324  char *
 309  325  ctf_type_name(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len)
 310  326  {
 311      -        ssize_t rv = ctf_type_lname(fp, type, buf, len);
      327 +        ssize_t rv = ctf_type_qlname(fp, type, buf, len, NULL);
      328 +        return (rv >= 0 && rv < len ? buf : NULL);
      329 +}
      330 +
      331 +char *
      332 +ctf_type_qname(ctf_file_t *fp, ctf_id_t type, char *buf, size_t len,
      333 +    const char *qname)
      334 +{
      335 +        ssize_t rv = ctf_type_qlname(fp, type, buf, len, qname);
 312  336          return (rv >= 0 && rv < len ? buf : NULL);
 313  337  }
 314  338  
      339 +
 315  340  /*
 316  341   * Resolve the type down to a base type node, and then return the size
 317  342   * of the type storage in bytes.
 318  343   */
 319  344  ssize_t
 320  345  ctf_type_size(ctf_file_t *fp, ctf_id_t type)
 321  346  {
 322  347          const ctf_type_t *tp;
 323  348          ssize_t size;
 324  349          ctf_arinfo_t ar;
↓ open down ↓ 521 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX