Attempt to work around a 32bit xlc compiler bug from a different place.

In de6fd1c8 I moved the the work around from 53f73879 into the aix
template. The previous location was removed in the former commit, and I
thought that it would be nice to emit a warning when running configure.

That didn't turn out to work because at the point the template is
included we don't know whether we're compiling a 32/64 bit binary and
it's possible to install compilers for both on a 64 bit kernel/OS.

So go back to a less ambitious approach and define
PG_FORCE_DISABLE_INLINE in port/aix.h, without emitting a warning. We
could try a more fancy approach, but it doesn't seem worth it.

This requires moving the check for PG_FORCE_DISABLE_INLINE in c.h to
after including the system headers included from therein which isn't
perfect, as it seems slightly more robust to include all system headers
in a similar environment. Oh well.

Discussion: 20150807132000.GC13310@awork2.anarazel.de
This commit is contained in:
Andres Freund 2015-08-08 01:19:02 +02:00
parent c2509944b1
commit 5a33650f24
3 changed files with 22 additions and 22 deletions

View File

@ -53,20 +53,6 @@
#include "pg_config.h"
#include "pg_config_manual.h" /* must be after pg_config.h */
/*
* Force disable inlining if PG_FORCE_DISABLE_INLINE is defined. This is used
* to work around compiler bugs and might also be useful for investigatory
* purposes.
*
* This is done early (in slightly the wrong section) for two reasons: a) we
* don't want to include headers with different settings of this b)
* functionality later in this file might want to rely on inline functions.
*/
#ifdef PG_FORCE_DISABLE_INLINE
#undef inline
#define inline
#endif
/*
* We always rely on the WIN32 macro being set by our build system,
* but _WIN32 is the compiler pre-defined macro. So make sure we define
@ -115,6 +101,19 @@
#include "pg_config_os.h"
#endif
/*
* Force disable inlining if PG_FORCE_DISABLE_INLINE is defined. This is used
* to work around compiler bugs and might also be useful for investigatory
* purposes by defining the symbol in the platform's header..
*
* This is done early (in slightly the wrong section) as functionality later
* in this file might want to rely on inline functions.
*/
#ifdef PG_FORCE_DISABLE_INLINE
#undef inline
#define inline
#endif
/* Must be before gettext() games below */
#include <locale.h>

View File

@ -3,3 +3,12 @@
*/
#define CLASS_CONFLICT
#define DISABLE_XOPEN_NLS
/*
* "IBM XL C/C++ for AIX, V12.1" miscompiles, for 32-bit, some inline
* expansions of ginCompareItemPointers() "long long" arithmetic. To take
* advantage of inlining, build a 64-bit PostgreSQL.
*/
#if defined(__ILP32__) && defined(__IBMC__)
#define PG_FORCE_DISABLE_INLINE
#endif

View File

@ -12,14 +12,6 @@ if test "$GCC" != yes ; then
esac
fi
# "IBM XL C/C++ for AIX, V12.1" miscompiles, for 32-bit, some inline
# expansions of ginCompareItemPointers() "long long" arithmetic. To
# take advantage of inlining, build a 64-bit PostgreSQL.
if test "$GCC" != yes -a $(getconf HARDWARE_BITMODE) == '32'; then
echo "$as_me: WARNING: disabling inlining on 32 bit aix due to a bug in xlc" 2>&1
CPPFLAGS="$CPPFLAGS -DPG_FORCE_DISABLE_INLINE"
fi
# Native memset() is faster, tested on:
# AIX 5.1 and 5.2, XLC 6.0 (IBM's cc)
# AIX 5.3 ML3, gcc 4.0.1