 |
FreeRDP
|
Loading...
Searching...
No Matches
24#include <winpr/platform.h>
25#include <winpr/assert-api.h>
32#define WINPR_CXX_COMPAT_CAST(t, val) static_cast<t>(val)
34#define WINPR_CXX_COMPAT_CAST(t, val) ((t)(val))
41#if defined(DISABLE_SUPPORTED_ARCH_CHECKS)
42#elif defined(_M_ARM) || defined(_M_ARM64)
45#if !defined(__ARM_FEATURE_UNALIGNED) && !defined(_MSC_VER)
47 "-munaligned-access is required on arm. Use -DDISABLE_SUPPORTED_ARCH_CHECKS=ON to ignore, but there will be dragons ahead!"
49#define WINPR_ARCH_SUPPORTED 1
51#elif defined(_M_IX86) || defined(_M_AMD64) || defined(_M_PPC) || defined(_M_S390X)
52#define WINPR_ARCH_SUPPORTED 1
53#elif defined(_M_RISCV32) || defined(_M_RISCV64)
54#if !defined(__riscv_misaligned_fast)
56 "RISCV must support __riscv_misaligned_fast. Use -DDISABLE_SUPPORTED_ARCH_CHECKS=ON to ignore, but there will be dragons ahead!"
58#define WINPR_ARCH_SUPPORTED 1
62#if !defined(WINPR_ARCH_SUPPORTED)
63#if defined(__GNUC__) || defined(__clang__) || \
64 (defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 202311L)) || \
65 (defined(__cplusplus) && (__cplusplus >= 202302L))
66#warning "unaligned pointer access not verified on platform, SIGBUS may happen!"
78#define WINPR_PACKED_ALIGN_CAST(t, val) WINPR_CXX_COMPAT_CAST(t, val)
79#elif defined(WINPR_ARCH_SUPPORTED)
80#define WINPR_PACKED_ALIGN_CAST(t, val) \
82 WINPR_PRAGMA_DIAG_PUSH; \
83 WINPR_PRAGMA_DIAG_IGNORED_CAST_ALIGN; \
84 typeof(t) aligntmp = WINPR_CXX_COMPAT_CAST(t, val); \
85 WINPR_PRAGMA_DIAG_POP; \
89#define WINPR_PACKED_ALIGN_CAST(t, val) \
91 typeof(t) aligntmp = WINPR_CXX_COMPAT_CAST(t, val); \
94 const size_t fromtype = _Alignof(typeof(*aligntmp)); \
95 const size_t actual = ((uintptr_t)(val)) % fromtype; \
96 WINPR_ASSERT(actual == 0); \
102#if defined(__GNUC__) || defined(__clang__)
110#define WINPR_REINTERPRET_CAST(ptr, srcType, dstType) \
117 WINPR_STATIC_ASSERT(sizeof(srcType) == sizeof(dstType)); \
129#define WINPR_CAST_CONST_PTR_AWAY(ptr, dstType) \
147#define WINPR_FUNC_PTR_CAST(ptr, dstType) \
154 WINPR_STATIC_ASSERT(sizeof(dstType) == sizeof(__typeof(ptr))); \
160#define WINPR_REINTERPRET_CAST(ptr, srcType, dstType) (dstType) ptr
161#define WINPR_CAST_CONST_PTR_AWAY(ptr, dstType) (dstType) ptr
162#define WINPR_FUNC_PTR_CAST(ptr, dstType) (dstType)(uintptr_t) ptr
165#if defined(__GNUC__) || defined(__clang__)
177#define WINPR_ASSERTING_INT_CAST(type, ivar) \
179 __typeof(ivar) var = ivar; \
180 WINPR_ASSERT((var) == \
181 WINPR_CXX_COMPAT_CAST(__typeof(var), WINPR_CXX_COMPAT_CAST(type, (var)))); \
182 WINPR_ASSERT((((var) > 0) && (WINPR_CXX_COMPAT_CAST(type, (var)) > 0)) || \
183 (((var) <= 0) && WINPR_CXX_COMPAT_CAST(type, (var)) <= 0)); \
184 WINPR_CXX_COMPAT_CAST(type, (var)); \
188#define WINPR_ASSERTING_INT_CAST(type, var) WINPR_CXX_COMPAT_CAST(type, var)