diff src/compiler.h @ 1743:543769b89fed

[xemacs-hg @ 2003-10-14 05:02:57 by james] New compiler.h contains compiler-specific defines. Use it everywhere.
author james
date Tue, 14 Oct 2003 05:03:13 +0000
parents
children e4f996d69637
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/compiler.h	Tue Oct 14 05:03:13 2003 +0000
@@ -0,0 +1,212 @@
+/* Compiler-specific definitions for XEmacs.
+   Copyright (C) 1998-1999, 2003 Free Software Foundation, Inc.
+   Copyright (C) 1994 Richard Mlynarik.
+
+This file is part of XEmacs.
+
+XEmacs 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, or (at your option) any
+later version.
+
+XEmacs 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 XEmacs; see the file COPYING.  If not, write to
+the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA.  */
+
+/* Synched up with: not in FSF. */
+
+/* Authorship:
+
+   NOT_REACHED, DOESNT_RETURN, PRINTF_ARGS by Richard Mlynarik, c. 1994.
+   RETURN_SANS_WARNING by Martin buchholz, 1998 or 1999.
+   Many changes and improvements by Jerry James, 2003.
+     Split out of lisp.h, reorganized, and modernized.
+     {BEGIN,END}_C_DECLS, NEED_GCC, GCC_VERSION
+     ATTRIBUTE_MALLOC, ATTRIBUTE_CONST, ATTRIBUTE_PURE, UNUSED_ARG
+*/
+
+#ifndef INCLUDED_compiler_h
+#define INCLUDED_compiler_h
+
+/* Define min() and max(). (Some compilers put them in strange places that
+   won't be referenced by include files used by XEmacs, such as 'macros.h'
+   under Solaris.) */
+
+#ifndef min
+#define min(a,b) (((a) <= (b)) ? (a) : (b))
+#endif
+#ifndef max
+#define max(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+/* Regular C complains about possible clobbering of local vars NOT declared
+   as volatile if there's a longjmp() in a function.  C++ complains if such
+   vars ARE volatile; or more correctly, sans volatile no problem even when
+   you longjmp, avec volatile you get unfixable compile errors like
+
+/src/xemacs/lilfix/src/process-unix.c: In function `void
+   unix_send_process(Lisp_Object, lstream*)':
+/src/xemacs/lilfix/src/process-unix.c:1577: no matching function for call to `
+   Lisp_Object::Lisp_Object(volatile Lisp_Object&)'
+/src/xemacs/lilfix/src/lisp-union.h:32: candidates are:
+   Lisp_Object::Lisp_Object(const Lisp_Object&)
+*/
+
+#ifdef __cplusplus
+#define VOLATILE_IF_NOT_CPP
+#else
+#define VOLATILE_IF_NOT_CPP volatile
+#endif
+
+/* Avoid indentation problems when XEmacs sees the curly braces */
+#ifndef BEGIN_C_DECLS
+# ifdef __cplusplus
+#  define BEGIN_C_DECLS extern "C" {
+#  define END_C_DECLS }
+# else
+#  define BEGIN_C_DECLS
+#  define END_C_DECLS
+# endif
+#endif
+
+/* Macro simplification for non-GNU compilers */
+#ifndef __GNUC__
+#define __GNUC__            0
+#define __GNUC_MINOR__      0
+#define __GNUC_PATCHLEVEL__ 0
+#endif /* __GNUC__ */
+
+/* Simplify testing for specific GCC versions.  This also works for non-GCC
+   compilers, where GCC_VERSION is zero. */
+#ifndef NEED_GCC
+#define NEED_GCC(major,minor,patch) (major * 1000000 + minor * 1000 + patch)
+#endif /* NEED_GCC */
+#ifndef GCC_VERSION
+#define GCC_VERSION NEED_GCC (__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
+#endif /* GCC_VERSION */
+
+/* GCC < 2.6.0 could only declare one attribute per function.  In that case,
+   we define DOESNT_RETURN in preference to PRINTF_ARGS, which is only used
+   for checking args against the string spec. */
+#ifndef PRINTF_ARGS
+# if (GCC_VERSION >= NEED_GCC (2, 6, 0))
+#  define PRINTF_ARGS(string_index,first_to_check) \
+          __attribute__ ((format (printf, string_index, first_to_check)))
+# else
+#  define PRINTF_ARGS(string_index,first_to_check)
+# endif /* GNUC */
+#endif
+
+#ifndef DOESNT_RETURN
+# if (GCC_VERSION > NEED_GCC (0, 0, 0))
+#  if (GCC_VERSION >= NEED_GCC (2, 5, 0))
+#   if (GCC_VERSION < NEED_GCC (3, 0, 0))
+      /* GCC 3.2 -O3 issues complaints in Fcommand_loop_1 about no return
+	 statement if we have this definition */
+#    define RETURN_NOT_REACHED(value) DO_NOTHING
+#   endif
+#   define DOESNT_RETURN void
+#   define DECLARE_DOESNT_RETURN(decl) void decl __attribute__ ((noreturn))
+#  else /* GCC_VERSION < NEED_GCC (2, 5, 0) */
+#   define DOESNT_RETURN void volatile
+#   define DECLARE_DOESNT_RETURN(decl) void volatile decl
+#  endif /* GCC_VERSION >= NEED_GCC (2, 5, 0) */
+# else /* not gcc */
+#  define DOESNT_RETURN void
+#  define DECLARE_DOESNT_RETURN(decl) void decl
+# endif /* GCC_VERSION > NEED_GCC (0, 0, 0) */
+#endif /* DOESNT_RETURN */
+
+/* Another try to fix SunPro C compiler warnings */
+/* "end-of-loop code not reached" */
+/* "statement not reached */
+#if defined __SUNPRO_C || defined __USLC__
+#define RETURN_SANS_WARNINGS if (1) return
+#define RETURN_NOT_REACHED(value) DO_NOTHING
+#endif
+
+/* More ways to shut up compiler.  This works in Fcommand_loop_1(),
+   where there's an infinite loop in a function returning a Lisp object.
+*/
+#if defined (_MSC_VER) || defined (__SUNPRO_C) || defined (__SUNPRO_CC) || \
+  (defined (DEC_ALPHA) && defined (OSF1))
+#define DO_NOTHING_DISABLING_NO_RETURN_WARNINGS if (0) return Qnil
+#else
+#define DO_NOTHING_DISABLING_NO_RETURN_WARNINGS DO_NOTHING
+#endif
+
+#ifndef RETURN_NOT_REACHED
+#define RETURN_NOT_REACHED(value) return (value)
+#endif
+
+#ifndef RETURN_SANS_WARNINGS
+#define RETURN_SANS_WARNINGS return
+#endif
+
+#ifndef DO_NOTHING
+#define DO_NOTHING do {} while (0)
+#endif
+
+#ifndef DECLARE_NOTHING
+#define DECLARE_NOTHING struct nosuchstruct
+#endif
+
+#ifndef ATTRIBUTE_MALLOC
+# if (GCC_VERSION >= NEED_GCC (2, 96, 0))
+#  define ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
+# else
+#  define ATTRIBUTE_MALLOC
+# endif /* GCC_VERSION >= NEED_GCC (2, 96, 0) */
+#endif /* ATTRIBUTE_MALLOC */
+
+#ifndef ATTRIBUTE_PURE
+# if (GCC_VERSION >= NEED_GCC (2, 96, 0))
+#  define ATTRIBUTE_PURE __attribute__ ((pure))
+# else
+#  define ATTRIBUTE_PURE
+# endif /* GCC_VERSION >= NEED_GCC (2, 96, 0) */
+#endif /* ATTRIBUTE_PURE */
+
+#ifndef ATTRIBUTE_CONST
+# if (GCC_VERSION >= NEED_GCC (2, 5, 0))
+#  define ATTRIBUTE_CONST __attribute__ ((const))
+#  define CONST_FUNC
+# else
+#  define ATTRIBUTE_CONST
+#  define CONST_FUNC const
+# endif /* GCC_VERSION >= NEED_GCC (2, 5, 0) */
+#endif /* ATTRIBUTE_CONST */
+
+/* Unused declarations; g++ doesn't support this. */
+#ifndef UNUSED_ARG
+# if defined(__GNUC__) && !defined(__cplusplus)
+#  define UNUSED_ARG __attribute__ ((unused))
+# else
+#  define UNUSED_ARG
+# endif
+#endif /* ATTRIBUTE_UNUSED */
+
+#ifdef DEBUG_XEMACS
+#define REGISTER
+#define register
+#else
+#define REGISTER register
+#endif
+
+#if defined(HAVE_MS_WINDOWS) && defined(HAVE_SHLIB)
+# ifdef EMACS_MODULE
+#  define MODULE_API __declspec(dllimport)
+# else
+#  define MODULE_API __declspec(dllexport)
+# endif
+#else
+# define MODULE_API
+#endif
+
+#endif /* INCLUDED_compiler_h */