Author: dim
Date: Wed Jul 16 21:04:31 2014
New Revision: 268775
URL: http://svnweb.freebsd.org/changeset/base/268775

Log:
  MFC r268463:
  
  In libproc, avoid calling __cxa_demangle(), and thus depending on either
  libcxxrt or libsupc++, if WITHOUT_CXX is defined. [1]
  
  Noticed by:   sbruno
  
  [1] However, on stable/10 this is more accurately described by
  WITHOUT_GNUCXX, so I've changed the test to that instead.

Modified:
  stable/10/lib/libproc/Makefile
  stable/10/lib/libproc/proc_sym.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/lib/libproc/Makefile
==============================================================================
--- stable/10/lib/libproc/Makefile      Wed Jul 16 20:37:03 2014        
(r268774)
+++ stable/10/lib/libproc/Makefile      Wed Jul 16 21:04:31 2014        
(r268775)
@@ -18,9 +18,11 @@ CFLAGS+=     -I${.CURDIR}
 .if ${MK_LIBCPLUSPLUS} != "no"
 LDADD+=                -lcxxrt
 DPADD+=                ${LIBCXXRT}
-.else
+.elif ${MK_GNUCXX} != "no"
 LDADD+=                -lsupc++
 DPADD+=                ${LIBSTDCPLUSPLUS}
+.else
+CFLAGS+=       -DNO_CXA_DEMANGLE
 .endif
 
 SHLIB_MAJOR=   2

Modified: stable/10/lib/libproc/proc_sym.c
==============================================================================
--- stable/10/lib/libproc/proc_sym.c    Wed Jul 16 20:37:03 2014        
(r268774)
+++ stable/10/lib/libproc/proc_sym.c    Wed Jul 16 21:04:31 2014        
(r268775)
@@ -46,27 +46,34 @@
 
 #include "_libproc.h"
 
+#ifndef NO_CXA_DEMANGLE
 extern char *__cxa_demangle(const char *, char *, size_t *, int *);
+#endif /* NO_CXA_DEMANGLE */
 
 static void    proc_rdl2prmap(rd_loadobj_t *, prmap_t *);
 
 static void
 demangle(const char *symbol, char *buf, size_t len)
 {
+#ifndef NO_CXA_DEMANGLE
        char *dembuf;
-       size_t demlen = len;
+       size_t demlen;
 
-       dembuf = malloc(len);
-       if (!dembuf)
-               goto fail;
-       dembuf = __cxa_demangle(symbol, dembuf, &demlen, NULL);
-       if (!dembuf)
-               goto fail;
-       strlcpy(buf, dembuf, len);
-       free(dembuf);
+       if (symbol[0] == '_' && symbol[1] == 'Z' && symbol[2]) {
+               dembuf = malloc(len);
+               if (!dembuf)
+                       goto fail;
+               demlen = len;
+               dembuf = __cxa_demangle(symbol, dembuf, &demlen, NULL);
+               if (!dembuf)
+                       goto fail;
+               strlcpy(buf, dembuf, len);
+               free(dembuf);
+       }
 
        return;
 fail:
+#endif /* NO_CXA_DEMANGLE */
        strlcpy(buf, symbol, len);
 }
 
@@ -291,10 +298,7 @@ proc_addr2sym(struct proc_handle *p, uin
                if (addr >= rsym && addr < rsym + sym.st_size) {
                        s = elf_strptr(e, dynsymstridx, sym.st_name);
                        if (s) {
-                               if (s[0] == '_' && s[1] == 'Z' && s[2])
-                                       demangle(s, name, namesz);
-                               else
-                                       strlcpy(name, s, namesz);
+                               demangle(s, name, namesz);
                                memcpy(symcopy, &sym, sizeof(sym));
                                /*
                                 * DTrace expects the st_value to contain
@@ -329,10 +333,7 @@ symtab:
                if (addr >= rsym && addr < rsym + sym.st_size) {
                        s = elf_strptr(e, symtabstridx, sym.st_name);
                        if (s) {
-                               if (s[0] == '_' && s[1] == 'Z' && s[2])
-                                       demangle(s, name, namesz);
-                               else
-                                       strlcpy(name, s, namesz);
+                               demangle(s, name, namesz);
                                memcpy(symcopy, &sym, sizeof(sym));
                                /*
                                 * DTrace expects the st_value to contain
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to