FreeRDP
Loading...
Searching...
No Matches
platform.h
1
20#ifndef WINPR_PLATFORM_H
21#define WINPR_PLATFORM_H
22
23#include <stdlib.h>
24
25/* MSVC only defines _Pragma if you compile with /std:c11 with no extensions
26 * see
27 * https://learn.microsoft.com/en-us/cpp/preprocessor/pragma-directives-and-the-pragma-keyword?view=msvc-170#the-pragma-preprocessing-operator
28 */
29#if !defined(_MSC_VER)
30#define WINPR_DO_PRAGMA(x) _Pragma(#x)
31#else
32#define WINPR_DO_PRAGMA(x) __pragma(#x)
33#endif
34
35/* COVERITY_BUILD must be defined by build system */
36#if !defined(COVERITY_BUILD)
37#define WINPR_DO_COVERITY_PRAGMA(x)
38#else
39#define WINPR_DO_COVERITY_PRAGMA(x) WINPR_DO_PRAGMA(x)
40#endif
41
42#if defined(__GNUC__)
43#define WINPR_PRAGMA_WARNING(msg) WINPR_DO_PRAGMA(GCC warning #msg)
44#elif defined(__clang__)
45#define WINPR_PRAGMA_WARNING(msg) WINPR_DO_PRAGMA(GCC warning #msg)
46#elif defined(_MSC_VER) && (_MSC_VER >= 1920)
47#define WINPR_PRAGMA_WARNING(msg) WINPR_DO_PRAGMA(message \x28 #msg \x29)
48#else
49#define WINPR_PRAGMA_WARNING(msg)
50#endif
51
52// C99 related macros
53#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
54#define WINPR_RESTRICT restrict
55#elif defined(_MSC_VER) && _MSC_VER >= 1900
56#define WINPR_RESTRICT __restrict
57#else
58#define WINPR_RESTRICT
59#endif
60
61// C23 related macros
62#if defined(__cplusplus) && (__cplusplus >= 201703L)
63#define WINPR_FALLTHROUGH \
64 (void)0; \
65 [[fallthrough]];
66#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
67#define WINPR_FALLTHROUGH \
68 (void)0; \
69 [[fallthrough]];
70#elif defined(__clang__)
71#define WINPR_FALLTHROUGH \
72 (void)0; \
73 __attribute__((fallthrough));
74#elif defined(__GNUC__) && (__GNUC__ >= 7)
75#define WINPR_FALLTHROUGH \
76 (void)0; \
77 __attribute__((fallthrough));
78#else
79#define WINPR_FALLTHROUGH (void)0;
80#endif
81
82#if (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202003L)) || defined(__cplusplus)
83#define WINPR_C_ARRAY_INIT \
84 { \
85 }
86#else
87#define WINPR_C_ARRAY_INIT { 0 }
88#define nullptr NULL
89#endif
90
91#if defined(WINPR_DEFINE_ATTR_NODISCARD)
92#if defined(__cplusplus) && (__cplusplus >= 201703L)
93#if defined(__GNUC__) && !defined(__clang__)
94#define WINPR_ATTR_NODISCARD [[gnu::warn_unused_result]]
95#else
96#define WINPR_ATTR_NODISCARD [[nodiscard]]
97#endif
98#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
99#if defined(__GNUC__) && !defined(__clang__)
100#define WINPR_ATTR_NODISCARD [[gnu::warn_unused_result]]
101#else
102#define WINPR_ATTR_NODISCARD [[nodiscard]]
103#endif
104#elif defined(__clang__)
105#define WINPR_ATTR_NODISCARD __attribute__((warn_unused_result))
106#elif defined(__GNUC__) && (__GNUC__ >= 7)
107#define WINPR_ATTR_NODISCARD __attribute__((warn_unused_result))
108#else
109#define WINPR_ATTR_NODISCARD
110#endif
111#else
112#define WINPR_ATTR_NODISCARD
113#endif
114
115#if defined(__clang__)
116#define WINPR_PRAGMA_DIAG_PUSH WINPR_DO_PRAGMA(clang diagnostic push)
117#define WINPR_PRAGMA_DIAG_IGNORED_OVERLENGTH_STRINGS \
118 WINPR_DO_PRAGMA(clang diagnostic ignored "-Woverlength-strings")
120#define WINPR_PRAGMA_DIAG_IGNORED_QUALIFIERS
121/* unsupported by clang WINPR_DO_PRAGMA(clang diagnostic ignored "-Wdiscarded-qualifiers") */
122#define WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC WINPR_DO_PRAGMA(clang diagnostic ignored "-Wpedantic")
123#define WINPR_PRAGMA_DIAG_IGNORED_MISSING_PROTOTYPES \
124 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wmissing-prototypes")
125#define WINPR_PRAGMA_DIAG_IGNORED_STRICT_PROTOTYPES \
126 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wstrict-prototypes")
127#define WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO \
128 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wreserved-id-macro")
129#define WINPR_PRAGMA_DIAG_IGNORED_UNUSED_MACRO \
130 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wunused-macros")
131#define WINPR_PRAGMA_DIAG_IGNORED_UNKNOWN_PRAGMAS \
132 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wunknown-pragmas")
133#define WINPR_PRAGMA_DIAG_IGNORED_DEPRECATED_DECL \
134 WINPR_DO_PRAGMA(clang diagnostic ignored \
135 "-Wdeprecated-declarations")
137#if __clang_major__ >= 13
138#define WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER \
139 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wreserved-identifier")
140#else
141#define WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
142#endif
143
144#define WINPR_PRAGMA_DIAG_IGNORED_ATOMIC_SEQ_CST \
145 WINPR_DO_PRAGMA(clang diagnostic ignored "-Watomic-implicit-seq-cst")
146#define WINPR_PRAGMA_DIAG_IGNORED_UNUSED_CONST_VAR \
147 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wunused-const-variable")
148#define WINPR_PRAGMA_DIAG_IGNORED_FORMAT_SECURITY \
149 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wformat-security")
150#define WINPR_PRAGMA_DIAG_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE \
151 WINPR_DO_PRAGMA(clang diagnostic ignored \
152 "-Wtautological-constant-out-of-range-compare")
156#if __clang_major__ >= 12
157#define WINPR_PRAGMA_DIAG_TAUTOLOGICAL_VALUE_RANGE_COMPARE \
158 WINPR_DO_PRAGMA(clang diagnostic ignored \
159 "-Wtautological-value-range-compare")
161#else
162#define WINPR_PRAGMA_DIAG_TAUTOLOGICAL_VALUE_RANGE_COMPARE
163#endif
164
165#define WINPR_PRAGMA_DIAG_IGNORED_FORMAT_NONLITERAL \
166 WINPR_DO_PRAGMA(clang diagnostic ignored "-Wformat-nonliteral")
168#define WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC /* not \
169 supported WINPR_DO_PRAGMA(clang diagnostic ignored "-Wmismatched-dealloc") */
170#define WINPR_PRAGMA_DIAG_POP WINPR_DO_PRAGMA(clang diagnostic pop)
171#define WINPR_PRAGMA_UNROLL_LOOP \
172 _Pragma("clang loop vectorize_width(8) interleave_count(8)")
174#elif defined(__GNUC__)
175#define WINPR_PRAGMA_DIAG_PUSH WINPR_DO_PRAGMA(GCC diagnostic push)
176#define WINPR_PRAGMA_DIAG_IGNORED_OVERLENGTH_STRINGS \
177 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Woverlength-strings")
178#define WINPR_PRAGMA_DIAG_IGNORED_QUALIFIERS \
179 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wdiscarded-qualifiers")
181#define WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wpedantic")
182#define WINPR_PRAGMA_DIAG_IGNORED_MISSING_PROTOTYPES \
183 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wmissing-prototypes")
184#define WINPR_PRAGMA_DIAG_IGNORED_STRICT_PROTOTYPES \
185 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wstrict-prototypes")
186#define WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO /* not supported WINPR_DO_PRAGMA(GCC \
187 diagnostic ignored \
188 "-Wreserved-id-macro") \
189 */
190#define WINPR_PRAGMA_DIAG_IGNORED_UNUSED_MACRO \
191 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wunused-macros")
192#define WINPR_PRAGMA_DIAG_IGNORED_UNKNOWN_PRAGMAS \
193 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wunknown-pragmas")
194#define WINPR_PRAGMA_DIAG_IGNORED_DEPRECATED_DECL \
195 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wdeprecated-declarations")
198#define WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
199/* not supported WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wreserved-identifier") */
200#define WINPR_PRAGMA_DIAG_IGNORED_ATOMIC_SEQ_CST /* not supported WINPR_DO_PRAGMA(GCC \
201 diagnostic ignored \
202 "-Watomic-implicit-seq-cst") */
203#define WINPR_PRAGMA_DIAG_IGNORED_UNUSED_CONST_VAR \
204 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wunused-const-variable")
205#define WINPR_PRAGMA_DIAG_IGNORED_FORMAT_SECURITY \
206 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wformat-security")
207#define WINPR_PRAGMA_DIAG_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE /* not supported
208 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wtautological-constant-out-of-range-compare") */
209#define WINPR_PRAGMA_DIAG_TAUTOLOGICAL_VALUE_RANGE_COMPARE /* not supported
210 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wtautological-value-range-compare") */
211#define WINPR_PRAGMA_DIAG_IGNORED_FORMAT_NONLITERAL \
212 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wformat-nonliteral")
213#if __GNUC__ >= 11
214#define WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC \
215 WINPR_DO_PRAGMA(GCC diagnostic ignored "-Wmismatched-dealloc")
216#else
217#define WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
218#endif
219#define WINPR_PRAGMA_DIAG_POP WINPR_DO_PRAGMA(GCC diagnostic pop)
220#define WINPR_PRAGMA_UNROLL_LOOP \
221 WINPR_DO_PRAGMA(GCC unroll 8) WINPR_DO_PRAGMA(GCC ivdep)
222#else
223#define WINPR_PRAGMA_DIAG_PUSH
224#define WINPR_PRAGMA_DIAG_IGNORED_PEDANTIC
225#define WINPR_PRAGMA_DIAG_IGNORED_QUALIFIERS
226#define WINPR_PRAGMA_DIAG_IGNORED_OVERLENGTH_STRINGS
227#define WINPR_PRAGMA_DIAG_IGNORED_MISSING_PROTOTYPES
228#define WINPR_PRAGMA_DIAG_IGNORED_STRICT_PROTOTYPES
229#define WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
230#define WINPR_PRAGMA_DIAG_IGNORED_UNUSED_MACRO
231#define WINPR_PRAGMA_DIAG_IGNORED_UNKNOWN_PRAGMAS
232#define WINPR_PRAGMA_DIAG_IGNORED_DEPRECATED_DECL
233#define WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
234#define WINPR_PRAGMA_DIAG_IGNORED_ATOMIC_SEQ_CST
235#define WINPR_PRAGMA_DIAG_IGNORED_UNUSED_CONST_VAR
236#define WINPR_PRAGMA_DIAG_IGNORED_FORMAT_SECURITY
237#define WINPR_PRAGMA_DIAG_TAUTOLOGICAL_CONSTANT_OUT_OF_RANGE_COMPARE
239#define WINPR_PRAGMA_DIAG_TAUTOLOGICAL_VALUE_RANGE_COMPARE
240#define WINPR_PRAGMA_DIAG_IGNORED_FORMAT_NONLITERAL
241#define WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
242#define WINPR_PRAGMA_DIAG_POP
243#define WINPR_PRAGMA_UNROLL_LOOP
244#endif
245
246#if defined(MSVC)
247#undef WINPR_PRAGMA_UNROLL_LOOP
248#define WINPR_PRAGMA_UNROLL_LOOP WINPR_DO_PRAGMA(loop(ivdep))
249#endif
250
251WINPR_PRAGMA_DIAG_PUSH
252
253WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
254
255/*
256 * Processor Architectures:
257 * http://sourceforge.net/p/predef/wiki/Architectures/
258 *
259 * Visual Studio Predefined Macros:
260 * http://msdn.microsoft.com/en-ca/library/vstudio/b0084kay.aspx
261 */
262
263/* Intel x86 (_M_IX86) */
264
265#if defined(i386) || defined(__i386) || defined(__i386__) || defined(__i486__) || \
266 defined(__i586__) || defined(__i686__) || defined(__X86__) || defined(_X86_) || \
267 defined(__I86__) || defined(__IA32__) || defined(__THW_INTEL__) || defined(__INTEL__) || \
268 defined(_M_IX86)
269#ifndef _M_IX86
270#define _M_IX86 1
271#endif
272#endif
273
274/* AMD64 (_M_AMD64) */
275
276#if defined(__amd64) || defined(__amd64__) || defined(__x86_64) || defined(__x86_64__) || \
277 defined(_M_X64)
278#ifndef _M_AMD64
279// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
280#define _M_AMD64 1
281#endif
282#endif
283
284/* Intel ia64 */
285#if defined(__ia64) || defined(__ia64__) || defined(_M_IA64)
286#ifndef _M_IA64
287// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
288#define _M_IA64 1
289#endif
290#endif
291
292/* Intel x86 or AMD64 (_M_IX86_AMD64) */
293
294#if defined(_M_IX86) || defined(_M_AMD64)
295#ifndef _M_IX86_AMD64
296// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
297#define _M_IX86_AMD64 1
298#endif
299#endif
300
301/* ARM (_M_ARM) */
302
303#if defined(__arm__) || defined(__thumb__) || defined(__TARGET_ARCH_ARM) || \
304 defined(__TARGET_ARCH_THUMB)
305#ifndef _M_ARM
306// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
307#define _M_ARM 1
308#endif
309#endif
310
311/* ARM64 (_M_ARM64) */
312
313#if defined(__aarch64__)
314#ifndef _M_ARM64
315#define _M_ARM64 1
316#endif
317#endif
318
319/* MIPS (_M_MIPS) */
320
321#if defined(mips) || defined(__mips) || defined(__mips__) || defined(__MIPS__)
322#ifndef _M_MIPS
323// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
324#define _M_MIPS 1
325#endif
326#endif
327
328/* MIPS64 (_M_MIPS64) */
329
330#if defined(mips64) || defined(__mips64) || defined(__mips64__) || defined(__MIPS64__)
331#ifndef _M_MIPS64
332// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
333#define _M_MIPS64 1
334#endif
335#endif
336
337/* PowerPC (_M_PPC) */
338
339#if defined(__ppc__) || defined(__powerpc) || defined(__powerpc__) || defined(__POWERPC__) || \
340 defined(_ARCH_PPC)
341#ifndef _M_PPC
342// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
343#define _M_PPC 1
344#endif
345#endif
346
347/* Intel Itanium (_M_IA64) */
348
349#if defined(__ia64) || defined(__ia64__) || defined(_IA64) || defined(__IA64__)
350#ifndef _M_IA64
351// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
352#define _M_IA64 1
353#endif
354#endif
355
356/* Alpha (_M_ALPHA) */
357
358#if defined(__alpha) || defined(__alpha__)
359#ifndef _M_ALPHA
360// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
361#define _M_ALPHA 1
362#endif
363#endif
364
365/* SPARC (_M_SPARC) */
366
367#if defined(__sparc) || defined(__sparc__)
368#ifndef _M_SPARC
369// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
370#define _M_SPARC 1
371#endif
372#endif
373
374/* E2K (_M_E2K) */
375
376#if defined(__e2k__)
377#ifndef _M_E2K
378// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
379#define _M_E2K 1
380#endif
381#endif
382
388/* Windows (_WIN32) */
389
390/* WinRT (_WINRT) */
391
392#if defined(WINAPI_FAMILY)
393#if (WINAPI_FAMILY == WINAPI_FAMILY_APP)
394#ifndef _WINRT
395// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
396#define _WINRT 1
397#endif
398#endif
399#endif
400
401#if defined(__cplusplus_winrt)
402#ifndef _WINRT
403// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
404#define _WINRT 1
405#endif
406#endif
407
408/* Linux (__linux__) */
409
410#if defined(linux) || defined(__linux)
411#ifndef __linux__
412#define __linux__ 1
413#endif
414#endif
415
416/* GNU/Linux (__gnu_linux__) */
417
418/* Apple Platforms (iOS, Mac OS X) */
419
420#if (defined(__APPLE__) && defined(__MACH__))
421
422#include <TargetConditionals.h>
423
424#if (TARGET_OS_IPHONE == 1) || (TARGET_IPHONE_SIMULATOR == 1)
425
426/* iOS (__IOS__) */
427
428#ifndef __IOS__
429// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
430#define __IOS__ 1
431#endif
432
433#elif (TARGET_OS_MAC == 1)
434
435/* Mac OS X (__MACOSX__) */
436
437#ifndef __MACOSX__
438// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
439#define __MACOSX__ 1
440#endif
441
442#endif
443#endif
444
445/* Android (__ANDROID__) */
446
447/* Cygwin (__CYGWIN__) */
448
449/* FreeBSD (__FreeBSD__) */
450
451/* NetBSD (__NetBSD__) */
452
453/* OpenBSD (__OpenBSD__) */
454
455/* DragonFly (__DragonFly__) */
456
457/* Solaris (__sun) */
458
459#if defined(sun)
460#ifndef __sun
461// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
462#define __sun 1
463#endif
464#endif
465
466/* IRIX (__sgi) */
467
468#if defined(sgi)
469#ifndef __sgi
470// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
471#define __sgi 1
472#endif
473#endif
474
475/* AIX (_AIX) */
476
477#if defined(__TOS_AIX__)
478#ifndef _AIX
479// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
480#define _AIX 1
481#endif
482#endif
483
484/* HP-UX (__hpux) */
485
486#if defined(hpux) || defined(_hpux)
487#ifndef __hpux
488// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
489#define __hpux 1
490#endif
491#endif
492
493/* BeOS (__BEOS__) */
494
495/* QNX (__QNXNTO__) */
496
502#if defined(__gnu_linux__)
503#include <endian.h>
504#endif
505
506#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || \
507 defined(__DragonFly__) || defined(__APPLE__)
508#include <sys/param.h>
509#endif
510
511/* Big-Endian */
512
513#ifdef __BYTE_ORDER
514
515#if (__BYTE_ORDER == __BIG_ENDIAN)
516#ifndef __BIG_ENDIAN__
517// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
518#define __BIG_ENDIAN__ 1
519#endif
520#endif
521
522#else
523
524#if defined(__ARMEB__) || defined(__THUMBEB__) || defined(__AARCH64EB__) || defined(_MIPSEB) || \
525 defined(__MIPSEB) || defined(__MIPSEB__)
526#ifndef __BIG_ENDIAN__
527// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
528#define __BIG_ENDIAN__ 1
529#endif
530#endif
531
532#endif /* __BYTE_ORDER */
533
534/* Little-Endian */
535
536#ifdef __BYTE_ORDER
537
538#if (__BYTE_ORDER == __LITTLE_ENDIAN)
539#ifndef __LITTLE_ENDIAN__
540// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
541#define __LITTLE_ENDIAN__ 1
542#endif
543#endif
544
545#else
546
547#if defined(__ARMEL__) || defined(__THUMBEL__) || defined(__AARCH64EL__) || defined(_MIPSEL) || \
548 defined(__MIPSEL) || defined(__MIPSEL__) || defined(__e2k__)
549#ifndef __LITTLE_ENDIAN__
550// NOLINTNEXTLINE(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
551#define __LITTLE_ENDIAN__ 1
552#endif
553#endif
554
555#endif /* __BYTE_ORDER */
556
557WINPR_PRAGMA_DIAG_POP
558
559#if defined(__cplusplus) && (__cplusplus >= 201703L)
560#define WINPR_DEPRECATED(obj) [[deprecated]] obj
561#define WINPR_DEPRECATED_VAR(text, obj) [[deprecated("[deprecated] " text)]] obj
562#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
563#define WINPR_DEPRECATED(obj) [[deprecated]] obj
564#define WINPR_DEPRECATED_VAR(text, obj) [[deprecated("[deprecated] " text)]] obj
565#elif defined(__GNUC__)
566#define WINPR_DEPRECATED(obj) obj __attribute__((deprecated))
567#define WINPR_DEPRECATED_VAR(text, obj) obj __attribute__((deprecated("[deprecated] " text)))
568#else
569#define WINPR_DEPRECATED(obj) obj
570#define WINPR_DEPRECATED_VAR(text, obj) obj
571#endif
572
573#if defined(__cplusplus) && (__cplusplus >= 201703L)
574#define WINPR_DECLSPEC_NORETURN [[noreturn]]
575#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
576#define WINPR_DECLSPEC_NORETURN [[noreturn]]
577#elif defined(WIN32) && !defined(__CYGWIN__)
578#define WINPR_DECLSPEC_NORETURN __declspec(noreturn)
579#elif defined(__GNUC__)
580#define WINPR_DECLSPEC_NORETURN __attribute__((__noreturn__))
581#else
582#define WINPR_DECLSPEC_NORETURN
583#endif
584
585#define WINPR_NORETURN(obj) WINPR_DECLSPEC_NORETURN obj
586
587#define INLINE inline
588
589#ifdef WINPR_DLL
590#if defined _WIN32 || defined __CYGWIN__
591#ifdef WINPR_EXPORTS
592#ifdef __GNUC__
593#define WINPR_API __attribute__((dllexport))
594#else
595#define WINPR_API __declspec(dllexport)
596#endif
597#else
598#ifdef __GNUC__
599#define WINPR_API __attribute__((dllimport))
600#else
601#define WINPR_API __declspec(dllimport)
602#endif
603#endif
604#else
605#if defined(__GNUC__) && (__GNUC__ >= 4)
606#if defined(__cplusplus) && (__cplusplus >= 201703L)
607#define WINPR_API [[gnu::visibility("default")]]
608#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
609#define WINPR_API [[gnu::visibility("default")]]
610#else
611#define WINPR_API __attribute__((visibility("default")))
612#endif
613#else
614#define WINPR_API
615#endif
616#endif
617#else /* WINPR_DLL */
618#define WINPR_API
619#endif
620
621#if defined(__clang__)
622#if defined(__cplusplus) && (__cplusplus >= 201703L)
623#define WINPR_ATTR_MALLOC(deallocator, ptrindex) \
624 [[gnu::malloc, nodiscard]]
625#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
626#define WINPR_ATTR_MALLOC(deallocator, ptrindex) \
627 [[gnu::malloc, nodiscard]]
628#else
629#define WINPR_ATTR_MALLOC(deallocator, ptrindex) \
630 __attribute__((malloc, warn_unused_result))
631#endif
632#elif defined(__GNUC__)
633#if (__GNUC__ <= 10)
634#define WINPR_ATTR_MALLOC(deallocator, ptrindex) \
635 __attribute__((malloc, warn_unused_result))
636#else
637#if defined(__cplusplus) && (__cplusplus >= 201703L)
638#define WINPR_ATTR_MALLOC(deallocator, ptrindex) \
639 [[gnu::malloc(deallocator, ptrindex), nodiscard]]
640#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
641#define WINPR_ATTR_MALLOC(deallocator, ptrindex) \
642 [[gnu::malloc(deallocator, ptrindex), nodiscard]]
643#else
644#define WINPR_ATTR_MALLOC(deallocator, ptrindex) \
645 __attribute__((malloc(deallocator, ptrindex), warn_unused_result))
646#endif
647#endif
648#elif defined(_MSC_VER)
649#define WINPR_ATTR_MALLOC(deallocator, ptrindex) __declspec(restrict)
650#endif
651
652#if defined(__GNUC__) || defined(__clang__)
653#if defined(__cplusplus) && (__cplusplus >= 201703L)
654#define WINPR_ATTR_FORMAT_ARG(pos, args) [[gnu::format(printf, pos, args)]]
655#define WINPR_FORMAT_ARG
656#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
657#define WINPR_ATTR_FORMAT_ARG(pos, args) [[gnu::format(printf, pos, args)]]
658#define WINPR_FORMAT_ARG
659#else
660#define WINPR_ATTR_FORMAT_ARG(pos, args) __attribute__((__format__(__printf__, pos, args)))
661#define WINPR_FORMAT_ARG
662#endif
663#elif defined(_MSC_VER)
664#define WINPR_ATTR_FORMAT_ARG(pos, args)
665#define WINPR_FORMAT_ARG _Printf_format_string_
666#endif
667
668#if defined(EXPORT_ALL_SYMBOLS)
669#define WINPR_LOCAL WINPR_API
670#elif defined _WIN32 || defined __CYGWIN__
671#define WINPR_LOCAL
672#elif defined(__GNUC__) && (__GNUC__ >= 4)
673#if defined(__cplusplus) && (__cplusplus >= 201703L)
674#define WINPR_LOCAL [[gnu::visibility("hidden")]]
675#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
676#define WINPR_LOCAL [[gnu::visibility("hidden")]]
677#else
678#define WINPR_LOCAL __attribute__((visibility("hidden")))
679#endif
680#else
681#define WINPR_LOCAL
682#endif
683
684// WARNING: *do not* use thread-local storage for new code because it is not portable
685// It is only used for VirtualChannelInit, and all FreeRDP channels use VirtualChannelInitEx
686// The old virtual channel API is only realistically used on Windows where TLS is available
687#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 201112L) && \
688 !defined(__STDC_NO_THREADS__) // C11
689#include <threads.h>
690
691#define WINPR_TLS thread_local
692#elif defined _WIN32 || defined __CYGWIN__
693#ifdef __GNUC__
694#define WINPR_TLS __thread
695#else
696#define WINPR_TLS __declspec(thread)
697#endif
698#elif !defined(__IOS__)
699#define WINPR_TLS __thread
700#else
701// thread-local storage is not supported on iOS
702// don't warn because it isn't actually used on iOS
703#define WINPR_TLS
704#endif
705
706#define WINPR_ALIGN64 DECLSPEC_ALIGN(8)
707
708#if defined(__cplusplus) && (__cplusplus >= 201703L)
709#define WINPR_ATTR_UNUSED [[maybe_unused]]
710#elif defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)
711#define WINPR_ATTR_UNUSED [[maybe_unused]]
712#elif defined(__GNUC__) || defined(__clang__)
713#define WINPR_ATTR_UNUSED __attribute__((unused))
714#else
715#define WINPR_ATTR_UNUSED
716#endif
717
718#define WINPR_UNUSED(x) (void)(x)
719
720#endif /* WINPR_PLATFORM_H */