xref: /aosp_15_r20/external/dynamic_depth/internal/base/port.h (revision a62be0856e8e1158f43b03e41bbad10f4d005fde)
1*a62be085SSadaf Ebrahimi // These are weird things we need to do to get this compiling on
2*a62be085SSadaf Ebrahimi // random systems (and on SWIG).
3*a62be085SSadaf Ebrahimi //
4*a62be085SSadaf Ebrahimi 
5*a62be085SSadaf Ebrahimi #ifndef DYNAMIC_DEPTH_INTERNAL_BASE_PORT_H_  // NOLINT
6*a62be085SSadaf Ebrahimi #define DYNAMIC_DEPTH_INTERNAL_BASE_PORT_H_  // NOLINT
7*a62be085SSadaf Ebrahimi 
8*a62be085SSadaf Ebrahimi #include <limits.h>  // So we can set the bounds of our types
9*a62be085SSadaf Ebrahimi #include <stdlib.h>  // for free()
10*a62be085SSadaf Ebrahimi #include <string.h>  // for memcpy()
11*a62be085SSadaf Ebrahimi 
12*a62be085SSadaf Ebrahimi #if defined(__APPLE__)
13*a62be085SSadaf Ebrahimi // OSX has type names *_t, so we define these aliases.
14*a62be085SSadaf Ebrahimi #include <inttypes.h>
15*a62be085SSadaf Ebrahimi #include <stdint.h>
16*a62be085SSadaf Ebrahimi 
17*a62be085SSadaf Ebrahimi typedef uint64_t uint64;
18*a62be085SSadaf Ebrahimi typedef uint32_t uint32;
19*a62be085SSadaf Ebrahimi typedef uint16_t uint16;
20*a62be085SSadaf Ebrahimi typedef uint8_t uint8;
21*a62be085SSadaf Ebrahimi 
22*a62be085SSadaf Ebrahimi typedef int64_t int64;
23*a62be085SSadaf Ebrahimi typedef int32_t int32;
24*a62be085SSadaf Ebrahimi typedef int16_t int16;
25*a62be085SSadaf Ebrahimi typedef int8_t int8;
26*a62be085SSadaf Ebrahimi #endif
27*a62be085SSadaf Ebrahimi 
28*a62be085SSadaf Ebrahimi #define DYNAMIC_DEPTH_INTERNAL_EXPORT  // NOLINT
29*a62be085SSadaf Ebrahimi 
30*a62be085SSadaf Ebrahimi #if defined(OS_CYGWIN)
31*a62be085SSadaf Ebrahimi #error "Cygwin is not supported."
32*a62be085SSadaf Ebrahimi #endif
33*a62be085SSadaf Ebrahimi 
34*a62be085SSadaf Ebrahimi #if defined(__CYGWIN__)
35*a62be085SSadaf Ebrahimi #error "Cygwin is not supported."
36*a62be085SSadaf Ebrahimi #endif
37*a62be085SSadaf Ebrahimi 
38*a62be085SSadaf Ebrahimi #if defined(__APPLE__)
39*a62be085SSadaf Ebrahimi // Currently, blaze supports iOS yet doesn't define a flag. Mac users have
40*a62be085SSadaf Ebrahimi // traditionally defined OS_MACOSX themselves via other build systems, since mac
41*a62be085SSadaf Ebrahimi // hasn't been supported by blaze.
42*a62be085SSadaf Ebrahimi #include <TargetConditionals.h>
43*a62be085SSadaf Ebrahimi #if defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
44*a62be085SSadaf Ebrahimi #ifndef OS_IOS  // NOLINT
45*a62be085SSadaf Ebrahimi #define OS_IOS 1
46*a62be085SSadaf Ebrahimi #endif
47*a62be085SSadaf Ebrahimi #define SUPPRESS_MOBILE_IOS_BASE_PORT_H
48*a62be085SSadaf Ebrahimi #endif  // defined(TARGET_OS_IPHONE) && TARGET_OS_IPHONE
49*a62be085SSadaf Ebrahimi #endif  // defined(__APPLE__)
50*a62be085SSadaf Ebrahimi 
51*a62be085SSadaf Ebrahimi #if defined(OS_MACOSX) || defined(OS_IOS)
52*a62be085SSadaf Ebrahimi // This was added for getpagesize(), which is no longer used here.
53*a62be085SSadaf Ebrahimi // Clients incorrectly depend on this include.
54*a62be085SSadaf Ebrahimi #include <unistd.h>
55*a62be085SSadaf Ebrahimi #elif defined(OS_CYGWIN) || defined(__ANDROID__)
56*a62be085SSadaf Ebrahimi #include <malloc.h>  // for memalign()
57*a62be085SSadaf Ebrahimi #elif defined(COMPILER_MSVC)
58*a62be085SSadaf Ebrahimi #include <stdio.h>  // declare snprintf/vsnprintf before overriding
59*a62be085SSadaf Ebrahimi #endif
60*a62be085SSadaf Ebrahimi 
61*a62be085SSadaf Ebrahimi #include "base/integral_types.h"
62*a62be085SSadaf Ebrahimi 
63*a62be085SSadaf Ebrahimi // We support gcc 4.7 and later.
64*a62be085SSadaf Ebrahimi #if defined(__GNUC__) && !defined(__clang__)
65*a62be085SSadaf Ebrahimi #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 7)
66*a62be085SSadaf Ebrahimi #error "This package requires gcc 4.7 or higher"
67*a62be085SSadaf Ebrahimi #endif
68*a62be085SSadaf Ebrahimi #endif
69*a62be085SSadaf Ebrahimi 
70*a62be085SSadaf Ebrahimi // We support MSVC++ 12.0 and later.
71*a62be085SSadaf Ebrahimi #if defined(_MSC_VER) && _MSC_VER < 1800
72*a62be085SSadaf Ebrahimi #error "This package requires _MSC_VER of 1800 or higher"
73*a62be085SSadaf Ebrahimi #endif
74*a62be085SSadaf Ebrahimi 
75*a62be085SSadaf Ebrahimi // We support Apple Xcode clang 4.2.1 (version 421.11.65) and later.
76*a62be085SSadaf Ebrahimi // This corresponds to Apple Xcode version 4.5.
77*a62be085SSadaf Ebrahimi #if defined(__apple_build_version__) && __apple_build_version__ < 4211165
78*a62be085SSadaf Ebrahimi #error "This package requires __apple_build_version__ of 4211165 or higher"
79*a62be085SSadaf Ebrahimi #endif
80*a62be085SSadaf Ebrahimi 
81*a62be085SSadaf Ebrahimi // Must happens before inttypes.h inclusion */
82*a62be085SSadaf Ebrahimi #if defined(OS_MACOSX)
83*a62be085SSadaf Ebrahimi /* From MacOSX's inttypes.h:
84*a62be085SSadaf Ebrahimi  * "C++ implementations should define these macros only when
85*a62be085SSadaf Ebrahimi  *  __STDC_FORMAT_MACROS is defined before <inttypes.h> is included." */
86*a62be085SSadaf Ebrahimi #ifndef __STDC_FORMAT_MACROS  // NOLINT
87*a62be085SSadaf Ebrahimi #define __STDC_FORMAT_MACROS
88*a62be085SSadaf Ebrahimi #endif /* __STDC_FORMAT_MACROS */
89*a62be085SSadaf Ebrahimi #endif /* OS_MACOSX */
90*a62be085SSadaf Ebrahimi 
91*a62be085SSadaf Ebrahimi /* Default for most OSes */
92*a62be085SSadaf Ebrahimi /* We use SIGPWR since that seems unlikely to be used for other reasons. */
93*a62be085SSadaf Ebrahimi #define GOOGLE_OBSCURE_SIGNAL SIGPWR
94*a62be085SSadaf Ebrahimi 
95*a62be085SSadaf Ebrahimi #if defined OS_LINUX || defined OS_CYGWIN || defined OS_ANDROID || \
96*a62be085SSadaf Ebrahimi     defined(__ANDROID__)
97*a62be085SSadaf Ebrahimi // _BIG_ENDIAN
98*a62be085SSadaf Ebrahimi #include <endian.h>
99*a62be085SSadaf Ebrahimi #endif
100*a62be085SSadaf Ebrahimi 
101*a62be085SSadaf Ebrahimi #if defined OS_LINUX || defined OS_CYGWIN
102*a62be085SSadaf Ebrahimi 
103*a62be085SSadaf Ebrahimi // GLIBC-related macros.
104*a62be085SSadaf Ebrahimi #include <features.h>
105*a62be085SSadaf Ebrahimi 
106*a62be085SSadaf Ebrahimi #ifndef __GLIBC_PREREQ          // NOLINT
107*a62be085SSadaf Ebrahimi #define __GLIBC_PREREQ(a, b) 0  // not a GLIBC system
108*a62be085SSadaf Ebrahimi #endif
109*a62be085SSadaf Ebrahimi 
110*a62be085SSadaf Ebrahimi // The uint mess:
111*a62be085SSadaf Ebrahimi // mysql.h sets _GNU_SOURCE which sets __USE_MISC in <features.h>
112*a62be085SSadaf Ebrahimi // sys/types.h typedefs uint if __USE_MISC
113*a62be085SSadaf Ebrahimi // mysql typedefs uint if HAVE_UINT not set
114*a62be085SSadaf Ebrahimi // The following typedef is carefully considered, and should not cause
115*a62be085SSadaf Ebrahimi //  any clashes
116*a62be085SSadaf Ebrahimi #if !defined(__USE_MISC)
117*a62be085SSadaf Ebrahimi #if !defined(HAVE_UINT)
118*a62be085SSadaf Ebrahimi #define HAVE_UINT 1
119*a62be085SSadaf Ebrahimi typedef unsigned int uint;
120*a62be085SSadaf Ebrahimi #endif
121*a62be085SSadaf Ebrahimi #if !defined(HAVE_USHORT)
122*a62be085SSadaf Ebrahimi #define HAVE_USHORT 1
123*a62be085SSadaf Ebrahimi typedef unsigned short ushort;
124*a62be085SSadaf Ebrahimi #endif
125*a62be085SSadaf Ebrahimi #if !defined(HAVE_ULONG)
126*a62be085SSadaf Ebrahimi #define HAVE_ULONG 1
127*a62be085SSadaf Ebrahimi typedef unsigned long ulong;
128*a62be085SSadaf Ebrahimi #endif
129*a62be085SSadaf Ebrahimi #endif
130*a62be085SSadaf Ebrahimi 
131*a62be085SSadaf Ebrahimi #if defined(__cplusplus)
132*a62be085SSadaf Ebrahimi #include <cstddef>  // For _GLIBCXX macros
133*a62be085SSadaf Ebrahimi #endif
134*a62be085SSadaf Ebrahimi 
135*a62be085SSadaf Ebrahimi #if !defined(HAVE_TLS) &&                                       \
136*a62be085SSadaf Ebrahimi     (defined(_LIBCPP_VERSION) || defined(_GLIBCXX_HAVE_TLS)) && \
137*a62be085SSadaf Ebrahimi     (defined(ARCH_K8) || defined(ARCH_PPC) || defined(ARCH_ARM))
138*a62be085SSadaf Ebrahimi #define HAVE_TLS 1
139*a62be085SSadaf Ebrahimi #endif
140*a62be085SSadaf Ebrahimi 
141*a62be085SSadaf Ebrahimi #elif defined OS_FREEBSD
142*a62be085SSadaf Ebrahimi 
143*a62be085SSadaf Ebrahimi // _BIG_ENDIAN
144*a62be085SSadaf Ebrahimi #include <machine/endian.h>
145*a62be085SSadaf Ebrahimi 
146*a62be085SSadaf Ebrahimi #elif defined(OS_MACOSX) || defined(OS_IOS)
147*a62be085SSadaf Ebrahimi 
148*a62be085SSadaf Ebrahimi // BIG_ENDIAN
149*a62be085SSadaf Ebrahimi #include <machine/endian.h>  // NOLINT(build/include)
150*a62be085SSadaf Ebrahimi /* Let's try and follow the Linux convention */
151*a62be085SSadaf Ebrahimi #define __BYTE_ORDER BYTE_ORDER
152*a62be085SSadaf Ebrahimi #define __LITTLE_ENDIAN LITTLE_ENDIAN
153*a62be085SSadaf Ebrahimi #define __BIG_ENDIAN BIG_ENDIAN
154*a62be085SSadaf Ebrahimi 
155*a62be085SSadaf Ebrahimi #endif
156*a62be085SSadaf Ebrahimi 
157*a62be085SSadaf Ebrahimi // The following guarantees declaration of the byte swap functions, and
158*a62be085SSadaf Ebrahimi // defines __BYTE_ORDER for MSVC
159*a62be085SSadaf Ebrahimi #ifdef COMPILER_MSVC
160*a62be085SSadaf Ebrahimi #include <stdlib.h>  // NOLINT(build/include)
161*a62be085SSadaf Ebrahimi #define __BYTE_ORDER __LITTLE_ENDIAN
162*a62be085SSadaf Ebrahimi #define bswap_16(x) _byteswap_ushort(x)
163*a62be085SSadaf Ebrahimi #define bswap_32(x) _byteswap_ulong(x)
164*a62be085SSadaf Ebrahimi #define bswap_64(x) _byteswap_uint64(x)
165*a62be085SSadaf Ebrahimi 
166*a62be085SSadaf Ebrahimi #elif defined(OS_MACOSX) || defined(OS_IOS)
167*a62be085SSadaf Ebrahimi // Mac OS X / Darwin features
168*a62be085SSadaf Ebrahimi #include <libkern/OSByteOrder.h>
169*a62be085SSadaf Ebrahimi #define bswap_16(x) OSSwapInt16(x)
170*a62be085SSadaf Ebrahimi #define bswap_32(x) OSSwapInt32(x)
171*a62be085SSadaf Ebrahimi #define bswap_64(x) OSSwapInt64(x)
172*a62be085SSadaf Ebrahimi 
173*a62be085SSadaf Ebrahimi #elif defined(__GLIBC__) || defined(__CYGWIN__)
174*a62be085SSadaf Ebrahimi #include <byteswap.h>  // IWYU pragma: export
175*a62be085SSadaf Ebrahimi 
176*a62be085SSadaf Ebrahimi #else
177*a62be085SSadaf Ebrahimi 
bswap_16(uint16 x)178*a62be085SSadaf Ebrahimi static inline uint16 bswap_16(uint16 x) {
179*a62be085SSadaf Ebrahimi   return static_cast<uint16>(((x & 0xFF) << 8) | ((x & 0xFF00) >> 8));
180*a62be085SSadaf Ebrahimi }
181*a62be085SSadaf Ebrahimi #define bswap_16(x) bswap_16(x)
bswap_32(uint32 x)182*a62be085SSadaf Ebrahimi static inline uint32 bswap_32(uint32 x) {
183*a62be085SSadaf Ebrahimi   return (((x & 0xFF) << 24) | ((x & 0xFF00) << 8) | ((x & 0xFF0000) >> 8) |
184*a62be085SSadaf Ebrahimi           ((x & 0xFF000000) >> 24));
185*a62be085SSadaf Ebrahimi }
186*a62be085SSadaf Ebrahimi #define bswap_32(x) bswap_32(x)
bswap_64(uint64 x)187*a62be085SSadaf Ebrahimi static inline uint64 bswap_64(uint64 x) {
188*a62be085SSadaf Ebrahimi   return (((x & GG_ULONGLONG(0xFF)) << 56) |
189*a62be085SSadaf Ebrahimi           ((x & GG_ULONGLONG(0xFF00)) << 40) |
190*a62be085SSadaf Ebrahimi           ((x & GG_ULONGLONG(0xFF0000)) << 24) |
191*a62be085SSadaf Ebrahimi           ((x & GG_ULONGLONG(0xFF000000)) << 8) |
192*a62be085SSadaf Ebrahimi           ((x & GG_ULONGLONG(0xFF00000000)) >> 8) |
193*a62be085SSadaf Ebrahimi           ((x & GG_ULONGLONG(0xFF0000000000)) >> 24) |
194*a62be085SSadaf Ebrahimi           ((x & GG_ULONGLONG(0xFF000000000000)) >> 40) |
195*a62be085SSadaf Ebrahimi           ((x & GG_ULONGLONG(0xFF00000000000000)) >> 56));
196*a62be085SSadaf Ebrahimi }
197*a62be085SSadaf Ebrahimi #define bswap_64(x) bswap_64(x)
198*a62be085SSadaf Ebrahimi 
199*a62be085SSadaf Ebrahimi #endif
200*a62be085SSadaf Ebrahimi 
201*a62be085SSadaf Ebrahimi // define the macros IS_LITTLE_ENDIAN or IS_BIG_ENDIAN
202*a62be085SSadaf Ebrahimi // using the above endian definitions from endian.h if
203*a62be085SSadaf Ebrahimi // endian.h was included
204*a62be085SSadaf Ebrahimi #ifdef __BYTE_ORDER
205*a62be085SSadaf Ebrahimi #if __BYTE_ORDER == __LITTLE_ENDIAN
206*a62be085SSadaf Ebrahimi #define IS_LITTLE_ENDIAN
207*a62be085SSadaf Ebrahimi #endif
208*a62be085SSadaf Ebrahimi 
209*a62be085SSadaf Ebrahimi #if __BYTE_ORDER == __BIG_ENDIAN
210*a62be085SSadaf Ebrahimi #define IS_BIG_ENDIAN
211*a62be085SSadaf Ebrahimi #endif
212*a62be085SSadaf Ebrahimi 
213*a62be085SSadaf Ebrahimi #else
214*a62be085SSadaf Ebrahimi 
215*a62be085SSadaf Ebrahimi #if defined(__LITTLE_ENDIAN__)
216*a62be085SSadaf Ebrahimi #define IS_LITTLE_ENDIAN
217*a62be085SSadaf Ebrahimi #elif defined(__BIG_ENDIAN__)
218*a62be085SSadaf Ebrahimi #define IS_BIG_ENDIAN
219*a62be085SSadaf Ebrahimi #endif
220*a62be085SSadaf Ebrahimi 
221*a62be085SSadaf Ebrahimi // there is also PDP endian ...
222*a62be085SSadaf Ebrahimi 
223*a62be085SSadaf Ebrahimi #endif  // __BYTE_ORDER
224*a62be085SSadaf Ebrahimi 
225*a62be085SSadaf Ebrahimi // Define the OS's path separator
226*a62be085SSadaf Ebrahimi #ifdef __cplusplus  // C won't merge duplicate const variables at link time
227*a62be085SSadaf Ebrahimi // Some headers provide a macro for this (GCC's system.h), remove it so that we
228*a62be085SSadaf Ebrahimi // can use our own.
229*a62be085SSadaf Ebrahimi #undef PATH_SEPARATOR
230*a62be085SSadaf Ebrahimi #if defined(OS_WINDOWS)
231*a62be085SSadaf Ebrahimi const char PATH_SEPARATOR = '\\';
232*a62be085SSadaf Ebrahimi #else
233*a62be085SSadaf Ebrahimi const char PATH_SEPARATOR = '/';
234*a62be085SSadaf Ebrahimi #endif
235*a62be085SSadaf Ebrahimi #endif
236*a62be085SSadaf Ebrahimi 
237*a62be085SSadaf Ebrahimi // Windows has O_BINARY as a flag to open() (like "b" for fopen).
238*a62be085SSadaf Ebrahimi // Linux doesn't need make this distinction.
239*a62be085SSadaf Ebrahimi #if defined OS_LINUX && !defined O_BINARY
240*a62be085SSadaf Ebrahimi #define O_BINARY 0
241*a62be085SSadaf Ebrahimi #endif
242*a62be085SSadaf Ebrahimi 
243*a62be085SSadaf Ebrahimi #ifdef COMPILER_MSVC
244*a62be085SSadaf Ebrahimi // doesn't have uid_t
245*a62be085SSadaf Ebrahimi typedef int uid_t;
246*a62be085SSadaf Ebrahimi #endif
247*a62be085SSadaf Ebrahimi 
248*a62be085SSadaf Ebrahimi // Mac OS X / Darwin and iOS features
249*a62be085SSadaf Ebrahimi 
250*a62be085SSadaf Ebrahimi #if defined(OS_MACOSX) || defined(OS_IOS)
251*a62be085SSadaf Ebrahimi 
252*a62be085SSadaf Ebrahimi // For mmap, Linux defines both MAP_ANONYMOUS and MAP_ANON and says MAP_ANON is
253*a62be085SSadaf Ebrahimi // deprecated. In Darwin, MAP_ANON is all there is.
254*a62be085SSadaf Ebrahimi #if !defined MAP_ANONYMOUS
255*a62be085SSadaf Ebrahimi #define MAP_ANONYMOUS MAP_ANON
256*a62be085SSadaf Ebrahimi #endif
257*a62be085SSadaf Ebrahimi 
258*a62be085SSadaf Ebrahimi // Linux has this in <sys/cdefs.h>
259*a62be085SSadaf Ebrahimi #define __ptr_t void *
260*a62be085SSadaf Ebrahimi 
261*a62be085SSadaf Ebrahimi // Linux has this in <linux/errno.h>
262*a62be085SSadaf Ebrahimi #define EXFULL ENOMEM  // not really that great a translation...
263*a62be085SSadaf Ebrahimi 
264*a62be085SSadaf Ebrahimi // Mach-O supports sections (albeit with small names), but doesn't have
265*a62be085SSadaf Ebrahimi // vars at the beginning and end.  Instead you should call the function
266*a62be085SSadaf Ebrahimi // getsectdata("__DATA", name, &size).
267*a62be085SSadaf Ebrahimi #define HAVE_ATTRIBUTE_SECTION 1
268*a62be085SSadaf Ebrahimi 
269*a62be085SSadaf Ebrahimi // Any function with ATTRIBUTE_SECTION must not be inlined, or it will
270*a62be085SSadaf Ebrahimi // be placed into whatever section its caller is placed into.
271*a62be085SSadaf Ebrahimi #define ATTRIBUTE_SECTION(name) \
272*a62be085SSadaf Ebrahimi   __attribute__((section("__DATA, " #name))) __attribute__((noinline))
273*a62be085SSadaf Ebrahimi 
274*a62be085SSadaf Ebrahimi #define ENUM_DYLD_BOOL  // so that we don't pollute the global namespace
275*a62be085SSadaf Ebrahimi extern "C" {
276*a62be085SSadaf Ebrahimi #include <mach-o/dyld.h>
277*a62be085SSadaf Ebrahimi #include <mach-o/getsect.h>
278*a62be085SSadaf Ebrahimi }
279*a62be085SSadaf Ebrahimi class AssignAttributeStartEnd {
280*a62be085SSadaf Ebrahimi  public:
AssignAttributeStartEnd(const char * name,char ** pstart,char ** pend)281*a62be085SSadaf Ebrahimi   AssignAttributeStartEnd(const char *name, char **pstart, char **pend) {
282*a62be085SSadaf Ebrahimi     // Find out what dynamic library name is defined in
283*a62be085SSadaf Ebrahimi     for (int i = _dyld_image_count() - 1; i >= 0; --i) {
284*a62be085SSadaf Ebrahimi       const mach_header *hdr = _dyld_get_image_header(i);
285*a62be085SSadaf Ebrahimi       uint32_t len;
286*a62be085SSadaf Ebrahimi       *pstart = getsectdatafromheader(hdr, "__DATA", name, &len);
287*a62be085SSadaf Ebrahimi       if (*pstart) {  // NULL if not defined in this dynamic library
288*a62be085SSadaf Ebrahimi         *pstart += _dyld_get_image_vmaddr_slide(i);  // correct for reloc
289*a62be085SSadaf Ebrahimi         *pend = *pstart + len;
290*a62be085SSadaf Ebrahimi         return;
291*a62be085SSadaf Ebrahimi       }
292*a62be085SSadaf Ebrahimi     }
293*a62be085SSadaf Ebrahimi     // If we get here, not defined in a dll at all.  See if defined statically.
294*a62be085SSadaf Ebrahimi     // don't ask me why this type isn't uint32_t too...
295*a62be085SSadaf Ebrahimi     unsigned long len;  // NOLINT
296*a62be085SSadaf Ebrahimi     *pstart = getsectdata("__DATA", name, &len);
297*a62be085SSadaf Ebrahimi     *pend = *pstart + len;
298*a62be085SSadaf Ebrahimi   }
299*a62be085SSadaf Ebrahimi };
300*a62be085SSadaf Ebrahimi 
301*a62be085SSadaf Ebrahimi // 1) DEFINE_ATTRIBUTE_SECTION_VARS: must be called once per unique
302*a62be085SSadaf Ebrahimi //    name.  You want to make sure this is executed before any
303*a62be085SSadaf Ebrahimi //    DECLARE_ATTRIBUTE_SECTION_VARS; the easiest way is to put them
304*a62be085SSadaf Ebrahimi //    in the same .cc file.  Put this call at the global level.
305*a62be085SSadaf Ebrahimi // 2) INIT_ATTRIBUTE_SECTION_VARS: you can scatter calls to this in
306*a62be085SSadaf Ebrahimi //    multiple places to help ensure execution before any
307*a62be085SSadaf Ebrahimi //    DECLARE_ATTRIBUTE_SECTION_VARS.  You must have at least one
308*a62be085SSadaf Ebrahimi //    DEFINE, but you can have many INITs.  Put each in its own scope.
309*a62be085SSadaf Ebrahimi // 3) DECLARE_ATTRIBUTE_SECTION_VARS: must be called before using
310*a62be085SSadaf Ebrahimi //    ATTRIBUTE_SECTION_START or ATTRIBUTE_SECTION_STOP on a name.
311*a62be085SSadaf Ebrahimi //    Put this call at the global level.
312*a62be085SSadaf Ebrahimi #define DECLARE_ATTRIBUTE_SECTION_VARS(name) \
313*a62be085SSadaf Ebrahimi   extern char *__start_##name;               \
314*a62be085SSadaf Ebrahimi   extern char *__stop_##name;
315*a62be085SSadaf Ebrahimi 
316*a62be085SSadaf Ebrahimi #define INIT_ATTRIBUTE_SECTION_VARS(name)                                      \
317*a62be085SSadaf Ebrahimi   DECLARE_ATTRIBUTE_SECTION_VARS(name);                                        \
318*a62be085SSadaf Ebrahimi   static const AssignAttributeStartEnd __assign_##name(#name, &__start_##name, \
319*a62be085SSadaf Ebrahimi                                                        &__stop_##name)
320*a62be085SSadaf Ebrahimi 
321*a62be085SSadaf Ebrahimi #define DEFINE_ATTRIBUTE_SECTION_VARS(name) \
322*a62be085SSadaf Ebrahimi   char *__start_##name, *__stop_##name;     \
323*a62be085SSadaf Ebrahimi   INIT_ATTRIBUTE_SECTION_VARS(name)
324*a62be085SSadaf Ebrahimi 
325*a62be085SSadaf Ebrahimi // Darwin doesn't have strnlen. No comment.
strnlen(const char * s,size_t maxlen)326*a62be085SSadaf Ebrahimi inline size_t strnlen(const char *s, size_t maxlen) {
327*a62be085SSadaf Ebrahimi   const char *end = (const char *)memchr(s, '\0', maxlen);
328*a62be085SSadaf Ebrahimi   if (end) return end - s;
329*a62be085SSadaf Ebrahimi   return maxlen;
330*a62be085SSadaf Ebrahimi }
331*a62be085SSadaf Ebrahimi 
332*a62be085SSadaf Ebrahimi // Doesn't exist on OSX.
333*a62be085SSadaf Ebrahimi #define MSG_NOSIGNAL 0
334*a62be085SSadaf Ebrahimi 
335*a62be085SSadaf Ebrahimi // No SIGPWR on MacOSX.  SIGINFO seems suitably obscure.
336*a62be085SSadaf Ebrahimi #undef GOOGLE_OBSCURE_SIGNAL
337*a62be085SSadaf Ebrahimi #define GOOGLE_OBSCURE_SIGNAL SIGINFO
338*a62be085SSadaf Ebrahimi 
339*a62be085SSadaf Ebrahimi #elif defined(OS_CYGWIN)  // Cygwin-specific behavior.
340*a62be085SSadaf Ebrahimi 
341*a62be085SSadaf Ebrahimi #if defined(__CYGWIN32__)
342*a62be085SSadaf Ebrahimi #define __WORDSIZE 32
343*a62be085SSadaf Ebrahimi #else
344*a62be085SSadaf Ebrahimi // It's probably possible to support 64-bit, but the #defines will need checked.
345*a62be085SSadaf Ebrahimi #error "Cygwin is currently only 32-bit."
346*a62be085SSadaf Ebrahimi #endif
347*a62be085SSadaf Ebrahimi 
348*a62be085SSadaf Ebrahimi // No signalling on Windows.
349*a62be085SSadaf Ebrahimi #undef GOOGLE_OBSCURE_SIGNAL
350*a62be085SSadaf Ebrahimi #define GOOGLE_OBSCURE_SIGNAL 0
351*a62be085SSadaf Ebrahimi 
352*a62be085SSadaf Ebrahimi struct stack_t {
353*a62be085SSadaf Ebrahimi   void *ss_sp;
354*a62be085SSadaf Ebrahimi   int ss_flags;
355*a62be085SSadaf Ebrahimi   size_t ss_size;
356*a62be085SSadaf Ebrahimi };
sigaltstack(stack_t * ss,stack_t * oss)357*a62be085SSadaf Ebrahimi inline int sigaltstack(stack_t *ss, stack_t *oss) { return 0; }
358*a62be085SSadaf Ebrahimi 
359*a62be085SSadaf Ebrahimi #define PTHREAD_STACK_MIN 0  // Not provided by cygwin
360*a62be085SSadaf Ebrahimi 
361*a62be085SSadaf Ebrahimi // Scans memory for a character.
362*a62be085SSadaf Ebrahimi // memrchr is used in a few places, but it's linux-specific.
memrchr(const void * bytes,int find_char,size_t len)363*a62be085SSadaf Ebrahimi inline void *memrchr(const void *bytes, int find_char, size_t len) {
364*a62be085SSadaf Ebrahimi   const unsigned char *cursor =
365*a62be085SSadaf Ebrahimi       reinterpret_cast<const unsigned char *>(bytes) + len - 1;
366*a62be085SSadaf Ebrahimi   unsigned char actual_char = find_char;
367*a62be085SSadaf Ebrahimi   for (; cursor >= bytes; --cursor) {
368*a62be085SSadaf Ebrahimi     if (*cursor == actual_char) {
369*a62be085SSadaf Ebrahimi       return const_cast<void *>(reinterpret_cast<const void *>(cursor));
370*a62be085SSadaf Ebrahimi     }
371*a62be085SSadaf Ebrahimi   }
372*a62be085SSadaf Ebrahimi   return NULL;
373*a62be085SSadaf Ebrahimi }
374*a62be085SSadaf Ebrahimi 
375*a62be085SSadaf Ebrahimi #endif
376*a62be085SSadaf Ebrahimi 
377*a62be085SSadaf Ebrahimi // Klocwork static analysis tool's C/C++ compiler kwcc
378*a62be085SSadaf Ebrahimi #if defined(__KLOCWORK__)
379*a62be085SSadaf Ebrahimi #define STATIC_ANALYSIS
380*a62be085SSadaf Ebrahimi #endif  // __KLOCWORK__
381*a62be085SSadaf Ebrahimi 
382*a62be085SSadaf Ebrahimi // GCC-specific features
383*a62be085SSadaf Ebrahimi 
384*a62be085SSadaf Ebrahimi #if (defined(COMPILER_GCC3) || defined(OS_MACOSX) || defined(OS_IOS)) && \
385*a62be085SSadaf Ebrahimi     !defined(SWIG)
386*a62be085SSadaf Ebrahimi 
387*a62be085SSadaf Ebrahimi //
388*a62be085SSadaf Ebrahimi // Tell the compiler to do printf format string checking if the
389*a62be085SSadaf Ebrahimi // compiler supports it; see the 'format' attribute in
390*a62be085SSadaf Ebrahimi // <http://gcc.gnu.org/onlinedocs/gcc-4.3.0/gcc/Function-Attributes.html>.
391*a62be085SSadaf Ebrahimi //
392*a62be085SSadaf Ebrahimi // N.B.: As the GCC manual states, "[s]ince non-static C++ methods
393*a62be085SSadaf Ebrahimi // have an implicit 'this' argument, the arguments of such methods
394*a62be085SSadaf Ebrahimi // should be counted from two, not one."
395*a62be085SSadaf Ebrahimi //
396*a62be085SSadaf Ebrahimi #define PRINTF_ATTRIBUTE(string_index, first_to_check) \
397*a62be085SSadaf Ebrahimi   __attribute__((__format__(__printf__, string_index, first_to_check)))
398*a62be085SSadaf Ebrahimi #define SCANF_ATTRIBUTE(string_index, first_to_check) \
399*a62be085SSadaf Ebrahimi   __attribute__((__format__(__scanf__, string_index, first_to_check)))
400*a62be085SSadaf Ebrahimi 
401*a62be085SSadaf Ebrahimi // Cache line alignment
402*a62be085SSadaf Ebrahimi #if defined(__i386__) || defined(__x86_64__)
403*a62be085SSadaf Ebrahimi #define CACHELINE_SIZE 64
404*a62be085SSadaf Ebrahimi #elif defined(__powerpc64__)
405*a62be085SSadaf Ebrahimi #define CACHELINE_SIZE 128
406*a62be085SSadaf Ebrahimi #elif defined(__aarch64__)
407*a62be085SSadaf Ebrahimi // We would need to read special regiter ctr_el0 to find out L1 dcache size.
408*a62be085SSadaf Ebrahimi // This value is a good estimate based on a real aarch64 machine.
409*a62be085SSadaf Ebrahimi #define CACHELINE_SIZE 64
410*a62be085SSadaf Ebrahimi #elif defined(__arm__)
411*a62be085SSadaf Ebrahimi // Cache line sizes for ARM: These values are not strictly correct since
412*a62be085SSadaf Ebrahimi // cache line sizes depend on implementations, not architectures.  There
413*a62be085SSadaf Ebrahimi // are even implementations with cache line sizes configurable at boot
414*a62be085SSadaf Ebrahimi // time.
415*a62be085SSadaf Ebrahimi #if defined(__ARM_ARCH_5T__)
416*a62be085SSadaf Ebrahimi #define CACHELINE_SIZE 32
417*a62be085SSadaf Ebrahimi #elif defined(__ARM_ARCH_7A__)
418*a62be085SSadaf Ebrahimi #define CACHELINE_SIZE 64
419*a62be085SSadaf Ebrahimi #endif
420*a62be085SSadaf Ebrahimi #endif
421*a62be085SSadaf Ebrahimi 
422*a62be085SSadaf Ebrahimi #ifndef CACHELINE_SIZE  // NOLINT
423*a62be085SSadaf Ebrahimi // A reasonable default guess.  Note that overestimates tend to waste more
424*a62be085SSadaf Ebrahimi // space, while underestimates tend to waste more time.
425*a62be085SSadaf Ebrahimi #define CACHELINE_SIZE 64
426*a62be085SSadaf Ebrahimi #endif
427*a62be085SSadaf Ebrahimi 
428*a62be085SSadaf Ebrahimi #define CACHELINE_ALIGNED __attribute__((aligned(CACHELINE_SIZE)))
429*a62be085SSadaf Ebrahimi 
430*a62be085SSadaf Ebrahimi //
431*a62be085SSadaf Ebrahimi // Prevent the compiler from complaining about or optimizing away variables
432*a62be085SSadaf Ebrahimi // that appear unused
433*a62be085SSadaf Ebrahimi #ifndef DDEPTH_ATTRIBUTE_UNUSED  // NOLINT
434*a62be085SSadaf Ebrahimi #undef DDEPTH_ATTRIBUTE_UNUSED
435*a62be085SSadaf Ebrahimi #define DDEPTH_ATTRIBUTE_UNUSED __attribute__((__unused__))
436*a62be085SSadaf Ebrahimi #endif  // DDEPTH_ATTRIBUTE_UNUSED
437*a62be085SSadaf Ebrahimi 
438*a62be085SSadaf Ebrahimi //
439*a62be085SSadaf Ebrahimi // For functions we want to force inline or not inline.
440*a62be085SSadaf Ebrahimi // Introduced in gcc 3.1.
441*a62be085SSadaf Ebrahimi #define ATTRIBUTE_ALWAYS_INLINE __attribute__((always_inline))
442*a62be085SSadaf Ebrahimi #define HAVE_ATTRIBUTE_ALWAYS_INLINE 1
443*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NOINLINE __attribute__((noinline))
444*a62be085SSadaf Ebrahimi #define HAVE_ATTRIBUTE_NOINLINE 1
445*a62be085SSadaf Ebrahimi 
446*a62be085SSadaf Ebrahimi // For weak functions
447*a62be085SSadaf Ebrahimi #undef ATTRIBUTE_WEAK
448*a62be085SSadaf Ebrahimi #define ATTRIBUTE_WEAK __attribute__((weak))
449*a62be085SSadaf Ebrahimi #define HAVE_ATTRIBUTE_WEAK 1
450*a62be085SSadaf Ebrahimi 
451*a62be085SSadaf Ebrahimi // Tell the compiler to use "initial-exec" mode for a thread-local variable.
452*a62be085SSadaf Ebrahimi // See http://people.redhat.com/drepper/tls.pdf for the gory details.
453*a62be085SSadaf Ebrahimi #define ATTRIBUTE_INITIAL_EXEC __attribute__((tls_model("initial-exec")))
454*a62be085SSadaf Ebrahimi 
455*a62be085SSadaf Ebrahimi // Tell the compiler either that a particular function parameter
456*a62be085SSadaf Ebrahimi // should be a non-null pointer, or that all pointer arguments should
457*a62be085SSadaf Ebrahimi // be non-null.
458*a62be085SSadaf Ebrahimi //
459*a62be085SSadaf Ebrahimi // Note: As the GCC manual states, "[s]ince non-static C++ methods
460*a62be085SSadaf Ebrahimi // have an implicit 'this' argument, the arguments of such methods
461*a62be085SSadaf Ebrahimi // should be counted from two, not one."
462*a62be085SSadaf Ebrahimi //
463*a62be085SSadaf Ebrahimi // Args are indexed starting at 1.
464*a62be085SSadaf Ebrahimi // For non-static class member functions, the implicit "this" argument
465*a62be085SSadaf Ebrahimi // is arg 1, and the first explicit argument is arg 2.
466*a62be085SSadaf Ebrahimi // For static class member functions, there is no implicit "this", and
467*a62be085SSadaf Ebrahimi // the first explicit argument is arg 1.
468*a62be085SSadaf Ebrahimi //
469*a62be085SSadaf Ebrahimi //   /* arg_a cannot be NULL, but arg_b can */
470*a62be085SSadaf Ebrahimi //   void Function(void* arg_a, void* arg_b) ATTRIBUTE_NONNULL(1);
471*a62be085SSadaf Ebrahimi //
472*a62be085SSadaf Ebrahimi //   class C {
473*a62be085SSadaf Ebrahimi //     /* arg_a cannot be NULL, but arg_b can */
474*a62be085SSadaf Ebrahimi //     void Method(void* arg_a, void* arg_b) ATTRIBUTE_NONNULL(2);
475*a62be085SSadaf Ebrahimi //
476*a62be085SSadaf Ebrahimi //     /* arg_a cannot be NULL, but arg_b can */
477*a62be085SSadaf Ebrahimi //     static void StaticMethod(void* arg_a, void* arg_b) ATTRIBUTE_NONNULL(1);
478*a62be085SSadaf Ebrahimi //   };
479*a62be085SSadaf Ebrahimi //
480*a62be085SSadaf Ebrahimi // If no arguments are provided, then all pointer arguments should be non-null.
481*a62be085SSadaf Ebrahimi //
482*a62be085SSadaf Ebrahimi //  /* No pointer arguments may be null. */
483*a62be085SSadaf Ebrahimi //  void Function(void* arg_a, void* arg_b, int arg_c) ATTRIBUTE_NONNULL();
484*a62be085SSadaf Ebrahimi //
485*a62be085SSadaf Ebrahimi // NOTE: The GCC nonnull attribute actually accepts a list of arguments, but
486*a62be085SSadaf Ebrahimi // ATTRIBUTE_NONNULL does not.
487*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NONNULL(arg_index) __attribute__((nonnull(arg_index)))
488*a62be085SSadaf Ebrahimi 
489*a62be085SSadaf Ebrahimi //
490*a62be085SSadaf Ebrahimi // Tell the compiler that a given function never returns
491*a62be085SSadaf Ebrahimi //
492*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NORETURN __attribute__((noreturn))
493*a62be085SSadaf Ebrahimi 
494*a62be085SSadaf Ebrahimi // Tell AddressSanitizer (or other memory testing tools) to ignore a given
495*a62be085SSadaf Ebrahimi // function. Useful for cases when a function reads random locations on stack,
496*a62be085SSadaf Ebrahimi // calls _exit from a cloned subprocess, deliberately accesses buffer
497*a62be085SSadaf Ebrahimi // out of bounds or does other scary things with memory.
498*a62be085SSadaf Ebrahimi #ifdef ADDRESS_SANITIZER
499*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
500*a62be085SSadaf Ebrahimi #else
501*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_ADDRESS
502*a62be085SSadaf Ebrahimi #endif
503*a62be085SSadaf Ebrahimi 
504*a62be085SSadaf Ebrahimi // Tell MemorySanitizer to relax the handling of a given function. All "Use of
505*a62be085SSadaf Ebrahimi // uninitialized value" warnings from such functions will be suppressed, and all
506*a62be085SSadaf Ebrahimi // values loaded from memory will be considered fully initialized.
507*a62be085SSadaf Ebrahimi // This is similar to the ADDRESS_SANITIZER attribute above, but deals with
508*a62be085SSadaf Ebrahimi // initializedness rather than addressability issues.
509*a62be085SSadaf Ebrahimi #ifdef MEMORY_SANITIZER
510*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_MEMORY __attribute__((no_sanitize_memory))
511*a62be085SSadaf Ebrahimi #else
512*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_MEMORY
513*a62be085SSadaf Ebrahimi #endif
514*a62be085SSadaf Ebrahimi 
515*a62be085SSadaf Ebrahimi // Tell ThreadSanitizer to not instrument a given function.
516*a62be085SSadaf Ebrahimi // If you are adding this attribute, please cc dynamic-tools@ on the cl.
517*a62be085SSadaf Ebrahimi #ifdef THREAD_SANITIZER
518*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_THREAD __attribute__((no_sanitize_thread))
519*a62be085SSadaf Ebrahimi #else
520*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_THREAD
521*a62be085SSadaf Ebrahimi #endif
522*a62be085SSadaf Ebrahimi 
523*a62be085SSadaf Ebrahimi // Tell ControlFlowIntegrity sanitizer to not instrument a given function.
524*a62be085SSadaf Ebrahimi #ifdef CONTROL_FLOW_INTEGRITY
525*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_CFI __attribute__((no_sanitize("cfi")))
526*a62be085SSadaf Ebrahimi #else
527*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_CFI
528*a62be085SSadaf Ebrahimi #endif
529*a62be085SSadaf Ebrahimi 
530*a62be085SSadaf Ebrahimi #ifndef HAVE_ATTRIBUTE_SECTION  // may have been pre-set to 0, e.g. for Darwin
531*a62be085SSadaf Ebrahimi                                 // // NOLINT
532*a62be085SSadaf Ebrahimi #define HAVE_ATTRIBUTE_SECTION 1
533*a62be085SSadaf Ebrahimi #endif
534*a62be085SSadaf Ebrahimi 
535*a62be085SSadaf Ebrahimi #if HAVE_ATTRIBUTE_SECTION  // define section support for the case of GCC
536*a62be085SSadaf Ebrahimi 
537*a62be085SSadaf Ebrahimi //
538*a62be085SSadaf Ebrahimi // Tell the compiler/linker to put a given function into a section and define
539*a62be085SSadaf Ebrahimi // "__start_ ## name" and "__stop_ ## name" symbols to bracket the section.
540*a62be085SSadaf Ebrahimi // This functionality is supported by GNU linker.
541*a62be085SSadaf Ebrahimi // Any function with ATTRIBUTE_SECTION must not be inlined, or it will
542*a62be085SSadaf Ebrahimi // be placed into whatever section its caller is placed into.
543*a62be085SSadaf Ebrahimi //
544*a62be085SSadaf Ebrahimi #ifndef ATTRIBUTE_SECTION  // NOLINT
545*a62be085SSadaf Ebrahimi #define ATTRIBUTE_SECTION(name) \
546*a62be085SSadaf Ebrahimi   __attribute__((section(#name))) __attribute__((noinline))
547*a62be085SSadaf Ebrahimi #endif
548*a62be085SSadaf Ebrahimi 
549*a62be085SSadaf Ebrahimi //
550*a62be085SSadaf Ebrahimi // Weak section declaration to be used as a global declaration
551*a62be085SSadaf Ebrahimi // for ATTRIBUTE_SECTION_START|STOP(name) to compile and link
552*a62be085SSadaf Ebrahimi // even without functions with ATTRIBUTE_SECTION(name).
553*a62be085SSadaf Ebrahimi // DEFINE_ATTRIBUTE_SECTION should be in the exactly one file; it's
554*a62be085SSadaf Ebrahimi // a no-op on ELF but not on Mach-O.
555*a62be085SSadaf Ebrahimi //
556*a62be085SSadaf Ebrahimi #ifndef DECLARE_ATTRIBUTE_SECTION_VARS  // NOLINT
557*a62be085SSadaf Ebrahimi #define DECLARE_ATTRIBUTE_SECTION_VARS(name)   \
558*a62be085SSadaf Ebrahimi   extern char __start_##name[] ATTRIBUTE_WEAK; \
559*a62be085SSadaf Ebrahimi   extern char __stop_##name[] ATTRIBUTE_WEAK
560*a62be085SSadaf Ebrahimi #endif
561*a62be085SSadaf Ebrahimi #ifndef DEFINE_ATTRIBUTE_SECTION_VARS  // NOLINT
562*a62be085SSadaf Ebrahimi #define INIT_ATTRIBUTE_SECTION_VARS(name)
563*a62be085SSadaf Ebrahimi #define DEFINE_ATTRIBUTE_SECTION_VARS(name)
564*a62be085SSadaf Ebrahimi #endif
565*a62be085SSadaf Ebrahimi 
566*a62be085SSadaf Ebrahimi //
567*a62be085SSadaf Ebrahimi // Return void* pointers to start/end of a section of code with
568*a62be085SSadaf Ebrahimi // functions having ATTRIBUTE_SECTION(name).
569*a62be085SSadaf Ebrahimi // Returns 0 if no such functions exits.
570*a62be085SSadaf Ebrahimi // One must DECLARE_ATTRIBUTE_SECTION_VARS(name) for this to compile and link.
571*a62be085SSadaf Ebrahimi //
572*a62be085SSadaf Ebrahimi #define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void *>(__start_##name))
573*a62be085SSadaf Ebrahimi #define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void *>(__stop_##name))
574*a62be085SSadaf Ebrahimi 
575*a62be085SSadaf Ebrahimi #endif  // HAVE_ATTRIBUTE_SECTION
576*a62be085SSadaf Ebrahimi 
577*a62be085SSadaf Ebrahimi // Support for aligning the stack on 32-bit x86.
578*a62be085SSadaf Ebrahimi 
579*a62be085SSadaf Ebrahimi #if defined(__i386__) && \
580*a62be085SSadaf Ebrahimi     (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))
581*a62be085SSadaf Ebrahimi #define ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC \
582*a62be085SSadaf Ebrahimi   __attribute__((force_align_arg_pointer))
583*a62be085SSadaf Ebrahimi #define REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
584*a62be085SSadaf Ebrahimi #elif defined(__i386__) || defined(__x86_64__)
585*a62be085SSadaf Ebrahimi #define REQUIRE_STACK_ALIGN_TRAMPOLINE (1)
586*a62be085SSadaf Ebrahimi #define ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
587*a62be085SSadaf Ebrahimi #else
588*a62be085SSadaf Ebrahimi #define REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
589*a62be085SSadaf Ebrahimi #define ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
590*a62be085SSadaf Ebrahimi #endif
591*a62be085SSadaf Ebrahimi 
592*a62be085SSadaf Ebrahimi // Tell the compiler to warn about unused return values for functions declared
593*a62be085SSadaf Ebrahimi // with this macro. The macro must appear as the very first part of a function
594*a62be085SSadaf Ebrahimi // declaration or definition:
595*a62be085SSadaf Ebrahimi //
596*a62be085SSadaf Ebrahimi //   ABSL_MUST_USE_RESULT Sprocket* AllocateSprocket();
597*a62be085SSadaf Ebrahimi //
598*a62be085SSadaf Ebrahimi // This placement has the broadest compatibility with GCC, Clang, and MSVC, with
599*a62be085SSadaf Ebrahimi // both defs and decls, and with GCC-style attributes, MSVC declspec, and C++11
600*a62be085SSadaf Ebrahimi // attributes. Note: past advice was to place the macro after the argument list.
601*a62be085SSadaf Ebrahimi #if defined(SWIG)
602*a62be085SSadaf Ebrahimi #define ABSL_MUST_USE_RESULT
603*a62be085SSadaf Ebrahimi #elif __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
604*a62be085SSadaf Ebrahimi #define ABSL_MUST_USE_RESULT __attribute__((warn_unused_result))
605*a62be085SSadaf Ebrahimi #else
606*a62be085SSadaf Ebrahimi #define ABSL_MUST_USE_RESULT
607*a62be085SSadaf Ebrahimi #endif
608*a62be085SSadaf Ebrahimi 
609*a62be085SSadaf Ebrahimi //
610*a62be085SSadaf Ebrahimi // Prevent the compiler from padding a structure to natural alignment
611*a62be085SSadaf Ebrahimi //
612*a62be085SSadaf Ebrahimi #if __GNUC__ && !defined(SWIG)
613*a62be085SSadaf Ebrahimi #define ATTRIBUTE_PACKED __attribute__((__packed__))
614*a62be085SSadaf Ebrahimi #else
615*a62be085SSadaf Ebrahimi #define ATTRIBUTE_PACKED
616*a62be085SSadaf Ebrahimi #endif
617*a62be085SSadaf Ebrahimi 
618*a62be085SSadaf Ebrahimi #if defined(COMPILER_GCC3) || defined(__llvm__)
619*a62be085SSadaf Ebrahimi // Defined behavior on some of the uarchs:
620*a62be085SSadaf Ebrahimi // PREFETCH_HINT_T0:
621*a62be085SSadaf Ebrahimi //   prefetch to all levels of the hierarchy (except on p4: prefetch to L2)
622*a62be085SSadaf Ebrahimi // PREFETCH_HINT_NTA:
623*a62be085SSadaf Ebrahimi //   p4: fetch to L2, but limit to 1 way (out of the 8 ways)
624*a62be085SSadaf Ebrahimi //   core: skip L2, go directly to L1
625*a62be085SSadaf Ebrahimi //   k8 rev E and later: skip L2, can go to either of the 2-ways in L1
626*a62be085SSadaf Ebrahimi enum PrefetchHint {
627*a62be085SSadaf Ebrahimi   PREFETCH_HINT_T0 = 3,  // More temporal locality
628*a62be085SSadaf Ebrahimi   PREFETCH_HINT_T1 = 2,
629*a62be085SSadaf Ebrahimi   PREFETCH_HINT_T2 = 1,  // Less temporal locality
630*a62be085SSadaf Ebrahimi   PREFETCH_HINT_NTA = 0  // No temporal locality
631*a62be085SSadaf Ebrahimi };
632*a62be085SSadaf Ebrahimi #else
633*a62be085SSadaf Ebrahimi // prefetch is a no-op for this target. Feel free to add more sections above.
634*a62be085SSadaf Ebrahimi #endif
635*a62be085SSadaf Ebrahimi 
636*a62be085SSadaf Ebrahimi // The default behavior of prefetch is to speculatively load for read only. This
637*a62be085SSadaf Ebrahimi // is safe for all currently supported platforms. However, prefetch for store
638*a62be085SSadaf Ebrahimi // may have problems depending on the target platform (x86, PPC, arm). Check
639*a62be085SSadaf Ebrahimi // with the platforms team (platforms-servers@) before introducing any changes
640*a62be085SSadaf Ebrahimi // to this function to identify potential impact on current and future servers.
prefetch(const void * x,int hint)641*a62be085SSadaf Ebrahimi extern inline void prefetch(const void *x, int hint) {
642*a62be085SSadaf Ebrahimi #if defined(__llvm__)
643*a62be085SSadaf Ebrahimi   // In the gcc version of prefetch(), hint is only a constant _after_ inlining
644*a62be085SSadaf Ebrahimi   // (assumed to have been successful).  llvm views things differently, and
645*a62be085SSadaf Ebrahimi   // checks constant-ness _before_ inlining.  This leads to compilation errors
646*a62be085SSadaf Ebrahimi   // with using the other version of this code with llvm.
647*a62be085SSadaf Ebrahimi   //
648*a62be085SSadaf Ebrahimi   // One way round this is to use a switch statement to explicitly match
649*a62be085SSadaf Ebrahimi   // prefetch hint enumerations, and invoke __builtin_prefetch for each valid
650*a62be085SSadaf Ebrahimi   // value.  llvm's optimization removes the switch and unused case statements
651*a62be085SSadaf Ebrahimi   // after inlining, so that this boils down in the end to the same as for gcc;
652*a62be085SSadaf Ebrahimi   // that is, a single inlined prefetchX instruction.
653*a62be085SSadaf Ebrahimi   //
654*a62be085SSadaf Ebrahimi   // Note that this version of prefetch() cannot verify constant-ness of hint.
655*a62be085SSadaf Ebrahimi   // If client code calls prefetch() with a variable value for hint, it will
656*a62be085SSadaf Ebrahimi   // receive the full expansion of the switch below, perhaps also not inlined.
657*a62be085SSadaf Ebrahimi   // This should however not be a problem in the general case of well behaved
658*a62be085SSadaf Ebrahimi   // caller code that uses the supplied prefetch hint enumerations.
659*a62be085SSadaf Ebrahimi   switch (hint) {
660*a62be085SSadaf Ebrahimi     case PREFETCH_HINT_T0:
661*a62be085SSadaf Ebrahimi       __builtin_prefetch(x, 0, PREFETCH_HINT_T0);
662*a62be085SSadaf Ebrahimi       break;
663*a62be085SSadaf Ebrahimi     case PREFETCH_HINT_T1:
664*a62be085SSadaf Ebrahimi       __builtin_prefetch(x, 0, PREFETCH_HINT_T1);
665*a62be085SSadaf Ebrahimi       break;
666*a62be085SSadaf Ebrahimi     case PREFETCH_HINT_T2:
667*a62be085SSadaf Ebrahimi       __builtin_prefetch(x, 0, PREFETCH_HINT_T2);
668*a62be085SSadaf Ebrahimi       break;
669*a62be085SSadaf Ebrahimi     case PREFETCH_HINT_NTA:
670*a62be085SSadaf Ebrahimi       __builtin_prefetch(x, 0, PREFETCH_HINT_NTA);
671*a62be085SSadaf Ebrahimi       break;
672*a62be085SSadaf Ebrahimi     default:
673*a62be085SSadaf Ebrahimi       __builtin_prefetch(x);
674*a62be085SSadaf Ebrahimi       break;
675*a62be085SSadaf Ebrahimi   }
676*a62be085SSadaf Ebrahimi #elif defined(COMPILER_GCC3)
677*a62be085SSadaf Ebrahimi   if (__builtin_constant_p(hint)) {
678*a62be085SSadaf Ebrahimi     __builtin_prefetch(x, 0, hint);
679*a62be085SSadaf Ebrahimi   } else {
680*a62be085SSadaf Ebrahimi     // Defaults to PREFETCH_HINT_T0
681*a62be085SSadaf Ebrahimi     __builtin_prefetch(x);
682*a62be085SSadaf Ebrahimi   }
683*a62be085SSadaf Ebrahimi #else
684*a62be085SSadaf Ebrahimi   // You get no effect.  Feel free to add more sections above.
685*a62be085SSadaf Ebrahimi #endif
686*a62be085SSadaf Ebrahimi }
687*a62be085SSadaf Ebrahimi 
688*a62be085SSadaf Ebrahimi #ifdef __cplusplus
689*a62be085SSadaf Ebrahimi // prefetch intrinsic (bring data to L1 without polluting L2 cache)
prefetch(const void * x)690*a62be085SSadaf Ebrahimi extern inline void prefetch(const void *x) { return prefetch(x, 0); }
691*a62be085SSadaf Ebrahimi #endif  // ifdef __cplusplus
692*a62be085SSadaf Ebrahimi 
693*a62be085SSadaf Ebrahimi //
694*a62be085SSadaf Ebrahimi // GCC can be told that a certain branch is not likely to be taken (for
695*a62be085SSadaf Ebrahimi // instance, a CHECK failure), and use that information in static analysis.
696*a62be085SSadaf Ebrahimi // Giving it this information can help it optimize for the common case in
697*a62be085SSadaf Ebrahimi // the absence of better information (ie. -fprofile-arcs).
698*a62be085SSadaf Ebrahimi //
699*a62be085SSadaf Ebrahimi #if defined(COMPILER_GCC3)
700*a62be085SSadaf Ebrahimi #define PREDICT_FALSE(x) (__builtin_expect(x, 0))
701*a62be085SSadaf Ebrahimi #define PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
702*a62be085SSadaf Ebrahimi #else
703*a62be085SSadaf Ebrahimi #define PREDICT_FALSE(x) x
704*a62be085SSadaf Ebrahimi #define PREDICT_TRUE(x) x
705*a62be085SSadaf Ebrahimi #endif
706*a62be085SSadaf Ebrahimi 
707*a62be085SSadaf Ebrahimi //
708*a62be085SSadaf Ebrahimi // Tell GCC that a function is hot or cold. GCC can use this information to
709*a62be085SSadaf Ebrahimi // improve static analysis, i.e. a conditional branch to a cold function
710*a62be085SSadaf Ebrahimi // is likely to be not-taken.
711*a62be085SSadaf Ebrahimi // This annotation is used for function declarations, e.g.:
712*a62be085SSadaf Ebrahimi //   int foo() ATTRIBUTE_HOT;
713*a62be085SSadaf Ebrahimi //
714*a62be085SSadaf Ebrahimi #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)
715*a62be085SSadaf Ebrahimi #define ATTRIBUTE_HOT __attribute__((hot))
716*a62be085SSadaf Ebrahimi #define ATTRIBUTE_COLD __attribute__((cold))
717*a62be085SSadaf Ebrahimi #else
718*a62be085SSadaf Ebrahimi #define ATTRIBUTE_HOT
719*a62be085SSadaf Ebrahimi #define ATTRIBUTE_COLD
720*a62be085SSadaf Ebrahimi #endif
721*a62be085SSadaf Ebrahimi 
722*a62be085SSadaf Ebrahimi #define FTELLO ftello
723*a62be085SSadaf Ebrahimi #define FSEEKO fseeko
724*a62be085SSadaf Ebrahimi 
725*a62be085SSadaf Ebrahimi #else  // not GCC
726*a62be085SSadaf Ebrahimi 
727*a62be085SSadaf Ebrahimi #define PRINTF_ATTRIBUTE(string_index, first_to_check)
728*a62be085SSadaf Ebrahimi #define SCANF_ATTRIBUTE(string_index, first_to_check)
729*a62be085SSadaf Ebrahimi #define CACHELINE_SIZE 64
730*a62be085SSadaf Ebrahimi #define CACHELINE_ALIGNED
731*a62be085SSadaf Ebrahimi 
732*a62be085SSadaf Ebrahimi #ifndef ATTRIBUTE_UNUSED  // NOLINT
733*a62be085SSadaf Ebrahimi #define ATTRIBUTE_UNUSED
734*a62be085SSadaf Ebrahimi #endif  // ATTRIBUTE_UNUSED
735*a62be085SSadaf Ebrahimi 
736*a62be085SSadaf Ebrahimi #define ATTRIBUTE_ALWAYS_INLINE
737*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NOINLINE
738*a62be085SSadaf Ebrahimi #define ATTRIBUTE_HOT
739*a62be085SSadaf Ebrahimi #define ATTRIBUTE_COLD
740*a62be085SSadaf Ebrahimi #define ATTRIBUTE_WEAK
741*a62be085SSadaf Ebrahimi #define HAVE_ATTRIBUTE_WEAK 0
742*a62be085SSadaf Ebrahimi #define ATTRIBUTE_INITIAL_EXEC
743*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NONNULL(arg_index)
744*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NORETURN
745*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_ADDRESS
746*a62be085SSadaf Ebrahimi #define ATTRIBUTE_NO_SANITIZE_MEMORY
747*a62be085SSadaf Ebrahimi #define HAVE_ATTRIBUTE_SECTION 0
748*a62be085SSadaf Ebrahimi #define ATTRIBUTE_PACKED
749*a62be085SSadaf Ebrahimi #define ATTRIBUTE_STACK_ALIGN_FOR_OLD_LIBC
750*a62be085SSadaf Ebrahimi #define REQUIRE_STACK_ALIGN_TRAMPOLINE (0)
751*a62be085SSadaf Ebrahimi #define ABSL_MUST_USE_RESULT
prefetch(const void *)752*a62be085SSadaf Ebrahimi extern inline void prefetch(const void *) {}
753*a62be085SSadaf Ebrahimi #define PREDICT_FALSE(x) x
754*a62be085SSadaf Ebrahimi #define PREDICT_TRUE(x) x
755*a62be085SSadaf Ebrahimi 
756*a62be085SSadaf Ebrahimi // These should be redefined appropriately if better alternatives to
757*a62be085SSadaf Ebrahimi // ftell/fseek exist in the compiler
758*a62be085SSadaf Ebrahimi #define FTELLO ftell
759*a62be085SSadaf Ebrahimi #define FSEEKO fseek
760*a62be085SSadaf Ebrahimi 
761*a62be085SSadaf Ebrahimi #endif  // GCC
762*a62be085SSadaf Ebrahimi 
763*a62be085SSadaf Ebrahimi #if ((defined(COMPILER_GCC3) || defined(OS_MACOSX) || defined(OS_IOS) || \
764*a62be085SSadaf Ebrahimi       defined(__NVCC__)) &&                                              \
765*a62be085SSadaf Ebrahimi      !defined(SWIG)) ||                                                  \
766*a62be085SSadaf Ebrahimi     ((__GNUC__ >= 3 || defined(__clang__)) && defined(__ANDROID__))
767*a62be085SSadaf Ebrahimi 
768*a62be085SSadaf Ebrahimi #if !defined(__cplusplus) && !defined(OS_MACOSX) && !defined(OS_IOS) && \
769*a62be085SSadaf Ebrahimi     !defined(OS_CYGWIN)
770*a62be085SSadaf Ebrahimi // stdlib.h only declares this in C++, not in C, so we declare it here.
771*a62be085SSadaf Ebrahimi // Also make sure to avoid declaring it on platforms which don't support it.
772*a62be085SSadaf Ebrahimi extern int posix_memalign(void **memptr, size_t alignment, size_t size);
773*a62be085SSadaf Ebrahimi #endif
774*a62be085SSadaf Ebrahimi 
aligned_malloc(size_t size,int minimum_alignment)775*a62be085SSadaf Ebrahimi inline void *aligned_malloc(size_t size, int minimum_alignment) {
776*a62be085SSadaf Ebrahimi #if defined(__ANDROID__) || defined(OS_ANDROID) || defined(OS_CYGWIN)
777*a62be085SSadaf Ebrahimi   return memalign(minimum_alignment, size);
778*a62be085SSadaf Ebrahimi #else  // !__ANDROID__ && !OS_ANDROID && !OS_CYGWIN
779*a62be085SSadaf Ebrahimi   void *ptr = NULL;
780*a62be085SSadaf Ebrahimi   // posix_memalign requires that the requested alignment be at least
781*a62be085SSadaf Ebrahimi   // sizeof(void*). In this case, fall back on malloc which should return memory
782*a62be085SSadaf Ebrahimi   // aligned to at least the size of a pointer.
783*a62be085SSadaf Ebrahimi   const int required_alignment = sizeof(void *);
784*a62be085SSadaf Ebrahimi   if (minimum_alignment < required_alignment) return malloc(size);
785*a62be085SSadaf Ebrahimi   if (posix_memalign(&ptr, minimum_alignment, size) != 0)
786*a62be085SSadaf Ebrahimi     return NULL;
787*a62be085SSadaf Ebrahimi   else
788*a62be085SSadaf Ebrahimi     return ptr;
789*a62be085SSadaf Ebrahimi #endif
790*a62be085SSadaf Ebrahimi }
791*a62be085SSadaf Ebrahimi 
aligned_free(void * aligned_memory)792*a62be085SSadaf Ebrahimi inline void aligned_free(void *aligned_memory) { free(aligned_memory); }
793*a62be085SSadaf Ebrahimi 
794*a62be085SSadaf Ebrahimi #endif
795*a62be085SSadaf Ebrahimi // #if ((defined(COMPILER_GCC3) || defined(OS_MACOSX) || defined(OS_IOS) ||
796*a62be085SSadaf Ebrahimi // defined(__NVCC__)) && !defined(SWIG)) ||
797*a62be085SSadaf Ebrahimi // ((__GNUC__ >= 3 || defined(__clang__)) && defined(__ANDROID__))
798*a62be085SSadaf Ebrahimi 
799*a62be085SSadaf Ebrahimi //
800*a62be085SSadaf Ebrahimi // Provides a char array with the exact same alignment as another type. The
801*a62be085SSadaf Ebrahimi // first parameter must be a complete type, the second parameter is how many
802*a62be085SSadaf Ebrahimi // of that type to provide space for.
803*a62be085SSadaf Ebrahimi //
804*a62be085SSadaf Ebrahimi //   ALIGNED_CHAR_ARRAY(struct stat, 16) storage_;
805*a62be085SSadaf Ebrahimi //
806*a62be085SSadaf Ebrahimi #if defined(__cplusplus)
807*a62be085SSadaf Ebrahimi #undef ALIGNED_CHAR_ARRAY
808*a62be085SSadaf Ebrahimi // Because MSVC and older GCCs require that the argument to their alignment
809*a62be085SSadaf Ebrahimi // construct to be a literal constant integer, we use a template instantiated
810*a62be085SSadaf Ebrahimi // at all the possible powers of two.
811*a62be085SSadaf Ebrahimi #ifndef SWIG  // NOLINT
812*a62be085SSadaf Ebrahimi template <int alignment, int size>
813*a62be085SSadaf Ebrahimi struct AlignType {};
814*a62be085SSadaf Ebrahimi template <int size>
815*a62be085SSadaf Ebrahimi struct AlignType<0, size> {
816*a62be085SSadaf Ebrahimi   typedef char result[size];
817*a62be085SSadaf Ebrahimi };
818*a62be085SSadaf Ebrahimi #if defined(COMPILER_MSVC)
819*a62be085SSadaf Ebrahimi #define BASE_PORT_H_ALIGN_ATTRIBUTE(X) __declspec(align(X))
820*a62be085SSadaf Ebrahimi #define BASE_PORT_H_ALIGN_OF(T) __alignof(T)
821*a62be085SSadaf Ebrahimi #elif defined(COMPILER_GCC3)
822*a62be085SSadaf Ebrahimi #define BASE_PORT_H_ALIGN_ATTRIBUTE(X) __attribute__((aligned(X)))
823*a62be085SSadaf Ebrahimi #define BASE_PORT_H_ALIGN_OF(T) __alignof__(T)
824*a62be085SSadaf Ebrahimi #endif
825*a62be085SSadaf Ebrahimi 
826*a62be085SSadaf Ebrahimi #if defined(BASE_PORT_H_ALIGN_ATTRIBUTE)
827*a62be085SSadaf Ebrahimi 
828*a62be085SSadaf Ebrahimi #define BASE_PORT_H_ALIGNTYPE_TEMPLATE(X)                     \
829*a62be085SSadaf Ebrahimi   template <int size>                                         \
830*a62be085SSadaf Ebrahimi   struct AlignType<X, size> {                                 \
831*a62be085SSadaf Ebrahimi     typedef BASE_PORT_H_ALIGN_ATTRIBUTE(X) char result[size]; \
832*a62be085SSadaf Ebrahimi   }
833*a62be085SSadaf Ebrahimi 
834*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(1);
835*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(2);
836*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(4);
837*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(8);
838*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(16);
839*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(32);
840*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(64);
841*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(128);
842*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(256);
843*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(512);
844*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(1024);
845*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(2048);
846*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(4096);
847*a62be085SSadaf Ebrahimi BASE_PORT_H_ALIGNTYPE_TEMPLATE(8192);
848*a62be085SSadaf Ebrahimi // Any larger and MSVC++ will complain.
849*a62be085SSadaf Ebrahimi 
850*a62be085SSadaf Ebrahimi #define ALIGNED_CHAR_ARRAY(T, Size) \
851*a62be085SSadaf Ebrahimi   typename AlignType<BASE_PORT_H_ALIGN_OF(T), sizeof(T) * Size>::result
852*a62be085SSadaf Ebrahimi 
853*a62be085SSadaf Ebrahimi #undef BASE_PORT_H_ALIGNTYPE_TEMPLATE
854*a62be085SSadaf Ebrahimi #undef BASE_PORT_H_ALIGN_ATTRIBUTE
855*a62be085SSadaf Ebrahimi 
856*a62be085SSadaf Ebrahimi #else  // defined(BASE_PORT_H_ALIGN_ATTRIBUTE)
857*a62be085SSadaf Ebrahimi #define ALIGNED_CHAR_ARRAY \
858*a62be085SSadaf Ebrahimi   you_must_define_ALIGNED_CHAR_ARRAY_for_your_compiler_in_base_port_h
859*a62be085SSadaf Ebrahimi #endif  // defined(BASE_PORT_H_ALIGN_ATTRIBUTE)
860*a62be085SSadaf Ebrahimi 
861*a62be085SSadaf Ebrahimi #else  // !SWIG
862*a62be085SSadaf Ebrahimi 
863*a62be085SSadaf Ebrahimi // SWIG can't represent alignment and doesn't care about alignment on data
864*a62be085SSadaf Ebrahimi // members (it works fine without it).
865*a62be085SSadaf Ebrahimi template <typename Size>
866*a62be085SSadaf Ebrahimi struct AlignType {
867*a62be085SSadaf Ebrahimi   typedef char result[Size];
868*a62be085SSadaf Ebrahimi };
869*a62be085SSadaf Ebrahimi #define ALIGNED_CHAR_ARRAY(T, Size) AlignType<Size * sizeof(T)>::result
870*a62be085SSadaf Ebrahimi 
871*a62be085SSadaf Ebrahimi #endif  // !SWIG
872*a62be085SSadaf Ebrahimi #else   // __cpluscplus
873*a62be085SSadaf Ebrahimi #define ALIGNED_CHAR_ARRAY ALIGNED_CHAR_ARRAY_is_not_available_without_Cplusplus
874*a62be085SSadaf Ebrahimi #endif  // __cplusplus
875*a62be085SSadaf Ebrahimi 
876*a62be085SSadaf Ebrahimi #if !HAVE_ATTRIBUTE_SECTION  // provide dummy definitions
877*a62be085SSadaf Ebrahimi 
878*a62be085SSadaf Ebrahimi #define ATTRIBUTE_SECTION(name)
879*a62be085SSadaf Ebrahimi #define INIT_ATTRIBUTE_SECTION_VARS(name)
880*a62be085SSadaf Ebrahimi #define DEFINE_ATTRIBUTE_SECTION_VARS(name)
881*a62be085SSadaf Ebrahimi #define DECLARE_ATTRIBUTE_SECTION_VARS(name)
882*a62be085SSadaf Ebrahimi #define ATTRIBUTE_SECTION_START(name) (reinterpret_cast<void *>(0))
883*a62be085SSadaf Ebrahimi #define ATTRIBUTE_SECTION_STOP(name) (reinterpret_cast<void *>(0))
884*a62be085SSadaf Ebrahimi 
885*a62be085SSadaf Ebrahimi #endif  // !HAVE_ATTRIBUTE_SECTION
886*a62be085SSadaf Ebrahimi 
887*a62be085SSadaf Ebrahimi #ifdef COMPILER_MSVC /* if Visual C++ */
888*a62be085SSadaf Ebrahimi 
889*a62be085SSadaf Ebrahimi // This compiler flag can be easily overlooked on MSVC.
890*a62be085SSadaf Ebrahimi // _CHAR_UNSIGNED gets set with the /J flag.
891*a62be085SSadaf Ebrahimi #ifndef _CHAR_UNSIGNED  // NOLINT
892*a62be085SSadaf Ebrahimi #error chars must be unsigned!  Use the /J flag on the compiler command line.
893*a62be085SSadaf Ebrahimi #endif
894*a62be085SSadaf Ebrahimi 
895*a62be085SSadaf Ebrahimi // MSVC is a little hyper-active in its warnings
896*a62be085SSadaf Ebrahimi // Signed vs. unsigned comparison is ok.
897*a62be085SSadaf Ebrahimi #pragma warning(disable : 4018)
898*a62be085SSadaf Ebrahimi // We know casting from a long to a char may lose data
899*a62be085SSadaf Ebrahimi #pragma warning(disable : 4244)
900*a62be085SSadaf Ebrahimi // Don't need performance warnings about converting ints to bools
901*a62be085SSadaf Ebrahimi #pragma warning(disable : 4800)
902*a62be085SSadaf Ebrahimi // Integral constant overflow is apparently ok too
903*a62be085SSadaf Ebrahimi // for example:
904*a62be085SSadaf Ebrahimi //  short k;  int n;
905*a62be085SSadaf Ebrahimi //  k = k + n;
906*a62be085SSadaf Ebrahimi #pragma warning(disable : 4307)
907*a62be085SSadaf Ebrahimi // It's ok to use this* in constructor
908*a62be085SSadaf Ebrahimi // Example:
909*a62be085SSadaf Ebrahimi //  class C {
910*a62be085SSadaf Ebrahimi //   Container cont_;
911*a62be085SSadaf Ebrahimi //   C() : cont_(this) { ...
912*a62be085SSadaf Ebrahimi #pragma warning(disable : 4355)
913*a62be085SSadaf Ebrahimi // Truncating from double to float is ok
914*a62be085SSadaf Ebrahimi #pragma warning(disable : 4305)
915*a62be085SSadaf Ebrahimi 
916*a62be085SSadaf Ebrahimi #include <assert.h>
917*a62be085SSadaf Ebrahimi #include <process.h>  // _getpid()
918*a62be085SSadaf Ebrahimi #include <windows.h>
919*a62be085SSadaf Ebrahimi #include <winsock2.h>
920*a62be085SSadaf Ebrahimi #undef ERROR
921*a62be085SSadaf Ebrahimi 
922*a62be085SSadaf Ebrahimi #include <float.h>  // for nextafter functionality on windows
923*a62be085SSadaf Ebrahimi #include <math.h>   // for HUGE_VAL
924*a62be085SSadaf Ebrahimi 
925*a62be085SSadaf Ebrahimi #ifndef HUGE_VALF  // NOLINT
926*a62be085SSadaf Ebrahimi #define HUGE_VALF (static_cast<float>(HUGE_VAL))
927*a62be085SSadaf Ebrahimi #endif
928*a62be085SSadaf Ebrahimi 
929*a62be085SSadaf Ebrahimi namespace std {}  // namespace std
930*a62be085SSadaf Ebrahimi using namespace std;
931*a62be085SSadaf Ebrahimi 
932*a62be085SSadaf Ebrahimi // VC++ doesn't understand "uint"
933*a62be085SSadaf Ebrahimi #ifndef HAVE_UINT  // NOLINT
934*a62be085SSadaf Ebrahimi #define HAVE_UINT 1
935*a62be085SSadaf Ebrahimi typedef unsigned int uint;
936*a62be085SSadaf Ebrahimi #endif
937*a62be085SSadaf Ebrahimi 
938*a62be085SSadaf Ebrahimi // VC++ doesn't understand "ssize_t"
939*a62be085SSadaf Ebrahimi // <windows.h> from above includes <BaseTsd.h> and <BaseTsd.h> defines SSIZE_T
940*a62be085SSadaf Ebrahimi #ifndef HAVE_SSIZET  // NOLINT
941*a62be085SSadaf Ebrahimi #define HAVE_SSIZET 1
942*a62be085SSadaf Ebrahimi typedef SSIZE_T ssize_t;
943*a62be085SSadaf Ebrahimi #endif
944*a62be085SSadaf Ebrahimi 
945*a62be085SSadaf Ebrahimi #define strtoq _strtoi64
946*a62be085SSadaf Ebrahimi #define strtouq _strtoui64
947*a62be085SSadaf Ebrahimi #define strtoll _strtoi64
948*a62be085SSadaf Ebrahimi #define strtoull _strtoui64
949*a62be085SSadaf Ebrahimi #define atoll _atoi64
950*a62be085SSadaf Ebrahimi 
951*a62be085SSadaf Ebrahimi // You say tomato, I say atotom
952*a62be085SSadaf Ebrahimi #define PATH_MAX MAX_PATH
953*a62be085SSadaf Ebrahimi 
954*a62be085SSadaf Ebrahimi // Wrap Microsoft _snprintf/_vsnprintf calls so they nul-terminate on buffer
955*a62be085SSadaf Ebrahimi // overflow.
956*a62be085SSadaf Ebrahimi #define vsnprintf base_port_MSVC_vsnprintf
957*a62be085SSadaf Ebrahimi inline int base_port_MSVC_vsnprintf(char *str, size_t size, const char *format,
958*a62be085SSadaf Ebrahimi                                     va_list ap) {
959*a62be085SSadaf Ebrahimi   int count = _vsnprintf(str, size, format, ap);
960*a62be085SSadaf Ebrahimi   if (count < 0) {
961*a62be085SSadaf Ebrahimi     count = _vscprintf(format, ap);  // Yields character count.
962*a62be085SSadaf Ebrahimi   }
963*a62be085SSadaf Ebrahimi   if (size > 0 && count >= size) {
964*a62be085SSadaf Ebrahimi     str[size - 1] = '\0';
965*a62be085SSadaf Ebrahimi   }
966*a62be085SSadaf Ebrahimi   return count;
967*a62be085SSadaf Ebrahimi }
968*a62be085SSadaf Ebrahimi 
969*a62be085SSadaf Ebrahimi #define snprintf base_port_MSVC_snprintf
970*a62be085SSadaf Ebrahimi inline int base_port_MSVC_snprintf(char *str, size_t size, const char *fmt,
971*a62be085SSadaf Ebrahimi                                    ...) {
972*a62be085SSadaf Ebrahimi   va_list ap;
973*a62be085SSadaf Ebrahimi   va_start(ap, fmt);
974*a62be085SSadaf Ebrahimi   int count = base_port_MSVC_vsnprintf(str, size, fmt, ap);
975*a62be085SSadaf Ebrahimi   va_end(ap);
976*a62be085SSadaf Ebrahimi   return count;
977*a62be085SSadaf Ebrahimi }
978*a62be085SSadaf Ebrahimi 
979*a62be085SSadaf Ebrahimi // You say tomato, I say _tomato
980*a62be085SSadaf Ebrahimi #define strcasecmp _stricmp
981*a62be085SSadaf Ebrahimi #define strncasecmp _strnicmp
982*a62be085SSadaf Ebrahimi #define nextafter _nextafter
983*a62be085SSadaf Ebrahimi #define strdup _strdup
984*a62be085SSadaf Ebrahimi #define tempnam _tempnam
985*a62be085SSadaf Ebrahimi #define chdir _chdir
986*a62be085SSadaf Ebrahimi #define getcwd _getcwd
987*a62be085SSadaf Ebrahimi #define putenv _putenv
988*a62be085SSadaf Ebrahimi #if _MSC_VER >= 1900  // Only needed for VS2015+
989*a62be085SSadaf Ebrahimi #define getpid _getpid
990*a62be085SSadaf Ebrahimi #define timezone _timezone
991*a62be085SSadaf Ebrahimi #define tzname _tzname
992*a62be085SSadaf Ebrahimi #endif
993*a62be085SSadaf Ebrahimi 
994*a62be085SSadaf Ebrahimi // You say tomato, I say toma
995*a62be085SSadaf Ebrahimi inline int random() { return rand(); }
996*a62be085SSadaf Ebrahimi inline void srandom(unsigned int seed) { srand(seed); }
997*a62be085SSadaf Ebrahimi 
998*a62be085SSadaf Ebrahimi // You say juxtapose, I say transpose
999*a62be085SSadaf Ebrahimi #define bcopy(s, d, n) memcpy(d, s, n)
1000*a62be085SSadaf Ebrahimi 
1001*a62be085SSadaf Ebrahimi inline void *aligned_malloc(size_t size, int minimum_alignment) {
1002*a62be085SSadaf Ebrahimi   return _aligned_malloc(size, minimum_alignment);
1003*a62be085SSadaf Ebrahimi }
1004*a62be085SSadaf Ebrahimi 
1005*a62be085SSadaf Ebrahimi inline void aligned_free(void *aligned_memory) {
1006*a62be085SSadaf Ebrahimi   _aligned_free(aligned_memory);
1007*a62be085SSadaf Ebrahimi }
1008*a62be085SSadaf Ebrahimi 
1009*a62be085SSadaf Ebrahimi // ----- BEGIN VC++ STUBS & FAKE DEFINITIONS ---------------------------------
1010*a62be085SSadaf Ebrahimi 
1011*a62be085SSadaf Ebrahimi // See http://en.wikipedia.org/wiki/IEEE_754 for details of
1012*a62be085SSadaf Ebrahimi // floating point format.
1013*a62be085SSadaf Ebrahimi 
1014*a62be085SSadaf Ebrahimi inline int fpclassify_double(double x) {
1015*a62be085SSadaf Ebrahimi   const int float_point_class = _fpclass(x);
1016*a62be085SSadaf Ebrahimi   int c99_class;
1017*a62be085SSadaf Ebrahimi   switch (float_point_class) {
1018*a62be085SSadaf Ebrahimi     case _FPCLASS_SNAN:  // Signaling NaN
1019*a62be085SSadaf Ebrahimi     case _FPCLASS_QNAN:  // Quiet NaN
1020*a62be085SSadaf Ebrahimi       c99_class = FP_NAN;
1021*a62be085SSadaf Ebrahimi       break;
1022*a62be085SSadaf Ebrahimi     case _FPCLASS_NZ:  // Negative zero ( -0)
1023*a62be085SSadaf Ebrahimi     case _FPCLASS_PZ:  // Positive 0 (+0)
1024*a62be085SSadaf Ebrahimi       c99_class = FP_ZERO;
1025*a62be085SSadaf Ebrahimi       break;
1026*a62be085SSadaf Ebrahimi     case _FPCLASS_NINF:  // Negative infinity ( -INF)
1027*a62be085SSadaf Ebrahimi     case _FPCLASS_PINF:  // Positive infinity (+INF)
1028*a62be085SSadaf Ebrahimi       c99_class = FP_INFINITE;
1029*a62be085SSadaf Ebrahimi       break;
1030*a62be085SSadaf Ebrahimi     case _FPCLASS_ND:  // Negative denormalized
1031*a62be085SSadaf Ebrahimi     case _FPCLASS_PD:  // Positive denormalized
1032*a62be085SSadaf Ebrahimi       c99_class = FP_SUBNORMAL;
1033*a62be085SSadaf Ebrahimi       break;
1034*a62be085SSadaf Ebrahimi     case _FPCLASS_NN:  // Negative normalized non-zero
1035*a62be085SSadaf Ebrahimi     case _FPCLASS_PN:  // Positive normalized non-zero
1036*a62be085SSadaf Ebrahimi       c99_class = FP_NORMAL;
1037*a62be085SSadaf Ebrahimi       break;
1038*a62be085SSadaf Ebrahimi     default:
1039*a62be085SSadaf Ebrahimi       c99_class = FP_NAN;  // Should never happen
1040*a62be085SSadaf Ebrahimi       break;
1041*a62be085SSadaf Ebrahimi   }
1042*a62be085SSadaf Ebrahimi   return c99_class;
1043*a62be085SSadaf Ebrahimi }
1044*a62be085SSadaf Ebrahimi 
1045*a62be085SSadaf Ebrahimi // This function handle the special subnormal case for float; it will
1046*a62be085SSadaf Ebrahimi // become a normal number while casting to double.
1047*a62be085SSadaf Ebrahimi // bit_cast is avoided to simplify dependency and to create a code that is
1048*a62be085SSadaf Ebrahimi // easy to deploy in C code
1049*a62be085SSadaf Ebrahimi inline int fpclassify_float(float x) {
1050*a62be085SSadaf Ebrahimi   uint32 bitwise_representation;
1051*a62be085SSadaf Ebrahimi   memcpy(&bitwise_representation, &x, 4);
1052*a62be085SSadaf Ebrahimi   if ((bitwise_representation & 0x7f800000) == 0 &&
1053*a62be085SSadaf Ebrahimi       (bitwise_representation & 0x007fffff) != 0)
1054*a62be085SSadaf Ebrahimi     return FP_SUBNORMAL;
1055*a62be085SSadaf Ebrahimi   return fpclassify_double(x);
1056*a62be085SSadaf Ebrahimi }
1057*a62be085SSadaf Ebrahimi //
1058*a62be085SSadaf Ebrahimi // This define takes care of the denormalized float; the casting to
1059*a62be085SSadaf Ebrahimi // double make it a normal number
1060*a62be085SSadaf Ebrahimi #define fpclassify(x) \
1061*a62be085SSadaf Ebrahimi   ((sizeof(x) == sizeof(float)) ? fpclassify_float(x) : fpclassify_double(x))
1062*a62be085SSadaf Ebrahimi 
1063*a62be085SSadaf Ebrahimi #define isnan _isnan
1064*a62be085SSadaf Ebrahimi 
1065*a62be085SSadaf Ebrahimi inline int isinf(double x) {
1066*a62be085SSadaf Ebrahimi   const int float_point_class = _fpclass(x);
1067*a62be085SSadaf Ebrahimi   if (float_point_class == _FPCLASS_PINF) return 1;
1068*a62be085SSadaf Ebrahimi   if (float_point_class == _FPCLASS_NINF) return -1;
1069*a62be085SSadaf Ebrahimi   return 0;
1070*a62be085SSadaf Ebrahimi }
1071*a62be085SSadaf Ebrahimi 
1072*a62be085SSadaf Ebrahimi typedef void (*sig_t)(int);
1073*a62be085SSadaf Ebrahimi 
1074*a62be085SSadaf Ebrahimi // This actually belongs in errno.h but there's a name conflict in errno
1075*a62be085SSadaf Ebrahimi // on WinNT. They (and a ton more) are also found in Winsock2.h, but
1076*a62be085SSadaf Ebrahimi // if'd out under NT. We need this subset at minimum.
1077*a62be085SSadaf Ebrahimi #define EXFULL ENOMEM  // not really that great a translation...
1078*a62be085SSadaf Ebrahimi 
1079*a62be085SSadaf Ebrahimi //
1080*a62be085SSadaf Ebrahimi // Really from <string.h>
1081*a62be085SSadaf Ebrahimi //
1082*a62be085SSadaf Ebrahimi 
1083*a62be085SSadaf Ebrahimi inline void bzero(void *s, int n) { memset(s, 0, n); }
1084*a62be085SSadaf Ebrahimi 
1085*a62be085SSadaf Ebrahimi // From glob.h
1086*a62be085SSadaf Ebrahimi #define __ptr_t void *
1087*a62be085SSadaf Ebrahimi 
1088*a62be085SSadaf Ebrahimi // Defined all over the place.
1089*a62be085SSadaf Ebrahimi typedef int pid_t;
1090*a62be085SSadaf Ebrahimi 
1091*a62be085SSadaf Ebrahimi // From stat.h
1092*a62be085SSadaf Ebrahimi typedef unsigned int mode_t;
1093*a62be085SSadaf Ebrahimi 
1094*a62be085SSadaf Ebrahimi // u_int16_t, int16_t don't exist in MSVC
1095*a62be085SSadaf Ebrahimi typedef unsigned short u_int16_t;
1096*a62be085SSadaf Ebrahimi typedef short int16_t;
1097*a62be085SSadaf Ebrahimi 
1098*a62be085SSadaf Ebrahimi // ----- END VC++ STUBS & FAKE DEFINITIONS ----------------------------------
1099*a62be085SSadaf Ebrahimi 
1100*a62be085SSadaf Ebrahimi #endif  // COMPILER_MSVC
1101*a62be085SSadaf Ebrahimi 
1102*a62be085SSadaf Ebrahimi #ifdef STL_MSVC  // not always the same as COMPILER_MSVC
1103*a62be085SSadaf Ebrahimi #include "base/port_hash.inc"
1104*a62be085SSadaf Ebrahimi #else
1105*a62be085SSadaf Ebrahimi struct PortableHashBase {};
1106*a62be085SSadaf Ebrahimi #endif
1107*a62be085SSadaf Ebrahimi 
1108*a62be085SSadaf Ebrahimi #if defined(OS_WINDOWS) || defined(OS_MACOSX) || defined(OS_IOS)
1109*a62be085SSadaf Ebrahimi // gethostbyname() *is* thread-safe for Windows native threads. It is also
1110*a62be085SSadaf Ebrahimi // safe on Mac OS X and iOS, where it uses thread-local storage, even though the
1111*a62be085SSadaf Ebrahimi // manpages claim otherwise. For details, see
1112*a62be085SSadaf Ebrahimi // http://lists.apple.com/archives/Darwin-dev/2006/May/msg00008.html
1113*a62be085SSadaf Ebrahimi #else
1114*a62be085SSadaf Ebrahimi // gethostbyname() is not thread-safe.  So disallow its use.  People
1115*a62be085SSadaf Ebrahimi // should either use the HostLookup::Lookup*() methods, or gethostbyname_r()
1116*a62be085SSadaf Ebrahimi #define gethostbyname gethostbyname_is_not_thread_safe_DO_NOT_USE
1117*a62be085SSadaf Ebrahimi #endif
1118*a62be085SSadaf Ebrahimi 
1119*a62be085SSadaf Ebrahimi // Define the namespace for pre-C++11 functors for hash_map and hash_set.
1120*a62be085SSadaf Ebrahimi // This is not the namespace for C++11 functors (that namespace is "std").
1121*a62be085SSadaf Ebrahimi //
1122*a62be085SSadaf Ebrahimi // We used to require that the build tool or Makefile provide this definition.
1123*a62be085SSadaf Ebrahimi // Now we usually get it from testing target macros. If the testing target
1124*a62be085SSadaf Ebrahimi // macros are different from an external definition, you will get a build
1125*a62be085SSadaf Ebrahimi // error.
1126*a62be085SSadaf Ebrahimi //
1127*a62be085SSadaf Ebrahimi 
1128*a62be085SSadaf Ebrahimi #if defined(__GNUC__) && defined(GOOGLE_GLIBCXX_VERSION)
1129*a62be085SSadaf Ebrahimi // Crosstool v17 or later.
1130*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE __gnu_cxx
1131*a62be085SSadaf Ebrahimi #elif defined(__GNUC__) && defined(STLPORT)
1132*a62be085SSadaf Ebrahimi // A version of gcc with stlport.
1133*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE std
1134*a62be085SSadaf Ebrahimi #elif defined(_MSC_VER)
1135*a62be085SSadaf Ebrahimi // MSVC.
1136*a62be085SSadaf Ebrahimi // http://msdn.microsoft.com/en-us/library/6x7w9f6z(v=vs.100).aspx
1137*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE stdext
1138*a62be085SSadaf Ebrahimi #elif defined(__APPLE__)
1139*a62be085SSadaf Ebrahimi // Xcode.
1140*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE __gnu_cxx
1141*a62be085SSadaf Ebrahimi #elif defined(__GNUC__)
1142*a62be085SSadaf Ebrahimi // Some other version of gcc.
1143*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE __gnu_cxx
1144*a62be085SSadaf Ebrahimi #else
1145*a62be085SSadaf Ebrahimi // HASH_NAMESPACE defined externally.
1146*a62be085SSadaf Ebrahimi #endif
1147*a62be085SSadaf Ebrahimi 
1148*a62be085SSadaf Ebrahimi #ifndef HASH_NAMESPACE  // NOLINT
1149*a62be085SSadaf Ebrahimi // I think gcc 2.95.3 was the last toolchain to use this.
1150*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE_DECLARATION_START
1151*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE_DECLARATION_END
1152*a62be085SSadaf Ebrahimi #else
1153*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE_DECLARATION_START namespace HASH_NAMESPACE {
1154*a62be085SSadaf Ebrahimi #define HASH_NAMESPACE_DECLARATION_END }
1155*a62be085SSadaf Ebrahimi #endif
1156*a62be085SSadaf Ebrahimi 
1157*a62be085SSadaf Ebrahimi // Our STL-like classes use __STD.
1158*a62be085SSadaf Ebrahimi #if defined(COMPILER_GCC3) || defined(OS_MACOSX) || defined(OS_IOS) || \
1159*a62be085SSadaf Ebrahimi     defined(COMPILER_MSVC)
1160*a62be085SSadaf Ebrahimi #define __STD std
1161*a62be085SSadaf Ebrahimi #endif
1162*a62be085SSadaf Ebrahimi 
1163*a62be085SSadaf Ebrahimi #if defined COMPILER_GCC3
1164*a62be085SSadaf Ebrahimi #define STREAM_SET(s, bit) (s).setstate(ios_base::bit)
1165*a62be085SSadaf Ebrahimi #define STREAM_SETF(s, flag) (s).setf(ios_base::flag)
1166*a62be085SSadaf Ebrahimi #else
1167*a62be085SSadaf Ebrahimi #define STREAM_SET(s, bit) (s).set(ios::bit)
1168*a62be085SSadaf Ebrahimi #define STREAM_SETF(s, flag) (s).setf(ios::flag)
1169*a62be085SSadaf Ebrahimi #endif
1170*a62be085SSadaf Ebrahimi 
1171*a62be085SSadaf Ebrahimi // Portable handling of unaligned loads, stores, and copies.
1172*a62be085SSadaf Ebrahimi // On some platforms, like ARM, the copy functions can be more efficient
1173*a62be085SSadaf Ebrahimi // then a load and a store.
1174*a62be085SSadaf Ebrahimi //
1175*a62be085SSadaf Ebrahimi // It is possible to implement all of these these using constant-length memcpy
1176*a62be085SSadaf Ebrahimi // calls, which is portable and will usually be inlined into simple loads and
1177*a62be085SSadaf Ebrahimi // stores if the architecture supports it. However, such inlining usually
1178*a62be085SSadaf Ebrahimi // happens in a pass that's quite late in compilation, which means the resulting
1179*a62be085SSadaf Ebrahimi // loads and stores cannot participate in many other optimizations, leading to
1180*a62be085SSadaf Ebrahimi // overall worse code.
1181*a62be085SSadaf Ebrahimi 
1182*a62be085SSadaf Ebrahimi #if defined(ADDRESS_SANITIZER) || defined(THREAD_SANITIZER) || \
1183*a62be085SSadaf Ebrahimi     defined(MEMORY_SANITIZER)
1184*a62be085SSadaf Ebrahimi // Consider we have an unaligned load/store of 4 bytes from address 0x...05.
1185*a62be085SSadaf Ebrahimi // AddressSanitizer will treat it as a 3-byte access to the range 05:07 and
1186*a62be085SSadaf Ebrahimi // will miss a bug if 08 is the first unaddressable byte.
1187*a62be085SSadaf Ebrahimi // ThreadSanitizer will also treat this as a 3-byte access to 05:07 and will
1188*a62be085SSadaf Ebrahimi // miss a race between this access and some other accesses to 08.
1189*a62be085SSadaf Ebrahimi // MemorySanitizer will correctly propagate the shadow on unaligned stores
1190*a62be085SSadaf Ebrahimi // and correctly report bugs on unaligned loads, but it may not properly
1191*a62be085SSadaf Ebrahimi // update and report the origin of the uninitialized memory.
1192*a62be085SSadaf Ebrahimi // For all three tools, replacing an unaligned access with a tool-specific
1193*a62be085SSadaf Ebrahimi // callback solves the problem.
1194*a62be085SSadaf Ebrahimi 
1195*a62be085SSadaf Ebrahimi // Make sure uint16_t/uint32_t/uint64_t are defined.
1196*a62be085SSadaf Ebrahimi #include <stdint.h>
1197*a62be085SSadaf Ebrahimi 
1198*a62be085SSadaf Ebrahimi #ifdef __cplusplus
1199*a62be085SSadaf Ebrahimi extern "C" {
1200*a62be085SSadaf Ebrahimi #endif  // __cplusplus
1201*a62be085SSadaf Ebrahimi uint16_t __sanitizer_unaligned_load16(const void *p);
1202*a62be085SSadaf Ebrahimi uint32_t __sanitizer_unaligned_load32(const void *p);
1203*a62be085SSadaf Ebrahimi uint64_t __sanitizer_unaligned_load64(const void *p);
1204*a62be085SSadaf Ebrahimi void __sanitizer_unaligned_store16(void *p, uint16_t v);
1205*a62be085SSadaf Ebrahimi void __sanitizer_unaligned_store32(void *p, uint32_t v);
1206*a62be085SSadaf Ebrahimi void __sanitizer_unaligned_store64(void *p, uint64_t v);
1207*a62be085SSadaf Ebrahimi #ifdef __cplusplus
1208*a62be085SSadaf Ebrahimi }  // extern "C"
1209*a62be085SSadaf Ebrahimi #endif  // __cplusplus
1210*a62be085SSadaf Ebrahimi 
1211*a62be085SSadaf Ebrahimi inline uint16 UNALIGNED_LOAD16(const void *p) {
1212*a62be085SSadaf Ebrahimi   return __sanitizer_unaligned_load16(p);
1213*a62be085SSadaf Ebrahimi }
1214*a62be085SSadaf Ebrahimi 
1215*a62be085SSadaf Ebrahimi inline uint32 UNALIGNED_LOAD32(const void *p) {
1216*a62be085SSadaf Ebrahimi   return __sanitizer_unaligned_load32(p);
1217*a62be085SSadaf Ebrahimi }
1218*a62be085SSadaf Ebrahimi 
1219*a62be085SSadaf Ebrahimi inline uint64 UNALIGNED_LOAD64(const void *p) {
1220*a62be085SSadaf Ebrahimi   return __sanitizer_unaligned_load64(p);
1221*a62be085SSadaf Ebrahimi }
1222*a62be085SSadaf Ebrahimi 
1223*a62be085SSadaf Ebrahimi inline void UNALIGNED_STORE16(void *p, uint16 v) {
1224*a62be085SSadaf Ebrahimi   __sanitizer_unaligned_store16(p, v);
1225*a62be085SSadaf Ebrahimi }
1226*a62be085SSadaf Ebrahimi 
1227*a62be085SSadaf Ebrahimi inline void UNALIGNED_STORE32(void *p, uint32 v) {
1228*a62be085SSadaf Ebrahimi   __sanitizer_unaligned_store32(p, v);
1229*a62be085SSadaf Ebrahimi }
1230*a62be085SSadaf Ebrahimi 
1231*a62be085SSadaf Ebrahimi inline void UNALIGNED_STORE64(void *p, uint64 v) {
1232*a62be085SSadaf Ebrahimi   __sanitizer_unaligned_store64(p, v);
1233*a62be085SSadaf Ebrahimi }
1234*a62be085SSadaf Ebrahimi 
1235*a62be085SSadaf Ebrahimi #elif defined(__i386__) || defined(ARCH_K8) || defined(ARCH_PPC)
1236*a62be085SSadaf Ebrahimi 
1237*a62be085SSadaf Ebrahimi // x86 and x86-64 can perform unaligned loads/stores directly;
1238*a62be085SSadaf Ebrahimi // modern PowerPC hardware can also do unaligned integer loads and stores;
1239*a62be085SSadaf Ebrahimi // but note: the FPU still sends unaligned loads and stores to a trap handler!
1240*a62be085SSadaf Ebrahimi 
1241*a62be085SSadaf Ebrahimi #define UNALIGNED_LOAD16(_p) (*reinterpret_cast<const uint16 *>(_p))
1242*a62be085SSadaf Ebrahimi #define UNALIGNED_LOAD32(_p) (*reinterpret_cast<const uint32 *>(_p))
1243*a62be085SSadaf Ebrahimi #define UNALIGNED_LOAD64(_p) (*reinterpret_cast<const uint64 *>(_p))
1244*a62be085SSadaf Ebrahimi 
1245*a62be085SSadaf Ebrahimi #define UNALIGNED_STORE16(_p, _val) (*reinterpret_cast<uint16 *>(_p) = (_val))
1246*a62be085SSadaf Ebrahimi #define UNALIGNED_STORE32(_p, _val) (*reinterpret_cast<uint32 *>(_p) = (_val))
1247*a62be085SSadaf Ebrahimi #define UNALIGNED_STORE64(_p, _val) (*reinterpret_cast<uint64 *>(_p) = (_val))
1248*a62be085SSadaf Ebrahimi 
1249*a62be085SSadaf Ebrahimi #elif defined(__arm__) && !defined(__ARM_ARCH_5__) &&          \
1250*a62be085SSadaf Ebrahimi     !defined(__ARM_ARCH_5T__) && !defined(__ARM_ARCH_5TE__) && \
1251*a62be085SSadaf Ebrahimi     !defined(__ARM_ARCH_5TEJ__) && !defined(__ARM_ARCH_6__) && \
1252*a62be085SSadaf Ebrahimi     !defined(__ARM_ARCH_6J__) && !defined(__ARM_ARCH_6K__) &&  \
1253*a62be085SSadaf Ebrahimi     !defined(__ARM_ARCH_6Z__) && !defined(__ARM_ARCH_6ZK__) && \
1254*a62be085SSadaf Ebrahimi     !defined(__ARM_ARCH_6T2__)
1255*a62be085SSadaf Ebrahimi 
1256*a62be085SSadaf Ebrahimi // ARMv7 and newer support native unaligned accesses, but only of 16-bit
1257*a62be085SSadaf Ebrahimi // and 32-bit values (not 64-bit); older versions either raise a fatal signal,
1258*a62be085SSadaf Ebrahimi // do an unaligned read and rotate the words around a bit, or do the reads very
1259*a62be085SSadaf Ebrahimi // slowly (trip through kernel mode). There's no simple #define that says just
1260*a62be085SSadaf Ebrahimi // “ARMv7 or higher”, so we have to filter away all ARMv5 and ARMv6
1261*a62be085SSadaf Ebrahimi // sub-architectures. Newer gcc (>= 4.6) set an __ARM_FEATURE_ALIGNED #define,
1262*a62be085SSadaf Ebrahimi // so in time, maybe we can move on to that.
1263*a62be085SSadaf Ebrahimi //
1264*a62be085SSadaf Ebrahimi // This is a mess, but there's not much we can do about it.
1265*a62be085SSadaf Ebrahimi //
1266*a62be085SSadaf Ebrahimi // To further complicate matters, only LDR instructions (single reads) are
1267*a62be085SSadaf Ebrahimi // allowed to be unaligned, not LDRD (two reads) or LDM (many reads). Unless we
1268*a62be085SSadaf Ebrahimi // explicitly tell the compiler that these accesses can be unaligned, it can and
1269*a62be085SSadaf Ebrahimi // will combine accesses. On armcc, the way to signal this is done by accessing
1270*a62be085SSadaf Ebrahimi // through the type (uint32 __packed *), but GCC has no such attribute
1271*a62be085SSadaf Ebrahimi // (it ignores __attribute__((packed)) on individual variables). However,
1272*a62be085SSadaf Ebrahimi // we can tell it that a _struct_ is unaligned, which has the same effect,
1273*a62be085SSadaf Ebrahimi // so we do that.
1274*a62be085SSadaf Ebrahimi 
1275*a62be085SSadaf Ebrahimi namespace base {
1276*a62be085SSadaf Ebrahimi namespace internal {
1277*a62be085SSadaf Ebrahimi 
1278*a62be085SSadaf Ebrahimi struct Unaligned16Struct {
1279*a62be085SSadaf Ebrahimi   uint16 value;
1280*a62be085SSadaf Ebrahimi   uint8 dummy;  // To make the size non-power-of-two.
1281*a62be085SSadaf Ebrahimi } ATTRIBUTE_PACKED;
1282*a62be085SSadaf Ebrahimi 
1283*a62be085SSadaf Ebrahimi struct Unaligned32Struct {
1284*a62be085SSadaf Ebrahimi   uint32 value;
1285*a62be085SSadaf Ebrahimi   uint8 dummy;  // To make the size non-power-of-two.
1286*a62be085SSadaf Ebrahimi } ATTRIBUTE_PACKED;
1287*a62be085SSadaf Ebrahimi 
1288*a62be085SSadaf Ebrahimi }  // namespace internal
1289*a62be085SSadaf Ebrahimi }  // namespace base
1290*a62be085SSadaf Ebrahimi 
1291*a62be085SSadaf Ebrahimi #define UNALIGNED_LOAD16(_p) \
1292*a62be085SSadaf Ebrahimi   ((reinterpret_cast<const ::base::internal::Unaligned16Struct *>(_p))->value)
1293*a62be085SSadaf Ebrahimi #define UNALIGNED_LOAD32(_p) \
1294*a62be085SSadaf Ebrahimi   ((reinterpret_cast<const ::base::internal::Unaligned32Struct *>(_p))->value)
1295*a62be085SSadaf Ebrahimi 
1296*a62be085SSadaf Ebrahimi #define UNALIGNED_STORE16(_p, _val)                                        \
1297*a62be085SSadaf Ebrahimi   ((reinterpret_cast< ::base::internal::Unaligned16Struct *>(_p))->value = \
1298*a62be085SSadaf Ebrahimi        (_val))
1299*a62be085SSadaf Ebrahimi #define UNALIGNED_STORE32(_p, _val)                                        \
1300*a62be085SSadaf Ebrahimi   ((reinterpret_cast< ::base::internal::Unaligned32Struct *>(_p))->value = \
1301*a62be085SSadaf Ebrahimi        (_val))
1302*a62be085SSadaf Ebrahimi 
1303*a62be085SSadaf Ebrahimi // See if that would be more efficient on platforms supporting it,
1304*a62be085SSadaf Ebrahimi // at least for copies.
1305*a62be085SSadaf Ebrahimi 
1306*a62be085SSadaf Ebrahimi inline uint64 UNALIGNED_LOAD64(const void *p) {
1307*a62be085SSadaf Ebrahimi   uint64 t;
1308*a62be085SSadaf Ebrahimi   memcpy(&t, p, sizeof t);
1309*a62be085SSadaf Ebrahimi   return t;
1310*a62be085SSadaf Ebrahimi }
1311*a62be085SSadaf Ebrahimi 
1312*a62be085SSadaf Ebrahimi inline void UNALIGNED_STORE64(void *p, uint64 v) { memcpy(p, &v, sizeof v); }
1313*a62be085SSadaf Ebrahimi 
1314*a62be085SSadaf Ebrahimi #else
1315*a62be085SSadaf Ebrahimi 
1316*a62be085SSadaf Ebrahimi #define NEED_ALIGNED_LOADS
1317*a62be085SSadaf Ebrahimi 
1318*a62be085SSadaf Ebrahimi // These functions are provided for architectures that don't support
1319*a62be085SSadaf Ebrahimi // unaligned loads and stores.
1320*a62be085SSadaf Ebrahimi 
1321*a62be085SSadaf Ebrahimi inline uint16 UNALIGNED_LOAD16(const void *p) {
1322*a62be085SSadaf Ebrahimi   uint16 t;
1323*a62be085SSadaf Ebrahimi   memcpy(&t, p, sizeof t);
1324*a62be085SSadaf Ebrahimi   return t;
1325*a62be085SSadaf Ebrahimi }
1326*a62be085SSadaf Ebrahimi 
1327*a62be085SSadaf Ebrahimi inline uint32 UNALIGNED_LOAD32(const void *p) {
1328*a62be085SSadaf Ebrahimi   uint32 t;
1329*a62be085SSadaf Ebrahimi   memcpy(&t, p, sizeof t);
1330*a62be085SSadaf Ebrahimi   return t;
1331*a62be085SSadaf Ebrahimi }
1332*a62be085SSadaf Ebrahimi 
1333*a62be085SSadaf Ebrahimi inline uint64 UNALIGNED_LOAD64(const void *p) {
1334*a62be085SSadaf Ebrahimi   uint64 t;
1335*a62be085SSadaf Ebrahimi   memcpy(&t, p, sizeof t);
1336*a62be085SSadaf Ebrahimi   return t;
1337*a62be085SSadaf Ebrahimi }
1338*a62be085SSadaf Ebrahimi 
1339*a62be085SSadaf Ebrahimi inline void UNALIGNED_STORE16(void *p, uint16 v) { memcpy(p, &v, sizeof v); }
1340*a62be085SSadaf Ebrahimi 
1341*a62be085SSadaf Ebrahimi inline void UNALIGNED_STORE32(void *p, uint32 v) { memcpy(p, &v, sizeof v); }
1342*a62be085SSadaf Ebrahimi 
1343*a62be085SSadaf Ebrahimi inline void UNALIGNED_STORE64(void *p, uint64 v) { memcpy(p, &v, sizeof v); }
1344*a62be085SSadaf Ebrahimi 
1345*a62be085SSadaf Ebrahimi #endif
1346*a62be085SSadaf Ebrahimi 
1347*a62be085SSadaf Ebrahimi // The UNALIGNED_LOADW and UNALIGNED_STOREW macros load and store values
1348*a62be085SSadaf Ebrahimi // of type uword_t.
1349*a62be085SSadaf Ebrahimi #ifdef _LP64
1350*a62be085SSadaf Ebrahimi #define UNALIGNED_LOADW(_p) UNALIGNED_LOAD64(_p)
1351*a62be085SSadaf Ebrahimi #define UNALIGNED_STOREW(_p, _val) UNALIGNED_STORE64(_p, _val)
1352*a62be085SSadaf Ebrahimi #else
1353*a62be085SSadaf Ebrahimi #define UNALIGNED_LOADW(_p) UNALIGNED_LOAD32(_p)
1354*a62be085SSadaf Ebrahimi #define UNALIGNED_STOREW(_p, _val) UNALIGNED_STORE32(_p, _val)
1355*a62be085SSadaf Ebrahimi #endif
1356*a62be085SSadaf Ebrahimi 
1357*a62be085SSadaf Ebrahimi // NOTE(sesse): These are only exported to C++ because the macros they depend on
1358*a62be085SSadaf Ebrahimi // use C++-only syntax. This #ifdef can be removed if/when the macros are fixed.
1359*a62be085SSadaf Ebrahimi 
1360*a62be085SSadaf Ebrahimi #if defined(__cplusplus)
1361*a62be085SSadaf Ebrahimi 
1362*a62be085SSadaf Ebrahimi inline void UnalignedCopy16(const void *src, void *dst) {
1363*a62be085SSadaf Ebrahimi   UNALIGNED_STORE16(dst, UNALIGNED_LOAD16(src));
1364*a62be085SSadaf Ebrahimi }
1365*a62be085SSadaf Ebrahimi 
1366*a62be085SSadaf Ebrahimi inline void UnalignedCopy32(const void *src, void *dst) {
1367*a62be085SSadaf Ebrahimi   UNALIGNED_STORE32(dst, UNALIGNED_LOAD32(src));
1368*a62be085SSadaf Ebrahimi }
1369*a62be085SSadaf Ebrahimi 
1370*a62be085SSadaf Ebrahimi inline void UnalignedCopy64(const void *src, void *dst) {
1371*a62be085SSadaf Ebrahimi   if (sizeof(void *) == 8) {
1372*a62be085SSadaf Ebrahimi     UNALIGNED_STORE64(dst, UNALIGNED_LOAD64(src));
1373*a62be085SSadaf Ebrahimi   } else {
1374*a62be085SSadaf Ebrahimi     const char *src_char = reinterpret_cast<const char *>(src);
1375*a62be085SSadaf Ebrahimi     char *dst_char = reinterpret_cast<char *>(dst);
1376*a62be085SSadaf Ebrahimi 
1377*a62be085SSadaf Ebrahimi     UNALIGNED_STORE32(dst_char, UNALIGNED_LOAD32(src_char));
1378*a62be085SSadaf Ebrahimi     UNALIGNED_STORE32(dst_char + 4, UNALIGNED_LOAD32(src_char + 4));
1379*a62be085SSadaf Ebrahimi   }
1380*a62be085SSadaf Ebrahimi }
1381*a62be085SSadaf Ebrahimi 
1382*a62be085SSadaf Ebrahimi #endif  // defined(__cpluscplus)
1383*a62be085SSadaf Ebrahimi 
1384*a62be085SSadaf Ebrahimi // printf macros for size_t, in the style of inttypes.h
1385*a62be085SSadaf Ebrahimi #if defined(_LP64) || defined(OS_IOS)
1386*a62be085SSadaf Ebrahimi #define __PRIS_PREFIX "z"
1387*a62be085SSadaf Ebrahimi #else
1388*a62be085SSadaf Ebrahimi #define __PRIS_PREFIX
1389*a62be085SSadaf Ebrahimi #endif
1390*a62be085SSadaf Ebrahimi 
1391*a62be085SSadaf Ebrahimi // Use these macros after a % in a printf format string
1392*a62be085SSadaf Ebrahimi // to get correct 32/64 bit behavior, like this:
1393*a62be085SSadaf Ebrahimi // size_t size = records.size();
1394*a62be085SSadaf Ebrahimi // printf("%" PRIuS "\n", size);
1395*a62be085SSadaf Ebrahimi 
1396*a62be085SSadaf Ebrahimi #define PRIdS __PRIS_PREFIX "d"
1397*a62be085SSadaf Ebrahimi #define PRIxS __PRIS_PREFIX "x"
1398*a62be085SSadaf Ebrahimi #define PRIuS __PRIS_PREFIX "u"
1399*a62be085SSadaf Ebrahimi #define PRIXS __PRIS_PREFIX "X"
1400*a62be085SSadaf Ebrahimi #define PRIoS __PRIS_PREFIX "o"
1401*a62be085SSadaf Ebrahimi 
1402*a62be085SSadaf Ebrahimi #define GPRIuPTHREAD "lu"
1403*a62be085SSadaf Ebrahimi #define GPRIxPTHREAD "lx"
1404*a62be085SSadaf Ebrahimi #ifdef OS_CYGWIN
1405*a62be085SSadaf Ebrahimi #define PRINTABLE_PTHREAD(pthreadt) reinterpret_cast<uintptr_t>(pthreadt)
1406*a62be085SSadaf Ebrahimi #else
1407*a62be085SSadaf Ebrahimi #define PRINTABLE_PTHREAD(pthreadt) pthreadt
1408*a62be085SSadaf Ebrahimi #endif
1409*a62be085SSadaf Ebrahimi 
1410*a62be085SSadaf Ebrahimi #define DDEPTH_SIZEOF_MEMBER(t, f) sizeof(((t *)4096)->f)
1411*a62be085SSadaf Ebrahimi 
1412*a62be085SSadaf Ebrahimi #define OFFSETOF_MEMBER(t, f)                                \
1413*a62be085SSadaf Ebrahimi   (reinterpret_cast<char *>(&reinterpret_cast<t *>(16)->f) - \
1414*a62be085SSadaf Ebrahimi    reinterpret_cast<char *>(16))
1415*a62be085SSadaf Ebrahimi 
1416*a62be085SSadaf Ebrahimi #ifdef PTHREADS_REDHAT_WIN32
1417*a62be085SSadaf Ebrahimi #include <pthread.h>  // NOLINT(build/include)
1418*a62be085SSadaf Ebrahimi #include <iosfwd>     // NOLINT(build/include)
1419*a62be085SSadaf Ebrahimi // pthread_t is not a simple integer or pointer on Win32
1420*a62be085SSadaf Ebrahimi std::ostream &operator<<(std::ostream &out, const pthread_t &thread_id);
1421*a62be085SSadaf Ebrahimi #endif
1422*a62be085SSadaf Ebrahimi 
1423*a62be085SSadaf Ebrahimi // GXX_EXPERIMENTAL_CXX0X is defined by gcc and clang up to at least
1424*a62be085SSadaf Ebrahimi // gcc-4.7 and clang-3.1 (2011-12-13).  __cplusplus was defined to 1
1425*a62be085SSadaf Ebrahimi // in gcc before 4.7 (Crosstool 16) and clang before 3.1, but is
1426*a62be085SSadaf Ebrahimi // defined according to the language version in effect thereafter.
1427*a62be085SSadaf Ebrahimi // Microsoft Visual Studio 14 (2015) sets __cplusplus==199711 despite
1428*a62be085SSadaf Ebrahimi // reasonably good C++11 support, so we set LANG_CXX for it and
1429*a62be085SSadaf Ebrahimi // newer versions (_MSC_VER >= 1900).  Stlport is used by many Android
1430*a62be085SSadaf Ebrahimi // projects and does not have full C++11 STL support.
1431*a62be085SSadaf Ebrahimi #if (defined(__GXX_EXPERIMENTAL_CXX0X__) || __cplusplus >= 201103L || \
1432*a62be085SSadaf Ebrahimi      (defined(_MSC_VER) && _MSC_VER >= 1900)) &&                      \
1433*a62be085SSadaf Ebrahimi     !defined(STLPORT)
1434*a62be085SSadaf Ebrahimi // Define this to 1 if the code is compiled in C++11 mode; leave it
1435*a62be085SSadaf Ebrahimi // undefined otherwise.  Do NOT define it to 0 -- that causes
1436*a62be085SSadaf Ebrahimi // '#ifdef LANG_CXX11' to behave differently from '#if LANG_CXX11'.
1437*a62be085SSadaf Ebrahimi #define LANG_CXX11 1
1438*a62be085SSadaf Ebrahimi #endif
1439*a62be085SSadaf Ebrahimi 
1440*a62be085SSadaf Ebrahimi // On some platforms, a "function pointer" points to a function descriptor
1441*a62be085SSadaf Ebrahimi // rather than directly to the function itself.  Use FUNC_PTR_TO_CHAR_PTR(func)
1442*a62be085SSadaf Ebrahimi // to get a char-pointer to the first instruction of the function func.
1443*a62be085SSadaf Ebrahimi #if (defined(__powerpc__) && !(_CALL_ELF > 1)) || defined(__ia64)
1444*a62be085SSadaf Ebrahimi // use opd section for function descriptors on these platforms, the function
1445*a62be085SSadaf Ebrahimi // address is the first word of the descriptor
1446*a62be085SSadaf Ebrahimi enum { kPlatformUsesOPDSections = 1 };
1447*a62be085SSadaf Ebrahimi #define FUNC_PTR_TO_CHAR_PTR(func) (reinterpret_cast<char **>(func)[0])
1448*a62be085SSadaf Ebrahimi #else
1449*a62be085SSadaf Ebrahimi enum { kPlatformUsesOPDSections = 0 };
1450*a62be085SSadaf Ebrahimi #define FUNC_PTR_TO_CHAR_PTR(func) (reinterpret_cast<char *>(func))
1451*a62be085SSadaf Ebrahimi #endif
1452*a62be085SSadaf Ebrahimi 
1453*a62be085SSadaf Ebrahimi // Private implementation detail: __has_extension is useful to implement
1454*a62be085SSadaf Ebrahimi // static_assert, and defining it for all toolchains avoids an extra level of
1455*a62be085SSadaf Ebrahimi // nesting of #if/#ifdef/#ifndef.
1456*a62be085SSadaf Ebrahimi #ifndef __has_extension       // NOLINT
1457*a62be085SSadaf Ebrahimi #define __has_extension(x) 0  // MSVC 10's preprocessor can't handle 'false'.
1458*a62be085SSadaf Ebrahimi #endif
1459*a62be085SSadaf Ebrahimi 
1460*a62be085SSadaf Ebrahimi #ifdef __cplusplus
1461*a62be085SSadaf Ebrahimi // We support C++11's static_assert(expression, message) for all C++
1462*a62be085SSadaf Ebrahimi // builds, though for some pre-C++11 toolchains we fall back to using
1463*a62be085SSadaf Ebrahimi // GG_PRIVATE_STATIC_ASSERT, which has two limitations: (1) the
1464*a62be085SSadaf Ebrahimi // expression argument will need to be parenthesized if it would
1465*a62be085SSadaf Ebrahimi // otherwise contain commas outside of parentheses, and (2) the
1466*a62be085SSadaf Ebrahimi // message is ignored (though the compiler error will likely mention
1467*a62be085SSadaf Ebrahimi // "static_assert_failed" and point to the line with the failing assertion).
1468*a62be085SSadaf Ebrahimi 
1469*a62be085SSadaf Ebrahimi // Something else (perhaps libc++) may have provided its own definition of
1470*a62be085SSadaf Ebrahimi // static_assert.
1471*a62be085SSadaf Ebrahimi #ifndef static_assert  // NOLINT
1472*a62be085SSadaf Ebrahimi #if LANG_CXX11 || __has_extension(cxx_static_assert) || defined(_MSC_VER)
1473*a62be085SSadaf Ebrahimi // There's a native implementation of static_assert, no need to define our own.
1474*a62be085SSadaf Ebrahimi #elif __has_extension(c_static_assert)
1475*a62be085SSadaf Ebrahimi // C11's _Static_assert is available, and makes a great static_assert.
1476*a62be085SSadaf Ebrahimi #define static_assert _Static_assert
1477*a62be085SSadaf Ebrahimi #else
1478*a62be085SSadaf Ebrahimi // Fall back on our home-grown implementation, with its limitations.
1479*a62be085SSadaf Ebrahimi #define static_assert GG_PRIVATE_STATIC_ASSERT
1480*a62be085SSadaf Ebrahimi #endif
1481*a62be085SSadaf Ebrahimi #endif
1482*a62be085SSadaf Ebrahimi 
1483*a62be085SSadaf Ebrahimi // CompileAssert is an implementation detail of COMPILE_ASSERT and
1484*a62be085SSadaf Ebrahimi // GG_PRIVATE_STATIC_ASSERT.
1485*a62be085SSadaf Ebrahimi template <bool>
1486*a62be085SSadaf Ebrahimi struct CompileAssert {};
1487*a62be085SSadaf Ebrahimi 
1488*a62be085SSadaf Ebrahimi // GG_PRIVATE_STATIC_ASSERT: A poor man's static_assert.  This doesn't handle
1489*a62be085SSadaf Ebrahimi // condition expressions that contain unparenthesized top-level commas;
1490*a62be085SSadaf Ebrahimi // write GG_PRIVATE_STATIC_ASSERT((expr), "comment") when needed.
1491*a62be085SSadaf Ebrahimi #define GG_PRIVATE_CAT_IMMEDIATE(a, b) a##b
1492*a62be085SSadaf Ebrahimi #define GG_PRIVATE_CAT(a, b) GG_PRIVATE_CAT_IMMEDIATE(a, b)
1493*a62be085SSadaf Ebrahimi #define GG_PRIVATE_STATIC_ASSERT(expr, ignored)                    \
1494*a62be085SSadaf Ebrahimi   typedef CompileAssert<(static_cast<bool>(expr))> GG_PRIVATE_CAT( \
1495*a62be085SSadaf Ebrahimi       static_assert_failed_at_line,                                \
1496*a62be085SSadaf Ebrahimi       __LINE__)[bool(expr) ? 1 : -1] DDEPTH_ATTRIBUTE_UNUSED  // NOLINT
1497*a62be085SSadaf Ebrahimi 
1498*a62be085SSadaf Ebrahimi #endif  // __cplusplus
1499*a62be085SSadaf Ebrahimi 
1500*a62be085SSadaf Ebrahimi // Some platforms have a ::string class that is different from ::std::string
1501*a62be085SSadaf Ebrahimi // (although the interface is the same, of course).  On other platforms,
1502*a62be085SSadaf Ebrahimi // ::string is the same as ::std::string.
1503*a62be085SSadaf Ebrahimi #if defined(__cplusplus) && !defined(SWIG)
1504*a62be085SSadaf Ebrahimi #include <string>
1505*a62be085SSadaf Ebrahimi #ifndef HAS_GLOBAL_STRING  // NOLINT
1506*a62be085SSadaf Ebrahimi using std::basic_string;
1507*a62be085SSadaf Ebrahimi using std::string;
1508*a62be085SSadaf Ebrahimi #endif  // HAS_GLOBAL_STRING
1509*a62be085SSadaf Ebrahimi #endif  // SWIG, __cplusplus
1510*a62be085SSadaf Ebrahimi 
1511*a62be085SSadaf Ebrahimi #endif  // DYNAMIC_DEPTH_INTERNAL_BASE_PORT_H_  // NOLINT
1512