[PATCH] add support of compilation against clang and llvm's libc++
Денис Пронин
dannftk@yandex.ru
Tue Dec 31 12:32:23 GMT 2024
Please, tell me guys if you are going to apply this patch or not
Thank you in advance
30.12.2024 15:06, Денис Пронин пишет:
>
> This fixes building with clang and libcxx
>
> The patch is attached and also duplicated within the letter
>
> ------
>
> From 62fe892263c43c0b0eca5dc01854b5afbb8d4d80 Mon Sep 17 00:00:00 2001
> From: Denis Pronin <dannftk@yandex.ru>
> Date: Mon, 30 Dec 2024 13:43:23 +0300
> Subject: [PATCH] add support of compilation against clang and llvm's
> libc++
>
> Signed-off-by: Denis Pronin <dannftk@yandex.ru>
> ---
> Makefile.am | 10 +++++-----
> configure.ac | 24 ++++++++++++++++++++++++
> dwflpp.cxx | 1 -
> interactive.cxx | 11 +++++++----
> language-server/stap-language-server.cxx | 1 -
> stapbpf/Makefile.am | 2 +-
> stapdyn/Makefile.am | 2 +-
> staprun/Makefile.am | 2 +-
> tapset-been.cxx | 2 --
> tapset-debuginfod.cxx | 1 -
> tapset-dynprobe.cxx | 1 -
> tapset-mark.cxx | 2 --
> tapset-method.cxx | 1 -
> tapset-netfilter.cxx | 1 -
> tapset-perfmon.cxx | 2 --
> tapset-procfs.cxx | 2 --
> tapset-python.cxx | 18 +++++++++++-------
> tapset-timers.cxx | 2 --
> tapset-utrace.cxx | 2 --
> tapsets.cxx | 1 -
> task_finder.cxx | 2 --
> util.cxx | 18 ++++++++++--------
> 22 files changed, 60 insertions(+), 48 deletions(-)
>
> diff --git a/Makefile.am b/Makefile.am
> index e8aa511a0..c569296ad 100644
> --- a/Makefile.am
> +++ b/Makefile.am
> @@ -143,7 +143,7 @@ if BUILD_TRANSLATOR
> stap_CFLAGS = $(AM_CFLAGS) @PIECFLAGS@
> stap_CXXFLAGS = $(AM_CXXFLAGS) @PIECXXFLAGS@ @ALIGNEDNEW@
> @debuginfod_CFLAGS@
> stap_CPPFLAGS = $(AM_CPPFLAGS) -DSTAP_SDT_V2
> -stap_LDFLAGS = $(AM_LDFLAGS) @PIELDFLAGS@ @BOOST_SYSTEM_LIB@
> +stap_LDFLAGS = $(AM_LDFLAGS) @PIELDFLAGS@ @BOOST_SYSTEM_LIB@
> @BOOST_IOSTREAMS_LIB@
>
> if HAVE_DYNINST
> stap_CXXFLAGS += $(DYNINST_CXXFLAGS)
> @@ -195,7 +195,7 @@ stap_sign_module_CPPFLAGS = $(AM_CPPFLAGS)
> stap_sign_module_CXXFLAGS = $(AM_CXXFLAGS) @PIECXXFLAGS@
> $(nss_CFLAGS) $(debuginfod_CFLAGS)
> stap_sign_module_CFLAGS = $(AM_CFLAGS) @PIECFLAGS@ $(nss_CFLAGS)
> $(debuginfod_CFLAGS)
> stap_sign_module_LDFLAGS = $(AM_LDFLAGS) @PIELDFLAGS@
> $(debuginfod_LDFLAGS)
> -stap_sign_module_LDADD = $(nss_LIBS) $(debuginfod_LIBS)
> +stap_sign_module_LDADD = $(nss_LIBS) $(debuginfod_LIBS)
> @BOOST_IOSTREAMS_LIB@
> if HAVE_HTTP_SUPPORT
> stap_sign_module_LDADD += $(openssl_LIBS)
> endif
> @@ -205,7 +205,7 @@ stap_authorize_cert_CPPFLAGS = $(AM_CPPFLAGS)
> stap_authorize_cert_CXXFLAGS = $(AM_CXXFLAGS) @PIECXXFLAGS@
> $(nss_CFLAGS) $(debuginfod_CFLAGS)
> stap_authorize_cert_CFLAGS = $(AM_CFLAGS) @PIECFLAGS@ $(nss_CFLAGS)
> $(debuginfod_CFLAGS)
> stap_authorize_cert_LDFLAGS = $(AM_LDFLAGS) @PIELDFLAGS@
> $(debuginfod_LDFLAGS)
> -stap_authorize_cert_LDADD = $(nss_LIBS) $(debuginfod_LIBS)
> +stap_authorize_cert_LDADD = $(nss_LIBS) $(debuginfod_LIBS)
> @BOOST_IOSTREAMS_LIB@
> if HAVE_HTTP_SUPPORT
> stap_authorize_cert_LDADD += $(openssl_LIBS)
> endif
> @@ -215,7 +215,7 @@ stap_serverd_SOURCES = stap-serverd.cxx
> cscommon.cxx util.cxx privilege.cxx nssc
> stap_serverd_CXXFLAGS = $(AM_CXXFLAGS) @PIECXXFLAGS@ $(nss_CFLAGS)
> $(debuginfod_CFLAGS)
> stap_serverd_CFLAGS = $(AM_CFLAGS) @PIECFLAGS@ $(nss_CFLAGS)
> $(debuginfod_CFLAGS)
> stap_serverd_LDFLAGS = $(AM_LDFLAGS) @PIELDFLAGS@ $(debuginfod_LDFLAGS)
> -stap_serverd_LDADD = $(nss_LIBS) -lpthread $(debuginfod_LIBS)
> +stap_serverd_LDADD = $(nss_LIBS) -lpthread $(debuginfod_LIBS)
> @BOOST_IOSTREAMS_LIB@
> if HAVE_AVAHI
> stap_serverd_CFLAGS += $(avahi_CFLAGS)
> stap_serverd_CXXFLAGS += $(avahi_CFLAGS)
> @@ -230,7 +230,7 @@ stap_gen_cert_SOURCES = stap-gen-cert.cxx util.cxx
> nsscommon.cxx
> stap_gen_cert_CXXFLAGS = $(AM_CXXFLAGS) @PIECXXFLAGS@ $(nss_CFLAGS)
> $(debuginfod_CFLAGS)
> stap_gen_cert_CFLAGS = $(AM_CFLAGS) @PIECFLAGS@ $(nss_CFLAGS)
> $(debuginfod_CFLAGS)
> stap_gen_cert_LDFLAGS = $(AM_LDFLAGS) @PIELDFLAGS@ $(debuginfod_LDFLAGS)
> -stap_gen_cert_LDADD = $(nss_LIBS) $(debuginfod_LIBS)
> +stap_gen_cert_LDADD = $(nss_LIBS) $(debuginfod_LIBS)
> @BOOST_IOSTREAMS_LIB@
> if HAVE_HTTP_SUPPORT
> stap_gen_cert_LDADD += $(openssl_LIBS)
> endif
> diff --git a/configure.ac b/configure.ac
> index 319af67b1..0e0a021f5 100644
> --- a/configure.ac
> +++ b/configure.ac
> @@ -639,6 +639,30 @@ int main() {
> ])
> LIBS="$saved_LIBS"
> AC_SUBST(BOOST_SYSTEM_LIB)
> +# add boost_iostreams
> +saved_LIBS="$LIBS"
> +LIBS="-lboost_iostreams $LIBS"
> +AC_MSG_CHECKING([need for -lboost_iostreams library])
> +AC_LINK_IFELSE([AC_LANG_SOURCE([
> +#include <cstdio>
> +#include <boost/iostreams/device/file_descriptor.hpp>
> +#include <boost/iostreams/stream.hpp>
> +int main() {
> + boost::iostreams::stream<boost::iostreams::file_descriptor_source> in(
> + STDIN_FILENO, boost::iostreams::file_descriptor_flags::close_handle
> + );
> + boost::iostreams::stream<boost::iostreams::file_descriptor_sink> out(
> + STDOUT_FILENO, boost::iostreams::file_descriptor_flags::close_handle
> + );
> + return 0;
> +}
> +])],[AC_MSG_RESULT([yup])
> + BOOST_IOSTREAMS_LIB="-lboost_iostreams"
> +],[AC_MSG_RESULT([nope])
> + BOOST_IOSTREAMS_LIB=""
> +])
> +LIBS="$saved_LIBS"
> +AC_SUBST(BOOST_IOSTREAMS_LIB)
>
> AC_LANG_POP(C++)
>
> diff --git a/dwflpp.cxx b/dwflpp.cxx
> index 5b3855354..ee52d3697 100644
> --- a/dwflpp.cxx
> +++ b/dwflpp.cxx
> @@ -66,7 +66,6 @@ extern "C" {
>
>
> using namespace std;
> -using namespace __gnu_cxx;
>
>
> static string TOK_KERNEL("kernel");
> diff --git a/interactive.cxx b/interactive.cxx
> index bd6ddd71e..5a15dc249 100644
> --- a/interactive.cxx
> +++ b/interactive.cxx
> @@ -21,10 +21,9 @@
> #include <stack>
> #include <sstream>
> #include <iterator>
> -#include <ext/stdio_filebuf.h>
> +#include <fstream>
>
> using namespace std;
> -using namespace __gnu_cxx;
>
> extern "C" {
> #include <unistd.h>
> @@ -40,6 +39,9 @@ extern "C" {
> #endif
> }
>
> +#include <boost/iostreams/device/file_descriptor.hpp>
> +#include <boost/iostreams/stream.hpp>
> +
> // FIXME: these declarations don't really belong here.
> extern int
> passes_0_4 (systemtap_session &s);
> @@ -1749,8 +1751,9 @@ forked_passes_0_4 (systemtap_session &s)
> try
> {
> rc = passes_0_4 (s);
> - stdio_filebuf<char> buf(ret.second, ios_base::out);
> - ostream o(&buf);
> + boost::iostreams::stream<boost::iostreams::file_descriptor_sink> o(
> + ret.second,
> boost::iostreams::file_descriptor_flags::close_handle
> + );
> if (rc == 0 && s.last_pass > 4)
> {
> o << s.module_name << endl;
> diff --git a/language-server/stap-language-server.cxx
> b/language-server/stap-language-server.cxx
> index f610b570f..89f979fff 100644
> --- a/language-server/stap-language-server.cxx
> +++ b/language-server/stap-language-server.cxx
> @@ -12,7 +12,6 @@
> #include "session.h"
> #include "tapsets.h"
> #include "util.h"
> -#include <ext/stdio_filebuf.h>
>
> using namespace std;
>
> diff --git a/stapbpf/Makefile.am b/stapbpf/Makefile.am
> index bb0c1eef8..f63c5ab26 100644
> --- a/stapbpf/Makefile.am
> +++ b/stapbpf/Makefile.am
> @@ -28,7 +28,7 @@ stapbpf_CPPFLAGS = $(AM_CPPFLAGS)
> stapbpf_CFLAGS = $(AM_CFLAGS) $(debuginfod_CFLAGS)
> stapbpf_CXXFLAGS = $(AM_CXXFLAGS) $(debuginfod_CFLAGS)
> stapbpf_LDFLAGS = $(AM_LDFLAGS) $(debuginfod_LDFLAGS)
> -stapbpf_LDADD = $(stapbpf_LIBS) -lpthread $(debuginfod_LIBS)
> +stapbpf_LDADD = $(stapbpf_LIBS) -lpthread $(debuginfod_LIBS)
> @BOOST_IOSTREAMS_LIB@
>
> BUILT_SOURCES =
> CLEANFILES =
> diff --git a/stapdyn/Makefile.am b/stapdyn/Makefile.am
> index efd6ee1ca..8adb933f7 100644
> --- a/stapdyn/Makefile.am
> +++ b/stapdyn/Makefile.am
> @@ -15,7 +15,7 @@ AM_CPPFLAGS += -DBINDIR='"$(bindir)"'
> -DSYSCONFDIR='"$(sysconfdir)"' -DPKGDATADI
>
> AM_CFLAGS += @PIECFLAGS@
> AM_CXXFLAGS += @PIECXXFLAGS@
> -AM_LDFLAGS = @PIELDFLAGS@ @BOOST_SYSTEM_LIB@
> +AM_LDFLAGS = @PIELDFLAGS@ @BOOST_SYSTEM_LIB@ @BOOST_IOSTREAMS_LIB@
>
> if HAVE_SELINUX
> AM_CPPFLAGS += $(selinux_CFLAGS)
> diff --git a/staprun/Makefile.am b/staprun/Makefile.am
> index 507c15d0e..5eddbd683 100644
> --- a/staprun/Makefile.am
> +++ b/staprun/Makefile.am
> @@ -15,7 +15,7 @@ AM_CPPFLAGS += -DBINDIR='"$(bindir)"'
> -DSYSCONFDIR='"$(sysconfdir)"' -DPKGDATADI
>
> AM_CFLAGS += @PIECFLAGS@
> AM_CXXFLAGS += @PIECXXFLAGS@
> -AM_LDFLAGS = @PIELDFLAGS@
> +AM_LDFLAGS = @PIELDFLAGS@ @BOOST_IOSTREAMS_LIB@
>
> bin_PROGRAMS = staprun stap-merge stapsh
> pkglibexec_PROGRAMS = stapio
> diff --git a/tapset-been.cxx b/tapset-been.cxx
> index e4b303961..56ac240ad 100644
> --- a/tapset-been.cxx
> +++ b/tapset-been.cxx
> @@ -18,8 +18,6 @@
>
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> static const string TOK_BEGIN("begin");
> static const string TOK_END("end");
> diff --git a/tapset-debuginfod.cxx b/tapset-debuginfod.cxx
> index d16f2d49f..a7f65b97f 100644
> --- a/tapset-debuginfod.cxx
> +++ b/tapset-debuginfod.cxx
> @@ -19,7 +19,6 @@
> #include <unistd.h>
>
> using namespace std;
> -using namespace __gnu_cxx;
>
> static const string TOK_DEBUGINFOD("debuginfod");
> static const string TOK_ARCHIVE("archive");
> diff --git a/tapset-dynprobe.cxx b/tapset-dynprobe.cxx
> index fc4c1b4b4..6f60546ae 100644
> --- a/tapset-dynprobe.cxx
> +++ b/tapset-dynprobe.cxx
> @@ -18,7 +18,6 @@
> #include <string>
>
> using namespace std;
> -using namespace __gnu_cxx;
>
> //
> ------------------------------------------------------------------------
> // dynprobe derived 'probes': These don't really exist. The purpose of
> diff --git a/tapset-mark.cxx b/tapset-mark.cxx
> index 582d536c0..517488bd6 100644
> --- a/tapset-mark.cxx
> +++ b/tapset-mark.cxx
> @@ -23,8 +23,6 @@ extern "C" {
>
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> static const string TOK_KERNEL("kernel");
> static const string TOK_MARK("mark");
> diff --git a/tapset-method.cxx b/tapset-method.cxx
> index 85a1658b6..d8a1f7fd5 100644
> --- a/tapset-method.cxx
> +++ b/tapset-method.cxx
> @@ -28,7 +28,6 @@ extern "C" {
> }
>
> using namespace std;
> -using namespace __gnu_cxx;
>
> static const string TOK_CLASS ("class");
> static const string TOK_METHOD ("method");
> diff --git a/tapset-netfilter.cxx b/tapset-netfilter.cxx
> index 857659764..7bdb5dc82 100644
> --- a/tapset-netfilter.cxx
> +++ b/tapset-netfilter.cxx
> @@ -16,7 +16,6 @@
> #include <limits.h>
>
> using namespace std;
> -using namespace __gnu_cxx;
>
> static const string TOK_NETFILTER("netfilter");
> static const string TOK_HOOK("hook");
> diff --git a/tapset-perfmon.cxx b/tapset-perfmon.cxx
> index 90817a8b7..e3b09bdef 100644
> --- a/tapset-perfmon.cxx
> +++ b/tapset-perfmon.cxx
> @@ -21,8 +21,6 @@ extern "C" {
> }
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> static const string TOK_PERF("perf");
> static const string TOK_TYPE("type");
> diff --git a/tapset-procfs.cxx b/tapset-procfs.cxx
> index f01bcbe3d..e5e264a6d 100644
> --- a/tapset-procfs.cxx
> +++ b/tapset-procfs.cxx
> @@ -18,8 +18,6 @@
>
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> static const string TOK_PROCFS("procfs");
> static const string TOK_READ("read");
> diff --git a/tapset-python.cxx b/tapset-python.cxx
> index cf18320fc..ba0b8f711 100644
> --- a/tapset-python.cxx
> +++ b/tapset-python.cxx
> @@ -13,10 +13,11 @@
>
> #include <cstring>
> #include <string>
> -#include <ext/stdio_filebuf.h>
> +
> +#include <boost/iostreams/device/file_descriptor.hpp>
> +#include <boost/iostreams/stream.hpp>
>
> using namespace std;
> -using namespace __gnu_cxx;
>
> static const string TOK_PYTHON2("python2");
> static const string TOK_PYTHON3("python3");
> @@ -433,15 +434,18 @@ python_builder::resolve(systemtap_session& s,
> // Read stderr from the child.
> if (s.verbose > 2)
> {
> - stdio_filebuf<char> in(child_err, ios_base::in);
> - clog << ∈
> + boost::iostreams::stream<boost::iostreams::file_descriptor_source> in(
> + child_err, boost::iostreams::file_descriptor_flags::close_handle
> + );
> + std::copy(std::istream_iterator<char>(in),
> std::istream_iterator<char>(), std::ostream_iterator<char>(clog));
> in.close();
> }
>
> // Read stdout from the child. Each line should contain 'MODULE
> // FUNCTION [FLAG]'
> - stdio_filebuf<char> buf(child_out, ios_base::in);
> - istream in(&buf);
> + boost::iostreams::stream<boost::iostreams::file_descriptor_source> in(
> + child_err, boost::iostreams::file_descriptor_flags::close_handle
> + );
> string line;
> while (getline(in, line))
> {
> @@ -458,7 +462,7 @@ python_builder::resolve(systemtap_session& s,
> else
> throw SEMANTIC_ERROR(_F("Unknown output from
> stap-resolve-module-function.py: %s", line.c_str()));
> }
> - buf.close();
> + in.close();
>
> return stap_waitpid(s.verbose, child);
> }
> diff --git a/tapset-timers.cxx b/tapset-timers.cxx
> index 10da17cda..6ce92949c 100644
> --- a/tapset-timers.cxx
> +++ b/tapset-timers.cxx
> @@ -18,8 +18,6 @@
>
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> static const string TOK_TIMER("timer");
>
> diff --git a/tapset-utrace.cxx b/tapset-utrace.cxx
> index 335bafcce..a52dec70d 100644
> --- a/tapset-utrace.cxx
> +++ b/tapset-utrace.cxx
> @@ -20,8 +20,6 @@
>
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> static const string TOK_PROCESS("process");
> static const string TOK_BEGIN("begin");
> diff --git a/tapsets.cxx b/tapsets.cxx
> index a68c45b99..ad391e336 100644
> --- a/tapsets.cxx
> +++ b/tapsets.cxx
> @@ -66,7 +66,6 @@ extern "C" {
> }
>
> using namespace std;
> -using namespace __gnu_cxx;
>
> // for elf.h where PPC64_LOCAL_ENTRY_OFFSET isn't defined
> #ifndef PPC64_LOCAL_ENTRY_OFFSET
> diff --git a/task_finder.cxx b/task_finder.cxx
> index b8ad1b71c..7d3d82700 100644
> --- a/task_finder.cxx
> +++ b/task_finder.cxx
> @@ -19,8 +19,6 @@
>
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> //
> ------------------------------------------------------------------------
> // task_finder and vma tracker derived 'probes': These don't really
> exist.
> diff --git a/util.cxx b/util.cxx
> index f90c74fce..5739f1c5e 100644
> --- a/util.cxx
> +++ b/util.cxx
> @@ -23,7 +23,6 @@
> #include <string>
> #include <fstream>
> #include <cassert>
> -#include <ext/stdio_filebuf.h>
> #include <algorithm>
> #include <mutex>
> #include <functional>
> @@ -53,11 +52,10 @@ extern "C" {
> #endif
> }
>
> -
> +#include <boost/iostreams/device/file_descriptor.hpp>
> +#include <boost/iostreams/stream.hpp>
>
> using namespace std;
> -using namespace __gnu_cxx;
> -
>
> // Return current users home directory or die.
> const char *
> @@ -1072,8 +1070,10 @@ stap_system_read(int verbose, const
> vector<string>& args, ostream& out)
> if (child > 0)
> {
> // read everything from the child
> - stdio_filebuf<char> in(child_fd, ios_base::in);
> - out << ∈
> + boost::iostreams::stream<boost::iostreams::file_descriptor_source> in(
> + child_fd, boost::iostreams::file_descriptor_flags::close_handle
> + );
> + std::copy(std::istream_iterator<char>(in),
> std::istream_iterator<char>(), std::ostream_iterator<char>(out));
> return stap_waitpid(verbose, child);
> }
> return -1;
> @@ -1116,8 +1116,10 @@ stap_fork_read(int verbose, ostream& out)
>
> // read everything from the child
> close(pipefd[1]);
> - stdio_filebuf<char> in(pipefd[0], ios_base::in);
> - out << ∈
> + boost::iostreams::stream<boost::iostreams::file_descriptor_source> in(
> + pipefd[0], boost::iostreams::file_descriptor_flags::close_handle
> + );
> + std::copy(std::istream_iterator<char>(in),
> std::istream_iterator<char>(), std::ostream_iterator<char>(out));
> return make_pair(false, stap_waitpid(verbose, child));
> }
>
> --
> 2.45.2
>
>
More information about the Systemtap
mailing list