build-time: hide boost stacktrace in a .cc file

Saves about 16s of CPU time. Not a lot but not nothing. Feels more like
the principle of the thing.

Change-Id: I0992d4024317c20d6985a7977d5649edfb9f46bb
This commit is contained in:
jade 2024-08-23 16:57:26 -07:00 committed by Rebecca Turner
parent 04f8a14833
commit a510d17484
Signed by: rbt
SSH key fingerprint: SHA256:SiNaEWabvotTldoNb5jIKqjJ3RnpS4aRXA4KLAdW5vs
2 changed files with 15 additions and 7 deletions

View file

@ -1,4 +1,9 @@
#include "fmt.hh" // IWYU pragma: keep #include "fmt.hh" // IWYU pragma: keep
// Darwin and FreeBSD stdenv do not define _GNU_SOURCE but do have _Unwind_Backtrace.
#if __APPLE__ || __FreeBSD__
#define BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED
#endif
#include <boost/stacktrace/stacktrace.hpp>
template class boost::basic_format<char>; template class boost::basic_format<char>;
@ -11,4 +16,9 @@ template HintFmt::HintFmt(const std::string &, const uint64_t &, const char * co
HintFmt::HintFmt(const std::string & literal) : HintFmt("%s", Uncolored(literal)) {} HintFmt::HintFmt(const std::string & literal) : HintFmt("%s", Uncolored(literal)) {}
void printStackTrace()
{
std::cerr << boost::stacktrace::stacktrace() << std::endl;
}
} }

View file

@ -4,11 +4,6 @@
#include <iostream> #include <iostream>
#include <string> #include <string>
#include <boost/format.hpp> #include <boost/format.hpp>
// Darwin and FreeBSD stdenv do not define _GNU_SOURCE but do have _Unwind_Backtrace.
#if __APPLE__ || __FreeBSD__
#define BOOST_STACKTRACE_GNU_SOURCE_NOT_REQUIRED
#endif
#include <boost/stacktrace.hpp>
#include "ansicolor.hh" #include "ansicolor.hh"
// Explicit instantiation in fmt.cc // Explicit instantiation in fmt.cc
@ -16,6 +11,9 @@ extern template class boost::basic_format<char>;
namespace nix { namespace nix {
/** Prints a C++ stack trace to stderr using boost stacktrace */
void printStackTrace();
/** /**
* Values wrapped in this struct are printed in magenta. * Values wrapped in this struct are printed in magenta.
* *
@ -176,14 +174,14 @@ public:
std::cerr << "HintFmt received incorrect number of format args. Original format string: '"; std::cerr << "HintFmt received incorrect number of format args. Original format string: '";
std::cerr << format << "'; number of arguments: " << sizeof...(args) << "\n"; std::cerr << format << "'; number of arguments: " << sizeof...(args) << "\n";
// And regardless of the coredump give me a damn stacktrace. // And regardless of the coredump give me a damn stacktrace.
std::cerr << boost::stacktrace::stacktrace() << std::endl; printStackTrace();
abort(); abort();
} }
} catch (boost::io::format_error & ex) { } catch (boost::io::format_error & ex) {
// Same thing, but for anything that happens in the member initializers. // Same thing, but for anything that happens in the member initializers.
std::cerr << "HintFmt received incorrect format string. Original format string: '"; std::cerr << "HintFmt received incorrect format string. Original format string: '";
std::cerr << format << "'; number of arguments: " << sizeof...(args) << "\n"; std::cerr << format << "'; number of arguments: " << sizeof...(args) << "\n";
std::cerr << boost::stacktrace::stacktrace() << std::endl; printStackTrace();
abort(); abort();
} }