head	1.7;
access;
symbols
	netbsd-11-0-RC4:1.6
	netbsd-11-0-RC3:1.6
	netbsd-11-0-RC2:1.6
	netbsd-11-0-RC1:1.6
	gcc-14-3-0:1.1.1.5
	perseant-exfatfs-base-20250801:1.6
	netbsd-11:1.6.0.2
	netbsd-11-base:1.6
	gcc-12-5-0:1.1.1.4
	netbsd-10-1-RELEASE:1.3
	perseant-exfatfs-base-20240630:1.5
	gcc-12-4-0:1.1.1.4
	perseant-exfatfs:1.5.0.2
	perseant-exfatfs-base:1.5
	netbsd-10-0-RELEASE:1.3
	netbsd-10-0-RC6:1.3
	netbsd-10-0-RC5:1.3
	netbsd-10-0-RC4:1.3
	netbsd-10-0-RC3:1.3
	netbsd-10-0-RC2:1.3
	netbsd-10-0-RC1:1.3
	gcc-12-3-0:1.1.1.4
	gcc-10-5-0:1.1.1.3
	netbsd-10:1.3.0.2
	netbsd-10-base:1.3
	gcc-10-4-0:1.1.1.3
	cjep_sun2x-base1:1.2
	cjep_sun2x:1.2.0.4
	cjep_sun2x-base:1.2
	cjep_staticlib_x-base1:1.2
	cjep_staticlib_x:1.2.0.2
	cjep_staticlib_x-base:1.2
	gcc-10-3-0:1.1.1.3
	gcc-9-3-0:1.1.1.2
	phil-wifi-20200421:1.1.1.1
	phil-wifi:1.1.1.1.0.4
	phil-wifi-20200411:1.1.1.1
	is-mlppp:1.1.1.1.0.2
	is-mlppp-base:1.1.1.1
	phil-wifi-20200406:1.1.1.1
	gcc-8-4-0:1.1.1.1
	phil-wifi-20191119:1.1.1.1
	gcc-8-3-0:1.1.1.1
	FSF:1.1.1;
locks; strict;
comment	@# @;


1.7
date	2025.09.14.00.08.57;	author mrg;	state Exp;
branches;
next	1.6;
commitid	x9D5QEnvbeMI4CaG;

1.6
date	2024.10.20.20.04.04;	author christos;	state Exp;
branches;
next	1.5;
commitid	LIVcO3cBh62VgruF;

1.5
date	2023.07.31.01.44.56;	author mrg;	state Exp;
branches
	1.5.2.1;
next	1.4;
commitid	q79F5Opf0FLsyTyE;

1.4
date	2023.07.30.05.51.42;	author mrg;	state Exp;
branches;
next	1.3;
commitid	Iugici1GtQ2mWMyE;

1.3
date	2021.11.13.15.34.39;	author christos;	state Exp;
branches;
next	1.2;
commitid	xBt4xJBzNzn1fEgD;

1.2
date	2021.04.11.23.54.27;	author mrg;	state Exp;
branches;
next	1.1;
commitid	wJn7ggfUTEMOWVOC;

1.1
date	2019.10.01.09.36.38;	author mrg;	state Exp;
branches
	1.1.1.1;
next	;
commitid	smvgr2IPAQDr89FB;

1.5.2.1
date	2025.08.02.05.25.51;	author perseant;	state Exp;
branches;
next	;
commitid	23j6GFaDws3O875G;

1.1.1.1
date	2019.10.01.09.36.38;	author mrg;	state Exp;
branches
	1.1.1.1.4.1;
next	1.1.1.2;
commitid	smvgr2IPAQDr89FB;

1.1.1.2
date	2020.09.05.07.52.57;	author mrg;	state Exp;
branches;
next	1.1.1.3;
commitid	ZRYA7IOuwfMjAPmC;

1.1.1.3
date	2021.04.10.22.09.22;	author mrg;	state Exp;
branches;
next	1.1.1.4;
commitid	eC4g0MRpqTvEkNOC;

