// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_COMPILER_SPECIFIC_H_ #define BASE_COMPILER_SPECIFIC_H_ #include "util/build_config.h" #if defined(COMPILER_MSVC) // For _Printf_format_string_. #include #else // Not MSVC #define _Printf_format_string_ #endif // COMPILER_MSVC #if COMPILER_GCC && defined(NDEBUG) #define ALWAYS_INLINE inline __attribute__((__always_inline__)) #elif COMPILER_MSVC && defined(NDEBUG) #define ALWAYS_INLINE __forceinline #else #define ALWAYS_INLINE inline #endif // Tell the compiler a function is using a printf-style format string. // |format_param| is the one-based index of the format string parameter; // |dots_param| is the one-based index of the "..." parameter. // For v*printf functions (which take a va_list), pass 0 for dots_param. // (This is undocumented but matches what the system C headers do.) #if defined(COMPILER_GCC) || defined(__clang__) #define PRINTF_FORMAT(format_param, dots_param) \ __attribute__((format(printf, format_param, dots_param))) #else #define PRINTF_FORMAT(format_param, dots_param) #endif // Macro for hinting that an expression is likely to be false. #if !defined(UNLIKELY) #if defined(COMPILER_GCC) || defined(__clang__) #define UNLIKELY(x) __builtin_expect(!!(x), 0) #else #define UNLIKELY(x) (x) #endif // defined(COMPILER_GCC) #endif // !defined(UNLIKELY) #if !defined(LIKELY) #if defined(COMPILER_GCC) || defined(__clang__) #define LIKELY(x) __builtin_expect(!!(x), 1) #else #define LIKELY(x) (x) #endif // defined(COMPILER_GCC) #endif // !defined(LIKELY) // Macro for telling -Wimplicit-fallthrough that a fallthrough is intentional. #if __cplusplus >= 201703L #define FALLTHROUGH [[fallthrough]] #elif defined(__clang__) #define FALLTHROUGH [[clang::fallthrough]] #else #define FALLTHROUGH #endif #endif // BASE_COMPILER_SPECIFIC_H_