diff --git a/Makefile b/Makefile index 824e8e19b..64ccd50aa 100644 --- a/Makefile +++ b/Makefile @@ -364,7 +364,7 @@ BUILD_OPTIONS += $(call ignore_implicit,USE_GETSOCKNAME) endif ifneq ($(USE_REGPARM),) -OPTIONS_CFLAGS += -DCONFIG_HAP_USE_REGPARM +OPTIONS_CFLAGS += -DCONFIG_REGPARM=3 BUILD_OPTIONS += $(call ignore_implicit,USE_REGPARM) endif diff --git a/ebtree/compiler.h b/ebtree/compiler.h new file mode 100644 index 000000000..7281f097a --- /dev/null +++ b/ebtree/compiler.h @@ -0,0 +1,23 @@ +/* + * ebtree/compiler.h + * This files contains some compiler-specific settings. + * + * Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, version 2.1 + * exclusively. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include + diff --git a/ebtree/ebtree.h b/ebtree/ebtree.h index 77813c1e8..76ea1e7f9 100644 --- a/ebtree/ebtree.h +++ b/ebtree/ebtree.h @@ -257,6 +257,7 @@ #define _EBTREE_H #include +#include "compiler.h" /* Note: we never need to run fls on null keys, so we can optimize the fls * function by removing a conditional jump. @@ -305,74 +306,6 @@ static inline int fls64(unsigned long long x) #define container_of(ptr, type, name) ((type *)(((void *)(ptr)) - ((long)&((type *)0)->name))) #endif -/* - * Gcc >= 3 provides the ability for the program to give hints to the compiler - * about what branch of an if is most likely to be taken. This helps the - * compiler produce the most compact critical paths, which is generally better - * for the cache and to reduce the number of jumps. Be very careful not to use - * this in inline functions, because the code reordering it causes very often - * has a negative impact on the calling functions. - */ -#if !defined(likely) -#if __GNUC__ < 3 -#define __builtin_expect(x,y) (x) -#define likely(x) (x) -#define unlikely(x) (x) -#elif __GNUC__ < 4 -/* gcc 3.x does the best job at this */ -#define likely(x) (__builtin_expect((x) != 0, 1)) -#define unlikely(x) (__builtin_expect((x) != 0, 0)) -#else -/* GCC 4.x is stupid, it performs the comparison then compares it to 1, - * so we cheat in a dirty way to prevent it from doing this. This will - * only work with ints and booleans though. - */ -#define likely(x) (x) -#define unlikely(x) (__builtin_expect((unsigned long)(x), 0)) -#endif -#endif - -/* By default, gcc does not inline large chunks of code, but we want it to - * respect our choices. - */ -#if !defined(forceinline) -#if __GNUC__ < 3 -#define forceinline inline -#else -#define forceinline inline __attribute__((always_inline)) -#endif -#endif - -/* Support passing function parameters in registers. For this, the - * CONFIG_EBTREE_REGPARM macro has to be set to the maximal number of registers - * allowed. Some functions have intentionally received a regparm lower than - * their parameter count, it is in order to avoid register clobbering where - * they are called. - */ -#ifndef REGPRM1 -#if CONFIG_EBTREE_REGPARM >= 1 -#define REGPRM1 __attribute__((regparm(1))) -#else -#define REGPRM1 -#endif -#endif - -#ifndef REGPRM2 -#if CONFIG_EBTREE_REGPARM >= 2 -#define REGPRM2 __attribute__((regparm(2))) -#else -#define REGPRM2 REGPRM1 -#endif -#endif - -#ifndef REGPRM3 -#if CONFIG_EBTREE_REGPARM >= 3 -#define REGPRM3 __attribute__((regparm(3))) -#else -#define REGPRM3 REGPRM2 -#endif -#endif - /* Number of bits per node, and number of leaves per node */ #define EB_NODE_BITS 1 #define EB_NODE_BRANCHES (1 << EB_NODE_BITS) diff --git a/include/common/compat.h b/include/common/compat.h index 8ddb72db9..3c939ce61 100644 --- a/include/common/compat.h +++ b/include/common/compat.h @@ -22,15 +22,6 @@ #ifndef _COMMON_COMPAT_H #define _COMMON_COMPAT_H -/* - * Gcc before 3.0 needs [0] to declare a variable-size array - */ -#if __GNUC__ < 3 -#define VAR_ARRAY 0 -#else -#define VAR_ARRAY -#endif - /* This is needed on Linux for Netfilter includes */ #include #include diff --git a/include/common/compiler.h b/include/common/compiler.h new file mode 100644 index 000000000..03d82ae36 --- /dev/null +++ b/include/common/compiler.h @@ -0,0 +1,107 @@ +/* + * include/common/compiler.h + * This files contains some compiler-specific settings. + * + * Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, version 2.1 + * exclusively. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _COMMON_COMPILER_H +#define _COMMON_COMPILER_H + + +/* + * Gcc before 3.0 needs [0] to declare a variable-size array + */ +#ifndef VAR_ARRAY +#if __GNUC__ < 3 +#define VAR_ARRAY 0 +#else +#define VAR_ARRAY +#endif +#endif + + +/* Support passing function parameters in registers. For this, the + * CONFIG_REGPARM macro has to be set to the maximal number of registers + * allowed. Some functions have intentionally received a regparm lower than + * their parameter count, it is in order to avoid register clobbering where + * they are called. + */ +#ifndef REGPRM1 +#if CONFIG_REGPARM >= 1 && __GNUC__ >= 3 +#define REGPRM1 __attribute__((regparm(1))) +#else +#define REGPRM1 +#endif +#endif + +#ifndef REGPRM2 +#if CONFIG_REGPARM >= 2 && __GNUC__ >= 3 +#define REGPRM2 __attribute__((regparm(2))) +#else +#define REGPRM2 REGPRM1 +#endif +#endif + +#ifndef REGPRM3 +#if CONFIG_REGPARM >= 3 && __GNUC__ >= 3 +#define REGPRM3 __attribute__((regparm(3))) +#else +#define REGPRM3 REGPRM2 +#endif +#endif + + +/* By default, gcc does not inline large chunks of code, but we want it to + * respect our choices. + */ +#if !defined(forceinline) +#if __GNUC__ < 3 +#define forceinline inline +#else +#define forceinline inline __attribute__((always_inline)) +#endif +#endif + + +/* + * Gcc >= 3 provides the ability for the programme to give hints to the + * compiler about what branch of an if is most likely to be taken. This + * helps the compiler produce the most compact critical paths, which is + * generally better for the cache and to reduce the number of jumps. + */ +#if !defined(likely) +#if __GNUC__ < 3 +#define __builtin_expect(x,y) (x) +#define likely(x) (x) +#define unlikely(x) (x) +#elif __GNUC__ < 4 +/* gcc 3.x does the best job at this */ +#define likely(x) (__builtin_expect((x) != 0, 1)) +#define unlikely(x) (__builtin_expect((x) != 0, 0)) +#else +/* GCC 4.x is stupid, it performs the comparison then compares it to 1, + * so we cheat in a dirty way to prevent it from doing this. This will + * only work with ints and booleans though. + */ +#define likely(x) (x) +#define unlikely(x) (__builtin_expect((unsigned long)(x), 0)) +#endif +#endif + + +#endif /* _COMMON_COMPILER_H */ diff --git a/include/common/config.h b/include/common/config.h index 5efa7cbb5..5833cfcdb 100644 --- a/include/common/config.h +++ b/include/common/config.h @@ -1,27 +1,28 @@ /* - include/common/config.h - This files contains most of the user-configurable settings. - - Copyright (C) 2000-2007 Willy Tarreau - w@1wt.eu - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation, version 2.1 - exclusively. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * include/common/config.h + * This files contains most of the user-configurable settings. + * + * Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, version 2.1 + * exclusively. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ #ifndef _COMMON_CONFIG_H #define _COMMON_CONFIG_H +#include #include /* this reduces the number of calls to select() by choosing appropriate @@ -68,30 +69,4 @@ */ //#undef CONFIG_HAP_INLINE_FD_SET -/* CONFIG_HAP_USE_REGPARM - * This enables the use of register parameters for some functions where - * it may improve performance by a measurable factor. This MUST NOT be - * enabled on gcc < 3 because it is ignored for function pointers. - */ -#if CONFIG_HAP_USE_REGPARM && __GNUC__ >= 3 -#define REGPRM1 __attribute__((regparm(1))) -#define REGPRM2 __attribute__((regparm(2))) -#define REGPRM3 __attribute__((regparm(3))) -#else -#define REGPRM1 -#define REGPRM2 -#define REGPRM3 -#endif - -/* By default, gcc does not inline large chunks of code, but we want it to - * respect our choices. - */ -#if !defined(forceinline) -#if __GNUC__ < 3 -#define forceinline inline -#else -#define forceinline inline __attribute__((always_inline)) -#endif -#endif - #endif /* _COMMON_CONFIG_H */ diff --git a/include/common/standard.h b/include/common/standard.h index 0a6b68bf9..544a5c315 100644 --- a/include/common/standard.h +++ b/include/common/standard.h @@ -1,23 +1,23 @@ /* - include/common/standard.h - This files contains some general purpose functions and macros. - - Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation, version 2.1 - exclusively. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA -*/ + * include/common/standard.h + * This files contains some general purpose functions and macros. + * + * Copyright (C) 2000-2009 Willy Tarreau - w@1wt.eu + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation, version 2.1 + * exclusively. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ #ifndef _COMMON_STANDARD_H #define _COMMON_STANDARD_H @@ -41,31 +41,6 @@ * power of 2, and 0 otherwise */ #define POWEROF2(x) (((x) & ((x)-1)) == 0) -/* - * Gcc >= 3 provides the ability for the programme to give hints to the - * compiler about what branch of an if is most likely to be taken. This - * helps the compiler produce the most compact critical paths, which is - * generally better for the cache and to reduce the number of jumps. - */ -#if !defined(likely) -#if __GNUC__ < 3 -#define __builtin_expect(x,y) (x) -#define likely(x) (x) -#define unlikely(x) (x) -#elif __GNUC__ < 4 -/* gcc 3.x does the best job at this */ -#define likely(x) (__builtin_expect((x) != 0, 1)) -#define unlikely(x) (__builtin_expect((x) != 0, 0)) -#else -/* GCC 4.x is stupid, it performs the comparison then compares it to 1, - * so we cheat in a dirty way to prevent it from doing this. This will - * only work with ints and booleans though. - */ -#define likely(x) (x) -#define unlikely(x) (__builtin_expect((unsigned long)(x), 0)) -#endif -#endif - /* * copies at most chars from to . Last char is always * set to 0, unless is 0. The number of chars copied is returned