text: // 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 <sal.h>
  
  #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 defined(__clang__)
  #define FALLTHROUGH [[clang::fallthrough]]
  #else
  #define FALLTHROUGH
  #endif
  
  #endif  // BASE_COMPILER_SPECIFIC_H_
  