/* Compiler definitions helpers, for portability. We assume only modern GCC and Clang here. */ #ifndef COM_DEF_H #define COM_DEF_H #define COM_DEF_STRLIT_(x) #x #define COM_DEF_STRLIT(x) COM_DEF_STRLIT_(x) #define COM_DEF_COMPILER_CLANG 1 #define COM_DEF_COMPILER_GCC 2 #if defined(__GNUC__) && !defined(__clang__) #define COM_DEF_COMPILER COM_DEF_COMPILER_GCC #elif defined(__clang__) #define COM_DEF_COMPILER COM_DEF_COMPILER_CLANG #endif #define COM_DEF_TARGET_LINUX 1 #define COM_DEF_TARGET_WASM 2 #define COM_DEF_TARGET_COSMO 3 #if defined(__wasm__) #define COM_DEF_TARGET COM_DEF_TARGET_WASM #define com_def_export_sym(m_s) __attribute__((export_name(m_s))) #elif defined(__linux__) #define COM_DEF_TARGET COM_DEF_TARGET_LINUX #define com_def_export_sym(m_s) __attribute__((visibility("default"))) #elif defined(__COSMOPOLITAN__) #define COM_DEF_TARGET COM_DEF_TARGET_COSMO #define com_def_export_sym(m_s) __attribute__((visibility("default"))) #else #error Unknown target. #endif #define COM_DEF_CPU_AMD64 1 #define COM_DEF_CPU_X86 2 #define COM_DEF_CPU_WASM32 3 #define COM_DEF_CPU_AARCH64 4 #if defined(__wasm__) #define COM_DEF_CPU COM_DEF_CPU_WASM32 #define COM_DEF_ALIGNMENT 16 #define COM_DEF_CPU_LITEND 1 #elif defined(__x86_64__) || defined(__amd64__) #define COM_DEF_CPU COM_DEF_CPU_AMD64 #define COM_DEF_CPU_LITEND 1 #define COM_DEF_ALIGNMENT 32 #elif defined(__i386__) #define COM_DEF_CPU COM_DEF_CPU_X86 #define COM_DEF_ALIGNMENT 16 #define COM_DEF_CPU_LITEND 1 #elif defined(__aarch64__) #define COM_DEF_CPU COM_DEF_CPU_AARCH64 #define COM_DEF_ALIGNMENT 16 #define COM_DEF_CPU_LITEND 1 #else #error Unknown cpu. #endif #define com_def_alignedas(v_as) _Alignas(v_as) #define com_def_vector(v_t, v_v, v_b) v_t v_v __attribute__((vector_size(v_b))) // #define COM_DEF_PROFILE_VAR volatile /* Sadly, doesn't work in some cases */ #define com_def_profile_sink(m_v) __asm__ volatile("" ::"r"(m_v) : "memory") #endif