From: Amos Jeffries Date: Sun, 6 Dec 2009 00:30:50 +0000 (+1300) Subject: Author: Francesco Chemolli X-Git-Tag: SQUID_3_0_STABLE21~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7a6be0802c652e91766b27bed65a4e11d2ef27b9;p=thirdparty%2Fsquid.git Author: Francesco Chemolli Bug 2778: fix linking issues using SunCC SunCC doesn't handle inline extern functions, and misses some duplicate code detection features gcc has; as a result squid-specific operator new and operator delete get defined multiple times and fail linking. * Implemented a compiler-specific workaround by de-inlining the code. * Improved Solaris OS detection logic. --- diff --git a/include/SquidNew.h b/include/SquidNew.h index 7434a486cb..8a889c536e 100644 --- a/include/SquidNew.h +++ b/include/SquidNew.h @@ -34,6 +34,8 @@ #ifndef SQUID_NEW_H #define SQUID_NEW_H +#ifndef __SUNPRO_CC + /* Any code using libstdc++ must have externally resolvable overloads * for void * operator new - which means in the .o for the binary, * or in a shared library. static libs don't propogate the symbol @@ -57,4 +59,7 @@ _SQUID_EXTERNNEW_ void operator delete[] (void *address) throw() { xfree (address); } + +#endif /* __SUNPRO_CC */ + #endif /* SQUID_NEW_H */ diff --git a/include/config.h b/include/config.h index c950ce153a..6dbf144713 100644 --- a/include/config.h +++ b/include/config.h @@ -1,5 +1,5 @@ /* - * $Id: config.h,v 1.25.2.1 2008/02/25 03:41:38 amosjeffries Exp $ + * $Id$ * * AUTHOR: Duane Wessels * @@ -57,83 +57,82 @@ #endif /* define the _SQUID_TYPE_ based on a guess of the OS */ -#if defined(__sun__) || defined(__sun) /* SUN */ -#define _SQUID_SUN_ +#if defined(__sun__) || defined(__sun) || defined(__SUNPRO_CC) || defined(__SunOS_OSversion) /* SUN */ #if defined(__SVR4) /* SOLARIS */ -#define _SQUID_SOLARIS_ +#define _SQUID_SOLARIS_ 1 #else /* SUNOS */ -#define _SQUID_SUNOS_ +#define _SQUID_SUNOS_ 1 #endif #elif defined(__hpux) /* HP-UX - SysV-like? */ -#define _SQUID_HPUX_ -#define _SQUID_SYSV_ +#define _SQUID_HPUX_ 1 +#define _SQUID_SYSV_ 1 #elif defined(__osf__) /* OSF/1 */ -#define _SQUID_OSF_ +#define _SQUID_OSF_ 1 #elif defined(__ultrix) /* Ultrix */ -#define _SQUID_ULTRIX_ +#define _SQUID_ULTRIX_ 1 #elif defined(_AIX) /* AIX */ -#define _SQUID_AIX_ +#define _SQUID_AIX_ 1 #elif defined(__linux__) /* Linux */ -#define _SQUID_LINUX_ +#define _SQUID_LINUX_ 1 #if USE_ASYNC_IO -#define _SQUID_LINUX_THREADS_ +#define _SQUID_LINUX_THREADS_ 1 #endif #elif defined(__FreeBSD__) /* FreeBSD */ -#define _SQUID_FREEBSD_ +#define _SQUID_FREEBSD_ 1 #if USE_ASYNC_IO && defined(LINUXTHREADS) -#define _SQUID_LINUX_THREADS_ +#define _SQUID_LINUX_THREADS_ 1 #endif #elif defined(__FreeBSD_kernel__) /* GNU/kFreeBSD */ -#define _SQUID_KFREEBSD_ +#define _SQUID_KFREEBSD_ 1 #elif defined(__sgi__) || defined(sgi) || defined(__sgi) /* SGI */ -#define _SQUID_SGI_ +#define _SQUID_SGI_ 1 #if !defined(_SVR4_SOURCE) -#define _SVR4_SOURCE /* for tempnam(3) */ +#define _SVR4_SOURCE 1 /* for tempnam(3) */ #endif #if USE_ASYNC_IO -#define _ABI_SOURCE +#define _ABI_SOURCE 1 #endif /* USE_ASYNC_IO */ #elif defined(__NeXT__) -#define _SQUID_NEXT_ +#define _SQUID_NEXT_ 1 #elif defined(__bsdi__) -#define _SQUID_BSDI_ /* BSD/OS */ +#define _SQUID_BSDI_ 1 /* BSD/OS */ #elif defined(__NetBSD__) -#define _SQUID_NETBSD_ +#define _SQUID_NETBSD_ 1 #elif defined(__OpenBSD__) -#define _SQUID_OPENBSD_ +#define _SQUID_OPENBSD_ 1 #elif defined(__DragonFly__) -#define _SQUID_DRAGONFLY_ +#define _SQUID_DRAGONFLY_ 1 #elif defined(__CYGWIN32__) || defined(__CYGWIN__) -#define _SQUID_CYGWIN_ -#define _SQUID_WIN32_ +#define _SQUID_CYGWIN_ 1 +#define _SQUID_WIN32_ 1 #elif defined(WIN32) || defined(WINNT) || defined(__WIN32__) || defined(__WIN32) -#define _SQUID_MSWIN_ -#define _SQUID_WIN32_ +#define _SQUID_MSWIN_ 1 +#define _SQUID_WIN32_ 1 #include "squid_mswin.h" #elif defined(__APPLE__) -#define _SQUID_APPLE_ +#define _SQUID_APPLE_ 1 #elif defined(sony_news) && defined(__svr4) -#define _SQUID_NEWSOS6_ +#define _SQUID_NEWSOS6_ 1 #elif defined(__EMX__) || defined(OS2) || defined(__OS2__) -#define _SQUID_OS2_ +#define _SQUID_OS2_ 1 /* * FIXME: the os2 port of bash seems to have problems checking * the return codes of programs in if statements. These options diff --git a/include/util.h b/include/util.h index 3e918fc272..23ffab55d5 100644 --- a/include/util.h +++ b/include/util.h @@ -83,7 +83,13 @@ SQUIDCEXTERN void xxfree(const void *); * for the extern version in squid */ #ifndef _SQUID_EXTERNNEW_ -#if defined(_SQUID_SGI_) && !defined(_GNUC_) +/* + * SunPro CC handles extern inline as inline, PLUS extern symbols. + */ +#if _SQUID_SOLARIS_ && !defined(_SQUID_EXTERNNEW_) && defined(__SUNPRO_CC) +#define _SQUID_EXTERNNEW_ extern +#else +#if _SQUID_SGI_ && !defined(_GNUC_) /* * The gcc compiler treats extern inline functions as being extern, * while the SGI MIPSpro compilers treat them as inline. To get equivalent @@ -96,8 +102,9 @@ SQUIDCEXTERN void xxfree(const void *); #else #define _SQUID_EXTERNNEW_ extern inline #endif -#endif -#endif +#endif /* SGI */ +#endif /* Solaris */ +#endif /* _SQUID_EXTERNNEW_ */ #include "SquidNew.h" #endif diff --git a/src/SquidNew.cc b/src/SquidNew.cc index db55bd4572..c2d7aed04d 100644 --- a/src/SquidNew.cc +++ b/src/SquidNew.cc @@ -33,5 +33,28 @@ * */ -#define _SQUID_EXTERNNEW_ +/* #define _SQUID_EXTERNNEW_ */ /* Why? kinkie */ #include "squid.h" + + +#ifdef __SUNPRO_CC + +#include +void *operator new(size_t size) throw (std::bad_alloc) +{ + return xmalloc(size); +} +void operator delete (void *address) throw() +{ + xfree (address); +} +void *operator new[] (size_t size) throw (std::bad_alloc) +{ + return xmalloc(size); +} +void operator delete[] (void *address) throw() +{ + xfree (address); +} + +#endif /* __SUNPRO_CC */