diff options
author | Thomas Munro <tmunro@postgresql.org> | 2024-12-04 14:46:59 +1300 |
---|---|---|
committer | Thomas Munro <tmunro@postgresql.org> | 2024-12-04 15:05:38 +1300 |
commit | 962da900ac8f0927f1af2fd811ca67fa163c873a (patch) | |
tree | 5839c22d2ad7bc68ddfd1e4debc734ef5df3a9d1 | |
parent | 3b08d5224d7df71cc111d8522cf6190fc02f6fb9 (diff) | |
download | postgresql-962da900ac8f0927f1af2fd811ca67fa163c873a.tar.gz postgresql-962da900ac8f0927f1af2fd811ca67fa163c873a.zip |
Use <stdint.h> and <inttypes.h> for c.h integers.
Redefine our exact width types with standard C99 types and macros,
including int64_t, INT64_MAX, INT64_C(), PRId64 etc. We were already
using <stdint.h> types in a few places.
One complication is that Windows' <inttypes.h> uses format strings like
"%I64d", "%I32", "%I" for PRI*64, PRI*32, PTR*PTR, instead of mapping to
other standardized format strings like "%lld" etc as seen on other known
systems. Teach our snprintf.c to understand them.
This removes a lot of configure clutter, and should also allow 64-bit
numbers and other standard types to be used in localized messages
without casting.
Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://postgr.es/m/ME3P282MB3166F9D1F71F787929C0C7E7B6312%40ME3P282MB3166.AUSP282.PROD.OUTLOOK.COM
-rw-r--r-- | config/c-compiler.m4 | 78 | ||||
-rwxr-xr-x | configure | 354 | ||||
-rw-r--r-- | configure.ac | 52 | ||||
-rw-r--r-- | meson.build | 41 | ||||
-rw-r--r-- | src/Makefile.global.in | 6 | ||||
-rw-r--r-- | src/bin/pg_waldump/pg_waldump.c | 16 | ||||
-rw-r--r-- | src/bin/pgbench/pgbench.c | 4 | ||||
-rw-r--r-- | src/include/.gitignore | 2 | ||||
-rw-r--r-- | src/include/Makefile | 8 | ||||
-rw-r--r-- | src/include/c.h | 101 | ||||
-rw-r--r-- | src/include/meson.build | 12 | ||||
-rw-r--r-- | src/include/pg_config.h.in | 25 | ||||
-rw-r--r-- | src/include/pg_config_ext.h.in | 7 | ||||
-rw-r--r-- | src/include/pg_config_ext.h.meson | 7 | ||||
-rw-r--r-- | src/include/port/pg_bitutils.h | 16 | ||||
-rw-r--r-- | src/include/postgres_ext.h | 4 | ||||
-rw-r--r-- | src/include/utils/dsa.h | 2 | ||||
-rw-r--r-- | src/interfaces/ecpg/ecpglib/typename.c | 9 | ||||
-rw-r--r-- | src/interfaces/ecpg/include/ecpg_config.h.in | 8 | ||||
-rw-r--r-- | src/interfaces/ecpg/include/meson.build | 4 | ||||
-rw-r--r-- | src/interfaces/ecpg/include/pgtypes_interval.h | 12 | ||||
-rw-r--r-- | src/interfaces/ecpg/include/sqltypes.h | 8 | ||||
-rw-r--r-- | src/interfaces/ecpg/test/expected/compat_informix-sqlda.c | 8 | ||||
-rw-r--r-- | src/port/pg_bitutils.c | 6 | ||||
-rw-r--r-- | src/port/snprintf.c | 64 |
25 files changed, 272 insertions, 582 deletions
diff --git a/config/c-compiler.m4 b/config/c-compiler.m4 index 309d5b04b46..e112fd45d48 100644 --- a/config/c-compiler.m4 +++ b/config/c-compiler.m4 @@ -38,60 +38,6 @@ ac_c_werror_flag=$ac_save_c_werror_flag ])# PGAC_TEST_PRINTF_ARCHETYPE -# PGAC_TYPE_64BIT_INT(TYPE) -# ------------------------- -# Check if TYPE is a working 64 bit integer type. Set HAVE_TYPE_64 to -# yes or no respectively, and define HAVE_TYPE_64 if yes. -AC_DEFUN([PGAC_TYPE_64BIT_INT], -[define([Ac_define], [translit([have_$1_64], [a-z *], [A-Z_P])])dnl -define([Ac_cachevar], [translit([pgac_cv_type_$1_64], [ *], [_p])])dnl -AC_CACHE_CHECK([whether $1 is 64 bits], [Ac_cachevar], -[AC_RUN_IFELSE([AC_LANG_SOURCE( -[typedef $1 ac_int64; - -/* - * These are globals to discourage the compiler from folding all the - * arithmetic tests down to compile-time constants. - */ -ac_int64 a = 20000001; -ac_int64 b = 40000005; - -int does_int64_work() -{ - ac_int64 c,d; - - if (sizeof(ac_int64) != 8) - return 0; /* definitely not the right size */ - - /* Do perfunctory checks to see if 64-bit arithmetic seems to work */ - c = a * b; - d = (c + b) / b; - if (d != a+1) - return 0; - return 1; -} - -int -main() { - return (! does_int64_work()); -}])], -[Ac_cachevar=yes], -[Ac_cachevar=no], -[# If cross-compiling, check the size reported by the compiler and -# trust that the arithmetic works. -AC_COMPILE_IFELSE([AC_LANG_BOOL_COMPILE_TRY([], [sizeof($1) == 8])], - Ac_cachevar=yes, - Ac_cachevar=no)])]) - -Ac_define=$Ac_cachevar -if test x"$Ac_cachevar" = xyes ; then - AC_DEFINE(Ac_define, 1, [Define to 1 if `]$1[' works and is 64 bits.]) -fi -undefine([Ac_define])dnl -undefine([Ac_cachevar])dnl -])# PGAC_TYPE_64BIT_INT - - # PGAC_TYPE_128BIT_INT # -------------------- # Check if __int128 is a working 128 bit integer type, and if so @@ -270,9 +216,10 @@ fi])# PGAC_C_BUILTIN_CONSTANT_P AC_DEFUN([PGAC_C_BUILTIN_OP_OVERFLOW], [AC_CACHE_CHECK(for __builtin_mul_overflow, pgac_cv__builtin_op_overflow, [AC_LINK_IFELSE([AC_LANG_PROGRAM([ -PG_INT64_TYPE a = 1; -PG_INT64_TYPE b = 1; -PG_INT64_TYPE result; +#include <stdint.h> +int64_t a = 1; +int64_t b = 1; +int64_t result; int oflo; ], [oflo = __builtin_mul_overflow(a, b, &result);])], @@ -557,13 +504,13 @@ fi])# PGAC_HAVE_GCC__SYNC_INT32_CAS # types, and define HAVE_GCC__SYNC_INT64_CAS if so. AC_DEFUN([PGAC_HAVE_GCC__SYNC_INT64_CAS], [AC_CACHE_CHECK(for builtin __sync int64 atomic operations, pgac_cv_gcc_sync_int64_cas, -[AC_LINK_IFELSE([AC_LANG_PROGRAM([], - [PG_INT64_TYPE lock = 0; - __sync_val_compare_and_swap(&lock, 0, (PG_INT64_TYPE) 37);])], +[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <stdint.h>], + [int64_t lock = 0; + __sync_val_compare_and_swap(&lock, 0, (int64_t) 37);])], [pgac_cv_gcc_sync_int64_cas="yes"], [pgac_cv_gcc_sync_int64_cas="no"])]) if test x"$pgac_cv_gcc_sync_int64_cas" = x"yes"; then - AC_DEFINE(HAVE_GCC__SYNC_INT64_CAS, 1, [Define to 1 if you have __sync_val_compare_and_swap(int64 *, int64, int64).]) + AC_DEFINE(HAVE_GCC__SYNC_INT64_CAS, 1, [Define to 1 if you have __sync_val_compare_and_swap(int64_t *, int64_t, int64_t).]) fi])# PGAC_HAVE_GCC__SYNC_INT64_CAS # PGAC_HAVE_GCC__ATOMIC_INT32_CAS @@ -588,9 +535,9 @@ fi])# PGAC_HAVE_GCC__ATOMIC_INT32_CAS # types, and define HAVE_GCC__ATOMIC_INT64_CAS if so. AC_DEFUN([PGAC_HAVE_GCC__ATOMIC_INT64_CAS], [AC_CACHE_CHECK(for builtin __atomic int64 atomic operations, pgac_cv_gcc_atomic_int64_cas, -[AC_LINK_IFELSE([AC_LANG_PROGRAM([], - [PG_INT64_TYPE val = 0; - PG_INT64_TYPE expect = 0; +[AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <stdint.h>], + [int64_t val = 0; + int64_t expect = 0; __atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED);])], [pgac_cv_gcc_atomic_int64_cas="yes"], [pgac_cv_gcc_atomic_int64_cas="no"])]) @@ -734,13 +681,14 @@ AC_DEFUN([PGAC_AVX512_POPCNT_INTRINSICS], [define([Ac_cachevar], [AS_TR_SH([pgac_cv_avx512_popcnt_intrinsics])])dnl AC_CACHE_CHECK([for _mm512_popcnt_epi64], [Ac_cachevar], [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <immintrin.h> + #include <stdint.h> #if defined(__has_attribute) && __has_attribute (target) __attribute__((target("avx512vpopcntdq,avx512bw"))) #endif static int popcount_test(void) { const char buf@<:@sizeof(__m512i)@:>@; - PG_INT64_TYPE popcnt = 0; + int64_t popcnt = 0; __m512i accum = _mm512_setzero_si512(); const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf); const __m512i cnt = _mm512_popcnt_epi64(val); diff --git a/configure b/configure index cf2d83b93ad..518c33b73a9 100755 --- a/configure +++ b/configure @@ -14437,6 +14437,43 @@ if test x"$pgac_cv__builtin_constant_p" = xyes ; then $as_echo "#define HAVE__BUILTIN_CONSTANT_P 1" >>confdefs.h fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_mul_overflow" >&5 +$as_echo_n "checking for __builtin_mul_overflow... " >&6; } +if ${pgac_cv__builtin_op_overflow+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <stdint.h> +int64_t a = 1; +int64_t b = 1; +int64_t result; +int oflo; + +int +main () +{ +oflo = __builtin_mul_overflow(a, b, &result); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + pgac_cv__builtin_op_overflow=yes +else + pgac_cv__builtin_op_overflow=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__builtin_op_overflow" >&5 +$as_echo "$pgac_cv__builtin_op_overflow" >&6; } +if test x"$pgac_cv__builtin_op_overflow" = xyes ; then + +$as_echo "#define HAVE__BUILTIN_OP_OVERFLOW 1" >>confdefs.h + +fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_unreachable" >&5 $as_echo_n "checking for __builtin_unreachable... " >&6; } if ${pgac_cv__builtin_unreachable+:} false; then : @@ -16196,236 +16233,6 @@ fi # Run tests below here # -------------------- - -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long int is 64 bits" >&5 -$as_echo_n "checking whether long int is 64 bits... " >&6; } -if ${pgac_cv_type_long_int_64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - # If cross-compiling, check the size reported by the compiler and -# trust that the arithmetic works. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -static int test_array [1 - 2 * !(sizeof(long int) == 8)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_type_long_int_64=yes -else - pgac_cv_type_long_int_64=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -typedef long int ac_int64; - -/* - * These are globals to discourage the compiler from folding all the - * arithmetic tests down to compile-time constants. - */ -ac_int64 a = 20000001; -ac_int64 b = 40000005; - -int does_int64_work() -{ - ac_int64 c,d; - - if (sizeof(ac_int64) != 8) - return 0; /* definitely not the right size */ - - /* Do perfunctory checks to see if 64-bit arithmetic seems to work */ - c = a * b; - d = (c + b) / b; - if (d != a+1) - return 0; - return 1; -} - -int -main() { - return (! does_int64_work()); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - pgac_cv_type_long_int_64=yes -else - pgac_cv_type_long_int_64=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_type_long_int_64" >&5 -$as_echo "$pgac_cv_type_long_int_64" >&6; } - -HAVE_LONG_INT_64=$pgac_cv_type_long_int_64 -if test x"$pgac_cv_type_long_int_64" = xyes ; then - -$as_echo "#define HAVE_LONG_INT_64 1" >>confdefs.h - -fi - - -if test x"$HAVE_LONG_INT_64" = x"yes" ; then - pg_int64_type="long int" -else - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether long long int is 64 bits" >&5 -$as_echo_n "checking whether long long int is 64 bits... " >&6; } -if ${pgac_cv_type_long_long_int_64+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test "$cross_compiling" = yes; then : - # If cross-compiling, check the size reported by the compiler and -# trust that the arithmetic works. -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -int -main () -{ -static int test_array [1 - 2 * !(sizeof(long long int) == 8)]; -test_array [0] = 0; -return test_array [0]; - - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - pgac_cv_type_long_long_int_64=yes -else - pgac_cv_type_long_long_int_64=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -typedef long long int ac_int64; - -/* - * These are globals to discourage the compiler from folding all the - * arithmetic tests down to compile-time constants. - */ -ac_int64 a = 20000001; -ac_int64 b = 40000005; - -int does_int64_work() -{ - ac_int64 c,d; - - if (sizeof(ac_int64) != 8) - return 0; /* definitely not the right size */ - - /* Do perfunctory checks to see if 64-bit arithmetic seems to work */ - c = a * b; - d = (c + b) / b; - if (d != a+1) - return 0; - return 1; -} - -int -main() { - return (! does_int64_work()); -} -_ACEOF -if ac_fn_c_try_run "$LINENO"; then : - pgac_cv_type_long_long_int_64=yes -else - pgac_cv_type_long_long_int_64=no -fi -rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ - conftest.$ac_objext conftest.beam conftest.$ac_ext -fi - -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv_type_long_long_int_64" >&5 -$as_echo "$pgac_cv_type_long_long_int_64" >&6; } - -HAVE_LONG_LONG_INT_64=$pgac_cv_type_long_long_int_64 -if test x"$pgac_cv_type_long_long_int_64" = xyes ; then - -$as_echo "#define HAVE_LONG_LONG_INT_64 1" >>confdefs.h - -fi - - if test x"$HAVE_LONG_LONG_INT_64" = x"yes" ; then - pg_int64_type="long long int" - else - as_fn_error $? "Cannot find a working 64-bit integer type." "$LINENO" 5 - fi -fi - - -cat >>confdefs.h <<_ACEOF -#define PG_INT64_TYPE $pg_int64_type -_ACEOF - - -# Select the printf length modifier that goes with that, too. -if test x"$pg_int64_type" = x"long long int" ; then - INT64_MODIFIER='"ll"' -else - INT64_MODIFIER='"l"' -fi - - -cat >>confdefs.h <<_ACEOF -#define INT64_MODIFIER $INT64_MODIFIER -_ACEOF - - -# has to be down here, rather than with the other builtins, because -# the test uses PG_INT64_TYPE. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __builtin_mul_overflow" >&5 -$as_echo_n "checking for __builtin_mul_overflow... " >&6; } -if ${pgac_cv__builtin_op_overflow+:} false; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -PG_INT64_TYPE a = 1; -PG_INT64_TYPE b = 1; -PG_INT64_TYPE result; -int oflo; - -int -main () -{ -oflo = __builtin_mul_overflow(a, b, &result); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - pgac_cv__builtin_op_overflow=yes -else - pgac_cv__builtin_op_overflow=no -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__builtin_op_overflow" >&5 -$as_echo "$pgac_cv__builtin_op_overflow" >&6; } -if test x"$pgac_cv__builtin_op_overflow" = xyes ; then - -$as_echo "#define HAVE__BUILTIN_OP_OVERFLOW 1" >>confdefs.h - -fi - # Check size of void *, size_t (enables tweaks for > 32bit address space) # The cast to long int works around a bug in the HP C Compiler # version HP92453-01 B.11.11.23709.GP, which incorrectly rejects @@ -16526,6 +16333,39 @@ cat >>confdefs.h <<_ACEOF _ACEOF +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" "$ac_includes_default"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + # Determine memory alignment requirements for the basic C data types. @@ -16634,43 +16474,41 @@ cat >>confdefs.h <<_ACEOF _ACEOF -if test x"$HAVE_LONG_LONG_INT_64" = x"yes" ; then - # The cast to long int works around a bug in the HP C Compiler, +# The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of long long int" >&5 -$as_echo_n "checking alignment of long long int... " >&6; } -if ${ac_cv_alignof_long_long_int+:} false; then : +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of int64_t" >&5 +$as_echo_n "checking alignment of int64_t... " >&6; } +if ${ac_cv_alignof_int64_t+:} false; then : $as_echo_n "(cached) " >&6 else - if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_long_long_int" "$ac_includes_default + if ac_fn_c_compute_int "$LINENO" "(long int) offsetof (ac__type_alignof_, y)" "ac_cv_alignof_int64_t" "$ac_includes_default #ifndef offsetof # define offsetof(type, member) ((char *) &((type *) 0)->member - (char *) 0) #endif -typedef struct { char x; long long int y; } ac__type_alignof_;"; then : +typedef struct { char x; int64_t y; } ac__type_alignof_;"; then : else - if test "$ac_cv_type_long_long_int" = yes; then + if test "$ac_cv_type_int64_t" = yes; then { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -as_fn_error 77 "cannot compute alignment of long long int +as_fn_error 77 "cannot compute alignment of int64_t See \`config.log' for more details" "$LINENO" 5; } else - ac_cv_alignof_long_long_int=0 + ac_cv_alignof_int64_t=0 fi fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_long_long_int" >&5 -$as_echo "$ac_cv_alignof_long_long_int" >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_alignof_int64_t" >&5 +$as_echo "$ac_cv_alignof_int64_t" >&6; } cat >>confdefs.h <<_ACEOF -#define ALIGNOF_LONG_LONG_INT $ac_cv_alignof_long_long_int +#define ALIGNOF_INT64_T $ac_cv_alignof_int64_t _ACEOF -fi # The cast to long int works around a bug in the HP C Compiler, # see AC_CHECK_SIZEOF for more information. { $as_echo "$as_me:${as_lineno-$LINENO}: checking alignment of double" >&5 @@ -16728,8 +16566,8 @@ MAX_ALIGNOF=$ac_cv_alignof_double if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then as_fn_error $? "alignment of 'long' is greater than the alignment of 'double'" "$LINENO" 5 fi -if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $ac_cv_alignof_long_long_int -gt $MAX_ALIGNOF ; then - as_fn_error $? "alignment of 'long long int' is greater than the alignment of 'double'" "$LINENO" 5 +if test $ac_cv_alignof_int64_t -gt $MAX_ALIGNOF ; then + as_fn_error $? "alignment of 'int64_t' is greater than the alignment of 'double'" "$LINENO" 5 fi cat >>confdefs.h <<_ACEOF @@ -16737,7 +16575,6 @@ cat >>confdefs.h <<_ACEOF _ACEOF - # Some compilers offer a 128-bit integer scalar type. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __int128" >&5 $as_echo_n "checking for __int128... " >&6; } @@ -16992,12 +16829,12 @@ if ${pgac_cv_gcc_sync_int64_cas+:} false; then : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#include <stdint.h> int main () { -PG_INT64_TYPE lock = 0; - __sync_val_compare_and_swap(&lock, 0, (PG_INT64_TYPE) 37); +int64_t lock = 0; + __sync_val_compare_and_swap(&lock, 0, (int64_t) 37); ; return 0; } @@ -17057,12 +16894,12 @@ if ${pgac_cv_gcc_atomic_int64_cas+:} false; then : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ - +#include <stdint.h> int main () { -PG_INT64_TYPE val = 0; - PG_INT64_TYPE expect = 0; +int64_t val = 0; + int64_t expect = 0; __atomic_compare_exchange_n(&val, &expect, 37, 0, __ATOMIC_SEQ_CST, __ATOMIC_RELAXED); ; return 0; @@ -17278,13 +17115,14 @@ else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <immintrin.h> + #include <stdint.h> #if defined(__has_attribute) && __has_attribute (target) __attribute__((target("avx512vpopcntdq,avx512bw"))) #endif static int popcount_test(void) { const char buf[sizeof(__m512i)]; - PG_INT64_TYPE popcnt = 0; + int64_t popcnt = 0; __m512i accum = _mm512_setzero_si512(); const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf); const __m512i cnt = _mm512_popcnt_epi64(val); @@ -18954,9 +18792,6 @@ fi ac_config_headers="$ac_config_headers src/include/pg_config.h" -ac_config_headers="$ac_config_headers src/include/pg_config_ext.h" - - ac_config_headers="$ac_config_headers src/interfaces/ecpg/include/ecpg_config.h" @@ -19671,7 +19506,6 @@ do "src/Makefile.port") CONFIG_LINKS="$CONFIG_LINKS src/Makefile.port:src/makefiles/Makefile.${template}" ;; "check_win32_symlinks") CONFIG_COMMANDS="$CONFIG_COMMANDS check_win32_symlinks" ;; "src/include/pg_config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/include/pg_config.h" ;; - "src/include/pg_config_ext.h") CONFIG_HEADERS="$CONFIG_HEADERS src/include/pg_config_ext.h" ;; "src/interfaces/ecpg/include/ecpg_config.h") CONFIG_HEADERS="$CONFIG_HEADERS src/interfaces/ecpg/include/ecpg_config.h" ;; *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; @@ -20280,10 +20114,6 @@ $as_echo "$as_me: WARNING: *** link for $FILE -- please fix by hand" >&2;} # Update timestamp for pg_config.h (see Makefile.global) echo >src/include/stamp-h ;; - "src/include/pg_config_ext.h":H) -# Update timestamp for pg_config_ext.h (see Makefile.global) -echo >src/include/stamp-ext-h - ;; "src/interfaces/ecpg/include/ecpg_config.h":H) echo >src/interfaces/ecpg/include/stamp-h ;; esac diff --git a/configure.ac b/configure.ac index 399aae4eed9..247ae97fa4c 100644 --- a/configure.ac +++ b/configure.ac @@ -1604,6 +1604,7 @@ PGAC_C_STATIC_ASSERT PGAC_C_TYPEOF PGAC_C_TYPES_COMPATIBLE PGAC_C_BUILTIN_CONSTANT_P +PGAC_C_BUILTIN_OP_OVERFLOW PGAC_C_BUILTIN_UNREACHABLE PGAC_C_COMPUTED_GOTO PGAC_STRUCT_TIMEZONE @@ -1906,54 +1907,18 @@ for the exact reason.]])], # Run tests below here # -------------------- -dnl Check to see if we have a working 64-bit integer type. -dnl Since Postgres 8.4, we no longer support compilers without a working -dnl 64-bit type; but we have to determine whether that type is called -dnl "long int" or "long long int". - -PGAC_TYPE_64BIT_INT([long int]) - -if test x"$HAVE_LONG_INT_64" = x"yes" ; then - pg_int64_type="long int" -else - PGAC_TYPE_64BIT_INT([long long int]) - if test x"$HAVE_LONG_LONG_INT_64" = x"yes" ; then - pg_int64_type="long long int" - else - AC_MSG_ERROR([Cannot find a working 64-bit integer type.]) - fi -fi - -AC_DEFINE_UNQUOTED(PG_INT64_TYPE, $pg_int64_type, - [Define to the name of a signed 64-bit integer type.]) - -# Select the printf length modifier that goes with that, too. -if test x"$pg_int64_type" = x"long long int" ; then - INT64_MODIFIER='"ll"' -else - INT64_MODIFIER='"l"' -fi - -AC_DEFINE_UNQUOTED(INT64_MODIFIER, $INT64_MODIFIER, - [Define to the appropriate printf length modifier for 64-bit ints.]) - -# has to be down here, rather than with the other builtins, because -# the test uses PG_INT64_TYPE. -PGAC_C_BUILTIN_OP_OVERFLOW - # Check size of void *, size_t (enables tweaks for > 32bit address space) AC_CHECK_SIZEOF([void *]) AC_CHECK_SIZEOF([size_t]) AC_CHECK_SIZEOF([long]) +AC_CHECK_SIZEOF([long long]) # Determine memory alignment requirements for the basic C data types. AC_CHECK_ALIGNOF(short) AC_CHECK_ALIGNOF(int) AC_CHECK_ALIGNOF(long) -if test x"$HAVE_LONG_LONG_INT_64" = x"yes" ; then - AC_CHECK_ALIGNOF(long long int) -fi +AC_CHECK_ALIGNOF(int64_t) AC_CHECK_ALIGNOF(double) # Compute maximum alignment of any basic type. @@ -1977,12 +1942,11 @@ MAX_ALIGNOF=$ac_cv_alignof_double if test $ac_cv_alignof_long -gt $MAX_ALIGNOF ; then AC_MSG_ERROR([alignment of 'long' is greater than the alignment of 'double']) fi -if test x"$HAVE_LONG_LONG_INT_64" = xyes && test $ac_cv_alignof_long_long_int -gt $MAX_ALIGNOF ; then - AC_MSG_ERROR([alignment of 'long long int' is greater than the alignment of 'double']) +if test $ac_cv_alignof_int64_t -gt $MAX_ALIGNOF ; then + AC_MSG_ERROR([alignment of 'int64_t' is greater than the alignment of 'double']) fi AC_DEFINE_UNQUOTED(MAXIMUM_ALIGNOF, $MAX_ALIGNOF, [Define as the maximum alignment requirement of any C data type.]) - # Some compilers offer a 128-bit integer scalar type. PGAC_TYPE_128BIT_INT @@ -2472,12 +2436,6 @@ AC_CONFIG_HEADERS([src/include/pg_config.h], echo >src/include/stamp-h ]) -AC_CONFIG_HEADERS([src/include/pg_config_ext.h], -[ -# Update timestamp for pg_config_ext.h (see Makefile.global) -echo >src/include/stamp-ext-h -]) - AC_CONFIG_HEADERS([src/interfaces/ecpg/include/ecpg_config.h], [echo >src/interfaces/ecpg/include/stamp-h]) diff --git a/meson.build b/meson.build index 7d9a247d21c..e5ce437a5c7 100644 --- a/meson.build +++ b/meson.build @@ -1594,21 +1594,6 @@ if not cc.compiles(c99_test, name: 'c99', args: test_c_args) endif endif -sizeof_long = cc.sizeof('long', args: test_c_args) -cdata.set('SIZEOF_LONG', sizeof_long) -if sizeof_long == 8 - cdata.set('HAVE_LONG_INT_64', 1) - pg_int64_type = 'long int' - cdata.set_quoted('INT64_MODIFIER', 'l') -elif sizeof_long == 4 and cc.sizeof('long long', args: test_c_args) == 8 - cdata.set('HAVE_LONG_LONG_INT_64', 1) - pg_int64_type = 'long long int' - cdata.set_quoted('INT64_MODIFIER', 'll') -else - error('do not know how to get a 64bit int') -endif -cdata.set('PG_INT64_TYPE', pg_int64_type) - if host_machine.endian() == 'big' cdata.set('WORDS_BIGENDIAN', 1) endif @@ -1632,16 +1617,18 @@ endforeach # of MAXIMUM_ALIGNOF to avoid that, but we no longer support any platforms # where TYPALIGN_DOUBLE != MAXIMUM_ALIGNOF. # -# We assume without checking that int64's alignment is at least as strong +# We assume without checking that int64_t's alignment is at least as strong # as long, char, short, or int. Note that we intentionally do not consider # any types wider than 64 bits, as allowing MAXIMUM_ALIGNOF to exceed 8 # would be too much of a penalty for disk and memory space. alignof_double = cdata.get('ALIGNOF_DOUBLE') -if cc.alignment(pg_int64_type, args: test_c_args) > alignof_double - error('alignment of int64 is greater than the alignment of double') +if cc.alignment('int64_t', args: test_c_args, prefix: '#include <stdint.h>') > alignof_double + error('alignment of int64_t is greater than the alignment of double') endif cdata.set('MAXIMUM_ALIGNOF', alignof_double) +cdata.set('SIZEOF_LONG', cc.sizeof('long', args: test_c_args)) +cdata.set('SIZEOF_LONG_LONG', cc.sizeof('long long', args: test_c_args)) cdata.set('SIZEOF_VOID_P', cc.sizeof('void *', args: test_c_args)) cdata.set('SIZEOF_SIZE_T', cc.sizeof('size_t', args: test_c_args)) @@ -1840,17 +1827,17 @@ endif # compile, and store the results in global variables so the compiler doesn't # optimize away the call. if cc.links(''' - INT64 a = 1; - INT64 b = 1; - INT64 result; + #include <stdint.h> + int64_t a = 1; + int64_t b = 1; + int64_t result; int main(void) { return __builtin_mul_overflow(a, b, &result); }''', name: '__builtin_mul_overflow', - args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))], - ) + args: test_c_args) cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1) endif @@ -2140,7 +2127,7 @@ int main(void) cdata.set(check['name'], cc.links(test, name: check['desc'], - args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) ? 1 : false + args: test_c_args) ? 1 : false ) endforeach @@ -2178,6 +2165,7 @@ if host_cpu == 'x86_64' prog = ''' #include <immintrin.h> +#include <stdint.h> #if defined(__has_attribute) && __has_attribute (target) __attribute__((target("avx512vpopcntdq,avx512bw"))) @@ -2185,7 +2173,7 @@ __attribute__((target("avx512vpopcntdq,avx512bw"))) int main(void) { const char buf[sizeof(__m512i)]; - INT64 popcnt = 0; + int64_t popcnt = 0; __m512i accum = _mm512_setzero_si512(); const __m512i val = _mm512_maskz_loadu_epi8((__mmask64) 0xf0f0f0f0f0f0f0f0, (const __m512i *) buf); const __m512i cnt = _mm512_popcnt_epi64(val); @@ -2196,8 +2184,7 @@ int main(void) } ''' - if cc.links(prog, name: 'AVX-512 popcount', - args: test_c_args + ['-DINT64=@0@'.format(cdata.get('PG_INT64_TYPE'))]) + if cc.links(prog, name: 'AVX-512 popcount', args: test_c_args) cdata.set('USE_AVX512_POPCNT_WITH_RUNTIME_CHECK', 1) endif diff --git a/src/Makefile.global.in b/src/Makefile.global.in index 0f38d712d15..eac3d001211 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -840,12 +840,6 @@ $(top_builddir)/src/include/pg_config.h: $(top_builddir)/src/include/stamp-h ; $(top_builddir)/src/include/stamp-h: $(top_srcdir)/src/include/pg_config.h.in $(top_builddir)/config.status cd $(top_builddir) && ./config.status src/include/pg_config.h -# Also remake pg_config_ext.h from pg_config_ext.h.in, same logic as above. -$(top_builddir)/src/include/pg_config_ext.h: $(top_builddir)/src/include/stamp-ext-h ; - -$(top_builddir)/src/include/stamp-ext-h: $(top_srcdir)/src/include/pg_config_ext.h.in $(top_builddir)/config.status - cd $(top_builddir) && ./config.status src/include/pg_config_ext.h - # Also remake ecpg_config.h from ecpg_config.h.in if the latter changed, same # logic as above. $(top_builddir)/src/interfaces/ecpg/include/ecpg_config.h: $(top_builddir)/src/interfaces/ecpg/include/stamp-h ; diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 1f9403fc5cf..c4b04d62965 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -610,10 +610,10 @@ XLogDumpStatsRow(const char *name, tot_len_pct = 100 * (double) tot_len / total_len; printf("%-27s " - "%20" INT64_MODIFIER "u (%6.02f) " - "%20" INT64_MODIFIER "u (%6.02f) " - "%20" INT64_MODIFIER "u (%6.02f) " - "%20" INT64_MODIFIER "u (%6.02f)\n", + "%20" PRIu64 " (%6.02f) " + "%20" PRIu64 " (%6.02f) " + "%20" PRIu64 " (%6.02f) " + "%20" PRIu64 " (%6.02f)\n", name, n, n_pct, rec_len, rec_len_pct, fpi_len, fpi_len_pct, tot_len, tot_len_pct); } @@ -742,10 +742,10 @@ XLogDumpDisplayStats(XLogDumpConfig *config, XLogStats *stats) fpi_len_pct = 100 * (double) total_fpi_len / total_len; printf("%-27s " - "%20" INT64_MODIFIER "u %-9s" - "%20" INT64_MODIFIER "u %-9s" - "%20" INT64_MODIFIER "u %-9s" - "%20" INT64_MODIFIER "u %-6s\n", + "%20" PRIu64 " %-9s" + "%20" PRIu64 " %-9s" + "%20" PRIu64 " %-9s" + "%20" PRIu64 " %-6s\n", "Total", stats->count, "", total_rec_len, psprintf("[%.02f%%]", rec_len_pct), total_fpi_len, psprintf("[%.02f%%]", fpi_len_pct), diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 85e7b68baa3..c4c38099c5b 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -6568,13 +6568,13 @@ printResults(StatsData *total, SimpleStats *cstats = &(*commands)->stats; if (max_tries == 1) - printf(" %11.3f %10" INT64_MODIFIER "d %s\n", + printf(" %11.3f %10" PRId64 " %s\n", (cstats->count > 0) ? 1000.0 * cstats->sum / cstats->count : 0.0, (*commands)->failures, (*commands)->first_line); else - printf(" %11.3f %10" INT64_MODIFIER "d %10" INT64_MODIFIER "d %s\n", + printf(" %11.3f %10" PRId64 " %10" PRId64 " %s\n", (cstats->count > 0) ? 1000.0 * cstats->sum / cstats->count : 0.0, (*commands)->failures, diff --git a/src/include/.gitignore b/src/include/.gitignore index 51819fb4ddd..6e99e82fe0c 100644 --- a/src/include/.gitignore +++ b/src/include/.gitignore @@ -1,5 +1,3 @@ /stamp-h -/stamp-ext-h /pg_config.h -/pg_config_ext.h /pg_config_os.h diff --git a/src/include/Makefile b/src/include/Makefile index b8b576a4de3..3f94543f327 100644 --- a/src/include/Makefile +++ b/src/include/Makefile @@ -13,7 +13,7 @@ top_builddir = ../.. include $(top_builddir)/src/Makefile.global -all: pg_config.h pg_config_ext.h pg_config_os.h +all: pg_config.h pg_config_os.h # Subdirectories containing installable headers @@ -32,7 +32,6 @@ install: all installdirs $(INSTALL_DATA) $(srcdir)/postgres_ext.h '$(DESTDIR)$(includedir)' $(INSTALL_DATA) $(srcdir)/libpq/libpq-fs.h '$(DESTDIR)$(includedir)/libpq' $(INSTALL_DATA) pg_config.h '$(DESTDIR)$(includedir)' - $(INSTALL_DATA) pg_config_ext.h '$(DESTDIR)$(includedir)' $(INSTALL_DATA) pg_config_os.h '$(DESTDIR)$(includedir)' $(INSTALL_DATA) $(srcdir)/pg_config_manual.h '$(DESTDIR)$(includedir)' # These headers are needed by the not-so-public headers of the interfaces. @@ -43,7 +42,6 @@ install: all installdirs $(INSTALL_DATA) $(srcdir)/libpq/protocol.h '$(DESTDIR)$(includedir_internal)/libpq' # These headers are needed for server-side development $(INSTALL_DATA) pg_config.h '$(DESTDIR)$(includedir_server)' - $(INSTALL_DATA) pg_config_ext.h '$(DESTDIR)$(includedir_server)' $(INSTALL_DATA) pg_config_os.h '$(DESTDIR)$(includedir_server)' $(INSTALL_DATA) nodes/nodetags.h '$(DESTDIR)$(includedir_server)/nodes' $(INSTALL_DATA) utils/errcodes.h '$(DESTDIR)$(includedir_server)/utils' @@ -66,7 +64,7 @@ installdirs: uninstall: - rm -f $(addprefix '$(DESTDIR)$(includedir)'/, pg_config.h pg_config_ext.h pg_config_os.h pg_config_manual.h postgres_ext.h libpq/libpq-fs.h) + rm -f $(addprefix '$(DESTDIR)$(includedir)'/, pg_config.h pg_config_os.h pg_config_manual.h postgres_ext.h libpq/libpq-fs.h) rm -f $(addprefix '$(DESTDIR)$(includedir_internal)'/, c.h port.h postgres_fe.h libpq/pqcomm.h libpq/protocol.h) # heuristic... rm -rf $(addprefix '$(DESTDIR)$(includedir_server)'/, $(SUBDIRS) *.h) @@ -80,4 +78,4 @@ clean: $(MAKE) -C catalog clean distclean: clean - rm -f pg_config.h pg_config_ext.h pg_config_os.h stamp-h stamp-ext-h + rm -f pg_config.h pg_config_os.h stamp-h diff --git a/src/include/c.h b/src/include/c.h index 304dff27e34..734626e75a8 100644 --- a/src/include/c.h +++ b/src/include/c.h @@ -48,14 +48,12 @@ #include "postgres_ext.h" -/* Must undef pg_config_ext.h symbols before including pg_config.h */ -#undef PG_INT64_TYPE - #include "pg_config.h" #include "pg_config_manual.h" /* must be after pg_config.h */ #include "pg_config_os.h" /* must be before any system header files */ /* System header files that should be available everywhere in Postgres */ +#include <inttypes.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -471,25 +469,15 @@ typedef void (*pg_funcptr_t) (void); */ typedef char *Pointer; -/* - * intN - * Signed integer, EXACTLY N BITS IN SIZE, - * used for numerical computations and the - * frontend/backend protocol. - */ -typedef signed char int8; /* == 8 bits */ -typedef signed short int16; /* == 16 bits */ -typedef signed int int32; /* == 32 bits */ - -/* - * uintN - * Unsigned integer, EXACTLY N BITS IN SIZE, - * used for numerical computations and the - * frontend/backend protocol. - */ -typedef unsigned char uint8; /* == 8 bits */ -typedef unsigned short uint16; /* == 16 bits */ -typedef unsigned int uint32; /* == 32 bits */ +/* Historical names for types in <stdint.h>. */ +typedef int8_t int8; +typedef int16_t int16; +typedef int32_t int32; +typedef int64_t int64; +typedef uint8_t uint8; +typedef uint16_t uint16; +typedef uint32_t uint32; +typedef uint64_t uint64; /* * bitsN @@ -502,30 +490,14 @@ typedef uint32 bits32; /* >= 32 bits */ /* * 64-bit integers */ -#ifdef HAVE_LONG_INT_64 -/* Plain "long int" fits, use it */ - -typedef long int int64; -typedef unsigned long int uint64; -#define INT64CONST(x) (x##L) -#define UINT64CONST(x) (x##UL) -#elif defined(HAVE_LONG_LONG_INT_64) -/* We have working support for "long long int", use that */ - -typedef long long int int64; -typedef unsigned long long int uint64; -#define INT64CONST(x) (x##LL) -#define UINT64CONST(x) (x##ULL) -#else -/* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */ -#error must have a working 64-bit integer datatype -#endif +#define INT64CONST(x) INT64_C(x) +#define UINT64CONST(x) UINT64_C(x) /* snprintf format strings to use for 64-bit integers */ -#define INT64_FORMAT "%" INT64_MODIFIER "d" -#define UINT64_FORMAT "%" INT64_MODIFIER "u" -#define INT64_HEX_FORMAT "%" INT64_MODIFIER "x" -#define UINT64_HEX_FORMAT "%" INT64_MODIFIER "x" +#define INT64_FORMAT "%" PRId64 +#define UINT64_FORMAT "%" PRIu64 +#define INT64_HEX_FORMAT "%" PRIx64 +#define UINT64_HEX_FORMAT "%" PRIx64 /* * 128-bit signed and unsigned integers @@ -554,22 +526,19 @@ typedef unsigned PG_INT128_TYPE uint128 #endif #endif -/* - * stdint.h limits aren't guaranteed to have compatible types with our fixed - * width types. So just define our own. - */ -#define PG_INT8_MIN (-0x7F-1) -#define PG_INT8_MAX (0x7F) -#define PG_UINT8_MAX (0xFF) -#define PG_INT16_MIN (-0x7FFF-1) -#define PG_INT16_MAX (0x7FFF) -#define PG_UINT16_MAX (0xFFFF) -#define PG_INT32_MIN (-0x7FFFFFFF-1) -#define PG_INT32_MAX (0x7FFFFFFF) -#define PG_UINT32_MAX (0xFFFFFFFFU) -#define PG_INT64_MIN (-INT64CONST(0x7FFFFFFFFFFFFFFF) - 1) -#define PG_INT64_MAX INT64CONST(0x7FFFFFFFFFFFFFFF) -#define PG_UINT64_MAX UINT64CONST(0xFFFFFFFFFFFFFFFF) +/* Historical names for limits in <stdint.h>. */ +#define PG_INT8_MIN INT8_MIN +#define PG_INT8_MAX INT8_MAX +#define PG_UINT8_MAX UINT8_MAX +#define PG_INT16_MIN INT16_MIN +#define PG_INT16_MAX INT16_MAX +#define PG_UINT16_MAX UINT16_MAX +#define PG_INT32_MIN INT32_MIN +#define PG_INT32_MAX INT32_MAX +#define PG_UINT32_MAX UINT32_MAX +#define PG_INT64_MIN INT64_MIN +#define PG_INT64_MAX INT64_MAX +#define PG_UINT64_MAX UINT64_MAX /* * We now always use int64 timestamps, but keep this symbol defined for the @@ -1272,21 +1241,25 @@ extern int fdatasync(int fildes); * definition of int64. (For the naming, compare that POSIX has * strtoimax()/strtoumax() which return intmax_t/uintmax_t.) */ -#ifdef HAVE_LONG_INT_64 +#if SIZEOF_LONG == 8 #define strtoi64(str, endptr, base) ((int64) strtol(str, endptr, base)) #define strtou64(str, endptr, base) ((uint64) strtoul(str, endptr, base)) -#else +#elif SIZEOF_LONG_LONG == 8 #define strtoi64(str, endptr, base) ((int64) strtoll(str, endptr, base)) #define strtou64(str, endptr, base) ((uint64) strtoull(str, endptr, base)) +#else +#error "cannot find integer type of the same size as int64_t" #endif /* * Similarly, wrappers around labs()/llabs() matching our int64. */ -#ifdef HAVE_LONG_INT_64 +#if SIZEOF_LONG == 8 #define i64abs(i) labs(i) -#else +#elif SIZEOF_LONG_LONG == 8 #define i64abs(i) llabs(i) +#else +#error "cannot find integer type of the same size as int64_t" #endif /* diff --git a/src/include/meson.build b/src/include/meson.build index 58b7a9c1e7e..ed65362cb64 100644 --- a/src/include/meson.build +++ b/src/include/meson.build @@ -1,14 +1,5 @@ # Copyright (c) 2022-2024, PostgreSQL Global Development Group -pg_config_ext = configure_file( - input: 'pg_config_ext.h.meson', - output: 'pg_config_ext.h', - configuration: cdata, - install: true, - install_dir: dir_include, -) -configure_files += pg_config_ext - pg_config_os = configure_file( output: 'pg_config_os.h', input: files('port/@0@.h'.format(portname)), @@ -116,7 +107,6 @@ install_headers( 'postgres_fe.h', 'varatt.h', 'windowapi.h', - pg_config_ext, pg_config_os, pg_config, install_dir: dir_include_server, @@ -186,4 +176,4 @@ install_subdir('catalog', ) # autoconf generates the file there, ensure we get a conflict -generated_sources_ac += {'src/include': ['stamp-h', 'stamp-ext-h']} +generated_sources_ac += {'src/include': ['stamp-h']} diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index ab0f8cc2b4a..07b2f798abd 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -9,12 +9,12 @@ /* The normal alignment of `int', in bytes. */ #undef ALIGNOF_INT +/* The normal alignment of `int64_t', in bytes. */ +#undef ALIGNOF_INT64_T + /* The normal alignment of `long', in bytes. */ #undef ALIGNOF_LONG -/* The normal alignment of `long long int', in bytes. */ -#undef ALIGNOF_LONG_LONG_INT - /* The normal alignment of `PG_INT128_TYPE', in bytes. */ #undef ALIGNOF_PG_INT128_TYPE @@ -153,8 +153,8 @@ /* Define to 1 if you have __sync_lock_test_and_set(int *) and friends. */ #undef HAVE_GCC__SYNC_INT32_TAS -/* Define to 1 if you have __sync_val_compare_and_swap(int64 *, int64, int64). - */ +/* Define to 1 if you have __sync_val_compare_and_swap(int64_t *, int64_t, + int64_t). */ #undef HAVE_GCC__SYNC_INT64_CAS /* Define to 1 if you have the `getauxval' function. */ @@ -265,12 +265,6 @@ /* Define to 1 if you have the `zstd' library (-lzstd). */ #undef HAVE_LIBZSTD -/* Define to 1 if `long int' works and is 64 bits. */ -#undef HAVE_LONG_INT_64 - -/* Define to 1 if `long long int' works and is 64 bits. */ -#undef HAVE_LONG_LONG_INT_64 - /* Define to 1 if you have the <mbarrier.h> header file. */ #undef HAVE_MBARRIER_H @@ -544,9 +538,6 @@ /* Define to 1 if your compiler understands _Static_assert. */ #undef HAVE__STATIC_ASSERT -/* Define to the appropriate printf length modifier for 64-bit ints. */ -#undef INT64_MODIFIER - /* Define as the maximum alignment requirement of any C data type. */ #undef MAXIMUM_ALIGNOF @@ -578,9 +569,6 @@ /* Define to the name of a signed 128-bit integer type. */ #undef PG_INT128_TYPE -/* Define to the name of a signed 64-bit integer type. */ -#undef PG_INT64_TYPE - /* Define to the name of the default PostgreSQL service principal in Kerberos (GSSAPI). (--with-krb-srvnam=NAME) */ #undef PG_KRB_SRVNAM @@ -630,6 +618,9 @@ /* The size of `long', as computed by sizeof. */ #undef SIZEOF_LONG +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + /* The size of `off_t', as computed by sizeof. */ #undef SIZEOF_OFF_T diff --git a/src/include/pg_config_ext.h.in b/src/include/pg_config_ext.h.in deleted file mode 100644 index 8acadbdafd4..00000000000 --- a/src/include/pg_config_ext.h.in +++ /dev/null @@ -1,7 +0,0 @@ -/* - * src/include/pg_config_ext.h.in. This is generated manually, not by - * autoheader, since we want to limit which symbols get defined here. - */ - -/* Define to the name of a signed 64-bit integer type. */ -#undef PG_INT64_TYPE diff --git a/src/include/pg_config_ext.h.meson b/src/include/pg_config_ext.h.meson deleted file mode 100644 index 57cdfca0cfd..00000000000 --- a/src/include/pg_config_ext.h.meson +++ /dev/null @@ -1,7 +0,0 @@ -/* - * src/include/pg_config_ext.h.in. This is generated manually, not by - * autoheader, since we want to limit which symbols get defined here. - */ - -/* Define to the name of a signed 64-bit integer type. */ -#mesondefine PG_INT64_TYPE diff --git a/src/include/port/pg_bitutils.h b/src/include/port/pg_bitutils.h index 4d88478c9c2..a3cad46afe9 100644 --- a/src/include/port/pg_bitutils.h +++ b/src/include/port/pg_bitutils.h @@ -74,13 +74,13 @@ pg_leftmost_one_pos64(uint64 word) #ifdef HAVE__BUILTIN_CLZ Assert(word != 0); -#if defined(HAVE_LONG_INT_64) +#if SIZEOF_LONG == 8 return 63 - __builtin_clzl(word); -#elif defined(HAVE_LONG_LONG_INT_64) +#elif SIZEOF_LONG_LONG == 8 return 63 - __builtin_clzll(word); #else -#error must have a working 64-bit integer datatype -#endif /* HAVE_LONG_INT_64 */ +#error "cannot find integer type of the same size as uint64_t" +#endif #elif defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_ARM64)) unsigned long result; @@ -147,13 +147,13 @@ pg_rightmost_one_pos64(uint64 word) #ifdef HAVE__BUILTIN_CTZ Assert(word != 0); -#if defined(HAVE_LONG_INT_64) +#if SIZEOF_LONG == 8 return __builtin_ctzl(word); -#elif defined(HAVE_LONG_LONG_INT_64) +#elif SIZEOF_LONG_LONG == 8 return __builtin_ctzll(word); #else -#error must have a working 64-bit integer datatype -#endif /* HAVE_LONG_INT_64 */ +#error "cannot find integer type of the same size as uint64_t" +#endif #elif defined(_MSC_VER) && (defined(_M_AMD64) || defined(_M_ARM64)) unsigned long result; diff --git a/src/include/postgres_ext.h b/src/include/postgres_ext.h index 240ad4e93bf..202eb049622 100644 --- a/src/include/postgres_ext.h +++ b/src/include/postgres_ext.h @@ -23,7 +23,7 @@ #ifndef POSTGRES_EXT_H #define POSTGRES_EXT_H -#include "pg_config_ext.h" +#include <stdint.h> /* * Object ID is a fundamental type in Postgres. @@ -44,7 +44,7 @@ typedef unsigned int Oid; /* Define a signed 64-bit integer type for use in client API declarations. */ -typedef PG_INT64_TYPE pg_int64; +typedef int64_t pg_int64; /* * Identifiers of error message fields. Kept here to keep common diff --git a/src/include/utils/dsa.h b/src/include/utils/dsa.h index 8dff964bf33..6c952a43f79 100644 --- a/src/include/utils/dsa.h +++ b/src/include/utils/dsa.h @@ -66,7 +66,7 @@ typedef pg_atomic_uint64 dsa_pointer_atomic; #define dsa_pointer_atomic_write pg_atomic_write_u64 #define dsa_pointer_atomic_fetch_add pg_atomic_fetch_add_u64 #define dsa_pointer_atomic_compare_exchange pg_atomic_compare_exchange_u64 -#define DSA_POINTER_FORMAT "%016" INT64_MODIFIER "x" +#define DSA_POINTER_FORMAT "%016" PRIx64 #endif /* Flags for dsa_allocate_extended. */ diff --git a/src/interfaces/ecpg/ecpglib/typename.c b/src/interfaces/ecpg/ecpglib/typename.c index 1d482c4fa61..1fb9860371b 100644 --- a/src/interfaces/ecpg/ecpglib/typename.c +++ b/src/interfaces/ecpg/ecpglib/typename.c @@ -131,11 +131,12 @@ sqlda_dynamic_type(Oid type, enum COMPAT_MODE compat) case INTERVALOID: return ECPGt_interval; case INT8OID: -#ifdef HAVE_LONG_LONG_INT_64 - return ECPGt_long_long; -#endif -#ifdef HAVE_LONG_INT_64 +#if SIZEOF_LONG == 8 return ECPGt_long; +#elif SIZEOF_LONG_LONG == 8 + return ECPGt_long_long; +#else +#error "cannot find integer type of the same size as INT8OID" #endif /* Unhandled types always return a string */ default: diff --git a/src/interfaces/ecpg/include/ecpg_config.h.in b/src/interfaces/ecpg/include/ecpg_config.h.in index 75f542f263b..4af45930b61 100644 --- a/src/interfaces/ecpg/include/ecpg_config.h.in +++ b/src/interfaces/ecpg/include/ecpg_config.h.in @@ -1,8 +1,8 @@ /* Define to 1 to build client libraries as thread-safe code. */ #define ENABLE_THREAD_SAFETY 1 -/* Define to 1 if `long int' works and is 64 bits. */ -#undef HAVE_LONG_INT_64 +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG -/* Define to 1 if `long long int' works and is 64 bits. */ -#undef HAVE_LONG_LONG_INT_64 +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG diff --git a/src/interfaces/ecpg/include/meson.build b/src/interfaces/ecpg/include/meson.build index a3beb3cc7be..c1a88e73fb8 100644 --- a/src/interfaces/ecpg/include/meson.build +++ b/src/interfaces/ecpg/include/meson.build @@ -3,8 +3,8 @@ ecpg_inc = include_directories('.') ecpg_conf_keys = [ - 'HAVE_LONG_INT_64', - 'HAVE_LONG_LONG_INT_64', + 'SIZEOF_LONG', + 'SIZEOF_LONG_LONG', ] ecpg_conf_data = configuration_data() diff --git a/src/interfaces/ecpg/include/pgtypes_interval.h b/src/interfaces/ecpg/include/pgtypes_interval.h index 46cfce65517..f0acbb4512a 100644 --- a/src/interfaces/ecpg/include/pgtypes_interval.h +++ b/src/interfaces/ecpg/include/pgtypes_interval.h @@ -3,21 +3,17 @@ #ifndef PGTYPES_INTERVAL #define PGTYPES_INTERVAL +#include <stdint.h> + #include <ecpg_config.h> #include <pgtypes.h> #ifndef C_H -#ifdef HAVE_LONG_INT_64 -typedef long int int64; -#elif defined(HAVE_LONG_LONG_INT_64) -typedef long long int int64; -#else -/* neither HAVE_LONG_INT_64 nor HAVE_LONG_LONG_INT_64 */ -#error must have a working 64-bit integer datatype -#endif +typedef int64_t int64; #define HAVE_INT64_TIMESTAMP + #endif /* C_H */ typedef struct diff --git a/src/interfaces/ecpg/include/sqltypes.h b/src/interfaces/ecpg/include/sqltypes.h index e7cbfa47956..498840458c4 100644 --- a/src/interfaces/ecpg/include/sqltypes.h +++ b/src/interfaces/ecpg/include/sqltypes.h @@ -46,12 +46,14 @@ #define SQLINTERVAL ECPGt_interval #define SQLNCHAR ECPGt_char #define SQLNVCHAR ECPGt_char -#ifdef HAVE_LONG_LONG_INT_64 +#if SIZEOF_LONG == 8 +#define SQLINT8 ECPGt_long +#define SQLSERIAL8 ECPGt_long +#elif SIZEOF_LONG_LONG == 8 #define SQLINT8 ECPGt_long_long #define SQLSERIAL8 ECPGt_long_long #else -#define SQLINT8 ECPGt_long -#define SQLSERIAL8 ECPGt_long +#error "cannot find integer type of the same size as SQLINT8" #endif #endif /* ndef ECPG_SQLTYPES_H */ diff --git a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c index 7e19319d27f..8eebc51664e 100644 --- a/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c +++ b/src/interfaces/ecpg/test/expected/compat_informix-sqlda.c @@ -97,12 +97,14 @@ typedef struct sqlda_struct sqlda_t; #define SQLINTERVAL ECPGt_interval #define SQLNCHAR ECPGt_char #define SQLNVCHAR ECPGt_char -#ifdef HAVE_LONG_LONG_INT_64 +#if SIZEOF_LONG == 8 +#define SQLINT8 ECPGt_long +#define SQLSERIAL8 ECPGt_long +#elif SIZEOF_LONG_LONG == 8 #define SQLINT8 ECPGt_long_long #define SQLSERIAL8 ECPGt_long_long #else -#define SQLINT8 ECPGt_long -#define SQLSERIAL8 ECPGt_long +#error "cannot find integer type of the same size as SQLINT8" #endif #endif /* ndef ECPG_SQLTYPES_H */ diff --git a/src/port/pg_bitutils.c b/src/port/pg_bitutils.c index 87f56e82b80..c8399981ee0 100644 --- a/src/port/pg_bitutils.c +++ b/src/port/pg_bitutils.c @@ -370,12 +370,12 @@ static inline int pg_popcount64_slow(uint64 word) { #ifdef HAVE__BUILTIN_POPCOUNT -#if defined(HAVE_LONG_INT_64) +#if SIZEOF_LONG == 8 return __builtin_popcountl(word); -#elif defined(HAVE_LONG_LONG_INT_64) +#elif SIZEOF_LONG_LONG == 8 return __builtin_popcountll(word); #else -#error must have a working 64-bit integer datatype +#error "cannot find integer of the same size as uint64_t" #endif #else /* !HAVE__BUILTIN_POPCOUNT */ int result = 0; diff --git a/src/port/snprintf.c b/src/port/snprintf.c index 884f0262dd1..d83f81ade3f 100644 --- a/src/port/snprintf.c +++ b/src/port/snprintf.c @@ -560,6 +560,28 @@ nextch2: fmtpos = accum; accum = 0; goto nextch2; +#ifdef WIN32 + case 'I': + /* Windows PRI*{32,64,PTR} size */ + if (format[0] == '3' && format[1] == '2') + format += 2; + else if (format[0] == '6' && format[1] == '4') + { + format += 2; + longlongflag = 1; + } + else + { +#if SIZEOF_VOID_P == SIZEOF_LONG + longflag = 1; +#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG + longlongflag = 1; +#else +#error "cannot find integer type of the same size as intptr_t" +#endif + } + goto nextch2; +#endif case 'l': if (longflag) longlongflag = 1; @@ -567,16 +589,12 @@ nextch2: longflag = 1; goto nextch2; case 'z': -#if SIZEOF_SIZE_T == 8 -#ifdef HAVE_LONG_INT_64 +#if SIZEOF_SIZE_T == SIZEOF_LONG longflag = 1; -#elif defined(HAVE_LONG_LONG_INT_64) +#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG longlongflag = 1; #else -#error "Don't know how to print 64bit integers" -#endif -#else - /* assume size_t is same size as int */ +#error "cannot find integer type of the same size as size_t" #endif goto nextch2; case 'h': @@ -827,6 +845,28 @@ nextch1: fmtpos = accum; accum = 0; goto nextch1; +#ifdef WIN32 + case 'I': + /* Windows PRI*{32,64,PTR} size */ + if (format[0] == '3' && format[1] == '2') + format += 2; + else if (format[0] == '6' && format[1] == '4') + { + format += 2; + longlongflag = 1; + } + else + { +#if SIZEOF_VOID_P == SIZEOF_LONG + longflag = 1; +#elif SIZEOF_VOID_P == SIZEOF_LONG_LONG + longlongflag = 1; +#else +#error "cannot find integer type of the same size as intptr_t" +#endif + } + goto nextch1; +#endif case 'l': if (longflag) longlongflag = 1; @@ -834,16 +874,12 @@ nextch1: longflag = 1; goto nextch1; case 'z': -#if SIZEOF_SIZE_T == 8 -#ifdef HAVE_LONG_INT_64 +#if SIZEOF_SIZE_T == SIZEOF_LONG longflag = 1; -#elif defined(HAVE_LONG_LONG_INT_64) +#elif SIZEOF_SIZE_T == SIZEOF_LONG_LONG longlongflag = 1; #else -#error "Don't know how to print 64bit integers" -#endif -#else - /* assume size_t is same size as int */ +#error "cannot find integer type of the same size as size_t" #endif goto nextch1; case 'h': |