Print this page
6375 Add native name demangling support

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/dis/dis_util.c
          +++ new/usr/src/cmd/dis/dis_util.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
       25 + *
       26 + * Copyright 2017 Jason King.
  25   27   */
  26   28  
  27      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  28      -
  29   29  #include <dlfcn.h>
  30   30  #include <stdarg.h>
  31   31  #include <stdio.h>
  32   32  #include <stdlib.h>
  33   33  #include <demangle.h>
       34 +#include <sysdemangle.h>
  34   35  
  35   36  #include "dis_util.h"
  36   37  
  37   38  int g_error;    /* global process exit status, set when warn() is called */
  38   39  
  39   40  /*
  40   41   * Fatal error.  Print out the error with a leading "dis: ", and then exit the
  41   42   * program.
  42   43   */
  43   44  void
↓ open down ↓ 41 lines elided ↑ open up ↑
  85   86          void *ret;
  86   87  
  87   88          if ((ret = calloc(1, size)) == NULL)
  88   89                  die("Out of memory");
  89   90  
  90   91          return (ret);
  91   92  }
  92   93  
  93   94  
  94   95  /*
  95      - * Generic interface to demangle C++ names.  Calls cplus_demangle to do the
  96      - * necessary translation.  If the translation fails, the argument is returned
  97      - * unchanged.  The memory returned is only valid until the next call to
  98      - * demangle().
  99      - *
 100      - * We dlopen() libdemangle.so rather than linking directly against it in case it
 101      - * is not installed on the system.
       96 + * Since -C flag explicitly says C++, for now at least, force language to
       97 + * C++
 102   98   */
 103   99  const char *
 104  100  dis_demangle(const char *name)
 105  101  {
 106      -        static char *demangled_name;
 107      -        static int (*demangle_func)() = NULL;
 108      -        static int size = BUFSIZE;
 109      -        static int first_flag = 0;
 110      -        int ret;
      102 +        static char *demangled_name = NULL;
 111  103  
 112      -        /*
 113      -         * If this is the first call, allocate storage
 114      -         * for the buffer.
 115      -         */
 116      -        if (first_flag == 0) {
 117      -                void *demangle_hand;
 118      -
 119      -                demangle_hand = dlopen("libdemangle.so.1", RTLD_LAZY);
 120      -                if (demangle_hand != NULL)
 121      -                        demangle_func = (int (*)(int))dlsym(
 122      -                                demangle_hand, "cplus_demangle");
 123      -
 124      -                demangled_name = safe_malloc(size);
 125      -                first_flag = 1;
 126      -        }
 127      -
 128      -        /*
 129      -         * If libdemangle is not present, pass through unchanged.
 130      -         */
 131      -        if (demangle_func == NULL)
 132      -                return (name);
 133      -
 134      -        /*
 135      -         * The function returns -1 when the buffer size is not sufficient.
 136      -         */
 137      -        while ((ret = (*demangle_func)(name, demangled_name, size)) == -1) {
 138      -                free(demangled_name);
 139      -                size = size + BUFSIZE;
 140      -                demangled_name = safe_malloc(size);
 141      -        }
 142      -
 143      -        if (ret != 0)
 144      -                return (name);
 145      -
 146      -        return (demangled_name);
      104 +        free(demangled_name);
      105 +        demangled_name = sysdemangle(name, SYSDEM_LANG_CPP, NULL);
      106 +        return ((demangled_name != NULL) ? demangled_name : name);
 147  107  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX