From 2322678e8fddbbf158b01b2720db2636404bba3b Mon Sep 17 00:00:00 2001
From: Ben Pfaff <blp@gnu.org>
Date: Sat, 4 Mar 2006 21:00:38 +0000
Subject: [PATCH] Move GCC attribute declarations from pref.h.orig to new file
 src/libpspp/compiler.h.

In many source files, #include "compiler.h" to get GCC attribute
definitions.
---
 ChangeLog                                  |  5 +++
 pref.h.orig                                | 40 ------------------
 src/ChangeLog                              |  5 +++
 src/data/casefile.c                        |  1 +
 src/data/data-in.c                         |  1 +
 src/data/dictionary.c                      |  1 +
 src/data/file-handle-def.c                 |  1 +
 src/data/format.c                          |  1 +
 src/data/por-file-reader.c                 |  1 +
 src/data/sfm-private.h                     |  2 +
 src/data/sys-file-reader.c                 |  1 +
 src/data/value-labels.c                    |  1 +
 src/data/variable.c                        |  1 +
 src/language/command.c                     |  1 +
 src/language/control/control-stack.c       |  1 +
 src/language/control/do-if.c               |  1 +
 src/language/control/loop.c                |  1 +
 src/language/data-io/data-list.c           |  1 +
 src/language/data-io/file-type.c           |  1 +
 src/language/data-io/get.c                 |  1 +
 src/language/data-io/inpt-pgm.c            |  1 +
 src/language/data-io/list.q                |  1 +
 src/language/data-io/matrix-data.c         |  1 +
 src/language/data-io/print.c               |  1 +
 src/language/dictionary/modify-variables.c |  1 +
 src/language/expressions/helpers.h         |  1 +
 src/language/lexer/q2c.c                   |  1 +
 src/language/stats/autorecode.c            |  1 +
 src/language/stats/correlations.q          |  1 +
 src/language/stats/crosstabs.q             |  1 +
 src/language/stats/descriptives.c          |  1 +
 src/language/stats/examine.q               |  1 +
 src/language/stats/frequencies.q           |  1 +
 src/language/stats/oneway.q                |  1 +
 src/language/stats/rank.q                  |  1 +
 src/language/stats/regression.q            |  1 +
 src/language/stats/t-test.q                |  1 +
 src/language/utilities/set.q               |  1 +
 src/language/xforms/count.c                |  1 +
 src/language/xforms/recode.c               |  1 +
 src/language/xforms/sample.c               |  1 +
 src/libpspp/ChangeLog                      |  4 ++
 src/libpspp/compiler.h                     | 47 ++++++++++++++++++++++
 src/libpspp/hash.c                         |  3 +-
 src/libpspp/message.h                      |  1 +
 src/libpspp/pool.h                         |  1 +
 src/libpspp/str.h                          |  1 +
 src/math/group.c                           |  1 +
 src/math/percentiles.c                     |  1 +
 src/output/ascii.c                         |  1 +
 src/output/charts/cartesian.c              |  1 +
 src/output/charts/dummy-chart.c            |  1 +
 src/output/groff-font.c                    |  1 +
 src/output/html.c                          |  1 +
 src/output/postscript.c                    |  1 +
 src/output/table.c                         |  1 +
 src/ui/terminal/main.c                     |  1 +
 57 files changed, 115 insertions(+), 41 deletions(-)
 create mode 100644 src/libpspp/compiler.h

diff --git a/ChangeLog b/ChangeLog
index 22e40403..253804ca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Sat Mar  4 12:58:34 2006  Ben Pfaff  <blp@gnu.org>
+
+	* pref.h.orig: Move GCC attribute declarations to
+	new file src/libpspp/compiler.h.
+
 Sat Mar  4 12:27:06 2006  Ben Pfaff  <blp@gnu.org>
 
 	* Smake: Require "intprops" gnulib module.
diff --git a/pref.h.orig b/pref.h.orig
index e67f4cf8..f2efb834 100644
--- a/pref.h.orig
+++ b/pref.h.orig
@@ -1,8 +1,5 @@
 /* -*- C -*- */
 
-/* Used by separable libraries to enable PSPP-specific features. */
-#define PSPP 1
-
 /*
  *
  * Debugging
@@ -19,43 +16,6 @@
 #if !HAVE_LIBPLOT
 #define NO_CHARTS 1
 #endif
-
-/* Define these if DEBUGGING is off and you want to make certain
-   additional optimizations. */
-#if !DEBUGGING
-/* #define NDEBUG 1 */			/* disable assert() sanity checks */
-#endif
-
-/* Compilers. */
-
-/* Use proper keywords. */
-#if __GNUC__ > 1 && !defined (inline)
-#define inline __inline__
-#endif
-
-/* GNU C allows the programmer to declare that certain functions take
-   printf-like arguments, never return, etc.  Conditionalize these
-   declarations on whether gcc is in use. */
-#if __GNUC__ > 1
-#define ATTRIBUTE(X) __attribute__ (X)
-
-/* Only necessary because of a wart in gnulib's xalloc.h. */
-#define __attribute__(X) __attribute__ (X)
-#else
-#define ATTRIBUTE(X)
-#endif
-
-#define UNUSED ATTRIBUTE ((unused))
-#define NO_RETURN ATTRIBUTE ((noreturn))
-#define PRINTF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (printf, FMT, FIRST)))
-#define SCANF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (scanf, FMT, FIRST)))
-
-/* This attribute was added late in the GCC 2.x cycle. */
-#if __GNUC__ > 2
-#define MALLOC_LIKE ATTRIBUTE ((malloc))
-#else
-#define MALLOC_LIKE
-#endif
 
 /* Filesystems. */
 
diff --git a/src/ChangeLog b/src/ChangeLog
index 1cf3b3e5..888271fa 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+Sat Mar  4 12:59:08 2006  Ben Pfaff  <blp@gnu.org>
+
+	* In many source files, #include "compiler.h" to get GCC attribute
+	definitions.
+
 Sat Mar  4 12:28:09 2006  Ben Pfaff  <blp@gnu.org>
 
 	* In many source files, replace INT_DIGITS by
diff --git a/src/data/casefile.c b/src/data/casefile.c
index 63b0fcd3..ef900e53 100644
--- a/src/data/casefile.c
+++ b/src/data/casefile.c
@@ -28,6 +28,7 @@
 #include <unistd.h>
 #include "alloc.h"
 #include "case.h"
+#include "compiler.h"
 #include "message.h"
 #include "full-read.h"
 #include "full-write.h"
diff --git a/src/data/data-in.c b/src/data/data-in.c
index 1502417b..aa8041d8 100644
--- a/src/data/data-in.c
+++ b/src/data/data-in.c
@@ -29,6 +29,7 @@
 #include <stdbool.h>
 #include "message.h"
 #include "calendar.h"
+#include "compiler.h"
 #include "identifier.h"
 #include "magic.h"
 #include "misc.h"
diff --git a/src/data/dictionary.c b/src/data/dictionary.c
index e0afe9bc..de529d67 100644
--- a/src/data/dictionary.c
+++ b/src/data/dictionary.c
@@ -26,6 +26,7 @@
 #include "case.h"
 #include "category.h"
 #include "cat-routines.h"
+#include "compiler.h"
 #include "message.h"
 #include "hash.h"
 #include "misc.h"
diff --git a/src/data/file-handle-def.c b/src/data/file-handle-def.c
index 25f26c9f..5ece4486 100644
--- a/src/data/file-handle-def.c
+++ b/src/data/file-handle-def.c
@@ -24,6 +24,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "alloc.h"
+#include "compiler.h"
 #include "filename.h"
 #include "message.h"
 #include "magic.h"
diff --git a/src/data/format.c b/src/data/format.c
index e88df463..d3899b43 100644
--- a/src/data/format.c
+++ b/src/data/format.c
@@ -22,6 +22,7 @@
 #include <ctype.h>
 #include "message.h"
 #include <stdlib.h>
+#include "compiler.h"
 #include "misc.h"
 #include "identifier.h"
 #include "str.h"
diff --git a/src/data/por-file-reader.c b/src/data/por-file-reader.c
index db33acf0..1ee59887 100644
--- a/src/data/por-file-reader.c
+++ b/src/data/por-file-reader.c
@@ -32,6 +32,7 @@
 #include "alloc.h"
 #include <stdbool.h>
 #include "case.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "file-handle-def.h"
 #include "format.h"
diff --git a/src/data/sfm-private.h b/src/data/sfm-private.h
index c127b85e..9e691e78 100644
--- a/src/data/sfm-private.h
+++ b/src/data/sfm-private.h
@@ -20,6 +20,8 @@
 /* PORTME: There might easily be alignment problems with some of these
    structures. */
 
+#include "compiler.h"
+
 /* This attribute might avoid some problems.  On the other hand... */
 #define P ATTRIBUTE ((packed))
 
diff --git a/src/data/sys-file-reader.c b/src/data/sys-file-reader.c
index 9a3faf6a..71fd6814 100644
--- a/src/data/sys-file-reader.c
+++ b/src/data/sys-file-reader.c
@@ -28,6 +28,7 @@
 #include <setjmp.h>
 #include "alloc.h"
 #include "case.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "file-handle-def.h"
diff --git a/src/data/value-labels.c b/src/data/value-labels.c
index 4638bd3f..dc18a707 100644
--- a/src/data/value-labels.c
+++ b/src/data/value-labels.c
@@ -22,6 +22,7 @@
 #include "message.h"
 #include <stdlib.h>
 #include "alloc.h"
+#include "compiler.h"
 #include "hash.h"
 #include "str.h"
 
diff --git a/src/data/variable.c b/src/data/variable.c
index 24363996..30ef24ca 100644
--- a/src/data/variable.c
+++ b/src/data/variable.c
@@ -22,6 +22,7 @@
 #include "message.h"
 #include <stdlib.h>
 #include "alloc.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "hash.h"
 #include "identifier.h"
diff --git a/src/language/command.c b/src/language/command.c
index 950d801f..397097ab 100644
--- a/src/language/command.c
+++ b/src/language/command.c
@@ -25,6 +25,7 @@
 #include <ctype.h>
 #include <errno.h>
 #include "alloc.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "lexer.h"
diff --git a/src/language/control/control-stack.c b/src/language/control/control-stack.c
index 9f1502c2..43f90e33 100644
--- a/src/language/control/control-stack.c
+++ b/src/language/control/control-stack.c
@@ -2,6 +2,7 @@
 #include "control-stack.h"
 #include <assert.h>
 #include <stdlib.h>
+#include "compiler.h"
 #include "message.h"
 #include "xalloc.h"
 
diff --git a/src/language/control/do-if.c b/src/language/control/do-if.c
index 35e59599..dc39e66d 100644
--- a/src/language/control/do-if.c
+++ b/src/language/control/do-if.c
@@ -23,6 +23,7 @@
 #include <stdlib.h>
 #include "alloc.h"
 #include "command.h"
+#include "compiler.h"
 #include "message.h"
 #include "expressions/public.h"
 #include "lexer.h"
diff --git a/src/language/control/loop.c b/src/language/control/loop.c
index a4d0e49c..ff38ba5f 100644
--- a/src/language/control/loop.c
+++ b/src/language/control/loop.c
@@ -22,6 +22,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "control-stack.h"
 #include "message.h"
diff --git a/src/language/data-io/data-list.c b/src/language/data-io/data-list.c
index 59830347..cd22d0cd 100644
--- a/src/language/data-io/data-list.c
+++ b/src/language/data-io/data-list.c
@@ -27,6 +27,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "data-in.h"
 #include "debug-print.h"
 #include "data-reader.h"
diff --git a/src/language/data-io/file-type.c b/src/language/data-io/file-type.c
index a021dd57..6a7e7cc2 100644
--- a/src/language/data-io/file-type.c
+++ b/src/language/data-io/file-type.c
@@ -22,6 +22,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "data-in.h"
 #include "data-reader.h"
 #include "dictionary.h"
diff --git a/src/language/data-io/get.c b/src/language/data-io/get.c
index c6ae3ed3..df31b11d 100644
--- a/src/language/data-io/get.c
+++ b/src/language/data-io/get.c
@@ -25,6 +25,7 @@
 #include "any-writer.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "file-handle.h"
diff --git a/src/language/data-io/inpt-pgm.c b/src/language/data-io/inpt-pgm.c
index 99bfb23b..875a6fdc 100644
--- a/src/language/data-io/inpt-pgm.c
+++ b/src/language/data-io/inpt-pgm.c
@@ -24,6 +24,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "data-list.h"
 #include "data-reader.h"
 #include "dictionary.h"
diff --git a/src/language/data-io/list.q b/src/language/data-io/list.q
index 18b08fee..77080a56 100644
--- a/src/language/data-io/list.q
+++ b/src/language/data-io/list.q
@@ -24,6 +24,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "intprops.h"
 #include "lexer.h"
diff --git a/src/language/data-io/matrix-data.c b/src/language/data-io/matrix-data.c
index 343e96dc..47281def 100644
--- a/src/language/data-io/matrix-data.c
+++ b/src/language/data-io/matrix-data.c
@@ -26,6 +26,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "data-in.h"
 #include "data-reader.h"
 #include "dictionary.h"
diff --git a/src/language/data-io/print.c b/src/language/data-io/print.c
index f5e857e3..2399de79 100644
--- a/src/language/data-io/print.c
+++ b/src/language/data-io/print.c
@@ -25,6 +25,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "data-writer.h"
 #include "message.h"
 #include "expressions/public.h"
diff --git a/src/language/dictionary/modify-variables.c b/src/language/dictionary/modify-variables.c
index fc91894e..6ead73dc 100644
--- a/src/language/dictionary/modify-variables.c
+++ b/src/language/dictionary/modify-variables.c
@@ -24,6 +24,7 @@
 #include "alloc.h"
 #include "bit-vector.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "hash.h"
diff --git a/src/language/expressions/helpers.h b/src/language/expressions/helpers.h
index e3813fd2..54e56bbd 100644
--- a/src/language/expressions/helpers.h
+++ b/src/language/expressions/helpers.h
@@ -10,6 +10,7 @@
 #include <math.h>
 #include <stdbool.h>
 #include "case.h"
+#include "compiler.h"
 #include "data-in.h"
 #include "dictionary.h"
 #include "message.h"
diff --git a/src/language/lexer/q2c.c b/src/language/lexer/q2c.c
index 73788706..acf08db8 100644
--- a/src/language/lexer/q2c.c
+++ b/src/language/lexer/q2c.c
@@ -28,6 +28,7 @@
 #if HAVE_UNISTD_H
 #include <unistd.h>
 #endif
+#include "compiler.h"
 #include "str.h"
 
 
diff --git a/src/language/stats/autorecode.c b/src/language/stats/autorecode.c
index 1ab48b93..1aea061f 100644
--- a/src/language/stats/autorecode.c
+++ b/src/language/stats/autorecode.c
@@ -23,6 +23,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "hash.h"
diff --git a/src/language/stats/correlations.q b/src/language/stats/correlations.q
index db1b65be..59f06e48 100644
--- a/src/language/stats/correlations.q
+++ b/src/language/stats/correlations.q
@@ -20,6 +20,7 @@
 #include <config.h>
 #include <stdlib.h>
 #include "alloc.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "file-handle-def.h"
 #include "command.h"
diff --git a/src/language/stats/crosstabs.q b/src/language/stats/crosstabs.q
index 1a6d5691..18eb26ec 100644
--- a/src/language/stats/crosstabs.q
+++ b/src/language/stats/crosstabs.q
@@ -42,6 +42,7 @@
 #include "hash.h"
 #include "pool.h"
 #include "command.h"
+#include "compiler.h"
 #include "lexer.h"
 #include "message.h"
 #include "magic.h"
diff --git a/src/language/stats/descriptives.c b/src/language/stats/descriptives.c
index fb89e90f..6704fe5d 100644
--- a/src/language/stats/descriptives.c
+++ b/src/language/stats/descriptives.c
@@ -29,6 +29,7 @@
 #include "case.h"
 #include "casefile.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "lexer.h"
 #include "message.h"
diff --git a/src/language/stats/examine.q b/src/language/stats/examine.q
index 940a4391..14981e88 100644
--- a/src/language/stats/examine.q
+++ b/src/language/stats/examine.q
@@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 #include "case.h"
 #include "dictionary.h"
 #include "command.h"
+#include "compiler.h"
 #include "lexer.h"
 #include "message.h"
 #include "magic.h"
diff --git a/src/language/stats/frequencies.q b/src/language/stats/frequencies.q
index c3b3a497..0bc6b555 100644
--- a/src/language/stats/frequencies.q
+++ b/src/language/stats/frequencies.q
@@ -32,6 +32,7 @@
 #include "alloc.h"
 #include "bit-vector.h"
 #include "case.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "hash.h"
 #include "pool.h"
diff --git a/src/language/stats/oneway.q b/src/language/stats/oneway.q
index 9cdb7db5..6c745cd1 100644
--- a/src/language/stats/oneway.q
+++ b/src/language/stats/oneway.q
@@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 #include "case.h"
 #include "dictionary.h"
 #include "command.h"
+#include "compiler.h"
 #include "lexer.h"
 #include "message.h"
 #include "magic.h"
diff --git a/src/language/stats/rank.q b/src/language/stats/rank.q
index db1feea5..a138fc8f 100644
--- a/src/language/stats/rank.q
+++ b/src/language/stats/rank.q
@@ -20,6 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 
 #include <config.h>
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "sort.h"
 #include "variable.h"
diff --git a/src/language/stats/regression.q b/src/language/stats/regression.q
index 1459628c..874e7bc2 100644
--- a/src/language/stats/regression.q
+++ b/src/language/stats/regression.q
@@ -29,6 +29,7 @@
 #include "category.h"
 #include "cat-routines.h"
 #include "command.h"
+#include "compiler.h"
 #include "design-matrix.h"
 #include "dictionary.h"
 #include "message.h"
diff --git a/src/language/stats/t-test.q b/src/language/stats/t-test.q
index d0fff3fd..fac23714 100644
--- a/src/language/stats/t-test.q
+++ b/src/language/stats/t-test.q
@@ -29,6 +29,7 @@
 #include "case.h"
 #include "casefile.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "group-proc.h"
diff --git a/src/language/utilities/set.q b/src/language/utilities/set.q
index b6b3963a..23559589 100644
--- a/src/language/utilities/set.q
+++ b/src/language/utilities/set.q
@@ -26,6 +26,7 @@
 #include <time.h>
 #include "alloc.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "line-buffer.h"
 #include "lexer.h"
diff --git a/src/language/xforms/count.c b/src/language/xforms/count.c
index e5f3991a..43576235 100644
--- a/src/language/xforms/count.c
+++ b/src/language/xforms/count.c
@@ -23,6 +23,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "lexer.h"
diff --git a/src/language/xforms/recode.c b/src/language/xforms/recode.c
index 7da3ab3a..38bb5508 100644
--- a/src/language/xforms/recode.c
+++ b/src/language/xforms/recode.c
@@ -25,6 +25,7 @@
 #include "alloc.h"
 #include "case.h"
 #include "command.h"
+#include "compiler.h"
 #include "data-in.h"
 #include "dictionary.h"
 #include "message.h"
diff --git a/src/language/xforms/sample.c b/src/language/xforms/sample.c
index 0635caa9..f0bfab98 100644
--- a/src/language/xforms/sample.c
+++ b/src/language/xforms/sample.c
@@ -24,6 +24,7 @@
 #include <math.h>
 #include "alloc.h"
 #include "command.h"
+#include "compiler.h"
 #include "message.h"
 #include "lexer.h"
 #include "random.h"
