]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Author: Francesco Chemolli <kinkie@squid-cache.org>
authorAmos Jeffries <squid3@treenet.co.nz>
Sun, 6 Dec 2009 00:30:50 +0000 (13:30 +1300)
committerAmos Jeffries <squid3@treenet.co.nz>
Sun, 6 Dec 2009 00:30:50 +0000 (13:30 +1300)
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.

include/SquidNew.h
include/config.h
include/util.h
src/SquidNew.cc

index 7434a486cb5f411e6b97e8aae4487b0cfc39f435..8a889c536e958f6eefee37d0baaca7f505ef6854 100644 (file)
@@ -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 */
index c950ce153a3f7e0657b69c9958b3792228f4dfb1..6dbf144713ef1a9fb5eb095e511cb98b37263faa 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: config.h,v 1.25.2.1 2008/02/25 03:41:38 amosjeffries Exp $
+ * $Id$
  *
  * AUTHOR: Duane Wessels
  *
 #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
index 3e918fc2728009761fdd8e861c174e9ac19d6039..23ffab55d5bf4a3ae245f64280b24097a0d0d1b2 100644 (file)
@@ -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
 
index db55bd457274d929db74f795784cf8830be0144b..c2d7aed04dda0b487508b90a643c85c0ba55fc97 100644 (file)
  *
  */
 
-#define _SQUID_EXTERNNEW_
+/* #define _SQUID_EXTERNNEW_ */ /* Why? kinkie */
 #include "squid.h"
+
+
+#ifdef __SUNPRO_CC
+
+#include <new>
+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 */