1/* 2 * Copyright 2009-2015 Samy Al Bahra. 3 * Copyright 2014 Paul Khuong. 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 */ 27 28#ifndef CK_GCC_CC_H 29#define CK_GCC_CC_H 30 31#include <ck_md.h> 32 33#ifdef __SUNPRO_C 34#define CK_CC_UNUSED 35#define CK_CC_USED 36#define CK_CC_IMM 37#define CK_CC_IMM_U32 38#else 39#define CK_CC_UNUSED __attribute__((unused)) 40#define CK_CC_USED __attribute__((used)) 41#define CK_CC_IMM "i" 42 43#define CK_CC_CONTAINER(F, T, M, N) \ 44 CK_CC_INLINE static T * \ 45 N(F *p) \ 46 { \ 47 \ 48 return (T *)(void *)((char *)p - __builtin_offsetof(T, M)); \ 49 } 50 51#if defined(__x86_64__) || defined(__x86__) 52#define CK_CC_IMM_U32 "Z" 53#define CK_CC_IMM_S32 "e" 54#else 55#define CK_CC_IMM_U32 CK_CC_IMM 56#define CK_CC_IMM_S32 CK_CC_IMM 57#endif /* __x86_64__ || __x86__ */ 58#endif 59 60#ifdef __OPTIMIZE__ 61#define CK_CC_INLINE CK_CC_UNUSED inline 62#else 63#define CK_CC_INLINE CK_CC_UNUSED 64#endif 65 66#define CK_CC_FORCE_INLINE CK_CC_UNUSED __attribute__((always_inline)) inline 67#define CK_CC_RESTRICT __restrict__ 68 69/* 70 * Packed attribute. 71 */ 72#define CK_CC_PACKED __attribute__((packed)) 73 74/* 75 * Weak reference. 76 */ 77#define CK_CC_WEAKREF __attribute__((weakref)) 78 79/* 80 * Alignment attribute. 81 */ 82#define CK_CC_ALIGN(B) __attribute__((aligned(B))) 83 84/* 85 * Cache align. 86 */ 87#define CK_CC_CACHELINE CK_CC_ALIGN(CK_MD_CACHELINE) 88 89/* 90 * These are functions which should be avoided. 91 */ 92#ifdef __freestanding__ 93#pragma GCC poison malloc free 94#endif 95 96/* 97 * Branch execution hints. 98 */ 99#define CK_CC_LIKELY(x) (__builtin_expect(!!(x), 1)) 100#define CK_CC_UNLIKELY(x) (__builtin_expect(!!(x), 0)) 101 102/* 103 * Some compilers are overly strict regarding aliasing semantics. 104 * Unfortunately, in many cases it makes more sense to pay aliasing 105 * cost rather than overly expensive register spillage. 106 */ 107#define CK_CC_ALIASED __attribute__((__may_alias__)) 108 109/* 110 * Compile-time typeof 111 */ 112#define CK_CC_TYPEOF(X, DEFAULT) __typeof__(X) 113 114/* 115 * Portability wrappers for bitwise operations. 116 */ 117#ifndef CK_MD_CC_BUILTIN_DISABLE 118#define CK_F_CC_FFS 119CK_CC_INLINE static int 120ck_cc_ffs(unsigned int x) 121{ 122 123 return __builtin_ffsl(x); 124} 125 126#define CK_F_CC_FFSL 127CK_CC_INLINE static int 128ck_cc_ffsl(unsigned long x) 129{ 130 131 return __builtin_ffsll(x); 132} 133 134#define CK_F_CC_CTZ 135CK_CC_INLINE static int 136ck_cc_ctz(unsigned int x) 137{ 138 139 return __builtin_ctz(x); 140} 141 142#define CK_F_CC_POPCOUNT 143CK_CC_INLINE static int 144ck_cc_popcount(unsigned int x) 145{ 146 147 return __builtin_popcount(x); 148} 149#endif /* CK_MD_CC_BUILTIN_DISABLE */ 150#endif /* CK_GCC_CC_H */ 151