diff --git a/src/libpspp/ChangeLog b/src/libpspp/ChangeLog
index e78ba849..dea90675 100644
--- a/src/libpspp/ChangeLog
+++ b/src/libpspp/ChangeLog
@@ -1,3 +1,7 @@
+Sat Mar  4 12:59:01 2006  Ben Pfaff  <blp@gnu.org>
+
+	* compiler.h: New file.
+
 Sat Mar  4 11:55:16 2006  Ben Pfaff  <blp@gnu.org>
 
 	* str.h: Now assume that sprintf() returns the correct value.
diff --git a/src/libpspp/compiler.h b/src/libpspp/compiler.h
new file mode 100644
index 00000000..44f22b39
--- /dev/null
+++ b/src/libpspp/compiler.h
@@ -0,0 +1,47 @@
+/* PSPP - computes sample statistics.
+   Copyright (C) 2006 Free Software Foundation, Inc.
+   Written by Ben Pfaff <blp@gnu.org>.
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful, but
+   WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+   02110-1301, USA. */
+
+#ifndef COMPILER_H
+#define COMPILER_H 1
+
+/* GNU C allows the programmer to declare that certain functions take
+   printf-like arguments, never return, etc.  Conditionalize these
+   declarations on whether gcc is in use. */
+#if __GNUC__ > 1
+#define ATTRIBUTE(X) __attribute__ (X)
+
+/* Only necessary because of a wart in gnulib's xalloc.h. */
+#define __attribute__(X) __attribute__ (X)
+#else
+#define ATTRIBUTE(X)
+#endif
+
+#define UNUSED ATTRIBUTE ((unused))
+#define NO_RETURN ATTRIBUTE ((noreturn))
+#define PRINTF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (printf, FMT, FIRST)))
+#define SCANF_FORMAT(FMT, FIRST) ATTRIBUTE ((format (scanf, FMT, FIRST)))
+
+/* This attribute was added late in the GCC 2.x cycle. */
+#if __GNUC__ > 2
+#define MALLOC_LIKE ATTRIBUTE ((malloc))
+#else
+#define MALLOC_LIKE
+#endif
+
+#endif /* compiler.h */
diff --git a/src/libpspp/hash.c b/src/libpspp/hash.c
index 76503664..fcf2b1f9 100644
--- a/src/libpspp/hash.c
+++ b/src/libpspp/hash.c
@@ -23,10 +23,11 @@
 #include <assert.h>
 #include <ctype.h>
 #include <limits.h>
+#include <stdbool.h>
 #include <stdlib.h>
 #include "array.h"
 #include "alloc.h"
-#include <stdbool.h>
+#include "compiler.h"
 #include "misc.h"
 #include "str.h"
 
diff --git a/src/libpspp/message.h b/src/libpspp/message.h
index 8f86d0a8..7505f7b0 100644
--- a/src/libpspp/message.h
+++ b/src/libpspp/message.h
@@ -22,6 +22,7 @@
 
 #include <stdarg.h>
 #include <stdbool.h>
+#include "compiler.h"
 
 /* Message classes. */
 enum
diff --git a/src/libpspp/pool.h b/src/libpspp/pool.h
index daa866b3..4f33dfa0 100644
--- a/src/libpspp/pool.h
+++ b/src/libpspp/pool.h
@@ -21,6 +21,7 @@
 #define pool_h 1
 
 #include <stdio.h>
