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>
119
-
120
- #define _ (x ) gettext(x)
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
+ */
121
134
122
- #ifdef ENABLE_NLS
123
- #include <libintl.h>
135
+ /* only GCC supports the unused attribute */
136
+ #ifdef __GNUC__
137
+ #define pg_attribute_unused () __attribute__((unused))
124
138
#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))
139
+ #define pg_attribute_unused ()
129
140
#endif
130
141
131
142
/*
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
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.
138
146
*/
139
- #define gettext_noop (x ) (x)
147
+ #ifdef USE_ASSERT_CHECKING
148
+ #define PG_USED_FOR_ASSERTS_ONLY
149
+ #else
150
+ #define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused()
151
+ #endif
140
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
141
161
142
- /* ----------------------------------------------------------------
143
- * Section 1: hacks to cope with non-ANSI C compilers
144
- *
145
- * type prefixes (const, signed, volatile, inline) are handled in pg_config.h.
146
- * ----------------------------------------------------------------
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
169
+ /*
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.
147
173
*/
174
+ #de
F438
fine pg_attribute_noreturn ()
175
+ #endif
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
148
189
149
190
/*
150
191
* CppAsString
151
192
* Convert the argument to a string, using the C preprocessor.
193
+ * CppAsString2
194
+ * Convert the argument to a string, after one round of macro expansion.
152
195
* CppConcat
153
196
* Concatenate two arguments together, using the C preprocessor.
154
197
*
157
200
* backward compatibility with existing PostgreSQL code.
158
201
*/
159
202
#define CppAsString (identifier ) #identifier
203
+ #define CppAsString2 (x ) CppAsString(x)
160
204
#define CppConcat (x , y ) x##y
161
205
162
206
/*
180
224
#endif
181
225
#endif
182
226
227
+
183
228
/* ----------------------------------------------------------------
184
229
* Section 2: bool, true, false, TRUE, FALSE, NULL
185
230
* ----------------------------------------------------------------
@@ -206,6 +251,7 @@ typedef char bool;
206
251
#ifndef false
207
252
#define false ((bool) 0)
208
253
#endif
254
+
209
255
#endif /* not C++ */
210
256
211
257
typedef bool * BoolPtr ;
@@ -497,16 +543,6 @@ typedef NameData *Name;
497
543
498
544
#define NameStr (name ) ((name).data)
499
545
500
- /*
501
- * Support macros for escaping strings. escape_backslash should be TRUE
502
- * if generating a non-standard-conforming string. Prefixing a string
503
- * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming.
504
- * Beware of multiple evaluation of the "ch" argument!
505
- */
506
- #define SQL_STR_DOUBLE (ch , escape_backslash ) \
507
- ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))
508
-
509
- #define ESCAPE_STRING_SYNTAX 'E'
510
546
511
547
/* ----------------------------------------------------------------
512
548
* Section 4: IsValid macros for system types
@@ -571,6 +607,9 @@ typedef NameData *Name;
571
607
*
572
608
* NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2.
573
609
* That case seems extremely unlikely to be needed in practice, however.
610
+ *
611
+ * NOTE: MAXIMUM_ALIGNOF, and hence MAXALIGN(), intentionally exclude any
612
+ * larger-than-8-byte types the compiler might have.
574
613
* ----------------
575
614
*/
576
615
@@ -607,47 +646,6 @@ typedef NameData *Name;
607
646
/* we don't currently need wider versions of the other ALIGN macros */
608
647
#define MAXALIGN64 (LEN ) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN))
609
648
610
- /* ----------------
611
- * Attribute macros
612
- *
613
- * GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
614
- * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
615
- * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html
616
- * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/function_attributes.html
617
- * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/type_attrib.html
618
- * ----------------
619
- */
620
-
621
- /* only GCC supports the unused attribute */
622
- #ifdef __GNUC__
623
- #define pg_attribute_unused () __attribute__((unused))
624
- #else
625
- #define pg_attribute_unused ()
626
- #endif
627
-
628
- /* GCC and XLC support format attributes */
629
- #if defined(__GNUC__ ) || defined(__IBMC__ )
630
- #define pg_attribute_format_arg (a ) __attribute__((format_arg(a)))
631
- #define pg_attribute_printf (f ,a ) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a)))
632
- #else
633
- #define pg_attribute_format_arg (a )
634
- #define pg_attribute_printf (f ,a )
635
- #endif
636
-
637
- /* GCC, Sunpro and XLC support aligned, packed and noreturn */
638
- #if defined(__GNUC__ ) || defined(__SUNPRO_C ) || defined(__IBMC__ )
639
- #define pg_attribute_aligned (a ) __attribute__((aligned(a)))
640
- #define pg_attribute_noreturn () __attribute__((noreturn))
641
- #define pg_attribute_packed () __attribute__((packed))
642
- #define HAVE_PG_ATTRIBUTE_NORETURN 1
643
- #else
644
- /*
645
- * NB: aligned and packed are not given default definitions because they
646
- * affect code functionality; they *must* be implemented by the compiler
647
- * if they are to be used.
648
- */
649
- #define pg_attribute_noreturn ()
650
- #endif
651
649
652
650
/* ----------------------------------------------------------------
653
651
* Section 6: assertions
@@ -684,6 +682,7 @@ typedef NameData *Name;
684
682
#define AssertArg (condition ) assert(condition)
685
683
#define AssertState (condition ) assert(condition)
686
684
#define AssertPointerAlignment (ptr , bndr ) ((void)true)
685
+
687
686
#else /* USE_ASSERT_CHECKING && !FRONTEND */
688
687
689
688
/*
@@ -929,20 +928,6 @@ typedef NameData *Name;
929
928
} while (0)
930
929
931
930
932
- /*
933
- * Mark a point as unreachable in a portable fashion. This should preferably
934
- * be something that the compiler understands, to aid code generation.
935
- * In assert-enabled builds, we prefer abort() for debugging reasons.
936
- */
937
- #if defined(HAVE__BUILTIN_UNREACHABLE ) && !defined(USE_ASSERT_CHECKING )
938
- #define pg_unreachable () __builtin_unreachable()
939
- #elif defined(_MSC_VER ) && !defined(USE_ASSERT_CHECKING )
940
- #define pg_unreachable () __assume(0)
941
- #else
942
- #define pg_unreachable () abort()
943
- #endif
944
-
945
-
946
931
/* ----------------------------------------------------------------
947
932
* Section 8: random stuff
948
933
* ----------------------------------------------------------------
@@ -952,26 +937,47 @@ typedef NameData *Name;
952
937
#define HIGHBIT (0x80)
953
938
#define IS_HIGHBIT_SET (ch ) ((unsigned char)(ch) & HIGHBIT)
954
939
940
+ /*
941
+ * Support macros for escaping strings. escape_backslash should be TRUE
942
+ * if generating a non-standard-conforming string. Prefixing a string
943
+ * with ESCAPE_STRING_SYNTAX guarantees it is non-standard-conforming.
944
+ * Beware of multiple evaluation of the "ch" argument!
945
+ */
946
+ #define SQL_STR_DOUBLE (ch , escape_backslash ) \
947
+ ((ch) == '\'' || ((ch) == '\\' && (escape_backslash)))
948
+
949
+ #define ESCAPE_STRING_SYNTAX 'E'
950
+
951
+
955
952
#define STATUS_OK (0)
956
953
#define STATUS_ERROR (-1)
957
954
#define STATUS_EOF (-2)
958
955
#define STATUS_FOUND (1)
959
956
#define STATUS_WAITING (2)
960
957
961
-
962
958
/*
963
- * Append PG_USED_FOR_ASSERTS_ONLY to definitions of variables that are only
964
- * used in assert-enabled builds, to avoid compiler warnings about unused
965
- * variables in assert-disabled builds.
959
+ * gettext support
966
960
*/
967
- #ifdef USE_ASSERT_CHECKING
968
- #define PG_USED_FOR_ASSERTS_ONLY
969
- #else
970
- #define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused()
961
+
962
+ #ifndef ENABLE_NLS
963
+ /* stuff we'd otherwise get from <libintl.h> */
964
+ #define gettext (x ) (x)
965
+ #define dgettext (d ,x ) (x)
966
+ #define ngettext (s ,p ,n ) ((n) == 1 ? (s) : (p))
967
+ #define dngettext (d ,s ,p ,n ) ((n) == 1 ? (s) : (p))
971
968
#endif
972
969
970
+ #define _ (x ) gettext(x)
973
971
974
- /* gettext domain name mangling */
972
+ /*
973
+ * Use this to mark string constants as needing translation at some later
974
+ * time, rather than immediately. This is useful for cases where you need
975
+ * access to the original string and translated string, and for cases where
976
+ * immediate translation is not possible, like when initializing global
977
+ * variables.
978
+ * http://www.gnu.org/software/autoconf/manual/gettext/Special-cases.html
979
+ */
980
+ #define gettext_noop (x ) (x)
975
981
976
982
/*
977
983
* To better support parallel installations of major PostgreSQL
@@ -986,10 +992,6 @@ typedef NameData *Name;
986
992
*
987
993
* Make sure this matches the installation rules in nls-global.mk.
988
994
*/
989
-
990
- /* need a second indirection because we want to stringize the macro value, not the name */
991
- #define CppAsString2 (x ) CppAsString(x)
992
-
993
995
#ifdef SO_MAJOR_VERSION
994
996
#define PG_TEXTDOMAIN (domain ) (domain CppAsString2(SO_MAJOR_VERSION) "-" PG_MAJORVERSION)
995
997
#else
0 commit comments