@@ -1304,6 +1304,139 @@ case $enable_backtrace in
13041304esac
13051305AM_CONDITIONAL([ HAVE_BACKTRACE_SCREEN] , [ test "$enable_backtrace" != no] )
13061306
1307+ AC_ARG_ENABLE (
1308+ [ demangling] ,
1309+ [ AS_HELP_STRING (
1310+ [ --enable-demangling=BACKEND] ,
1311+ [ enable demangling support for backtraces; available backends: libiberty libdemangle @<:@ default=check@:>@ ]
1312+ ) ] ,
1313+ [ ] ,
1314+ [ enable_demangling=check]
1315+ )
1316+
1317+ demangling_backend_found=no
1318+ have_libiberty=no
1319+ have_libdemangle=no
1320+ case $enable_demangling in
1321+ check|yes)
1322+ have_libiberty=check
1323+ have_libdemangle=check
1324+ ;;
1325+ libiberty|iberty|liberty)
1326+ have_libiberty=check
1327+ enable_demangling=libiberty
1328+ ;;
1329+ libdemangle)
1330+ have_libdemangle=check
1331+ ;;
1332+ esac
1333+
1334+ demangle_header_paths=''
1335+
1336+ if test "$have_libiberty" != no; then
1337+ AC_CHECK_LIB (
1338+ [ iberty] ,
1339+ [ cplus_demangle] ,
1340+ [ demangle_header_paths="/usr/local/include/libiberty /usr/include/libiberty"] ,
1341+ [ have_libiberty=no]
1342+ )
1343+ fi
1344+ if test "$have_libdemangle" != no; then
1345+ AC_CHECK_LIB ( [ demangle] , [ cplus_demangle] , [ :] , [ have_libdemangle=no] )
1346+ fi
1347+
1348+ if test "$have_libiberty$have_libdemangle" != nono; then
1349+ if htop_search_header_dir demangle.h "$demangle_header_paths"; then
1350+ AC_DEFINE ( [ HAVE_DEMANGLE_H] , 1 , [ Define to 1 if you have the <demangle.h> header file.] )
1351+ else
1352+ have_libdemangle=no
1353+ if test "$have_libiberty" != no; then
1354+ AC_CHECK_HEADERS ( [ libiberty/demangle.h] , [ ] , [ have_libiberty=no] )
1355+ fi
1356+ fi
1357+ fi
1358+
1359+ htop_save_CPPFLAGS=$CPPFLAGS
1360+ htop_save_LIBS=$LIBS
1361+ CPPFLAGS="$AM_CPPFLAGS -I$srcdir $CPPFLAGS"
1362+
1363+ if test "$demangling_backend_found" = no && test "$have_libiberty" != no; then
1364+ LIBS="-liberty $htop_save_LIBS"
1365+
1366+ AC_MSG_CHECKING ( [ whether libiberty cplus_demangle works] )
1367+ AC_LINK_IFELSE (
1368+ [ AC_LANG_PROGRAM (
1369+ [ [
1370+ #include <stdlib.h>
1371+ #include "generic/ProvideDemangle.h"
1372+ /* char* cplus_demangle(const char* mangled, int options); */
1373+ ] ] , [ [
1374+ char* demangled = cplus_demangle("", DMGL_AUTO);
1375+ free(demangled);
1376+ ] ]
1377+ ) ] , [
1378+ AC_MSG_RESULT ( [ yes] )
1379+ have_libiberty=yes
1380+ demangling_backend_found=yes
1381+ enable_demangling=libiberty
1382+ AC_DEFINE ( [ HAVE_LIBIBERTY_CPLUS_DEMANGLE] , [ 1] , [ Define to 1 if libiberty supports cplus_demangle function.] )
1383+ ] , [
1384+ AC_MSG_RESULT ( [ no] )
1385+ have_libiberty=no
1386+ LIBS=$htop_save_LIBS
1387+ ]
1388+ )
1389+ fi
1390+
1391+ if test "$demangling_backend_found" = no && test "$have_libdemangle" != no; then
1392+ LIBS="-ldemangle $htop_save_LIBS"
1393+
1394+ AC_MSG_CHECKING ( [ whether libdemangle cplus_demangle works] )
1395+ AC_LINK_IFELSE (
1396+ [ AC_LANG_PROGRAM (
1397+ [ [
1398+ #include "generic/ProvideDemangle.h"
1399+ /* int cplus_demangle(const char* symbol, char* interpretation, size_t size); */
1400+ ] ] , [ [
1401+ static char demangled[ 1] ;
1402+ int ret = cplus_demangle("", demangled, sizeof(demangled));
1403+ if (ret == DEMANGLE_ENAME) {
1404+ ret = 0;
1405+ }
1406+ return (ret <= 0 && ret > -126 ? ret : 1);
1407+ ] ]
1408+ ) ] , [
1409+ AC_MSG_RESULT ( [ yes] )
1410+ have_libdemangle=yes
1411+ demangling_backend_found=yes
1412+ enable_demangling=libdemangle
1413+ AC_DEFINE ( [ HAVE_LIBDEMANGLE_CPLUS_DEMANGLE] , [ 1] , [ Define to 1 if libdemangle supports cplus_demangle function.] )
1414+ ] , [
1415+ AC_MSG_RESULT ( [ no] )
1416+ have_libdemangle=no
1417+ LIBS=$htop_save_LIBS
1418+ ]
1419+ )
1420+ fi
1421+
1422+ CPPFLAGS=$htop_save_CPPFLAGS
1423+
1424+ case $enable_demangling in
1425+ no|check)
1426+ enable_demangling=no
1427+ ;;
1428+ yes)
1429+ AC_MSG_ERROR ( [ did not find any backend for --enable-demangling] )
1430+ ;;
1431+ *)
1432+ if test "$demangling_backend_found" = no; then
1433+ AC_MSG_ERROR ( [ backend '$enable_demangling' for --enable-demangling is not supported or not found] )
1434+ fi
1435+ AC_DEFINE ( [ HAVE_DEMANGLING] , [ 1] , [ Define to 1 if the demangling is supported.] )
1436+ ;;
1437+ esac
1438+ AM_CONDITIONAL([ HAVE_DEMANGLING] , [ test "$have_demangling" != no] )
1439+
13071440AC_ARG_ENABLE (
13081441 [ hwloc] ,
13091442 [ AS_HELP_STRING (
@@ -1740,6 +1873,7 @@ AC_MSG_RESULT([
17401873 unicode: $enable_unicode
17411874 affinity: $enable_affinity
17421875 backtrace: $enable_backtrace
1876+ demangling: $enable_demangling
17431877 hwloc: $enable_hwloc
17441878 debug: $enable_debug
17451879 static: $enable_static
0 commit comments