1.1.1.4
date	2023.07.30.05.20.40;	author mrg;	state Exp;
branches;
next	1.1.1.5;
commitid	tk6nV4mbc9nVEMyE;

1.1.1.5
date	2025.09.13.23.45.04;	author mrg;	state Exp;
branches;
next	;
commitid	KwhwN4krNWa6XBaG;

1.1.1.1.4.1
date	2019.10.01.09.36.38;	author martin;	state dead;
branches;
next	1.1.1.1.4.2;
commitid	X01YhRUPVUDaec4C;

1.1.1.1.4.2
date	2020.04.13.07.58.21;	author martin;	state Exp;
branches;
next	;
commitid	X01YhRUPVUDaec4C;


desc
@@


1.7
log
@merge GCC 14.3.0.
@
text
@//===-- sanitizer_signal_interceptors.inc -----------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Signal interceptors for sanitizers.
//
//===----------------------------------------------------------------------===//

#include "interception/interception.h"
#include "sanitizer_common.h"
#include "sanitizer_internal_defs.h"
#include "sanitizer_platform_interceptors.h"

using namespace __sanitizer;

#if SANITIZER_NETBSD
#define sigaction_symname __sigaction_siginfo
#else
#define sigaction_symname sigaction
#endif

#ifndef SIGNAL_INTERCEPTOR_SIGNAL_IMPL
#define SIGNAL_INTERCEPTOR_SIGNAL_IMPL(func, signum, handler) \
  { return REAL(func)(signum, handler); }
#endif

#ifndef SIGNAL_INTERCEPTOR_SIGACTION_IMPL
#  define SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact)              \
    {                                                                         \
      if (!REAL(sigaction_symname)) {                                         \
        Printf(                                                               \
            "Warning: REAL(sigaction_symname) == nullptr. This may happen "   \
            "if you link with ubsan statically. Sigaction will not work.\n"); \
        return -1;                                                            \
      }                                                                       \
      return REAL(sigaction_symname)(signum, act, oldact);                    \
    }
#endif

#if SANITIZER_INTERCEPT_BSD_SIGNAL
INTERCEPTOR(uptr, bsd_signal, int signum, uptr handler) {
  SIGNAL_INTERCEPTOR_ENTER();
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return 0;
  SIGNAL_INTERCEPTOR_SIGNAL_IMPL(bsd_signal, signum, handler);
}
#define INIT_BSD_SIGNAL COMMON_INTERCEPT_FUNCTION(bsd_signal)
#else  // SANITIZER_INTERCEPT_BSD_SIGNAL
#define INIT_BSD_SIGNAL
#endif  // SANITIZER_INTERCEPT_BSD_SIGNAL

#if SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION
INTERCEPTOR(uptr, signal, int signum, uptr handler) {
  SIGNAL_INTERCEPTOR_ENTER();
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive)
    return (uptr) nullptr;
  SIGNAL_INTERCEPTOR_SIGNAL_IMPL(signal, signum, handler);
}
#define INIT_SIGNAL COMMON_INTERCEPT_FUNCTION(signal)

INTERCEPTOR(int, sigaction_symname, int signum,
            const __sanitizer_sigaction *act, __sanitizer_sigaction *oldact) {
  SIGNAL_INTERCEPTOR_ENTER();
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) {
    if (!oldact) return 0;
    act = nullptr;
  }
  SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact);
}
#define INIT_SIGACTION COMMON_INTERCEPT_FUNCTION(sigaction_symname)

namespace __sanitizer {
int real_sigaction(int signum, const void *act, void *oldact) {
  return REAL(sigaction_symname)(signum, (const __sanitizer_sigaction *)act,
                         (__sanitizer_sigaction *)oldact);
}
}  // namespace __sanitizer
#else  // SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION
#define INIT_SIGNAL
#define INIT_SIGACTION
// We need to have defined REAL(sigaction) on other systems.
namespace __sanitizer {
struct __sanitizer_sigaction;
}
DEFINE_REAL(int, sigaction, int signum, const __sanitizer_sigaction *act,
            __sanitizer_sigaction *oldact)
