1/*
2 *
3 * Copyright 2015 gRPC authors.
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 */
18
19#ifndef GRPC_IMPL_CODEGEN_PORT_PLATFORM_H
20#define GRPC_IMPL_CODEGEN_PORT_PLATFORM_H
21
22/*
23 * Define GPR_BACKWARDS_COMPATIBILITY_MODE to try harder to be ABI
24 * compatible with older platforms (currently only on Linux)
25 * Causes:
26 * - some libc calls to be gotten via dlsym
27 * - some syscalls to be made directly
28 */
29
30/*
31 * Defines GRPC_USE_ABSL to use Abseil Common Libraries (C++)
32 */
33#ifndef GRPC_USE_ABSL
34#define GRPC_USE_ABSL 1
35#endif
36
37/*
38 * Defines GPR_ABSEIL_SYNC to use synchronization features from Abseil
39 */
40#ifndef GPR_ABSEIL_SYNC
41/* #define GPR_ABSEIL_SYNC 1 */
42#endif
43
44/* Get windows.h included everywhere (we need it) */
45#if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
46#ifndef WIN32_LEAN_AND_MEAN
47#define GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
48#define WIN32_LEAN_AND_MEAN
49#endif /* WIN32_LEAN_AND_MEAN */
50
51#ifndef NOMINMAX
52#define GRPC_NOMINMX_WAS_NOT_DEFINED
53#define NOMINMAX
54#endif /* NOMINMAX */
55
56#include <windows.h>
57
58#ifndef _WIN32_WINNT
59#error \
60 "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
61#else /* !defined(_WIN32_WINNT) */
62#if (_WIN32_WINNT < 0x0600)
63#error \
64 "Please compile grpc with _WIN32_WINNT of at least 0x600 (aka Windows Vista)"
65#endif /* _WIN32_WINNT < 0x0600 */
66#endif /* defined(_WIN32_WINNT) */
67
68#ifdef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
69#undef GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED
70#undef WIN32_LEAN_AND_MEAN
71#endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
72
73#ifdef GRPC_NOMINMAX_WAS_NOT_DEFINED
74#undef GRPC_NOMINMAX_WAS_NOT_DEFINED
75#undef NOMINMAX
76#endif /* GRPC_WIN32_LEAN_AND_MEAN_WAS_NOT_DEFINED */
77#endif /* defined(_WIN64) || defined(WIN64) || defined(_WIN32) || \
78 defined(WIN32) */
79
80/* Override this file with one for your platform if you need to redefine
81 things. */
82
83#if !defined(GPR_NO_AUTODETECT_PLATFORM)
84#if defined(_WIN64) || defined(WIN64) || defined(_WIN32) || defined(WIN32)
85#if defined(_WIN64) || defined(WIN64)
86#define GPR_ARCH_64 1
87#else
88#define GPR_ARCH_32 1
89#endif
90#define GPR_PLATFORM_STRING "windows"
91#define GPR_WINDOWS 1
92#define GPR_WINDOWS_SUBPROCESS 1
93#define GPR_WINDOWS_ENV
94#ifdef __MSYS__
95#define GPR_GETPID_IN_UNISTD_H 1
96#define GPR_MSYS_TMPFILE
97#define GPR_POSIX_LOG
98#define GPR_POSIX_STRING
99#define GPR_POSIX_TIME
100#else
101#define GPR_GETPID_IN_PROCESS_H 1
102#define GPR_WINDOWS_TMPFILE
103#define GPR_WINDOWS_LOG
104#define GPR_WINDOWS_CRASH_HANDLER 1
105#define GPR_WINDOWS_STRING
106#define GPR_WINDOWS_TIME
107#endif
108#ifdef __GNUC__
109#define GPR_GCC_ATOMIC 1
110#define GPR_GCC_TLS 1
111#else
112#define GPR_WINDOWS_ATOMIC 1
113#define GPR_MSVC_TLS 1
114#endif
115#elif defined(GPR_MANYLINUX1)
116// TODO(atash): manylinux1 is just another __linux__ but with ancient
117// libraries; it should be integrated with the `__linux__` definitions below.
118#define GPR_PLATFORM_STRING "manylinux"
119#define GPR_POSIX_CRASH_HANDLER 1
120#define GPR_CPU_POSIX 1
121#define GPR_GCC_ATOMIC 1
122#define GPR_GCC_TLS 1
123#define GPR_LINUX 1
124#define GPR_LINUX_LOG 1
125#define GPR_SUPPORT_CHANNELS_FROM_FD 1
126#define GPR_LINUX_ENV 1
127#define GPR_POSIX_TMPFILE 1
128#define GPR_POSIX_STRING 1
129#define GPR_POSIX_SUBPROCESS 1
130#define GPR_POSIX_SYNC 1
131#define GPR_POSIX_TIME 1
132#define GPR_HAS_PTHREAD_H 1
133#define GPR_GETPID_IN_UNISTD_H 1
134#ifdef _LP64
135#define GPR_ARCH_64 1
136#else /* _LP64 */
137#define GPR_ARCH_32 1
138#endif /* _LP64 */
139#include <linux/version.h>
140#elif defined(ANDROID) || defined(__ANDROID__)
141#define GPR_PLATFORM_STRING "android"
142#define GPR_ANDROID 1
143// TODO(apolcyn): re-evaluate support for c-ares
144// on android after upgrading our c-ares dependency.
145// See https://github.com/grpc/grpc/issues/18038.
146#define GRPC_ARES 0
147#ifdef _LP64
148#define GPR_ARCH_64 1
149#else /* _LP64 */
150#define GPR_ARCH_32 1
151#endif /* _LP64 */
152#define GPR_CPU_POSIX 1
153#define GPR_GCC_SYNC 1
154#define GPR_GCC_TLS 1
155#define GPR_POSIX_ENV 1
156#define GPR_POSIX_TMPFILE 1
157#define GPR_ANDROID_LOG 1
158#define GPR_POSIX_STRING 1
159#define GPR_POSIX_SUBPROCESS 1
160#define GPR_POSIX_SYNC 1
161#define GPR_POSIX_TIME 1
162#define GPR_HAS_PTHREAD_H 1
163#define GPR_GETPID_IN_UNISTD_H 1
164#define GPR_SUPPORT_CHANNELS_FROM_FD 1
165#elif defined(__linux__)
166#define GPR_PLATFORM_STRING "linux"
167#ifndef _BSD_SOURCE
168#define _BSD_SOURCE
169#endif
170#ifndef _DEFAULT_SOURCE
171#define _DEFAULT_SOURCE
172#endif
173#ifndef _GNU_SOURCE
174#define _GNU_SOURCE
175#endif
176#include <features.h>
177#define GPR_CPU_LINUX 1
178#define GPR_GCC_ATOMIC 1
179#define GPR_GCC_TLS 1
180#define GPR_LINUX 1
181#define GPR_LINUX_LOG
182#define GPR_SUPPORT_CHANNELS_FROM_FD 1
183#define GPR_LINUX_ENV 1
184#define GPR_POSIX_TMPFILE 1
185#define GPR_POSIX_STRING 1
186#define GPR_POSIX_SUBPROCESS 1
187#define GPR_POSIX_SYNC 1
188#define GPR_POSIX_TIME 1
189#define GPR_HAS_PTHREAD_H 1
190#define GPR_GETPID_IN_UNISTD_H 1
191#ifdef _LP64
192#define GPR_ARCH_64 1
193#else /* _LP64 */
194#define GPR_ARCH_32 1
195#endif /* _LP64 */
196#ifdef __GLIBC__
197#define GPR_POSIX_CRASH_HANDLER 1
198#define GPR_LINUX_PTHREAD_NAME 1
199#include <linux/version.h>
200#else /* musl libc */
201#define GPR_MUSL_LIBC_COMPAT 1
202#endif
203#elif defined(__ASYLO__)
204#define GPR_ARCH_64 1
205#define GPR_CPU_POSIX 1
206#define GPR_GCC_TLS 1
207#define GPR_PLATFORM_STRING "asylo"
208#define GPR_GCC_SYNC 1
209#define GPR_POSIX_SYNC 1
210#define GPR_POSIX_STRING 1
211#define GPR_POSIX_LOG 1
212#define GPR_POSIX_TIME 1
213#define GPR_POSIX_ENV 1
214#define GPR_ASYLO 1
215#define GRPC_POSIX_SOCKET 1
216#define GRPC_POSIX_SOCKETADDR
217#define GRPC_POSIX_SOCKETUTILS 1
218#define GRPC_TIMER_USE_GENERIC 1
219#define GRPC_POSIX_NO_SPECIAL_WAKEUP_FD 1
220#define GRPC_POSIX_WAKEUP_FD 1
221#define GRPC_ARES 0
222#define GPR_NO_AUTODETECT_PLATFORM 1
223#elif defined(__APPLE__)
224#include <Availability.h>
225#include <TargetConditionals.h>
226#ifndef _BSD_SOURCE
227#define _BSD_SOURCE
228#endif
229#if TARGET_OS_IPHONE
230#define GPR_PLATFORM_STRING "ios"
231#define GPR_CPU_IPHONE 1
232#define GPR_PTHREAD_TLS 1
233#define GRPC_CFSTREAM 1
234/* the c-ares resolver isn't safe to enable on iOS */
235#define GRPC_ARES 0
236#else /* TARGET_OS_IPHONE */
237#define GPR_PLATFORM_STRING "osx"
238#ifdef __MAC_OS_X_VERSION_MIN_REQUIRED
239#if __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7
240#define GPR_CPU_IPHONE 1
241#define GPR_PTHREAD_TLS 1
242#else /* __MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7 */
243#define GPR_CPU_POSIX 1
244/* TODO(vjpai): there is a reported issue in bazel build for Mac where __thread
245 in a header is currently not working (bazelbuild/bazel#4341). Remove
246 the following conditional and use GPR_GCC_TLS when that is fixed */
247#ifndef GRPC_BAZEL_BUILD
248#define GPR_GCC_TLS 1
249#else /* GRPC_BAZEL_BUILD */
250#define GPR_PTHREAD_TLS 1
251#endif /* GRPC_BAZEL_BUILD */
252#define GPR_APPLE_PTHREAD_NAME 1
253#endif
254#else /* __MAC_OS_X_VERSION_MIN_REQUIRED */
255#define GPR_CPU_POSIX 1
256/* TODO(vjpai): Remove the following conditional and use only GPR_GCC_TLS
257 when bazelbuild/bazel#4341 is fixed */
258#ifndef GRPC_BAZEL_BUILD
259#define GPR_GCC_TLS 1
260#else /* GRPC_BAZEL_BUILD */
261#define GPR_PTHREAD_TLS 1
262#endif /* GRPC_BAZEL_BUILD */
263#endif
264#define GPR_POSIX_CRASH_HANDLER 1
265#endif
266#define GPR_APPLE 1
267#define GPR_GCC_ATOMIC 1
268#define GPR_POSIX_LOG 1
269#define GPR_POSIX_ENV 1
270#define GPR_POSIX_TMPFILE 1
271#define GPR_POSIX_STRING 1
272#define GPR_POSIX_SUBPROCESS 1
273#define GPR_POSIX_SYNC 1
274#define GPR_POSIX_TIME 1
275#define GPR_HAS_PTHREAD_H 1
276#define GPR_GETPID_IN_UNISTD_H 1
277#ifndef GRPC_CFSTREAM
278#define GPR_SUPPORT_CHANNELS_FROM_FD 1
279#endif
280#ifdef _LP64
281#define GPR_ARCH_64 1
282#else /* _LP64 */
283#define GPR_ARCH_32 1
284#endif /* _LP64 */
285#elif defined(__FreeBSD__)
286#define GPR_PLATFORM_STRING "freebsd"
287#ifndef _BSD_SOURCE
288#define _BSD_SOURCE
289#endif
290#define GPR_FREEBSD 1
291#define GPR_CPU_POSIX 1
292#define GPR_GCC_ATOMIC 1
293#define GPR_GCC_TLS 1
294#define GPR_POSIX_LOG 1
295#define GPR_POSIX_ENV 1
296#define GPR_POSIX_TMPFILE 1
297#define GPR_POSIX_STRING 1
298#define GPR_POSIX_SUBPROCESS 1
299#define GPR_POSIX_SYNC 1
300#define GPR_POSIX_TIME 1
301#define GPR_HAS_PTHREAD_H 1
302#define GPR_GETPID_IN_UNISTD_H 1
303#define GPR_SUPPORT_CHANNELS_FROM_FD 1
304#ifdef _LP64
305#define GPR_ARCH_64 1
306#else /* _LP64 */
307#define GPR_ARCH_32 1
308#endif /* _LP64 */
309#elif defined(__OpenBSD__)
310#define GPR_PLATFORM_STRING "openbsd"
311#ifndef _BSD_SOURCE
312#define _BSD_SOURCE
313#endif
314#define GPR_OPENBSD 1
315#define GPR_CPU_POSIX 1
316#define GPR_GCC_ATOMIC 1
317#define GPR_GCC_TLS 1
318#define GPR_POSIX_LOG 1
319#define GPR_POSIX_ENV 1
320#define GPR_POSIX_TMPFILE 1
321#define GPR_POSIX_STRING 1
322#define GPR_POSIX_SUBPROCESS 1
323#define GPR_POSIX_SYNC 1
324#define GPR_POSIX_TIME 1
325#define GPR_HAS_PTHREAD_H 1
326#define GPR_GETPID_IN_UNISTD_H 1
327#define GPR_SUPPORT_CHANNELS_FROM_FD 1
328#ifdef _LP64
329#define GPR_ARCH_64 1
330#else /* _LP64 */
331#define GPR_ARCH_32 1
332#endif /* _LP64 */
333#elif defined(__sun) && defined(__SVR4)
334#define GPR_PLATFORM_STRING "solaris"
335#define GPR_SOLARIS 1
336#define GPR_CPU_POSIX 1
337#define GPR_GCC_ATOMIC 1
338#define GPR_GCC_TLS 1
339#define GPR_POSIX_LOG 1
340#define GPR_POSIX_ENV 1
341#define GPR_POSIX_TMPFILE 1
342#define GPR_POSIX_STRING 1
343#define GPR_POSIX_SUBPROCESS 1
344#define GPR_POSIX_SYNC 1
345#define GPR_POSIX_TIME 1
346#define GPR_HAS_PTHREAD_H 1
347#define GPR_GETPID_IN_UNISTD_H 1
348#ifdef _LP64
349#define GPR_ARCH_64 1
350#else /* _LP64 */
351#define GPR_ARCH_32 1
352#endif /* _LP64 */
353#elif defined(_AIX)
354#define GPR_PLATFORM_STRING "aix"
355#ifndef _ALL_SOURCE
356#define _ALL_SOURCE
357#endif
358#define GPR_AIX 1
359#define GPR_CPU_POSIX 1
360#define GPR_GCC_ATOMIC 1
361#define GPR_GCC_TLS 1
362#define GPR_POSIX_LOG 1
363#define GPR_POSIX_ENV 1
364#define GPR_POSIX_TMPFILE 1
365#define GPR_POSIX_STRING 1
366#define GPR_POSIX_SUBPROCESS 1
367#define GPR_POSIX_SYNC 1
368#define GPR_POSIX_TIME 1
369#define GPR_HAS_PTHREAD_H 1
370#define GPR_GETPID_IN_UNISTD_H 1
371#ifdef _LP64
372#define GPR_ARCH_64 1
373#else /* _LP64 */
374#define GPR_ARCH_32 1
375#endif /* _LP64 */
376#elif defined(__native_client__)
377#define GPR_PLATFORM_STRING "nacl"
378#ifndef _BSD_SOURCE
379#define _BSD_SOURCE
380#endif
381#ifndef _DEFAULT_SOURCE
382#define _DEFAULT_SOURCE
383#endif
384#ifndef _GNU_SOURCE
385#define _GNU_SOURCE
386#endif
387#define GPR_NACL 1
388#define GPR_CPU_POSIX 1
389#define GPR_GCC_ATOMIC 1
390#define GPR_GCC_TLS 1
391#define GPR_POSIX_LOG 1
392#define GPR_POSIX_ENV 1
393#define GPR_POSIX_TMPFILE 1
394#define GPR_POSIX_STRING 1
395#define GPR_POSIX_SUBPROCESS 1
396#define GPR_POSIX_SYNC 1
397#define GPR_POSIX_TIME 1
398#define GPR_HAS_PTHREAD_H 1
399#define GPR_GETPID_IN_UNISTD_H 1
400#ifdef _LP64
401#define GPR_ARCH_64 1
402#else /* _LP64 */
403#define GPR_ARCH_32 1
404#endif /* _LP64 */
405#elif defined(__Fuchsia__)
406#define GPR_FUCHSIA 1
407#define GPR_ARCH_64 1
408#define GPR_PLATFORM_STRING "fuchsia"
409#include <features.h>
410// Specifying musl libc affects wrap_memcpy.c. It causes memmove() to be
411// invoked.
412#define GPR_MUSL_LIBC_COMPAT 1
413#define GPR_CPU_POSIX 1
414#define GPR_GCC_ATOMIC 1
415#define GPR_PTHREAD_TLS 1
416#define GPR_POSIX_LOG 1
417#define GPR_POSIX_SYNC 1
418#define GPR_POSIX_ENV 1
419#define GPR_POSIX_TMPFILE 1
420#define GPR_POSIX_SUBPROCESS 1
421#define GPR_POSIX_SYNC 1
422#define GPR_POSIX_STRING 1
423#define GPR_POSIX_TIME 1
424#define GPR_HAS_PTHREAD_H 1
425#define GPR_GETPID_IN_UNISTD_H 1
426#else
427#error "Could not auto-detect platform"
428#endif
429#endif /* GPR_NO_AUTODETECT_PLATFORM */
430
431#if defined(GPR_BACKWARDS_COMPATIBILITY_MODE)
432/*
433 * For backward compatibility mode, reset _FORTIFY_SOURCE to prevent
434 * a library from having non-standard symbols such as __asprintf_chk.
435 * This helps non-glibc systems such as alpine using musl to find symbols.
436 */
437#if defined(_FORTIFY_SOURCE) && _FORTIFY_SOURCE > 0
438#undef _FORTIFY_SOURCE
439#define _FORTIFY_SOURCE 0
440#endif
441#endif
442
443/*
444 * There are platforms for which TLS should not be used even though the
445 * compiler makes it seem like it's supported (Android NDK < r12b for example).
446 * This is primarily because of linker problems and toolchain misconfiguration:
447 * TLS isn't supported until NDK r12b per
448 * https://developer.android.com/ndk/downloads/revision_history.html
449 * TLS also does not work with Android NDK if GCC is being used as the compiler
450 * instead of Clang.
451 * Since NDK r16, `__NDK_MAJOR__` and `__NDK_MINOR__` are defined in
452 * <android/ndk-version.h>. For NDK < r16, users should define these macros,
453 * e.g. `-D__NDK_MAJOR__=11 -D__NKD_MINOR__=0` for NDK r11. */
454#if defined(__ANDROID__) && defined(GPR_GCC_TLS)
455#if __has_include(<android/ndk-version.h>)
456#include <android/ndk-version.h>
457#endif /* __has_include(<android/ndk-version.h>) */
458#if (defined(__clang__) && defined(__NDK_MAJOR__) && defined(__NDK_MINOR__) && \
459 ((__NDK_MAJOR__ < 12) || \
460 ((__NDK_MAJOR__ == 12) && (__NDK_MINOR__ < 1)))) || \
461 (defined(__GNUC__) && !defined(__clang__))
462#undef GPR_GCC_TLS
463#define GPR_PTHREAD_TLS 1
464#endif
465#endif /*defined(__ANDROID__) && defined(GPR_GCC_TLS) */
466
467#if defined(__has_include)
468#if __has_include(<atomic>)
469#define GRPC_HAS_CXX11_ATOMIC
470#endif /* __has_include(<atomic>) */
471#endif /* defined(__has_include) */
472
473#ifndef GPR_PLATFORM_STRING
474#warning "GPR_PLATFORM_STRING not auto-detected"
475#define GPR_PLATFORM_STRING "unknown"
476#endif
477
478#ifdef GPR_GCOV
479#undef GPR_FORBID_UNREACHABLE_CODE
480#define GPR_FORBID_UNREACHABLE_CODE 1
481#endif
482
483#ifdef _MSC_VER
484#if _MSC_VER < 1700
485typedef __int8 int8_t;
486typedef __int16 int16_t;
487typedef __int32 int32_t;
488typedef __int64 int64_t;
489typedef unsigned __int8 uint8_t;
490typedef unsigned __int16 uint16_t;
491typedef unsigned __int32 uint32_t;
492typedef unsigned __int64 uint64_t;
493#else
494#include <stdint.h>
495#endif /* _MSC_VER < 1700 */
496#else
497#include <stdint.h>
498#endif /* _MSC_VER */
499
500/* Type of cycle clock implementation */
501#ifdef GPR_LINUX
502/* Disable cycle clock by default.
503 TODO(soheil): enable when we support fallback for unstable cycle clocks.
504#if defined(__i386__)
505#define GPR_CYCLE_COUNTER_RDTSC_32 1
506#elif defined(__x86_64__) || defined(__amd64__)
507#define GPR_CYCLE_COUNTER_RDTSC_64 1
508#else
509#define GPR_CYCLE_COUNTER_FALLBACK 1
510#endif
511*/
512#define GPR_CYCLE_COUNTER_FALLBACK 1
513#else
514#define GPR_CYCLE_COUNTER_FALLBACK 1
515#endif /* GPR_LINUX */
516
517/* Cache line alignment */
518#ifndef GPR_CACHELINE_SIZE_LOG
519#if defined(__i386__) || defined(__x86_64__)
520#define GPR_CACHELINE_SIZE_LOG 6
521#endif
522#ifndef GPR_CACHELINE_SIZE_LOG
523/* A reasonable default guess. Note that overestimates tend to waste more
524 space, while underestimates tend to waste more time. */
525#define GPR_CACHELINE_SIZE_LOG 6
526#endif /* GPR_CACHELINE_SIZE_LOG */
527#endif /* GPR_CACHELINE_SIZE_LOG */
528
529#define GPR_CACHELINE_SIZE (1 << GPR_CACHELINE_SIZE_LOG)
530
531/* scrub GCC_ATOMIC if it's not available on this compiler */
532#if defined(GPR_GCC_ATOMIC) && !defined(__ATOMIC_RELAXED)
533#undef GPR_GCC_ATOMIC
534#define GPR_GCC_SYNC 1
535#endif
536
537/* Validate platform combinations */
538#if defined(GPR_GCC_ATOMIC) + defined(GPR_GCC_SYNC) + \
539 defined(GPR_WINDOWS_ATOMIC) != \
540 1
541#error Must define exactly one of GPR_GCC_ATOMIC, GPR_GCC_SYNC, GPR_WINDOWS_ATOMIC
542#endif
543
544#if defined(GPR_ARCH_32) + defined(GPR_ARCH_64) != 1
545#error Must define exactly one of GPR_ARCH_32, GPR_ARCH_64
546#endif
547
548#if defined(GPR_CPU_LINUX) + defined(GPR_CPU_POSIX) + defined(GPR_WINDOWS) + \
549 defined(GPR_CPU_IPHONE) + defined(GPR_CPU_CUSTOM) != \
550 1
551#error Must define exactly one of GPR_CPU_LINUX, GPR_CPU_POSIX, GPR_WINDOWS, GPR_CPU_IPHONE, GPR_CPU_CUSTOM
552#endif
553
554#if defined(GPR_MSVC_TLS) + defined(GPR_GCC_TLS) + defined(GPR_PTHREAD_TLS) + \
555 defined(GPR_CUSTOM_TLS) != \
556 1
557#error Must define exactly one of GPR_MSVC_TLS, GPR_GCC_TLS, GPR_PTHREAD_TLS, GPR_CUSTOM_TLS
558#endif
559
560/* maximum alignment needed for any type on this platform, rounded up to a
561 power of two */
562#define GPR_MAX_ALIGNMENT 16
563
564#ifndef GRPC_ARES
565#define GRPC_ARES 1
566#endif
567
568#ifndef GRPC_IF_NAMETOINDEX
569#define GRPC_IF_NAMETOINDEX 1
570#endif
571
572#ifndef GRPC_MUST_USE_RESULT
573#if defined(__GNUC__) && !defined(__MINGW32__)
574#define GRPC_MUST_USE_RESULT __attribute__((warn_unused_result))
575#define GPR_ALIGN_STRUCT(n) __attribute__((aligned(n)))
576#else
577#define GRPC_MUST_USE_RESULT
578#define GPR_ALIGN_STRUCT(n)
579#endif
580#endif
581
582#ifndef GRPC_UNUSED
583#if defined(__GNUC__) && !defined(__MINGW32__)
584#define GRPC_UNUSED __attribute__((unused))
585#else
586#define GRPC_UNUSED
587#endif
588#endif
589
590#ifndef GPR_PRINT_FORMAT_CHECK
591#ifdef __GNUC__
592#define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS) \
593 __attribute__((format(printf, FORMAT_STR, ARGS)))
594#else
595#define GPR_PRINT_FORMAT_CHECK(FORMAT_STR, ARGS)
596#endif
597#endif /* GPR_PRINT_FORMAT_CHECK */
598
599#if GPR_FORBID_UNREACHABLE_CODE
600#define GPR_UNREACHABLE_CODE(STATEMENT)
601#else
602#define GPR_UNREACHABLE_CODE(STATEMENT) \
603 do { \
604 gpr_log(GPR_ERROR, "Should never reach here."); \
605 abort(); \
606 STATEMENT; \
607 } while (0)
608#endif /* GPR_FORBID_UNREACHABLE_CODE */
609
610#ifndef GPRAPI
611#define GPRAPI
612#endif
613
614#ifndef GRPCAPI
615#define GRPCAPI GPRAPI
616#endif
617
618#ifndef CENSUSAPI
619#define CENSUSAPI GRPCAPI
620#endif
621
622#ifndef GPR_HAS_ATTRIBUTE
623#ifdef __has_attribute
624#define GPR_HAS_ATTRIBUTE(a) __has_attribute(a)
625#else
626#define GPR_HAS_ATTRIBUTE(a) 0
627#endif
628#endif /* GPR_HAS_ATTRIBUTE */
629
630#ifndef GPR_HAS_FEATURE
631#ifdef __has_feature
632#define GPR_HAS_FEATURE(a) __has_feature(a)
633#else
634#define GPR_HAS_FEATURE(a) 0
635#endif
636#endif /* GPR_HAS_FEATURE */
637
638#ifndef GPR_ATTRIBUTE_NOINLINE
639#if GPR_HAS_ATTRIBUTE(noinline) || (defined(__GNUC__) && !defined(__clang__))
640#define GPR_ATTRIBUTE_NOINLINE __attribute__((noinline))
641#define GPR_HAS_ATTRIBUTE_NOINLINE 1
642#else
643#define GPR_ATTRIBUTE_NOINLINE
644#endif
645#endif /* GPR_ATTRIBUTE_NOINLINE */
646
647#ifndef GPR_ATTRIBUTE_WEAK
648/* Attribute weak is broken on LLVM/windows:
649 * https://bugs.llvm.org/show_bug.cgi?id=37598 */
650#if (GPR_HAS_ATTRIBUTE(weak) || (defined(__GNUC__) && !defined(__clang__))) && \
651 !(defined(__llvm__) && defined(_WIN32))
652#define GPR_ATTRIBUTE_WEAK __attribute__((weak))
653#define GPR_HAS_ATTRIBUTE_WEAK 1
654#else
655#define GPR_ATTRIBUTE_WEAK
656#endif
657#endif /* GPR_ATTRIBUTE_WEAK */
658
659#ifndef GPR_ATTRIBUTE_NO_TSAN /* (1) */
660#if GPR_HAS_FEATURE(thread_sanitizer)
661#define GPR_ATTRIBUTE_NO_TSAN __attribute__((no_sanitize("thread")))
662#endif /* GPR_HAS_FEATURE */
663#ifndef GPR_ATTRIBUTE_NO_TSAN /* (2) */
664#define GPR_ATTRIBUTE_NO_TSAN
665#endif /* GPR_ATTRIBUTE_NO_TSAN (2) */
666#endif /* GPR_ATTRIBUTE_NO_TSAN (1) */
667
668/* GRPC_TSAN_ENABLED will be defined, when compiled with thread sanitizer. */
669#ifndef GRPC_TSAN_SUPPRESSED
670#if defined(__SANITIZE_THREAD__)
671#define GRPC_TSAN_ENABLED
672#elif GPR_HAS_FEATURE(thread_sanitizer)
673#define GRPC_TSAN_ENABLED
674#endif
675#endif
676
677/* GRPC_ASAN_ENABLED will be defined, when compiled with address sanitizer. */
678#ifndef GRPC_ASAN_SUPPRESSED
679#if defined(__SANITIZE_ADDRESS__)
680#define GRPC_ASAN_ENABLED
681#elif GPR_HAS_FEATURE(address_sanitizer)
682#define GRPC_ASAN_ENABLED
683#endif
684#endif
685
686/* GRPC_ALLOW_EXCEPTIONS should be 0 or 1 if exceptions are allowed or not */
687#ifndef GRPC_ALLOW_EXCEPTIONS
688#ifdef GPR_WINDOWS
689#if defined(_MSC_VER) && defined(_CPPUNWIND)
690#define GRPC_ALLOW_EXCEPTIONS 1
691#elif defined(__EXCEPTIONS)
692#define GRPC_ALLOW_EXCEPTIONS 1
693#else
694#define GRPC_ALLOW_EXCEPTIONS 0
695#endif
696#else /* GPR_WINDOWS */
697#ifdef __EXCEPTIONS
698#define GRPC_ALLOW_EXCEPTIONS 1
699#else /* __EXCEPTIONS */
700#define GRPC_ALLOW_EXCEPTIONS 0
701#endif /* __EXCEPTIONS */
702#endif /* __GPR_WINDOWS */
703#endif /* GRPC_ALLOW_EXCEPTIONS */
704
705/* Use GPR_LIKELY only in cases where you are sure that a certain outcome is the
706 * most likely. Ideally, also collect performance numbers to justify the claim.
707 */
708#ifdef __GNUC__
709#define GPR_LIKELY(x) __builtin_expect((x), 1)
710#define GPR_UNLIKELY(x) __builtin_expect((x), 0)
711#else /* __GNUC__ */
712#define GPR_LIKELY(x) (x)
713#define GPR_UNLIKELY(x) (x)
714#endif /* __GNUC__ */
715
716#ifndef __STDC_FORMAT_MACROS
717#define __STDC_FORMAT_MACROS
718#endif
719
720#endif /* GRPC_IMPL_CODEGEN_PORT_PLATFORM_H */
721

source code of include/grpc/impl/codegen/port_platform.h