Print this page
10823 should ignore DW_TAG_subprogram with DW_AT_declaration tags
10824 GCC7-derived CTF can double qualifiers on arrays
10825 ctfdump -c drops last type
10826 ctfdump -c goes off the rails with a missing parent
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Jason King <jason.king@joyent.com>
Approved by: Jerry Jelinek <jerry.jelinek@joyent.com>

Split Close
Expand all
Collapse all
          --- old/usr/src/common/ctf/ctf_lookup.c
          +++ new/usr/src/common/ctf/ctf_lookup.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"
       28 +/*
       29 + * Copyright 2019, Joyent, Inc.
       30 + */
  29   31  
  30   32  #include <sys/sysmacros.h>
  31   33  #include <ctf_impl.h>
  32   34  
  33   35  /*
  34   36   * Compare the given input string and length against a table of known C storage
  35   37   * qualifier keywords.  We just ignore these in ctf_lookup_by_name, below.  To
  36   38   * do this quickly, we use a pre-computed Perfect Hash Function similar to the
  37   39   * technique originally described in the classic paper:
  38   40   *
↓ open down ↓ 265 lines elided ↑ open up ↑
 304  306           * The argument data is two ushort_t's past the translation table
 305  307           * offset: one for the function info, and one for the return type.
 306  308           */
 307  309          dp = (ushort_t *)((uintptr_t)fp->ctf_buf + fp->ctf_sxlate[symidx]) + 2;
 308  310  
 309  311          for (argc = MIN(argc, f.ctc_argc); argc != 0; argc--)
 310  312                  *argv++ = *dp++;
 311  313  
 312  314          return (0);
 313  315  }
      316 +
      317 +/*
      318 + * Unlike the normal lookup routines, ctf_dyn_*() variants consult both the
      319 + * processed CTF contents of a ctf_file_t as well as the dynamic types in the
      320 + * dtdef list.
      321 + */
      322 +
      323 +const ctf_type_t *
      324 +ctf_dyn_lookup_by_id(ctf_file_t *fp, ctf_id_t id)
      325 +{
      326 +        ctf_file_t **fpp = &fp;
      327 +        const ctf_type_t *t;
      328 +        ctf_dtdef_t *dtd;
      329 +
      330 +        if ((t = ctf_lookup_by_id(fpp, id)) != NULL)
      331 +                return (t);
      332 +
      333 +        if ((dtd = ctf_dtd_lookup(fp, id)) == NULL)
      334 +                return (NULL);
      335 +
      336 +        return (&dtd->dtd_data);
      337 +}
      338 +
      339 +int
      340 +ctf_dyn_array_info(ctf_file_t *infp, ctf_id_t id, ctf_arinfo_t *arinfop)
      341 +{
      342 +        ctf_file_t *fp = infp;
      343 +        const ctf_type_t *t;
      344 +        ctf_dtdef_t *dtd;
      345 +
      346 +        if ((t = ctf_lookup_by_id(&fp, id)) != NULL) {
      347 +
      348 +                if (LCTF_INFO_KIND(fp, t->ctt_info) != CTF_K_ARRAY)
      349 +                        return (ctf_set_errno(infp, ECTF_NOTARRAY));
      350 +
      351 +                return (ctf_array_info(fp, id, arinfop));
      352 +        }
      353 +
      354 +        if ((dtd = ctf_dtd_lookup(fp, id)) == NULL)
      355 +                return (ctf_set_errno(infp, ENOENT));
      356 +
      357 +        if (LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
      358 +                return (ctf_set_errno(infp, ECTF_NOTARRAY));
      359 +
      360 +        bcopy(&dtd->dtd_u.dtu_arr, arinfop, sizeof (*arinfop));
      361 +        return (0);
      362 +}
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX