Skip to content

Commit 58c6f67

Browse files
Explorer09MrCirdoBenBE
committed
build: Add '--enable-demangling' configure option
For demangling support in the backtrace screen, which will be added in the next commit. Two backends will be supported: libiberty (GNU) and libdemangle (Solaris). This commit adds checks for both of them. Co-authored-by: Odric Roux-Paris <odric@roux-paris.fr> Co-authored-by: Benny Baumann <BenBE@geshi.org> Signed-off-by: Kang-Che Sung <explorer09@gmail.com>
1 parent 04fa44c commit 58c6f67

3 files changed

Lines changed: 169 additions & 1 deletion

File tree

Makefile.am

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ myhtopheaders = \
161161
UptimeMeter.h \
162162
UsersTable.h \
163163
Vector.h \
164-
XUtils.h
164+
XUtils.h \
165+
generic/ProvideDemangle.h
165166

166167
if HAVE_BACKTRACE_SCREEN
167168
myhtopheaders += \

configure.ac

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1304,6 +1304,139 @@ case $enable_backtrace in
13041304
esac
13051305
AM_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+
13071440
AC_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

generic/ProvideDemangle.h

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#ifndef HEADER_ProvideDemangle
2+
#define HEADER_ProvideDemangle
3+
/*
4+
htop - generic/ProvideDemangle.h
5+
(C) 2026 htop dev team
6+
Released under the GNU GPLv2+, see the COPYING file
7+
in the source distribution for its full text.
8+
*/
9+
10+
// IWYU pragma: no_include "config.h"
11+
12+
// IWYU pragma: begin_exports
13+
14+
#if !defined(HAVE_DECL_BASENAME)
15+
// Suppress libiberty's own declaration of basename().
16+
// It's a pity that we need this workaround as libiberty developers
17+
// refuse fix their headers and export an unwanted interface to us.
18+
// htop doesn't use basename() API. (The POSIX version is flawed by
19+
// design; libiberty's ships with GNU version of basename() that's
20+
// incompatible with POSIX.)
21+
// <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=122729>
22+
#define HAVE_DECL_BASENAME 1
23+
#endif
24+
25+
#if defined(HAVE_DEMANGLE_H)
26+
#include <demangle.h>
27+
#elif defined(HAVE_LIBIBERTY_DEMANGLE_H)
28+
#include <libiberty/demangle.h>
29+
#endif
30+
31+
// IWYU pragma: end_exports
32+
33+
#endif /* HEADER_ProvideDemangle */

0 commit comments

Comments
 (0)