26
26
* section description
27
27
* ------- ------------------------------------------------
28
28
* 0) pg_config.h and standard system headers
29
- * 1) hacks to cope with non-ANSI C compilers
29
+ * 1) compiler characteristics
30
30
* 2) bool, true, false, TRUE, FALSE, NULL
31
31
* 3) standard system types
32
32
* 4) IsValid macros for system types
90
90
#include <stdint.h>
91
91
#endif
92
92
#include <sys/types.h>
93
-
94
93
#include <errno.h>
95
94
#if defined(WIN32 ) || defined(__CYGWIN__ )
96
95
#include <fcntl.h> /* ensure O_BINARY is available */
97
96
#endif
97
+ #include <locale.h>
98
+ #ifdef ENABLE_NLS
99
+ #include <libintl.h>
100
+ #endif
98
101
99
102
#if defined(WIN32 ) || defined(__CYGWIN__ )
100
103
/* We have to redefine some system functions after they are included above. */
101
104
#include "pg_config_os.h"
102
105
#endif
103
106
104
- /*
105
- * Force disable inlining if PG_FORCE_DISABLE_INLINE is defined. This is used
106
- * to work around compiler bugs and might also be useful for investigatory
107
- * purposes by defining the symbol in the platform's header..
107
+
108
+ /* ----------------------------------------------------------------
109
+ * Section 1: compiler characteristics
108
110
*
109
- * This is done early (in slightly the wrong section) as functionality later
110
- * in this file might want to rely on inline functions.
111
+ * type prefixes (const, signed, volatile, inline) are handled in pg_config.h.
112
+ * ----------------------------------------------------------------
113
+ */
114
+
115
+ /*
116
+ * Disable "inline" if PG_FORCE_DISABLE_INLINE is defined.
117
+ * This is used to work around compiler bugs and might also be useful for
118
+ * investigatory purposes.
111
119
*/
112
120
#ifdef PG_FORCE_DISABLE_INLINE
113
121
#undef inline
114
122
#define inline
115
123
#endif
116
124
117
- /* Must be before gettext() games below */
118
- #include <locale.h>
125
+ /*
126
+ * Attribute macros
127
+ *
128
+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
129
+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
130
+ * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html
131
+ * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/function_attributes.html
132
+ * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/type_attrib.html
133
+ */
119
134
120
- #define _ (x ) gettext(x)
135
+ /* only GCC supports the unused attribute */
136
+ #ifdef __GNUC__
137
+ #define pg_attribute_unused () __attribute__((unused))
138
+ #else
139
+ #define pg_attribute_unused ()
140
+ #endif
121
141
122
- #ifdef ENABLE_NLS
123
- #include <libintl.h>
142
+ /*
143
+ * Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are only
144
+ * used in assert-enabled builds, to avoid compiler warnings about unused
145
+ * variables in assert-disabled builds.
146
+ */
147
+ #ifdef USE_ASSERT_CHECKING
148
+ #define PG_USED_FOR_ASSERTS_ONLY
124
149
#else
125
- #define gettext (x ) (x)
126
- #define dgettext (d ,x ) (x)
127
- #define ngettext (s ,p ,n ) ((n) == 1 ? (s) : (p))
128
- #define dngettext (d ,s ,p ,n ) ((n) == 1 ? (s) : (p))
150
+ #define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused()
129
151
#endif
130
152
153
+ /* GCC and XLC support format attributes */
154
+ #if defined(__GNUC__ ) || defined(__IBMC__ )
155
+ #define pg_attribute_format_arg (a ) __attribute__((format_arg(a)))
156
+ #define pg_attribute_printf (f ,a ) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a)))
157
+ #else
158
+ #define pg_attribute_format_arg (a )
159
+ #define pg_attribute_printf (f ,a )
160
+ #endif
161
+
162
+ /* GCC, Sunpro and XLC support aligned, packed and noreturn */
163
+ #if defined(__GNUC__ ) || defined(__SUNPRO_C ) || defined(__IBMC__ )
164
+ #define pg_attribute_aligned (a ) __attribute__((aligned(a)))
165
+ #define pg_attribute_noreturn () __attribute__((noreturn))
166
+ #define pg_attribute_packed () __attribute__((packed))
167
+ #define HAVE_PG_ATTRIBUTE_NORETURN 1
168
+ #else
131
169
/*
132
- * Use this to mark string constants as needing translation at some later
133
- * time, rather than immediately. This is useful for cases where you need
134
- * access to the original string and translated string, and for cases where
135
- * immediate translation is not possible, like when initializing global
136
- * variables.
137
- * http://www.gnu.org/software/autoconf/manual/gettext/Special-cases.html
170
+ * NB: aligned and packed are not given default definitions because they
171
+ * affect code functionality; they *must* be implemented by the compiler
172
+ * if they are to be used.
138
173
*/
139
- #define gettext_noop (x ) (x)
174
+ #define pg_attribute_noreturn ()
175
+ #endif
140
176
177
+ /*
178
+ * Mark a point as unreachable in a portable fashion. This should preferably
179
+ * be something that the compiler understands, to aid code generation.
180
+ * In assert-enabled builds, we prefer abort() for debugging reasons.
181
+ */
182
+ #if defined(HAVE__BUILTIN_UNREACHABLE ) && !defined(USE_ASSERT_CHECKING )
183
+ #define pg_unreachable () __builtin_unreachable()
184
+ #elif defined(_MSC_VER ) && !defined(USE_ASSERT_CHECKING )
185
+ #define pg_unreachable () __assume(0)
186
+ #else
187
+ #define pg_unreachable () abort()
188
+ #endif
141
189
142
- /* ----------------------------------------------------------------
143
- * Section 1: hacks to cope with non-ANSI C compilers
190
+ /*
191
+ * Hints to the compiler about the likelihood of a branch. Both likely() and
192
+ * unlikely() return the boolean value of the contained expression.
144
193
*
145
- * type prefixes (const, signed, volatile, inline) are handled in pg_config.h.
146
- * ----------------------------------------------------------------
194
+ * These should only be used sparingly, in very hot code paths. It's very easy
195
+ * to mis-estimate likelihoods.
147
196
*/
197
+ #if __GNUC__ >= 3
198
+ #define likely (x ) __builtin_expect((x) != 0, 1)
199
+ #define unlikely (x ) __builtin_expect((x) != 0, 0)
200
+ #else
201
+ #define likely (x ) ((x) != 0)
202
+ #define unlikely (x ) ((x) != 0)
203
+ #endif
148
204
149
205
/*
150
206
* CppAsString
183
239
#endif
184
240
#endif
185
241
242
+
186
243
/* ----------------------------------------------------------------
187
244
* Section 2: bool, true, false, TRUE, FALSE, NULL
188
245
* ----------------------------------------------------------------
@@ -209,6 +266,7 @@ typedef char bool;
209
266
#ifndef false
210
267
#define false ((bool) 0)
211
268
#endif
269
+
212
270
#endif /* not C++ */
213
271
214
272
typedef bool * BoolPtr ;
@@ -502,16 +560,6 @@ typedef NameData *Name;
502
560
503
561
#define NameStr (name ) ((name).data)
504
562
505
- /*
506
- * Support macros for escaping strings. escape_backslash should be TRUE
507
- * if generating a non-standard-conforming string. Prefixing a string
508
- * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming.
509
- * Beware of multiple evaluation of the "ch" argument!
510
- */
511
- #define SQL_STR_DOUBLE (ch , escape_backslash ) \
512
- ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))
513
-
514
- #define ESCAPE_STRING_SYNTAX 'E'
515
563
516
564
/* ----------------------------------------------------------------
517
565
* Section 4: IsValid macros for system types
@@ -579,6 +627,9 @@ typedef NameData *Name;
579
627
*
580
628
* NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2.
581
629
* That case seems extremely unlikely to be needed in practice, however.
630
+ *
631
+ * NOTE: MAXIMUM_ALIGNOF, and hence MAXALIGN(), intentionally exclude any
632
+ * larger-than-8-byte types the compiler might have.
582
633
* ----------------
583
634
*/
584
635
@@ -615,47 +666,6 @@ typedef NameData *Name;
615
666
/* we don't currently need wider versions of the other ALIGN macros */
616
667
#define MAXALIGN64 (LEN ) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN))
617
668
618
- /* ----------------
619
- * Attribute macros
620
- *
621
- * GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
622
- * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
623
- * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html
624
- * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/function_attributes.html
625
- * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/type_attrib.html
626
- * ----------------
627
- */
628
-
629
- /* only GCC supports the unused attribute */
630
- #ifdef __GNUC__
631
- #define pg_attribute_unused () __attribute__((unused))
632
- #else
633
- #define pg_attribute_unused ()
634
- #endif
635
-
636
- /* GCC and XLC support format attributes */
637
- #if defined(__GNUC__ ) || defined(__IBMC__ )
638
- #define pg_attribute_format_arg (a ) __attribute__((format_arg(a)))
639
- #define pg_attribute_printf (f ,a ) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a)))
640
- #else
641
- #define pg_attribute_format_arg (a )
642
- #define pg_attribute_printf (f ,a )
643
- #endif
644
-
645
- /* GCC, Sunpro and XLC support aligned, packed and noreturn */
646
- #if defined(__GNUC__ ) || defined(__SUNPRO_C ) || defined(__IBMC__ )
647
- #define pg_attribute_aligned (a ) __attribute__((aligned(a)))
648
- #define pg_attribute_noreturn () __attribute__((noreturn))
649
- #define pg_attribute_packed () __attribute__((packed))
650
- #define HAVE_PG_ATTRIBUTE_NORETURN 1
651
- #else
652
- /*
653
- * NB: aligned and packed are not given default definitions because they
654
- * affect code functionality; they *must* be implemented by the compiler
655
- * if they are to be used.
656
- */
657
- #define pg_attribute_noreturn ()
658
- #endif
659
669
660
670
/* ----------------------------------------------------------------
661
671
* Section 6: assertions
@@ -692,6 +702,7 @@ typedef NameData *Name;
692
702
#define AssertArg (condition ) assert(condition)
693
703
#define AssertState (condition ) assert(condition)
694
704
#define AssertPointerAlignment (ptr , bndr ) ((void)true)
705
+
695
706
#else /* USE_ASSERT_CHECKING && !FRONTEND */
696
707
697
708
/*
@@ -937,36 +948,6 @@ typedef NameData *Name;
937
948
} while (0)
938
949
939
950
940
- /*
941
- * Mark a point as unreachable in a portable fashion. This should preferably
942
- * be something that the compiler understands, to aid code generation.
943
- * In assert-enabled builds, we prefer abort() for debugging reasons.
944
- */
945
- #if defined(HAVE__BUILTIN_UNREACHABLE ) && !defined(USE_ASSERT_CHECKING )
946
- #define pg_unreachable () __builtin_unreachable()
947
- #elif defined(_MSC_VER ) && !defined(USE_ASSERT_CHECKING )
948
- #define pg_unreachable () __assume(0)
949
- #else
950
- #define pg_unreachable () abort()
951
- #endif
952
-
953
-
954
- /*
955
- * Hints to the compiler about the likelihood of a branch. Both likely() and
956
- * unlikely() return the boolean value of the contained expression.
957
- *
958
- * These should only be used sparingly, in very hot code paths. It's very easy
959
- * to mis-estimate likelihoods.
960
- */
961
- #if __GNUC__ >= 3
962
- #define likely (x ) __builtin_expect((x) != 0, 1)
963
- #define unlikely (x ) __builtin_expect((x) != 0, 0)
964
- #else
965
- #define likely (x ) ((x) != 0)
966
- #define unlikely (x ) ((x) != 0)
967
- #endif
968
-
969
-
970
951
/* ----------------------------------------------------------------
971
952
* Section 8: random stuff
972
953
* ----------------------------------------------------------------
@@ -976,26 +957,47 @@ typedef NameData *Name;
976
957
#define HIGHBIT (0x80)
977
958
#define IS_HIGHBIT_SET (ch ) ((unsigned char)(ch) & HIGHBIT)
978
959
960
+ /*
961
+ * Support macros for escaping strings. escape_backslash should be TRUE
962
+ * if generating a non-standard-conforming string. Prefixing a string
963
+ * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming.
964
+ * Beware of multiple evaluation of the "ch" argument!
965
+ */
966
+ #define SQL_STR_DOUBLE (ch , escape_backslash ) \
967
+ ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))
968
+
969
+ #define ESCAPE_STRING_SYNTAX 'E'
970
+
971
+
979
972
#define STATUS_OK (0)
980
973
#define STATUS_ERROR (-1)
981
974
#define STATUS_EOF (-2)
982
975
#define STATUS_FOUND (1)
983
976
#define STATUS_WAITING (2)
984
977
985
-
986
978
/*
987
- * Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are only
988
- * used in assert-enabled builds, to avoid compiler warnings about unused
989
- * variables in assert-disabled builds.
979
+ * gettext support
990
980
*/
991
- #ifdef USE_ASSERT_CHECKING
992
- #define PG_USED_FOR_ASSERTS_ONLY
993
- #else
994
- #define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused()
981
+
982
+ #ifndef ENABLE_NLS
983
+ /* stuff we'd otherwise get from <libintl.h> */
984
+ #define gettext (x ) (x)
985
+ #define dgettext (d ,x ) (x)
986
+ #define ngettext (s ,p ,n ) ((n) == 1 ? (s) : (p))
987
+ #define dngettext (d ,s ,p ,n ) ((n) == 1 ? (s) : (p))
995
988
#endif
996
989
990
+ #define _ (x ) gettext(x)
997
991
998
- /* gettext domain name mangling */
992
+ /*
993
+ * Use this to mark string constants as needing translation at some later
994
+ * time, rather than immediately. This is useful for cases where you need
995
+ * access to the original string and translated string, and for cases where
996
+ * immediate translation is not possible, like when initializing global
997
+ * variables.
998
+ * http://www.gnu.org/software/autoconf/manual/gettext/Special-cases.html
999
+ */
1000
+ #define gettext_noop (x ) (x)
999
1001
1000
1002
/*
1001
1003
* To better support parallel installations of major PostgreSQL
0 commit comments