29 #ifndef Pythia8_PythiaFpe_H 30 #define Pythia8_PythiaFpe_H 37 #error "GCCDEBUG unsupported on ARM64. Disable -DGCCDEBUG or compile on x86." 40 #ifndef __ENABLE_FP_DEBUG__ 41 #define __ENABLE_FP_DEBUG__ 44 #include <xmmintrin.h> 52 static void fpeSignalHandler(
int sig, siginfo_t* info,
void* context) {
60 fprintf(stderr,
"\n*************************************************\n");
61 fprintf(stderr,
"** Caught SIGFPE (Floating Point Exception) **\n");
62 fprintf(stderr,
"** Printing stack trace (compile with -O0 -g) **\n");
63 fprintf(stderr,
"** For better symbols, also consider -rdynamic.**\n");
64 fprintf(stderr,
"*************************************************\n");
68 int n = backtrace(buffer, 32);
71 backtrace_symbols_fd(buffer, n, STDERR_FILENO);
72 fprintf(stderr,
"*************************************************\n");
81 static void __attribute__((constructor)) setupFpeHandler() {
86 sa.sa_sigaction = fpeSignalHandler;
88 sigemptyset(&sa.sa_mask);
90 sa.sa_flags = SA_SIGINFO;
92 sigaction(SIGFPE, &sa,
nullptr);
98 static void __attribute__((constructor)) raisefpe() {
102 feenableexcept (FE_DIVBYZERO | FE_OVERFLOW | FE_INVALID);
106 unsigned int cw = _MM_GET_EXCEPTION_MASK();
107 cw &= ~(_MM_MASK_DIV_ZERO | _MM_MASK_INVALID | _MM_MASK_OVERFLOW);
108 _MM_SET_EXCEPTION_MASK(cw);