#endif  // SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION

static void InitializeSignalInterceptors() {
  static bool was_called_once;
  CHECK(!was_called_once);
  was_called_once = true;

  INIT_BSD_SIGNAL;
  INIT_SIGNAL;
  INIT_SIGACTION;
}
@


1.6
log
@Catch up with sigaction renames... Fixes atf tests
WARNING: ThreadSanitizer: signal handler spoils errno (pid=21202)
@
text
@d46 1
d57 1
d66 1
@


1.5
log
@make this actually be GCC 12.3.0's libsanitizer.

the libsanitizer we used with GCC 9 and GCC 10 was significantly
ahead of the GCC 9 and GCC 10 provided versions.
@
text
@d21 1
a21 1
#define sigaction_symname __sigaction14
@


1.5.2.1
log
@Sync with HEAD
@
text
@d21 1
a21 1
#define sigaction_symname __sigaction_siginfo
@


1.4
log
@initial merge of GCC 12.3.0.

this doesn't include any of the changes to the .c -> .cc files renamed,
and reverts our local changes to the vax port and libsanitizer subdir.
vax GCC was rewritten and our local fixes no longer are relevant, and
the new libsanitizer is more updated than our old one, and merging via
gcc10->gcc12 is not really possible.

unfortunately, our local changes to libsanitizer that aren't related
to the general update of those sources (ie, the netbsd code) will need
to be re-checked and perhaps re-ported.
@
text
@d3 3
a5 2
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
d21 1
a21 1
#define sigaction_symname __sigaction_siginfo
@


1.3
log
@fix the remaining vestiges of __sigaction14; now the tsan signal tests work.
@
text
@d31 10
a40 2
#define SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact) \
  { return REAL(sigaction_symname)(signum, act, oldact); }
d63 4
a66 1
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return 0;
@


1.2
log
@revert sanitizer back to the version we were using with GCC 9, since
that one was already newer than the GCC 10 version.
@
text
@d20 1
a20 1
#define sigaction_symname __sigaction14
@


