// Copyright 2021 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_NOTREACHED_H_ #define BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_NOTREACHED_H_ #include "base/allocator/partition_allocator/logging_buildflags.h" #include "base/allocator/partition_allocator/partition_alloc_base/compiler_specific.h" #include "base/allocator/partition_allocator/partition_alloc_base/debug/debugging_buildflags.h" #include "base/allocator/partition_allocator/partition_alloc_buildflags.h" #include "base/allocator/partition_allocator/partition_alloc_check.h" // When PartitionAlloc is used as the default allocator, we cannot use the // regular (D)CHECK() macros, as they allocate internally. (c.f. // // base/allocator/partition_allocator/partition_alloc_check.h) // So PA_NOTREACHED() uses PA_DCHECK() instead of DCHECK(). #if BUILDFLAG(PA_ENABLE_LOG_ERROR_NOT_REACHED) #define PA_NOTREACHED() \ true ? ::partition_alloc::internal::logging::RawError( \ __FILE__ "(" PA_STRINGIFY(__LINE__) ") PA_NOTREACHED() hit.") \ : PA_EAT_CHECK_STREAM_PARAMS() #elif BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC) && defined(OFFICIAL_BUILD) && \ defined(NDEBUG) && BUILDFLAG(PA_DCHECK_IS_ON) // PA_DCHECK(condition) is PA_CHECK(condition) if BUILDFLAG(PA_DCHECK_IS_ON). // When BUILDFLAG(USE_PARTITION_ALLOC_AS_MALLOC), OFFICIAL_BUILD, // NDEBUG are defined, PA_CHECK(false) is IMMEDIATE_CRASH(). Since // IMMEDIATE_CRASH() hints __builtin_unreachable() to the compiler, the // following code causes compile failure: // switch(...) { // ... // case X: // PA_DCHECK(false); // [[fallthrough]]; // The compiler knows "not reached". // case Y: // ... // So define PA_NOTREACHED() by using async-signal-safe RawCheck(). #define PA_NOTREACHED() \ PA_UNLIKELY(true) \ ? ::partition_alloc::internal::logging::RawCheck( \ __FILE__ "(" PA_STRINGIFY(__LINE__) ") PA_NOTREACHED() hit.") \ : PA_EAT_CHECK_STREAM_PARAMS() #else // PA_CHECK() uses RawCheck() for error reporting. So "PA_DCHECK(false); // [[fallthrough]];" doesn't cause compile failure. #define PA_NOTREACHED() PA_DCHECK(false) #endif #endif // BASE_ALLOCATOR_PARTITION_ALLOCATOR_PARTITION_ALLOC_NOTREACHED_H_