summaryrefslogtreecommitdiff
path: root/src/include
diff options
context:
space:
mode:
authorAndres Freund2015-03-11 13:19:54 +0000
committerAndres Freund2015-03-11 13:30:01 +0000
commitbbfd7edae5aa5ad5553d3c7e102f2e450d4380d4 (patch)
treed230d006ceb7bf350abd5c3c25a89b660a8d3193 /src/include
parent66ece312f99f384bd33e4342580e78b0eebf0e74 (diff)
Add macros wrapping all usage of gcc's __attribute__.
Until now __attribute__() was defined to be empty for all compilers but gcc. That's problematic because it prevents using it in other compilers; which is necessary e.g. for atomics portability. It's also just generally dubious to do so in a header as widely included as c.h. Instead add pg_attribute_format_arg, pg_attribute_printf, pg_attribute_noreturn macros which are implemented in the compilers that understand them. Also add pg_attribute_noreturn and pg_attribute_packed, but don't provide fallbacks, since they can affect functionality. This means that external code that, possibly unwittingly, relied on __attribute__ defined to be empty on !gcc compilers may now run into warnings or errors on those compilers. But there shouldn't be many occurances of that and it's hard to work around... Discussion: 54B58BA3.8040302@ohmu.fi Author: Oskari Saarenmaa, with some minor changes by me.
Diffstat (limited to 'src/include')
-rw-r--r--src/include/bootstrap/bootstrap.h4
-rw-r--r--src/include/c.h49
-rw-r--r--src/include/common/fe_memutils.h4
-rw-r--r--src/include/lib/stringinfo.h4
-rw-r--r--src/include/mb/pg_wchar.h4
-rw-r--r--src/include/parser/parse_relation.h4
-rw-r--r--src/include/parser/scanner.h2
-rw-r--r--src/include/pgstat.h2
-rw-r--r--src/include/port.h14
-rw-r--r--src/include/port/atomics/generic-gcc.h2
-rw-r--r--src/include/port/atomics/generic-sunpro.h2
-rw-r--r--src/include/port/atomics/generic-xlc.h2
-rw-r--r--src/include/postgres.h2
-rw-r--r--src/include/postmaster/autovacuum.h4
-rw-r--r--src/include/postmaster/bgworker_internals.h2
-rw-r--r--src/include/postmaster/bgwriter.h4
-rw-r--r--src/include/postmaster/pgarch.h2
-rw-r--r--src/include/postmaster/postmaster.h4
-rw-r--r--src/include/postmaster/startup.h2
-rw-r--r--src/include/postmaster/syslogger.h2
-rw-r--r--src/include/postmaster/walwriter.h2
-rw-r--r--src/include/replication/walreceiver.h2
-rw-r--r--src/include/storage/ipc.h2
-rw-r--r--src/include/storage/itemptr.h2
-rw-r--r--src/include/storage/lock.h2
-rw-r--r--src/include/tcop/tcopprot.h6
-rw-r--r--src/include/utils/datetime.h2
-rw-r--r--src/include/utils/elog.h38
-rw-r--r--src/include/utils/help_config.h2
-rw-r--r--src/include/utils/palloc.h4
30 files changed, 107 insertions, 70 deletions
diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/bootstrap.h
index f9cbc137e72..3734afb468a 100644
--- a/src/include/bootstrap/bootstrap.h
+++ b/src/include/bootstrap/bootstrap.h
@@ -32,7 +32,7 @@ extern Form_pg_attribute attrtypes[MAXATTR];
extern int numattr;
-extern void AuxiliaryProcessMain(int argc, char *argv[]) __attribute__((noreturn));
+extern void AuxiliaryProcessMain(int argc, char *argv[]) pg_attribute_noreturn;
extern void err_out(void);
@@ -61,6 +61,6 @@ extern void boot_get_type_io_data(Oid typid,
extern int boot_yyparse(void);
extern int boot_yylex(void);
-extern void boot_yyerror(const char *str) __attribute__((noreturn));
+extern void boot_yyerror(const char *str) pg_attribute_noreturn;
#endif /* BOOTSTRAP_H */
diff --git a/src/include/c.h b/src/include/c.h
index ee615ee687f..a2d4a2c5c5d 100644
--- a/src/include/c.h
+++ b/src/include/c.h
@@ -156,10 +156,6 @@
#define dummyret char
#endif
-#ifndef __GNUC__
-#define __attribute__(_arg_)
-#endif
-
/* ----------------------------------------------------------------
* Section 2: bool, true, false, TRUE, FALSE, NULL
* ----------------------------------------------------------------
@@ -560,6 +556,47 @@ typedef NameData *Name;
/* we don't currently need wider versions of the other ALIGN macros */
#define MAXALIGN64(LEN) TYPEALIGN64(MAXIMUM_ALIGNOF, (LEN))
+/* ----------------
+ * Attribute macros
+ *
+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html
+ * GCC: https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html
+ * Sunpro: https://docs.oracle.com/cd/E18659_01/html/821-1384/gjzke.html
+ * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/function_attributes.html
+ * XLC: http://www-01.ibm.com/support/knowledgecenter/SSGH2K_11.1.0/com.ibm.xlc111.aix.doc/language_ref/type_attrib.html
+ * ----------------
+ */
+
+/* only GCC supports the unused attribute */
+#ifdef __GNUC__
+#define pg_attribute_unused __attribute__((unused))
+#else
+#define pg_attribute_unused
+#endif
+
+/* GCC and XLC support format attributes */
+#if defined(__GNUC__) || defined(__IBMC__)
+#define pg_attribute_format_arg(a) __attribute__((format_arg(a)))
+#define pg_attribute_printf(f,a) __attribute__((format(PG_PRINTF_ATTRIBUTE, f, a)))
+#else
+#define pg_attribute_format_arg(a)
+#define pg_attribute_printf(f,a)
+#endif
+
+/* GCC, Sunpro and XLC support aligned, packed and noreturn */
+#if defined(__GNUC__) || defined(__SUNPRO_C) || defined(__IBMC__)
+#define pg_attribute_aligned(a) __attribute__((aligned(a)))
+#define pg_attribute_noreturn __attribute__((noreturn))
+#define pg_attribute_packed __attribute__((packed))
+#else
+/*
+ * NB: aligned and packed are not defined as empty as they affect code
+ * functionality; they must be implemented by the compiler if they are to be
+ * used.
+ */
+#define pg_attribute_noreturn
+#endif
+
/* ----------------------------------------------------------------
* Section 6: assertions
* ----------------------------------------------------------------
@@ -906,7 +943,7 @@ typedef NameData *Name;
#ifdef USE_ASSERT_CHECKING
#define PG_USED_FOR_ASSERTS_ONLY
#else
-#define PG_USED_FOR_ASSERTS_ONLY __attribute__((unused))
+#define PG_USED_FOR_ASSERTS_ONLY pg_attribute_unused
#endif
@@ -973,7 +1010,7 @@ typedef NameData *Name;
extern int
snprintf(char *str, size_t count, const char *fmt,...)
/* This extension allows gcc to check the format string */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4)));
+pg_attribute_printf(3, 4);
#endif
#if !HAVE_DECL_VSNPRINTF
diff --git a/src/include/common/fe_memutils.h b/src/include/common/fe_memutils.h
index f7114c244f3..33123cb5044 100644
--- a/src/include/common/fe_memutils.h
+++ b/src/include/common/fe_memutils.h
@@ -26,9 +26,9 @@ extern void pfree(void *pointer);
/* sprintf into a palloc'd buffer --- these are in psprintf.c */
extern char *
psprintf(const char *fmt,...)
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern size_t
pvsnprintf(char *buf, size_t len, const char *fmt, va_list args)
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0)));
+pg_attribute_printf(3, 0);
#endif /* FE_MEMUTILS_H */
diff --git a/src/include/lib/stringinfo.h b/src/include/lib/stringinfo.h
index 63d39e56218..fdb828508ea 100644
--- a/src/include/lib/stringinfo.h
+++ b/src/include/lib/stringinfo.h
@@ -95,7 +95,7 @@ extern void resetStringInfo(StringInfo str);
extern void
appendStringInfo(StringInfo str, const char *fmt,...)
/* This extension allows gcc to check the format string */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3)));
+pg_attribute_printf(2, 3);
/*------------------------
* appendStringInfoVA
@@ -108,7 +108,7 @@ __attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3)));
*/
extern int
appendStringInfoVA(StringInfo str, const char *fmt, va_list args)
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 0)));
+pg_attribute_printf(2, 0);
/*------------------------
* appendStringInfoString
diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h
index 231003f85c7..0a2234d35ac 100644
--- a/src/include/mb/pg_wchar.h
+++ b/src/include/mb/pg_wchar.h
@@ -514,9 +514,9 @@ extern void check_encoding_conversion_args(int src_encoding,
int expected_src_encoding,
int expected_dest_encoding);
-extern void report_invalid_encoding(int encoding, const char *mbstr, int len) __attribute__((noreturn));
+extern void report_invalid_encoding(int encoding, const char *mbstr, int len) pg_attribute_noreturn;
extern void report_untranslatable_char(int src_encoding, int dest_encoding,
- const char *mbstr, int len) __attribute__((noreturn));
+ const char *mbstr, int len) pg_attribute_noreturn;
extern void pg_ascii2mic(const unsigned char *l, unsigned char *p, int len);
extern void pg_mic2ascii(const unsigned char *mic, unsigned char *p, int len);
diff --git a/src/include/parser/parse_relation.h b/src/include/parser/parse_relation.h
index c886335e85b..fc0a2577f31 100644
--- a/src/include/parser/parse_relation.h
+++ b/src/include/parser/parse_relation.h
@@ -85,9 +85,9 @@ extern bool isLockedRefname(ParseState *pstate, const char *refname);
extern void addRTEtoQuery(ParseState *pstate, RangeTblEntry *rte,
bool addToJoinList,
bool addToRelNameSpace, bool addToVarNameSpace);
-extern void errorMissingRTE(ParseState *pstate, RangeVar *relation) __attribute__((noreturn));
+extern void errorMissingRTE(ParseState *pstate, RangeVar *relation) pg_attribute_noreturn;
extern void errorMissingColumn(ParseState *pstate,
- char *relname, char *colname, int location) __attribute__((noreturn));
+ char *relname, char *colname, int location) pg_attribute_noreturn;
extern void expandRTE(RangeTblEntry *rte, int rtindex, int sublevels_up,
int location, bool include_dropped,
List **colnames, List **colvars);
diff --git a/src/include/parser/scanner.h b/src/include/parser/scanner.h
index 535e864e368..0e22d031f14 100644
--- a/src/include/parser/scanner.h
+++ b/src/include/parser/scanner.h
@@ -124,6 +124,6 @@ extern void scanner_finish(core_yyscan_t yyscanner);
extern int core_yylex(core_YYSTYPE *lvalp, YYLTYPE *llocp,
core_yyscan_t yyscanner);
extern int scanner_errposition(int location, core_yyscan_t yyscanner);
-extern void scanner_yyerror(const char *message, core_yyscan_t yyscanner) __attribute__((noreturn));
+extern void scanner_yyerror(const char *message, core_yyscan_t yyscanner) pg_attribute_noreturn;
#endif /* SCANNER_H */
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index 30934d3ddf6..64cc8e2e7c8 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -875,7 +875,7 @@ extern void pgstat_reset_all(void);
extern void allow_immediate_pgstat_restart(void);
#ifdef EXEC_BACKEND
-extern void PgstatCollectorMain(int argc, char *argv[]) __attribute__((noreturn));
+extern void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn;
#endif
diff --git a/src/include/port.h b/src/include/port.h
index a1ab42e3da6..b64651f1665 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -156,25 +156,25 @@ extern int pg_vsnprintf(char *str, size_t count, const char *fmt, va_list args);
extern int
pg_snprintf(char *str, size_t count, const char *fmt,...)
/* This extension allows gcc to check the format string */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4)));
+pg_attribute_printf(3, 4);
extern int
pg_sprintf(char *str, const char *fmt,...)
/* This extension allows gcc to check the format string */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3)));
+pg_attribute_printf(2, 3);
extern int pg_vfprintf(FILE *stream, const char *fmt, va_list args);
extern int
pg_fprintf(FILE *stream, const char *fmt,...)
/* This extension allows gcc to check the format string */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3)));
+pg_attribute_printf(2, 3);
extern int
pg_printf(const char *fmt,...)
/* This extension allows gcc to check the format string */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
/*
- * The GCC-specific code below prevents the __attribute__(... 'printf')
- * above from being replaced, and this is required because gcc doesn't
- * know anything about pg_printf.
+ * The GCC-specific code below prevents the pg_attribute_printf above from
+ * being replaced, and this is required because gcc doesn't know anything
+ * about pg_printf.
*/
#ifdef __GNUC__
#define vsnprintf(...) pg_vsnprintf(__VA_ARGS__)
diff --git a/src/include/port/atomics/generic-gcc.h b/src/include/port/atomics/generic-gcc.h
index fea1cb5e135..c9fc87b30d9 100644
--- a/src/include/port/atomics/generic-gcc.h
+++ b/src/include/port/atomics/generic-gcc.h
@@ -98,7 +98,7 @@ typedef struct pg_atomic_uint32
typedef struct pg_atomic_uint64
{
- volatile uint64 value __attribute__((aligned(8)));
+ volatile uint64 value pg_attribute_aligned(8);
} pg_atomic_uint64;
#endif /* defined(HAVE_GCC__ATOMIC_INT64_CAS) || defined(HAVE_GCC__SYNC_INT64_CAS) */
diff --git a/src/include/port/atomics/generic-sunpro.h b/src/include/port/atomics/generic-sunpro.h
index 7a3028ec3d0..d369207fb34 100644
--- a/src/include/port/atomics/generic-sunpro.h
+++ b/src/include/port/atomics/generic-sunpro.h
@@ -61,7 +61,7 @@ typedef struct pg_atomic_uint64
* it proves to be a problem, we'll have to add more version checks for 64
* bit support.
*/
- volatile uint64 value __attribute__((__aligned__(8)));
+ volatile uint64 value pg_attribute_aligned(8);
} pg_atomic_uint64;
#endif /* HAVE_ATOMIC_H */
diff --git a/src/include/port/atomics/generic-xlc.h b/src/include/port/atomics/generic-xlc.h
index 7a4c12ae6ca..1c743f2bc80 100644
--- a/src/include/port/atomics/generic-xlc.h
+++ b/src/include/port/atomics/generic-xlc.h
@@ -32,7 +32,7 @@ typedef struct pg_atomic_uint32
#define PG_HAVE_ATOMIC_U64_SUPPORT
typedef struct pg_atomic_uint64
{
- volatile uint64 value __attribute__((__aligned__(8)));
+ volatile uint64 value pg_attribute_aligned(8);
} pg_atomic_uint64;
#endif /* __64BIT__ */
diff --git a/src/include/postgres.h b/src/include/postgres.h
index cbb7f796e1e..ff30e05bfc8 100644
--- a/src/include/postgres.h
+++ b/src/include/postgres.h
@@ -687,6 +687,6 @@ extern Datum Float8GetDatum(float8 X);
*/
extern void ExceptionalCondition(const char *conditionName,
const char *errorType,
- const char *fileName, int lineNumber) __attribute__((noreturn));
+ const char *fileName, int lineNumber) pg_attribute_noreturn;
#endif /* POSTGRES_H */
diff --git a/src/include/postmaster/autovacuum.h b/src/include/postmaster/autovacuum.h
index 121f1073871..0bd50443aeb 100644
--- a/src/include/postmaster/autovacuum.h
+++ b/src/include/postmaster/autovacuum.h
@@ -54,8 +54,8 @@ extern void AutoVacWorkerFailed(void);
extern void AutoVacuumUpdateDelay(void);
#ifdef EXEC_BACKEND
-extern void AutoVacLauncherMain(int argc, char *argv[]) __attribute__((noreturn));
-extern void AutoVacWorkerMain(int argc, char *argv[]) __attribute__((noreturn));
+extern void AutoVacLauncherMain(int argc, char *argv[]) pg_attribute_noreturn;
+extern void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn;
extern void AutovacuumWorkerIAm(void);
extern void AutovacuumLauncherIAm(void);
#endif
diff --git a/src/include/postmaster/bgworker_internals.h b/src/include/postmaster/bgworker_internals.h
index 81c03e4bb3b..fe7c328afd1 100644
--- a/src/include/postmaster/bgworker_internals.h
+++ b/src/include/postmaster/bgworker_internals.h
@@ -46,7 +46,7 @@ extern void BackgroundWorkerStopNotifications(pid_t pid);
extern void ResetBackgroundWorkerCrashTimes(void);
/* Function to start a background worker, called from postmaster.c */
-extern void StartBackgroundWorker(void) __attribute__((noreturn));
+extern void StartBackgroundWorker(void) pg_attribute_noreturn;
#ifdef EXEC_BACKEND
extern BackgroundWorker *BackgroundWorkerEntry(int slotno);
diff --git a/src/include/postmaster/bgwriter.h b/src/include/postmaster/bgwriter.h
index ce12619797d..f584d857872 100644
--- a/src/include/postmaster/bgwriter.h
+++ b/src/include/postmaster/bgwriter.h
@@ -25,8 +25,8 @@ extern int CheckPointTimeout;
extern int CheckPointWarning;
extern double CheckPointCompletionTarget;
-extern void BackgroundWriterMain(void) __attribute__((noreturn));
-extern void CheckpointerMain(void) __attribute__((noreturn));
+extern void BackgroundWriterMain(void) pg_attribute_noreturn;
+extern void CheckpointerMain(void) pg_attribute_noreturn;
extern void RequestCheckpoint(int flags);
extern void CheckpointWriteDelay(int flags, double progress);
diff --git a/src/include/postmaster/pgarch.h b/src/include/postmaster/pgarch.h
index a585e6736c2..60e4f50368d 100644
--- a/src/include/postmaster/pgarch.h
+++ b/src/include/postmaster/pgarch.h
@@ -33,7 +33,7 @@
extern int pgarch_start(void);
#ifdef EXEC_BACKEND
-extern void PgArchiverMain(int argc, char *argv[]) __attribute__((noreturn));
+extern void PgArchiverMain(int argc, char *argv[]) pg_attribute_noreturn;
#endif
#endif /* _PGARCH_H */
diff --git a/src/include/postmaster/postmaster.h b/src/include/postmaster/postmaster.h
index 91723f7d9af..d41761fc7a1 100644
--- a/src/include/postmaster/postmaster.h
+++ b/src/include/postmaster/postmaster.h
@@ -46,7 +46,7 @@ extern int postmaster_alive_fds[2];
extern const char *progname;
-extern void PostmasterMain(int argc, char *argv[]) __attribute__((noreturn));
+extern void PostmasterMain(int argc, char *argv[]) pg_attribute_noreturn;
extern void ClosePostmasterPorts(bool am_syslogger);
extern int MaxLivePostmasterChildren(void);
@@ -56,7 +56,7 @@ extern bool PostmasterMarkPIDForWorkerNotify(int);
#ifdef EXEC_BACKEND
extern pid_t postmaster_forkexec(int argc, char *argv[]);
-extern void SubPostmasterMain(int argc, char *argv[]) __attribute__((noreturn));
+extern void SubPostmasterMain(int argc, char *argv[]) pg_attribute_noreturn;
extern Size ShmemBackendArraySize(void);
extern void ShmemBackendArrayAllocation(void);
diff --git a/src/include/postmaster/startup.h b/src/include/postmaster/startup.h
index da1f6e93362..9a2092e5f28 100644
--- a/src/include/postmaster/startup.h
+++ b/src/include/postmaster/startup.h
@@ -13,7 +13,7 @@
#define _STARTUP_H
extern void HandleStartupProcInterrupts(void);
-extern void StartupProcessMain(void) __attribute__((noreturn));
+extern void StartupProcessMain(void) pg_attribute_noreturn;
extern void PreRestoreCommand(void);
extern void PostRestoreCommand(void);
extern bool IsPromoteTriggered(void);
diff --git a/src/include/postmaster/syslogger.h b/src/include/postmaster/syslogger.h
index 89a535c18fd..d6a05d5a209 100644
--- a/src/include/postmaster/syslogger.h
+++ b/src/include/postmaster/syslogger.h
@@ -84,7 +84,7 @@ extern int SysLogger_Start(void);
extern void write_syslogger_file(const char *buffer, int count, int dest);
#ifdef EXEC_BACKEND
-extern void SysLoggerMain(int argc, char *argv[]) __attribute__((noreturn));
+extern void SysLoggerMain(int argc, char *argv[]) pg_attribute_noreturn;
#endif
#endif /* _SYSLOGGER_H */
diff --git a/src/include/postmaster/walwriter.h b/src/include/postmaster/walwriter.h
index de45a01f82d..55de6c73e4a 100644
--- a/src/include/postmaster/walwriter.h
+++ b/src/include/postmaster/walwriter.h
@@ -15,6 +15,6 @@
/* GUC options */
extern int WalWriterDelay;
-extern void WalWriterMain(void) __attribute__((noreturn));
+extern void WalWriterMain(void) pg_attribute_noreturn;
#endif /* _WALWRITER_H */
diff --git a/src/include/replication/walreceiver.h b/src/include/replication/walreceiver.h
index defe8f982b1..4afdf91a6dc 100644
--- a/src/include/replication/walreceiver.h
+++ b/src/include/replication/walreceiver.h
@@ -147,7 +147,7 @@ typedef void (*walrcv_disconnect_type) (void);
extern PGDLLIMPORT walrcv_disconnect_type walrcv_disconnect;
/* prototypes for functions in walreceiver.c */
-extern void WalReceiverMain(void) __attribute__((noreturn));
+extern void WalReceiverMain(void) pg_attribute_noreturn;
/* prototypes for functions in walreceiverfuncs.c */
extern Size WalRcvShmemSize(void);
diff --git a/src/include/storage/ipc.h b/src/include/storage/ipc.h
index 54fa2ba57bb..7da434e7987 100644
--- a/src/include/storage/ipc.h
+++ b/src/include/storage/ipc.h
@@ -64,7 +64,7 @@ typedef void (*shmem_startup_hook_type) (void);
/* ipc.c */
extern PGDLLIMPORT bool proc_exit_inprogress;
-extern void proc_exit(int code) __attribute__((noreturn));
+extern void proc_exit(int code) pg_attribute_noreturn;
extern void shmem_exit(int code);
extern void on_proc_exit(pg_on_exit_callback function, Datum arg);
extern void on_shmem_exit(pg_on_exit_callback function, Datum arg);
diff --git a/src/include/storage/itemptr.h b/src/include/storage/itemptr.h
index 944812c4c01..1f0ea7db552 100644
--- a/src/include/storage/itemptr.h
+++ b/src/include/storage/itemptr.h
@@ -41,7 +41,7 @@ typedef struct ItemPointerData
}
#ifdef __arm__
-__attribute__((packed)) /* Appropriate whack upside the head for ARM */
+pg_attribute_packed /* Appropriate whack upside the head for ARM */
#endif
ItemPointerData;
diff --git a/src/include/storage/lock.h b/src/include/storage/lock.h
index 11009237866..1477a6fe3d1 100644
--- a/src/include/storage/lock.h
+++ b/src/include/storage/lock.h
@@ -547,7 +547,7 @@ extern void lock_twophase_standby_recover(TransactionId xid, uint16 info,
extern DeadLockState DeadLockCheck(PGPROC *proc);
extern PGPROC *GetBlockingAutoVacuumPgproc(void);
-extern void DeadLockReport(void) __attribute__((noreturn));
+extern void DeadLockReport(void) pg_attribute_noreturn;
extern void RememberSimpleDeadLock(PGPROC *proc1,
LOCKMODE lockmode,
LOCK *lock,
diff --git a/src/include/tcop/tcopprot.h b/src/include/tcop/tcopprot.h
index 3e17770e22a..b3c705f97b6 100644
--- a/src/include/tcop/tcopprot.h
+++ b/src/include/tcop/tcopprot.h
@@ -62,9 +62,9 @@ extern bool check_max_stack_depth(int *newval, void **extra, GucSource source);
extern void assign_max_stack_depth(int newval, void *extra);
extern void die(SIGNAL_ARGS);
-extern void quickdie(SIGNAL_ARGS) __attribute__((noreturn));
+extern void quickdie(SIGNAL_ARGS) pg_attribute_noreturn;
extern void StatementCancelHandler(SIGNAL_ARGS);
-extern void FloatExceptionHandler(SIGNAL_ARGS) __attribute__((noreturn));
+extern void FloatExceptionHandler(SIGNAL_ARGS) pg_attribute_noreturn;
extern void RecoveryConflictInterrupt(ProcSignalReason reason); /* called from SIGUSR1
* handler */
extern void ProcessClientReadInterrupt(bool blocked);
@@ -74,7 +74,7 @@ extern void process_postgres_switches(int argc, char *argv[],
GucContext ctx, const char **dbname);
extern void PostgresMain(int argc, char *argv[],
const char *dbname,
- const char *username) __attribute__((noreturn));
+ const char *username) pg_attribute_noreturn;
extern long get_stack_depth_rlimit(void);
extern void ResetUsage(void);
extern void ShowUsage(const char *title);
diff --git a/src/include/utils/datetime.h b/src/include/utils/datetime.h
index 6b8ab3c6564..3a2335523d0 100644
--- a/src/include/utils/datetime.h
+++ b/src/include/utils/datetime.h
@@ -315,7 +315,7 @@ extern int DecodeISO8601Interval(char *str,
int *dtype, struct pg_tm * tm, fsec_t *fsec);
extern void DateTimeParseError(int dterr, const char *str,
- const char *datatype) __attribute__((noreturn));
+ const char *datatype) pg_attribute_noreturn;
extern int DetermineTimeZoneOffset(struct pg_tm * tm, pg_tz *tzp);
extern int DetermineTimeZoneAbbrevOffset(struct pg_tm * tm, const char *abbr, pg_tz *tzp);
diff --git a/src/include/utils/elog.h b/src/include/utils/elog.h
index b5cfc9cbc88..a82063a57b1 100644
--- a/src/include/utils/elog.h
+++ b/src/include/utils/elog.h
@@ -147,61 +147,61 @@ extern int
errmsg(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern int
errmsg_internal(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern int
errmsg_plural(const char *fmt_singular, const char *fmt_plural,
unsigned long n,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 4)))
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 4)));
+pg_attribute_printf(1, 4)
+pg_attribute_printf(2, 4);
extern int
errdetail(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern int
errdetail_internal(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern int
errdetail_log(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern int
errdetail_log_plural(const char *fmt_singular, const char *fmt_plural,
unsigned long n,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 4)))
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 4)));
+pg_attribute_printf(1, 4)
+pg_attribute_printf(2, 4);
extern int
errdetail_plural(const char *fmt_singular, const char *fmt_plural,
unsigned long n,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 4)))
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 4)));
+pg_attribute_printf(1, 4)
+pg_attribute_printf(2, 4);
extern int
errhint(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
/*
* errcontext() is typically called in error context callback functions, not
@@ -218,7 +218,7 @@ extern int
errcontext_msg(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern int errhidestmt(bool hide_stmt);
extern int errhidecontext(bool hide_ctx);
@@ -278,7 +278,7 @@ extern void
elog_finish(int elevel, const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3)));
+pg_attribute_printf(2, 3);
/* Support for constructing error strings separately from ereport() calls */
@@ -288,7 +288,7 @@ extern char *
format_elog_string(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
/* Support for attaching context information to error reports */
@@ -364,7 +364,7 @@ extern PGDLLIMPORT ErrorContextCallback *error_context_stack;
} while (0)
/*
- * gcc understands __attribute__((noreturn)); for other compilers, insert
+ * gcc understands pg_attribute_noreturn; for other compilers, insert
* pg_unreachable() so that the compiler gets the point.
*/
#ifdef __GNUC__
@@ -423,9 +423,9 @@ extern void EmitErrorReport(void);
extern ErrorData *CopyErrorData(void);
extern void FreeErrorData(ErrorData *edata);
extern void FlushErrorState(void);
-extern void ReThrowError(ErrorData *edata) __attribute__((noreturn));
+extern void ReThrowError(ErrorData *edata) pg_attribute_noreturn;
extern void ThrowErrorData(ErrorData *edata);
-extern void pg_re_throw(void) __attribute__((noreturn));
+extern void pg_re_throw(void) pg_attribute_noreturn;
extern char *GetErrorContextStack(void);
@@ -472,6 +472,6 @@ extern void
write_stderr(const char *fmt,...)
/* This extension allows gcc to check the format string for consistency with
the supplied arguments. */
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
#endif /* ELOG_H */
diff --git a/src/include/utils/help_config.h b/src/include/utils/help_config.h
index 481687f25fd..af529964003 100644
--- a/src/include/utils/help_config.h
+++ b/src/include/utils/help_config.h
@@ -12,6 +12,6 @@
#ifndef HELP_CONFIG_H
#define HELP_CONFIG_H 1
-extern void GucInfoMain(void) __attribute__((noreturn));
+extern void GucInfoMain(void) pg_attribute_noreturn;
#endif
diff --git a/src/include/utils/palloc.h b/src/include/utils/palloc.h
index 39b318da43a..bd8767520e3 100644
--- a/src/include/utils/palloc.h
+++ b/src/include/utils/palloc.h
@@ -138,9 +138,9 @@ extern char *pnstrdup(const char *in, Size len);
/* sprintf into a palloc'd buffer --- these are in psprintf.c */
extern char *
psprintf(const char *fmt,...)
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2)));
+pg_attribute_printf(1, 2);
extern size_t
pvsnprintf(char *buf, size_t len, const char *fmt, va_list args)
-__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0)));
+pg_attribute_printf(3, 0);
#endif /* PALLOC_H */