/* Compiler definitions helpers, for portability. */ #ifndef COM_DEF_H #define COM_DEF_H #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) || \ defined(__GNUC__) || defined(__clang__) #define COM_DEF_COMPILE_MODERN 1 #endif #define COM_DEF_TARGET_LINUX 0 #define COM_DEF_TARGET_WASM 1 #if defined(__wasm__) #define COM_DEF_TARGET COM_DEF_TARGET_WASM #define com_def_export_sym(m_s) __attribute__((export_name(m_s))) #else #define COM_DEF_TARGET COM_DEF_TARGET_LINUX #define com_def_export_sym(m_s) __attribute__((visibility("default"))) #endif /* TODO: uppercase? */ #ifdef COM_DEF_COMPILE_MODERN #define com_def_alignedas(v_as) _Alignas(v_as) #define com_def_vector(v_t, v_v, v_n) \ v_t v_v __attribute__((vector_size(sizeof(v_t) * v_n))) #else #define com_def_alignedas(v_as) #define com_def_vector(v_t, v_v, v_n) v_t v_v[v_n] #endif // #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