• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef BASE_COMPILER_SPECIFIC_H_
6 #define BASE_COMPILER_SPECIFIC_H_
7 
8 #include "util/build_config.h"
9 
10 #if defined(COMPILER_MSVC)
11 
12 // For _Printf_format_string_.
13 #include <sal.h>
14 
15 #else  // Not MSVC
16 
17 #define _Printf_format_string_
18 
19 #endif  // COMPILER_MSVC
20 
21 #if COMPILER_GCC && defined(NDEBUG)
22 #define ALWAYS_INLINE inline __attribute__((__always_inline__))
23 #elif COMPILER_MSVC && defined(NDEBUG)
24 #define ALWAYS_INLINE __forceinline
25 #else
26 #define ALWAYS_INLINE inline
27 #endif
28 
29 // Tell the compiler a function is using a printf-style format string.
30 // |format_param| is the one-based index of the format string parameter;
31 // |dots_param| is the one-based index of the "..." parameter.
32 // For v*printf functions (which take a va_list), pass 0 for dots_param.
33 // (This is undocumented but matches what the system C headers do.)
34 #if defined(COMPILER_GCC) || defined(__clang__)
35 #define PRINTF_FORMAT(format_param, dots_param) \
36   __attribute__((format(printf, format_param, dots_param)))
37 #else
38 #define PRINTF_FORMAT(format_param, dots_param)
39 #endif
40 
41 // Macro for hinting that an expression is likely to be false.
42 #if !defined(UNLIKELY)
43 #if defined(COMPILER_GCC) || defined(__clang__)
44 #define UNLIKELY(x) __builtin_expect(!!(x), 0)
45 #else
46 #define UNLIKELY(x) (x)
47 #endif  // defined(COMPILER_GCC)
48 #endif  // !defined(UNLIKELY)
49 
50 #if !defined(LIKELY)
51 #if defined(COMPILER_GCC) || defined(__clang__)
52 #define LIKELY(x) __builtin_expect(!!(x), 1)
53 #else
54 #define LIKELY(x) (x)
55 #endif  // defined(COMPILER_GCC)
56 #endif  // !defined(LIKELY)
57 
58 // Macro for telling -Wimplicit-fallthrough that a fallthrough is intentional.
59 #if __cplusplus >= 201703L
60 #define FALLTHROUGH [[fallthrough]]
61 #elif defined(__clang__)
62 #define FALLTHROUGH [[clang::fallthrough]]
63 #else
64 #define FALLTHROUGH
65 #endif
66 
67 #endif  // BASE_COMPILER_SPECIFIC_H_
68