+#include "compiler.h"
 
 /* Maximum size of a suballocated block.  Larger blocks are allocated
    directly with malloc() to avoid memory wastage at the end of a
diff --git a/src/libpspp/str.h b/src/libpspp/str.h
index 0b50b031..7773db02 100644
--- a/src/libpspp/str.h
+++ b/src/libpspp/str.h
@@ -25,6 +25,7 @@
 #include <stdio.h>
 #include <string.h>
 
+#include "compiler.h"
 #include "memcasecmp.h"
 #include "memmem.h"
 #include "snprintf.h"
diff --git a/src/math/group.c b/src/math/group.c
index 58d5c929..07803183 100644
--- a/src/math/group.c
+++ b/src/math/group.c
@@ -20,6 +20,7 @@
 #include <config.h>
 #include <stdlib.h>
 #include "alloc.h"
+#include "compiler.h"
 #include "hash.h"
 #include "group.h"
 #include "group-proc.h"
diff --git a/src/math/percentiles.c b/src/math/percentiles.c
index 4d7b1481..372bd4ca 100644
--- a/src/math/percentiles.c
+++ b/src/math/percentiles.c
@@ -19,6 +19,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
 02110-1301, USA. */
 
 #include <config.h>
+#include "compiler.h"
 #include "factor-stats.h"
 #include "percentiles.h"
 #include "misc.h"
diff --git a/src/output/ascii.c b/src/output/ascii.c
index ffe0c045..305100af 100644
--- a/src/output/ascii.c
+++ b/src/output/ascii.c
@@ -26,6 +26,7 @@
 #include "alloc.h"
 #include "message.h"
 #include "chart.h"
+#include "compiler.h"
 #include "filename.h"
 #include "misc.h"
 #include "output.h"
diff --git a/src/output/charts/cartesian.c b/src/output/charts/cartesian.c
index 1350a155..2a9b1c5f 100644
--- a/src/output/charts/cartesian.c
+++ b/src/output/charts/cartesian.c
@@ -23,6 +23,7 @@
 #include <assert.h>
 #include "plot-chart.h"
 #include "cartesian.h"
+#include "compiler.h"
 
 
 
diff --git a/src/output/charts/dummy-chart.c b/src/output/charts/dummy-chart.c
index 963015e6..a255f237 100644
--- a/src/output/charts/dummy-chart.c
+++ b/src/output/charts/dummy-chart.c
@@ -26,6 +26,7 @@
 #include "plot-chart.h"
 #include "cartesian.h"
 #include <gsl/gsl_histogram.h>
+#include "compiler.h"
 
 
 #ifndef NO_CHARTS
diff --git a/src/output/groff-font.c b/src/output/groff-font.c
index c8014d78..5b651c4a 100644
--- a/src/output/groff-font.c
+++ b/src/output/groff-font.c
@@ -26,6 +26,7 @@
 #include <limits.h>
 #include <stdarg.h>
 #include "alloc.h"
+#include "compiler.h"
 #include "message.h"
 #include "filename.h"
 #include "getline.h"
diff --git a/src/output/html.c b/src/output/html.c
index 901c98a2..50561df7 100644
--- a/src/output/html.c
+++ b/src/output/html.c
@@ -34,6 +34,7 @@
 #endif
 
 #include "alloc.h"
+#include "compiler.h"
 #include "message.h"
 #include "filename.h"
 #include "getline.h"
diff --git a/src/output/postscript.c b/src/output/postscript.c
index f54ef168..754559ca 100644
--- a/src/output/postscript.c
+++ b/src/output/postscript.c
@@ -36,6 +36,7 @@
 
 #include "alloc.h"
 #include "bit-vector.h"
+#include "compiler.h"
 #include "message.h"
 #include "filename.h"
 #include "font.h"
diff --git a/src/output/table.c b/src/output/table.c
index 45af6411..4a8e036e 100644
--- a/src/output/table.c
+++ b/src/output/table.c
@@ -25,6 +25,7 @@
 #include <stdlib.h>
 #include "message.h"
 #include "alloc.h"
+#include "compiler.h"
 #include "format.h"
 #include "magic.h"
 #include "misc.h"
diff --git a/src/ui/terminal/main.c b/src/ui/terminal/main.c
index 0a09cda9..7712df83 100644
--- a/src/ui/terminal/main.c
+++ b/src/ui/terminal/main.c
@@ -23,6 +23,7 @@
 #include <stdio.h>
 #include "command-line.h"
 #include "command.h"
+#include "compiler.h"
 #include "dictionary.h"
 #include "message.h"
 #include "file-handle-def.h"
-- 
2.30.2