Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit a891050

Browse files
committed
Rearrange c.h to create a "compiler characteristics" section.
Generalize section 1 to handle stuff that is principally about the compiler (not libraries), such as attributes, and collect stuff there that had been dropped into various other parts of c.h. Also, push all the gettext macros into section 8, so that section 0 is really just inclusions rather than inclusions and random other stuff. The primary goal here is to get pg_attribute_aligned() defined before section 3, so that we can use it with int128. But this seems like good cleanup anyway. This patch just moves macro definitions around, and shouldn't result in any changes in generated code. Back-patch of commit 91aec93. Discussion: https://postgr.es/m/20171110185747.31519.28038@wrigleys.postgresql.org
1 parent 8d8f85d commit a891050

File tree

1 file changed

+120
-118
lines changed

1 file changed

+120
-118
lines changed

src/include/c.h

Lines changed: 120 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
* section description
2727
* ------- ------------------------------------------------
2828
* 0) pg_config.h and standard system headers
29-
* 1) hacks to cope with non-ANSI C compilers
29+
* 1) compiler characteristics
3030
* 2) bool, true, false, TRUE, FALSE, NULL
3131
* 3) standard system types
3232
* 4) IsValid macros for system types
@@ -90,61 +90,117 @@
9090
#include <stdint.h>
9191
#endif
9292
#include <sys/types.h>
93-
9493
#include <errno.h>
9594
#if defined(WIN32) || defined(__CYGWIN__)
9695
#include <fcntl.h> /* ensure O_BINARY is available */
9796
#endif
97+
#include <locale.h>
98+
#ifdef ENABLE_NLS
99+
#include <libintl.h>
100+
#endif
98101

99102
#if defined(WIN32) || defined(__CYGWIN__)
100103
/* We have to redefine some system functions after they are included above. */
101104
#include "pg_config_os.h"
102105
#endif
103106

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
108110
*
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.
111119
*/
112120
#ifdef PG_FORCE_DISABLE_INLINE
113121
#undef inline
114122
#define inline
115123
#endif
116124

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+
*/
119134

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
121141

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
124149
#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()
129151
#endif
130152

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
131169
/*
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.
138173
*/
139-
#define gettext_noop(x) (x)
174+
#define pg_attribute_noreturn()
175+
#endif
140176

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
141189

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.
144193
*
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.
147196
*/
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
148204

149205
/*
150206
* CppAsString
@@ -183,6 +239,7 @@
183239
#endif
184240
#endif
185241

242+
186243
/* ----------------------------------------------------------------
187244
* Section 2: bool, true, false, TRUE, FALSE, NULL
188245
* ----------------------------------------------------------------
@@ -209,6 +266,7 @@ typedef char bool;
209266
#ifndef false
210267
#define false ((bool) 0)
211268
#endif
269+
212270
#endif /* not C++ */
213271

214272
typedef bool *BoolPtr;
@@ -502,16 +560,6 @@ typedef NameData *Name;
502560

503561
#define NameStr(name) ((name).data)
504562

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'
515563

516564
/* ----------------------------------------------------------------
517565
* Section 4: IsValid macros for system types
@@ -579,6 +627,9 @@ typedef NameData *Name;
579627
*
580628
* NOTE: TYPEALIGN[_DOWN] will not work if ALIGNVAL is not a power of 2.
581629
* 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.
582633
* ----------------
583634
*/
584635

@@ -615,47 +666,6 @@ typedef NameData *Name;
615666
/* we don't currently need wider versions of the other ALIGN macros */
616667
#define MAXALIGN64(LEN) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN))
617668

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
659669

660670
/* ----------------------------------------------------------------
661671
* Section 6: assertions
@@ -692,6 +702,7 @@ typedef NameData *Name;
692702
#define AssertArg(condition) assert(condition)
693703
#define AssertState(condition) assert(condition)
694704
#define AssertPointerAlignment(ptr, bndr) ((void)true)
705+
695706
#else /* USE_ASSERT_CHECKING && !FRONTEND */
696707

697708
/*
@@ -937,36 +948,6 @@ typedef NameData *Name;
937948
} while (0)
938949

939950

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-
970951
/* ----------------------------------------------------------------
971952
* Section 8: random stuff
972953
* ----------------------------------------------------------------
@@ -976,26 +957,47 @@ typedef NameData *Name;
976957
#define HIGHBIT (0x80)
977958
#define IS_HIGHBIT_SET(ch) ((unsigned char)(ch) & HIGHBIT)
978959

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+
979972
#define STATUS_OK (0)
980973
#define STATUS_ERROR (-1)
981974
#define STATUS_EOF (-2)
982975
#define STATUS_FOUND (1)
983976
#define STATUS_WAITING (2)
984977

985-
986978
/*
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
990980
*/
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))
995988
#endif
996989

990+
#define _(x) gettext(x)
997991

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)
9991001

10001002
/*
10011003
* To better support parallel installations of major PostgreSQL

0 commit comments

Comments
 (0)