1.1
log
@Initial revision
@
text
@d19 16
d36 1
a36 1
INTERCEPTOR(void *, bsd_signal, int signum, void *handler) {
d38 1
a38 1
  return REAL(bsd_signal)(signum, handler);
d46 4
a49 3
INTERCEPTOR(void *, signal, int signum, void *handler) {
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return nullptr;
  return REAL(signal)(signum, handler);
d53 2
a54 2
INTERCEPTOR(int, sigaction, int signum, const struct sigaction *act,
            struct sigaction *oldact) {
d56 1
a56 1
  return REAL(sigaction)(signum, act, oldact);
d58 1
a58 1
#define INIT_SIGACTION COMMON_INTERCEPT_FUNCTION(sigaction)
d62 2
a63 2
  return REAL(sigaction)(signum, (const struct sigaction *)act,
                         (struct sigaction *)oldact);
d70 5
a74 2
DEFINE_REAL(int, sigaction, int signum, const struct sigaction *act,
            struct sigaction *oldact)
@


1.1.1.1
log
@import GCC 8.3.  it includes these new features:
- many optimisations improved: inter-procedural, profile-directed,
  LTO, loops including user-controllable unroll support, and more.
- columns numbers added to line numbers in dwarf
- gcov extended significantly
- many sanitizer updates
- many new warning messages
- many better hints and more useful error messages
- minor ABI changes on x86-64 libstdc++, and some c++17 modes
- draft c++2a features
- better c++17 experimental support
- Armv8.4-A supported, better 8.2-A and 8.3-A support, including
  32 bit arm port.  cortex a-55, a-75 and a-55.a-75 combo support.
- in the GCC bugzilla, 8.1 shows 1149 bugs fixed, 8.2 shows 100, and
  8.3 shows 158.
@
text
@@


1.1.1.2
log
@initial import of GCC 9.3.0.  changes include:

- live patching support
- shell completion help
- generally better diagnostic output (less verbose/more useful)
- diagnostics and optimisation choices can be emitted in json
- asan memory usage reduction
- many general, and specific to switch, inter-procedure,
  profile and link-time optimisations.  from the release notes:
  "Overall compile time of Firefox 66 and LibreOffice 6.2.3 on
  an 8-core machine was reduced by about 5% compared to GCC 8.3"
- OpenMP 5.0 support
- better spell-guesser
- partial experimental support for c2x and c++2a
- c++17 is no longer experimental
- arm AAPCS GCC 6-8 structure passing bug fixed, may cause
  incompatibility (restored compat with GCC 5 and earlier.)
- openrisc support
@
text
@a18 16
#if SANITIZER_NETBSD
#define sigaction_symname __sigaction14
#else
#define sigaction_symname sigaction
#endif

#ifndef SIGNAL_INTERCEPTOR_SIGNAL_IMPL
#define SIGNAL_INTERCEPTOR_SIGNAL_IMPL(func, signum, handler) \
  { return REAL(func)(signum, handler); }
#endif

#ifndef SIGNAL_INTERCEPTOR_SIGACTION_IMPL
#define SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact) \
  { return REAL(sigaction_symname)(signum, act, oldact); }
#endif

d20 1
a20 1
INTERCEPTOR(uptr, bsd_signal, int signum, uptr handler) {
d22 1
a22 1
  SIGNAL_INTERCEPTOR_SIGNAL_IMPL(bsd_signal, signum, handler);
d30 3
a32 4
INTERCEPTOR(uptr, signal, int signum, uptr handler) {
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive)
    return (uptr) nullptr;
  SIGNAL_INTERCEPTOR_SIGNAL_IMPL(signal, signum, handler);
d36 2
a37 2
INTERCEPTOR(int, sigaction_symname, int signum,
            const __sanitizer_sigaction *act, __sanitizer_sigaction *oldact) {
d39 1
a39 1
  SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact);
d41 1
a41 1
#define INIT_SIGACTION COMMON_INTERCEPT_FUNCTION(sigaction_symname)
d45 2
a46 2
  return REAL(sigaction_symname)(signum, (const __sanitizer_sigaction *)act,
                         (__sanitizer_sigaction *)oldact);
d53 2
a54 5
namespace __sanitizer {
struct __sanitizer_sigaction;
}
DEFINE_REAL(int, sigaction, int signum, const __sanitizer_sigaction *act,
            __sanitizer_sigaction *oldact)
@


1.1.1.3
log
@initial import of GCC 10.3.0.  main changes include:

caveats:
- ABI issue between c++14 and c++17 fixed
- profile mode is removed from libstdc++
- -fno-common is now the default

new features:
- new flags -fallocation-dce, -fprofile-partial-training,
  -fprofile-reproducible, -fprofile-prefix-path, and -fanalyzer
- many new compile and link time optimisations
- enhanced drive optimisations
- openacc 2.6 support
- openmp 5.0 features
- new warnings: -Wstring-compare and -Wzero-length-bounds
- extended warnings: -Warray-bounds, -Wformat-overflow,
  -Wrestrict, -Wreturn-local-addr, -Wstringop-overflow,
  -Warith-conversion, -Wmismatched-tags, and -Wredundant-tags
- some likely C2X features implemented
- more C++20 implemented
- many new arm & intel CPUs known

hundreds of reported bugs are fixed.  full list of changes
can be found at:

   https://gcc.gnu.org/gcc-10/changes.html
@
text
@d3 2
a4 3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
@


1.1.1.4
log
@initial import of GCC 12.3.0.

major changes in GCC 11 included:

- The default mode for C++ is now -std=gnu++17 instead of -std=gnu++14.
- When building GCC itself, the host compiler must now support C++11,
  rather than C++98.
- Some short options of the gcov tool have been renamed: -i to -j and
  -j to -H.
- ThreadSanitizer improvements.
- Introduce Hardware-assisted AddressSanitizer support.
- For targets that produce DWARF debugging information GCC now defaults
  to DWARF version 5. This can produce up to 25% more compact debug
  information compared to earlier versions.
- Many optimisations.
- The existing malloc attribute has been extended so that it can be
  used to identify allocator/deallocator API pairs. A pair of new
  -Wmismatched-dealloc and -Wmismatched-new-delete warnings are added.
- Other new warnings:
  -Wsizeof-array-div, enabled by -Wall, warns about divisions of two
    sizeof operators when the first one is applied to an array and the
    divisor does not equal the size of the array element.
  -Wstringop-overread, enabled by default, warns about calls to string
    functions reading past the end of the arrays passed to them as
    arguments.
  -Wtsan, enabled by default, warns about unsupported features in
    ThreadSanitizer (currently std::atomic_thread_fence).
- Enchanced warnings:
  -Wfree-nonheap-object detects many more instances of calls to
    deallocation functions with pointers not returned from a dynamic
    memory allocation function.
  -Wmaybe-uninitialized diagnoses passing pointers or references to
    uninitialized memory to functions taking const-qualified arguments.
  -Wuninitialized detects reads from uninitialized dynamically
    allocated memory.
  -Warray-parameter warns about functions with inconsistent array forms.
  -Wvla-parameter warns about functions with inconsistent VLA forms.
- Several new features from the upcoming C2X revision of the ISO C
  standard are supported with -std=c2x and -std=gnu2x.
- Several C++20 features have been implemented.
- The C++ front end has experimental support for some of the upcoming
  C++23 draft.
- Several new C++ warnings.
- Enhanced Arm, AArch64, x86, and RISC-V CPU support.
- The implementation of how program state is tracked within
  -fanalyzer has been completely rewritten with many enhancements.

see https://gcc.gnu.org/gcc-11/changes.html for a full list.

major changes in GCC 12 include:

- An ABI incompatibility between C and C++ when passing or returning
  by value certain aggregates containing zero width bit-fields has
  been discovered on various targets. x86-64, ARM and AArch64
  will always ignore them (so there is a C ABI incompatibility
  between GCC 11 and earlier with GCC 12 or later), PowerPC64 ELFv2
  always take them into account (so there is a C++ ABI
  incompatibility, GCC 4.4 and earlier compatible with GCC 12 or
  later, incompatible with GCC 4.5 through GCC 11). RISC-V has
  changed the handling of these already starting with GCC 10. As
  the ABI requires, MIPS takes them into account handling function
  return values so there is a C++ ABI incompatibility with GCC 4.5
  through 11.
- STABS: Support for emitting the STABS debugging format is
  deprecated and will be removed in the next release. All ports now
  default to emit DWARF (version 2 or later) debugging info or are
  obsoleted.
- Vectorization is enabled at -O2 which is now equivalent to the
  original -O2 -ftree-vectorize -fvect-cost-model=very-cheap.
- GCC now supports the ShadowCallStack sanitizer.
- Support for __builtin_shufflevector compatible with the clang
  language extension was added.
- Support for attribute unavailable was added.
- Support for __builtin_dynamic_object_size compatible with the
  clang language extension was added.
- New warnings:
  -Wbidi-chars warns about potentially misleading UTF-8
    bidirectional control characters.
  -Warray-compare warns about comparisons between two operands of
    array type.
- Some new features from the upcoming C2X revision of the ISO C
  standard are supported with -std=c2x and -std=gnu2x.
- Several C++23 features have been implemented.
- Many C++ enhancements across warnings and -f options.

see https://gcc.gnu.org/gcc-12/changes.html for a full list.
@
text
@d32 2
a33 10
#  define SIGNAL_INTERCEPTOR_SIGACTION_IMPL(signum, act, oldact)              \
    {                                                                         \
      if (!REAL(sigaction_symname)) {                                         \
        Printf(                                                               \
            "Warning: REAL(sigaction_symname) == nullptr. This may happen "   \
            "if you link with ubsan statically. Sigaction will not work.\n"); \
        return -1;                                                            \
      }                                                                       \
      return REAL(sigaction_symname)(signum, act, oldact);                    \
    }
d56 1
a56 4
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) {
    if (!oldact) return 0;
    act = nullptr;
  }
@


1.1.1.5
log
@initial import of GCC 14.3.0.

major changes in GCC 13:
- improved sanitizer
- zstd debug info compression
- LTO improvements
- SARIF based diagnostic support
- new warnings: -Wxor-used-as-pow, -Wenum-int-mismatch, -Wself-move,
  -Wdangling-reference
- many new -Wanalyzer* specific warnings
- enhanced warnings: -Wpessimizing-move, -Wredundant-move
- new attributes to mark file descriptors, c++23 "assume"
- several C23 features added
- several C++23 features added
- many new features for Arm, x86, RISC-V

major changes in GCC 14:
- more strict C99 or newer support
- ia64* marked deprecated (but seemingly still in GCC 15.)
- several new hardening features
- support for "hardbool", which can have user supplied values of true/false
- explicit support for stack scrubbing upon function exit
- better auto-vectorisation support
- added clang-compatible __has_feature and __has_extension
- more C23, including -std=c23
- several C++26 features added
- better diagnostics in C++ templates
- new warnings: -Wnrvo, Welaborated-enum-base
- many new features for Arm, x86, RISC-V
- possible ABI breaking change for SPARC64 and small structures with arrays
  of floats.
@
text
@a45 1
  SIGNAL_INTERCEPTOR_ENTER();
a55 1
  SIGNAL_INTERCEPTOR_ENTER();
a63 1
  SIGNAL_INTERCEPTOR_ENTER();
@


1.1.1.1.4.1
log
@file sanitizer_signal_interceptors.inc was added on branch phil-wifi on 2020-04-13 07:58:21 +0000
@
text
@d1 65
@


1.1.1.1.4.2
log
@Mostly merge changes from HEAD upto 20200411
@
text
@a0 65
//===-- sanitizer_signal_interceptors.inc -----------------------*- C++ -*-===//
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Signal interceptors for sanitizers.
//
//===----------------------------------------------------------------------===//

#include "interception/interception.h"
#include "sanitizer_common.h"
#include "sanitizer_internal_defs.h"
#include "sanitizer_platform_interceptors.h"

using namespace __sanitizer;

#if SANITIZER_INTERCEPT_BSD_SIGNAL
INTERCEPTOR(void *, bsd_signal, int signum, void *handler) {
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return 0;
  return REAL(bsd_signal)(signum, handler);
}
#define INIT_BSD_SIGNAL COMMON_INTERCEPT_FUNCTION(bsd_signal)
#else  // SANITIZER_INTERCEPT_BSD_SIGNAL
#define INIT_BSD_SIGNAL
#endif  // SANITIZER_INTERCEPT_BSD_SIGNAL

#if SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION
INTERCEPTOR(void *, signal, int signum, void *handler) {
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return nullptr;
  return REAL(signal)(signum, handler);
}
#define INIT_SIGNAL COMMON_INTERCEPT_FUNCTION(signal)

INTERCEPTOR(int, sigaction, int signum, const struct sigaction *act,
            struct sigaction *oldact) {
  if (GetHandleSignalMode(signum) == kHandleSignalExclusive) return 0;
  return REAL(sigaction)(signum, act, oldact);
}
#define INIT_SIGACTION COMMON_INTERCEPT_FUNCTION(sigaction)

namespace __sanitizer {
int real_sigaction(int signum, const void *act, void *oldact) {
  return REAL(sigaction)(signum, (const struct sigaction *)act,
                         (struct sigaction *)oldact);
}
}  // namespace __sanitizer
#else  // SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION
#define INIT_SIGNAL
#define INIT_SIGACTION
// We need to have defined REAL(sigaction) on other systems.
DEFINE_REAL(int, sigaction, int signum, const struct sigaction *act,
            struct sigaction *oldact)
#endif  // SANITIZER_INTERCEPT_SIGNAL_AND_SIGACTION

static void InitializeSignalInterceptors() {
  static bool was_called_once;
  CHECK(!was_called_once);
  was_called_once = true;

  INIT_BSD_SIGNAL;
  INIT_SIGNAL;
  INIT_SIGACTION;
}
@


