From bbfd7edae5aa5ad5553d3c7e102f2e450d4380d4 Mon Sep 17 00:00:00 2001 From: Andres Freund Date: Wed, 11 Mar 2015 14:19:54 +0100 Subject: [PATCH] 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. --- contrib/cube/cubescan.l | 2 +- contrib/pg_upgrade/pg_upgrade.h | 14 +++--- contrib/pg_upgrade/util.c | 2 +- contrib/pg_xlogdump/pg_xlogdump.c | 2 +- contrib/pgcrypto/px.h | 2 +- contrib/seg/segscan.l | 2 +- src/backend/access/transam/xlogreader.c | 2 +- src/backend/postmaster/autovacuum.c | 4 +- src/backend/postmaster/pgarch.c | 2 +- src/backend/postmaster/pgstat.c | 2 +- src/backend/postmaster/postmaster.c | 4 +- src/backend/postmaster/syslogger.c | 2 +- src/backend/replication/repl_scanner.l | 2 +- src/backend/replication/walsender.c | 2 +- src/backend/utils/error/elog.c | 2 +- src/backend/utils/misc/guc.c | 2 +- src/bin/pg_ctl/pg_ctl.c | 2 +- src/bin/pg_dump/parallel.c | 2 +- src/bin/pg_dump/pg_backup.h | 2 +- src/bin/pg_dump/pg_backup_archiver.h | 6 +-- src/bin/pg_dump/pg_backup_tar.c | 2 +- src/bin/pg_dump/pg_backup_utils.h | 8 ++-- src/bin/psql/common.h | 2 +- src/bin/psql/large_obj.c | 2 +- src/include/bootstrap/bootstrap.h | 4 +- src/include/c.h | 49 ++++++++++++++++++--- src/include/common/fe_memutils.h | 4 +- src/include/lib/stringinfo.h | 4 +- src/include/mb/pg_wchar.h | 4 +- src/include/parser/parse_relation.h | 4 +- src/include/parser/scanner.h | 2 +- src/include/pgstat.h | 2 +- src/include/port.h | 14 +++--- src/include/port/atomics/generic-gcc.h | 2 +- src/include/port/atomics/generic-sunpro.h | 2 +- src/include/port/atomics/generic-xlc.h | 2 +- src/include/postgres.h | 2 +- src/include/postmaster/autovacuum.h | 4 +- src/include/postmaster/bgworker_internals.h | 2 +- src/include/postmaster/bgwriter.h | 4 +- src/include/postmaster/pgarch.h | 2 +- src/include/postmaster/postmaster.h | 4 +- src/include/postmaster/startup.h | 2 +- src/include/postmaster/syslogger.h | 2 +- src/include/postmaster/walwriter.h | 2 +- src/include/replication/walreceiver.h | 2 +- src/include/storage/ipc.h | 2 +- src/include/storage/itemptr.h | 2 +- src/include/storage/lock.h | 2 +- src/include/tcop/tcopprot.h | 6 +-- src/include/utils/datetime.h | 2 +- src/include/utils/elog.h | 38 ++++++++-------- src/include/utils/help_config.h | 2 +- src/include/utils/palloc.h | 4 +- src/interfaces/ecpg/ecpglib/extern.h | 2 +- src/interfaces/ecpg/include/ecpglib.h | 2 +- src/interfaces/ecpg/preproc/ecpg.header | 2 +- src/interfaces/ecpg/preproc/extern.h | 4 +- src/interfaces/libpq/libpq-int.h | 6 +-- src/interfaces/libpq/pqexpbuffer.c | 2 +- src/interfaces/libpq/pqexpbuffer.h | 4 +- src/interfaces/libpq/win32.c | 2 +- src/pl/plperl/plperl.h | 4 +- src/pl/plpgsql/src/pl_scanner.c | 2 +- src/pl/plpython/plpy_elog.h | 8 ++-- src/test/modules/test_shm_mq/test_shm_mq.h | 2 +- src/test/modules/worker_spi/worker_spi.c | 2 +- src/test/regress/pg_regress.c | 6 +-- 68 files changed, 167 insertions(+), 132 deletions(-) diff --git a/contrib/cube/cubescan.l b/contrib/cube/cubescan.l index e383b59d3d..1c2522a239 100644 --- a/contrib/cube/cubescan.l +++ b/contrib/cube/cubescan.l @@ -60,7 +60,7 @@ float ({integer}|{real})([eE]{integer})? %% -void __attribute__((noreturn)) +void pg_attribute_noreturn yyerror(NDBOX **result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) diff --git a/contrib/pg_upgrade/pg_upgrade.h b/contrib/pg_upgrade/pg_upgrade.h index 19d59f5237..9b873adbc0 100644 --- a/contrib/pg_upgrade/pg_upgrade.h +++ b/contrib/pg_upgrade/pg_upgrade.h @@ -359,7 +359,7 @@ void optionally_create_toast_tables(void); bool exec_prog(const char *log_file, const char *opt_log_file, bool throw_error, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 4, 5))); +pg_attribute_printf(4, 5); void verify_directories(void); bool pid_lock_file_exists(const char *datadir); @@ -445,7 +445,7 @@ void init_tablespaces(void); PGconn *connectToServer(ClusterInfo *cluster, const char *db_name); PGresult * executeQueryOrDie(PGconn *conn, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); char *cluster_conn_opts(ClusterInfo *cluster); @@ -462,17 +462,17 @@ int get_user_info(char **user_name_p); void check_ok(void); void report_status(eLogType type, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); void pg_log(eLogType type, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); void pg_fatal(const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2), noreturn)); +pg_attribute_printf(1, 2) pg_attribute_noreturn; void end_progress_output(void); void prep_status(const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); +pg_attribute_printf(1, 2); void check_ok(void); const char *getErrorText(int errNum); unsigned int str2uint(const char *str); @@ -489,7 +489,7 @@ void old_9_3_check_for_line_data_type_usage(ClusterInfo *cluster); void parallel_exec_prog(const char *log_file, const char *opt_log_file, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); +pg_attribute_printf(3, 4); void parallel_transfer_all_new_dbs(DbInfoArr *old_db_arr, DbInfoArr *new_db_arr, char *old_pgdata, char *new_pgdata, char *old_tablespace); diff --git a/contrib/pg_upgrade/util.c b/contrib/pg_upgrade/util.c index ec18526d96..ce17aa0d47 100644 --- a/contrib/pg_upgrade/util.c +++ b/contrib/pg_upgrade/util.c @@ -82,7 +82,7 @@ prep_status(const char *fmt,...) static -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 0))) +pg_attribute_printf(2, 0) void pg_log_v(eLogType type, const char *fmt, va_list ap) { diff --git a/contrib/pg_xlogdump/pg_xlogdump.c b/contrib/pg_xlogdump/pg_xlogdump.c index c471267fde..15805be294 100644 --- a/contrib/pg_xlogdump/pg_xlogdump.c +++ b/contrib/pg_xlogdump/pg_xlogdump.c @@ -69,7 +69,7 @@ typedef struct XLogDumpStats static void fatal_error(const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); +pg_attribute_printf(1, 2); /* * Big red button to push when things go horribly wrong. diff --git a/contrib/pgcrypto/px.h b/contrib/pgcrypto/px.h index a01a58e29c..297747c60a 100644 --- a/contrib/pgcrypto/px.h +++ b/contrib/pgcrypto/px.h @@ -208,7 +208,7 @@ void px_memset(void *ptr, int c, size_t len); #ifdef PX_DEBUG void px_debug(const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); +pg_attribute_printf(1, 2); #else #define px_debug(...) #endif diff --git a/contrib/seg/segscan.l b/contrib/seg/segscan.l index a3e685488a..5fe4a2c453 100644 --- a/contrib/seg/segscan.l +++ b/contrib/seg/segscan.l @@ -59,7 +59,7 @@ float ({integer}|{real})([eE]{integer})? %% -void __attribute__((noreturn)) +void pg_attribute_noreturn yyerror(SEG *result, const char *message) { if (*yytext == YY_END_OF_BUFFER_CHAR) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index fb4a2ddfcf..4a51defc52 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -36,7 +36,7 @@ static void report_invalid_record(XLogReaderState *state, 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); static void ResetDecoder(XLogReaderState *state); diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 77158c1e8f..ee556f3600 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -286,8 +286,8 @@ int AutovacuumLauncherPid = 0; static pid_t avlauncher_forkexec(void); static pid_t avworker_forkexec(void); #endif -NON_EXEC_STATIC void AutoVacWorkerMain(int argc, char *argv[]) __attribute__((noreturn)); -NON_EXEC_STATIC void AutoVacLauncherMain(int argc, char *argv[]) __attribute__((noreturn)); +NON_EXEC_STATIC void AutoVacWorkerMain(int argc, char *argv[]) pg_attribute_noreturn; +NON_EXEC_STATIC void AutoVacLauncherMain(int argc, char *argv[]) pg_attribute_noreturn; static Oid do_start_worker(void); static void launcher_determine_sleep(bool canlaunch, bool recursing, diff --git a/src/backend/postmaster/pgarch.c b/src/backend/postmaster/pgarch.c index 9b689af915..800ae9362f 100644 --- a/src/backend/postmaster/pgarch.c +++ b/src/backend/postmaster/pgarch.c @@ -86,7 +86,7 @@ static volatile sig_atomic_t ready_to_stop = false; static pid_t pgarch_forkexec(void); #endif -NON_EXEC_STATIC void PgArchiverMain(int argc, char *argv[]) __attribute__((noreturn)); +NON_EXEC_STATIC void PgArchiverMain(int argc, char *argv[]) pg_attribute_noreturn; static void pgarch_exit(SIGNAL_ARGS); static void ArchSigHupHandler(SIGNAL_ARGS); static void ArchSigTermHandler(SIGNAL_ARGS); diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index 1148e29090..abdfe8947a 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -251,7 +251,7 @@ static instr_time total_func_time; static pid_t pgstat_forkexec(void); #endif -NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) __attribute__((noreturn)); +NON_EXEC_STATIC void PgstatCollectorMain(int argc, char *argv[]) pg_attribute_noreturn; static void pgstat_exit(SIGNAL_ARGS); static void pgstat_beshutdown_hook(int code, Datum arg); static void pgstat_sighup_handler(SIGNAL_ARGS); diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c index ac431e5dd5..9b2e7f310c 100644 --- a/src/backend/postmaster/postmaster.c +++ b/src/backend/postmaster/postmaster.c @@ -380,8 +380,8 @@ static void LogChildExit(int lev, const char *procname, int pid, int exitstatus); static void PostmasterStateMachine(void); static void BackendInitialize(Port *port); -static void BackendRun(Port *port) __attribute__((noreturn)); -static void ExitPostmaster(int status) __attribute__((noreturn)); +static void BackendRun(Port *port) pg_attribute_noreturn; +static void ExitPostmaster(int status) pg_attribute_noreturn; static int ServerLoop(void); static int BackendStartup(Port *port); static int ProcessStartupPacket(Port *port, bool SSLdone); diff --git a/src/backend/postmaster/syslogger.c b/src/backend/postmaster/syslogger.c index 14ff1477c1..a27401f370 100644 --- a/src/backend/postmaster/syslogger.c +++ b/src/backend/postmaster/syslogger.c @@ -130,7 +130,7 @@ static volatile sig_atomic_t rotation_requested = false; static pid_t syslogger_forkexec(void); static void syslogger_parseArgs(int argc, char *argv[]); #endif -NON_EXEC_STATIC void SysLoggerMain(int argc, char *argv[]) __attribute__((noreturn)); +NON_EXEC_STATIC void SysLoggerMain(int argc, char *argv[]) pg_attribute_noreturn; static void process_pipe_input(char *logbuffer, int *bytes_in_logbuffer); static void flush_pipe_input(char *logbuffer, int *bytes_in_logbuffer); static void open_csvlogfile(void); diff --git a/src/backend/replication/repl_scanner.l b/src/backend/replication/repl_scanner.l index 449c127e18..9abe475842 100644 --- a/src/backend/replication/repl_scanner.l +++ b/src/backend/replication/repl_scanner.l @@ -205,7 +205,7 @@ addlitchar(unsigned char ychar) appendStringInfoChar(&litbuf, ychar); } -void __attribute__((noreturn)) +void pg_attribute_noreturn yyerror(const char *message) { ereport(ERROR, diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index af5c1cc3ba..295611913a 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -193,7 +193,7 @@ typedef void (*WalSndSendDataCallback) (void); static void WalSndLoop(WalSndSendDataCallback send_data); static void InitWalSenderSlot(void); static void WalSndKill(int code, Datum arg); -static void WalSndShutdown(void) __attribute__((noreturn)); +static void WalSndShutdown(void) pg_attribute_noreturn; static void XLogSendPhysical(void); static void XLogSendLogical(void); static void WalSndDone(WalSndSendDataCallback send_data); diff --git a/src/backend/utils/error/elog.c b/src/backend/utils/error/elog.c index 4e0cc30f1c..b952c7c98e 100644 --- a/src/backend/utils/error/elog.c +++ b/src/backend/utils/error/elog.c @@ -86,7 +86,7 @@ static const char * err_gettext(const char *str) /* This extension allows gcc to check the format string for consistency with the supplied arguments. */ -__attribute__((format_arg(1))); +pg_attribute_format_arg(1); static void set_errdata_field(MemoryContextData *cxt, char **ptr, const char *str); /* Global variables */ diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c index 0da1981e38..6eaab4352a 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -132,7 +132,7 @@ char *GUC_check_errhint_string; static void do_serialize(char **destptr, Size *maxbytes, const char *fmt,...) /* This lets gcc check the format string for consistency. */ -__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); +pg_attribute_printf(3, 4); static void set_config_sourcefile(const char *name, char *sourcefile, int sourceline); diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c index 789fe8f25a..052caffe8d 100644 --- a/src/bin/pg_ctl/pg_ctl.c +++ b/src/bin/pg_ctl/pg_ctl.c @@ -120,7 +120,7 @@ static 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); static void do_advice(void); static void do_help(void); static void set_mode(char *modeopt); diff --git a/src/bin/pg_dump/parallel.c b/src/bin/pg_dump/parallel.c index 1bf76114c0..f58f96b063 100644 --- a/src/bin/pg_dump/parallel.c +++ b/src/bin/pg_dump/parallel.c @@ -81,7 +81,7 @@ static ParallelSlot *GetMyPSlot(ParallelState *pstate); static void parallel_msg_master(ParallelSlot *slot, const char *modulename, const char *fmt, va_list ap) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0))); +pg_attribute_printf(3, 0); static void archive_close_connection(int code, void *arg); static void ShutdownWorkersHard(ParallelState *pstate); static void WaitForTerminatingWorkers(ParallelState *pstate); diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index a936ff81b9..d484236c4f 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -280,7 +280,7 @@ extern void archputs(const char *s, Archive *AH); extern int archprintf(Archive *AH, const char *fmt,...) /* This extension allows gcc to check the format string */ -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); #define appendStringLiteralAH(buf,str,AH) \ appendStringLiteral(buf, str, (AH)->encoding, (AH)->std_strings) diff --git a/src/bin/pg_dump/pg_backup_archiver.h b/src/bin/pg_dump/pg_backup_archiver.h index 144027ce97..620ada53f1 100644 --- a/src/bin/pg_dump/pg_backup_archiver.h +++ b/src/bin/pg_dump/pg_backup_archiver.h @@ -378,7 +378,7 @@ struct _tocEntry extern int parallel_restore(struct ParallelArgs *args); extern void on_exit_close_archive(Archive *AHX); -extern void warn_or_exit_horribly(ArchiveHandle *AH, const char *modulename, const char *fmt,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); +extern void warn_or_exit_horribly(ArchiveHandle *AH, const char *modulename, const char *fmt,...) pg_attribute_printf(3, 4); extern void WriteTOC(ArchiveHandle *AH); extern void ReadTOC(ArchiveHandle *AH); @@ -429,8 +429,8 @@ extern int ReconnectToServer(ArchiveHandle *AH, const char *dbname, const char * extern void DropBlobIfExists(ArchiveHandle *AH, Oid oid); void ahwrite(const void *ptr, size_t size, size_t nmemb, ArchiveHandle *AH); -int ahprintf(ArchiveHandle *AH, const char *fmt,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +int ahprintf(ArchiveHandle *AH, const char *fmt,...) pg_attribute_printf(2, 3); -void ahlog(ArchiveHandle *AH, int level, const char *fmt,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); +void ahlog(ArchiveHandle *AH, int level, const char *fmt,...) pg_attribute_printf(3, 4); #endif diff --git a/src/bin/pg_dump/pg_backup_tar.c b/src/bin/pg_dump/pg_backup_tar.c index f48d3696b3..309b4b53db 100644 --- a/src/bin/pg_dump/pg_backup_tar.c +++ b/src/bin/pg_dump/pg_backup_tar.c @@ -115,7 +115,7 @@ static void tarClose(ArchiveHandle *AH, TAR_MEMBER *TH); #ifdef __NOT_USED__ static char *tarGets(char *buf, size_t len, TAR_MEMBER *th); #endif -static int tarPrintf(ArchiveHandle *AH, TAR_MEMBER *th, const char *fmt,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); +static int tarPrintf(ArchiveHandle *AH, TAR_MEMBER *th, const char *fmt,...) pg_attribute_printf(3, 4); static void _tarAddFile(ArchiveHandle *AH, TAR_MEMBER *th); static TAR_MEMBER *_tarPositionTo(ArchiveHandle *AH, const char *filename); diff --git a/src/bin/pg_dump/pg_backup_utils.h b/src/bin/pg_dump/pg_backup_utils.h index 1bcc1a784f..2e9a69a615 100644 --- a/src/bin/pg_dump/pg_backup_utils.h +++ b/src/bin/pg_dump/pg_backup_utils.h @@ -30,15 +30,15 @@ extern const char *progname; extern void set_dump_section(const char *arg, int *dumpSections); extern void write_msg(const char *modulename, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); extern void vwrite_msg(const char *modulename, const char *fmt, va_list ap) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 0))); +pg_attribute_printf(2, 0); extern void on_exit_nicely(on_exit_nicely_callback function, void *arg); -extern void exit_nicely(int code) __attribute__((noreturn)); +extern void exit_nicely(int code) pg_attribute_noreturn; extern void exit_horribly(const char *modulename, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3), noreturn)); +pg_attribute_printf(2, 3) pg_attribute_noreturn; #endif /* PG_BACKUP_UTILS_H */ diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h index eb14d1cd46..54266c1cb1 100644 --- a/src/bin/psql/common.h +++ b/src/bin/psql/common.h @@ -21,7 +21,7 @@ extern bool setQFout(const char *fname); extern void psql_error(const char *fmt,...) /* This lets gcc check the format string for consistency. */ -__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); +pg_attribute_printf(1, 2); extern void NoticeProcessor(void *arg, const char *message); diff --git a/src/bin/psql/large_obj.c b/src/bin/psql/large_obj.c index 709869e88a..48d2d77a5e 100644 --- a/src/bin/psql/large_obj.c +++ b/src/bin/psql/large_obj.c @@ -14,7 +14,7 @@ static void print_lo_result(const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); +pg_attribute_printf(1, 2); static void print_lo_result(const char *fmt,...) diff --git a/src/include/bootstrap/bootstrap.h b/src/include/bootstrap/bootstrap.h index f9cbc137e7..3734afb468 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 ee615ee687..a2d4a2c5c5 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 f7114c244f..33123cb504 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 63d39e5621..fdb828508e 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 231003f85c..0a2234d35a 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 c886335e85..fc0a2577f3 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 535e864e36..0e22d031f1 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 30934d3ddf..64cc8e2e7c 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 a1ab42e3da..b64651f166 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 fea1cb5e13..c9fc87b30d 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 7a3028ec3d..d369207fb3 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 7a4c12ae6c..1c743f2bc8 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 cbb7f796e1..ff30e05bfc 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 121f107387..0bd50443ae 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 81c03e4bb3..fe7c328afd 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 ce12619797..f584d85787 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 a585e6736c..60e4f50368 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 91723f7d9a..d41761fc7a 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 da1f6e9336..9a2092e5f2 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 89a535c18f..d6a05d5a20 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 de45a01f82..55de6c73e4 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 defe8f982b..4afdf91a6d 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 54fa2ba57b..7da434e798 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 944812c4c0..1f0ea7db55 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 1100923786..1477a6fe3d 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 3e17770e22..b3c705f97b 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 6b8ab3c656..3a2335523d 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 b5cfc9cbc8..a82063a57b 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 481687f25f..af52996400 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 39b318da43..bd8767520e 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 */ diff --git a/src/interfaces/ecpg/ecpglib/extern.h b/src/interfaces/ecpg/ecpglib/extern.h index ca3bf05181..1fa21fd84a 100644 --- a/src/interfaces/ecpg/ecpglib/extern.h +++ b/src/interfaces/ecpg/ecpglib/extern.h @@ -185,7 +185,7 @@ void ecpg_raise(int line, int code, const char *sqlstate, const char *str); void ecpg_raise_backend(int line, PGresult *result, PGconn *conn, int compat); char *ecpg_prepared(const char *, struct connection *); bool ecpg_deallocate_all_conn(int lineno, enum COMPAT_MODE c, struct connection * conn); -void ecpg_log(const char *format,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 1, 2))); +void ecpg_log(const char *format,...) pg_attribute_printf(1, 2); bool ecpg_auto_prepare(int, const char *, const int, char **, const char *); void ecpg_init_sqlca(struct sqlca_t * sqlca); diff --git a/src/interfaces/ecpg/include/ecpglib.h b/src/interfaces/ecpg/include/ecpglib.h index 3b8ed4c4b0..5efe59351f 100644 --- a/src/interfaces/ecpg/include/ecpglib.h +++ b/src/interfaces/ecpg/include/ecpglib.h @@ -15,7 +15,7 @@ #ifdef ENABLE_NLS extern char * ecpg_gettext(const char *msgid) -__attribute__((format_arg(1))); +pg_attribute_format_arg(1); #else #define ecpg_gettext(x) (x) #endif diff --git a/src/interfaces/ecpg/preproc/ecpg.header b/src/interfaces/ecpg/preproc/ecpg.header index a2be29c434..e23407ec8d 100644 --- a/src/interfaces/ecpg/preproc/ecpg.header +++ b/src/interfaces/ecpg/preproc/ecpg.header @@ -64,7 +64,7 @@ static struct ECPGtype ecpg_query = {ECPGt_char_variable, NULL, NULL, NULL, {NUL /* * Handle parsing errors and warnings */ -static void __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 0))) +static void pg_attribute_printf(3, 0) vmmerror(int error_code, enum errortype type, const char *error, va_list ap) { /* localize the error message string */ diff --git a/src/interfaces/ecpg/preproc/extern.h b/src/interfaces/ecpg/preproc/extern.h index dfc75bceec..1ce25ebe1b 100644 --- a/src/interfaces/ecpg/preproc/extern.h +++ b/src/interfaces/ecpg/preproc/extern.h @@ -77,8 +77,8 @@ extern int base_yylex(void); extern void base_yyerror(const char *); extern void *mm_alloc(size_t), *mm_realloc(void *, size_t); extern char *mm_strdup(const char *); -extern void mmerror(int errorcode, enum errortype type, const char *error,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 4))); -extern void mmfatal(int errorcode, const char *error,...) __attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3), noreturn)); +extern void mmerror(int errorcode, enum errortype type, const char *error,...) pg_attribute_printf(3, 4); +extern void mmfatal(int errorcode, const char *error,...) pg_attribute_printf(2, 3) pg_attribute_noreturn; extern void output_get_descr_header(char *); extern void output_get_descr(char *, char *); extern void output_set_descr_header(char *); diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 64579d2940..b9b630a222 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -548,7 +548,7 @@ extern PGresult *pqPrepareAsyncResult(PGconn *conn); extern void pqInternalNotice(const PGNoticeHooks *hooks, const char *fmt,...) /* This lets gcc check the format string for consistency. */ -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); extern void pqSaveMessageField(PGresult *res, char code, const char *value); extern void pqSaveParameterStatus(PGconn *conn, const char *name, @@ -653,10 +653,10 @@ extern ssize_t pgtls_write(PGconn *conn, const void *ptr, size_t len); #ifdef ENABLE_NLS extern char * libpq_gettext(const char *msgid) -__attribute__((format_arg(1))); +pg_attribute_format_arg(1); extern char * libpq_ngettext(const char *msgid, const char *msgid_plural, unsigned long n) -__attribute__((format_arg(1))) __attribute__((format_arg(2))); +pg_attribute_format_arg(1) pg_attribute_format_arg(2); #else #define libpq_gettext(x) (x) #define libpq_ngettext(s, p, n) ((n) == 1 ? (s) : (p)) diff --git a/src/interfaces/libpq/pqexpbuffer.c b/src/interfaces/libpq/pqexpbuffer.c index 15117a3d17..43df56a1e0 100644 --- a/src/interfaces/libpq/pqexpbuffer.c +++ b/src/interfaces/libpq/pqexpbuffer.c @@ -39,7 +39,7 @@ static const char oom_buffer[1] = ""; static bool appendPQExpBufferVA(PQExpBuffer str, const char *fmt, va_list args) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 0))); +pg_attribute_printf(2, 0); /* diff --git a/src/interfaces/libpq/pqexpbuffer.h b/src/interfaces/libpq/pqexpbuffer.h index 3598271fa9..345d20376b 100644 --- a/src/interfaces/libpq/pqexpbuffer.h +++ b/src/interfaces/libpq/pqexpbuffer.h @@ -149,7 +149,7 @@ extern int enlargePQExpBuffer(PQExpBuffer str, size_t needed); extern void printfPQExpBuffer(PQExpBuffer 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); /*------------------------ * appendPQExpBuffer @@ -161,7 +161,7 @@ __attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); extern void appendPQExpBuffer(PQExpBuffer 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); /*------------------------ * appendPQExpBufferStr diff --git a/src/interfaces/libpq/win32.c b/src/interfaces/libpq/win32.c index 4d2497afe9..04c5ed4b72 100644 --- a/src/interfaces/libpq/win32.c +++ b/src/interfaces/libpq/win32.c @@ -36,7 +36,7 @@ #ifdef ENABLE_NLS extern char * libpq_gettext(const char *msgid) -__attribute__((format_arg(1))); +pg_attribute_format_arg(1); #else #define libpq_gettext(x) (x) #endif diff --git a/src/pl/plperl/plperl.h b/src/pl/plperl/plperl.h index 89bbd7ccb0..aadb888393 100644 --- a/src/pl/plperl/plperl.h +++ b/src/pl/plperl/plperl.h @@ -30,9 +30,7 @@ * Supply a value of PERL_UNUSED_DECL that will satisfy gcc - the one * perl itself supplies doesn't seem to. */ -#if defined(__GNUC__) -#define PERL_UNUSED_DECL __attribute__ ((unused)) -#endif +#define PERL_UNUSED_DECL pg_attribute_unused /* * Sometimes perl carefully scribbles on our *printf macros. diff --git a/src/pl/plpgsql/src/pl_scanner.c b/src/pl/plpgsql/src/pl_scanner.c index ec08b02a21..f9323771e6 100644 --- a/src/pl/plpgsql/src/pl_scanner.c +++ b/src/pl/plpgsql/src/pl_scanner.c @@ -608,7 +608,7 @@ plpgsql_scanner_errposition(int location) * be misleading! */ void -__attribute__((noreturn)) +pg_attribute_noreturn plpgsql_yyerror(const char *message) { char *yytext = core_yy.scanbuf + plpgsql_yylloc; diff --git a/src/pl/plpython/plpy_elog.h b/src/pl/plpython/plpy_elog.h index 6b8d485625..e4e4dfb695 100644 --- a/src/pl/plpython/plpy_elog.h +++ b/src/pl/plpython/plpy_elog.h @@ -12,16 +12,16 @@ extern PyObject *PLy_exc_spi_error; extern void PLy_elog(int elevel, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); extern void PLy_exception_set(PyObject *exc, const char *fmt,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 3))); +pg_attribute_printf(2, 3); extern void PLy_exception_set_plural(PyObject *exc, const char *fmt_singular, const char *fmt_plural, unsigned long n,...) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 2, 5))) -__attribute__((format(PG_PRINTF_ATTRIBUTE, 3, 5))); +pg_attribute_printf(2, 5) +pg_attribute_printf(3, 5); #endif /* PLPY_ELOG_H */ diff --git a/src/test/modules/test_shm_mq/test_shm_mq.h b/src/test/modules/test_shm_mq/test_shm_mq.h index 144345b611..94d28805ff 100644 --- a/src/test/modules/test_shm_mq/test_shm_mq.h +++ b/src/test/modules/test_shm_mq/test_shm_mq.h @@ -40,6 +40,6 @@ extern void test_shm_mq_setup(int64 queue_size, int32 nworkers, shm_mq_handle **input); /* Main entrypoint for a worker. */ -extern void test_shm_mq_main(Datum) __attribute__((noreturn)); +extern void test_shm_mq_main(Datum) pg_attribute_noreturn; #endif diff --git a/src/test/modules/worker_spi/worker_spi.c b/src/test/modules/worker_spi/worker_spi.c index 94d3857364..4149c94d30 100644 --- a/src/test/modules/worker_spi/worker_spi.c +++ b/src/test/modules/worker_spi/worker_spi.c @@ -46,7 +46,7 @@ PG_MODULE_MAGIC; PG_FUNCTION_INFO_V1(worker_spi_launch); void _PG_init(void); -void worker_spi_main(Datum) __attribute__((noreturn)); +void worker_spi_main(Datum) pg_attribute_noreturn; /* flags set by signal handlers */ static volatile sig_atomic_t got_sighup = false; diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 3af0e57d4e..9d4fb9a5a5 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -135,17 +135,17 @@ static void header(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); static void status(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); static void psql_command(const char *database, const char *query,...) /* 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); #ifdef WIN32 typedef BOOL (WINAPI * __CreateRestrictedToken) (HANDLE, DWORD, DWORD, PSID_AND_ATTRIBUTES, DWORD, PLUID_AND_ATTRIBUTES, DWORD, PSID_AND_ATTRIBUTES, PHANDLE);