aboutsummaryrefslogtreecommitdiff
path: root/nuttx/include/nuttx/compiler.h
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/include/nuttx/compiler.h')
-rw-r--r--nuttx/include/nuttx/compiler.h448
1 files changed, 448 insertions, 0 deletions
diff --git a/nuttx/include/nuttx/compiler.h b/nuttx/include/nuttx/compiler.h
new file mode 100644
index 000000000..733d58eec
--- /dev/null
+++ b/nuttx/include/nuttx/compiler.h
@@ -0,0 +1,448 @@
+/****************************************************************************
+ * include/nuttx/compiler.h
+ *
+ * Copyright (C) 2007-2009 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ * 3. Neither the name NuttX nor the names of its contributors may be
+ * used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
+ * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
+ * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ ****************************************************************************/
+
+#ifndef __INCLUDE_NUTTX_COMPILER_H
+#define __INCLUDE_NUTTX_COMPILER_H
+
+/****************************************************************************
+ * Included Files
+ ****************************************************************************/
+
+/****************************************************************************
+ * Definitions
+ ****************************************************************************/
+
+/* GCC-specific definitions *************************************************/
+
+#ifdef __GNUC__
+
+/* Pre-processor */
+
+# define CONFIG_CPP_HAVE_VARARGS 1 /* Supports variable argument macros */
+# define CONFIG_CPP_HAVE_WARNING 1 /* Supports #warning */
+
+/* Intriniscs */
+
+# define CONFIG_HAVE_FUNCTIONNAME 1 /* Has __FUNCTION__ */
+# define CONFIG_HAVE_FILENAME 1 /* Has __FILE__ */
+
+/* Attributes
+ *
+ * GCC supports weak symbols which can be used to reduce code size because
+ * unnecessary "weak" functions can be excluded from the link.
+ */
+
+# ifndef __CYGWIN__
+# define CONFIG_HAVE_WEAKFUNCTIONS 1
+# define weak_alias(name, aliasname) \
+ extern __typeof (name) aliasname __attribute__ ((weak, alias (#name)));
+# define weak_function __attribute__ ((weak))
+# define weak_const_function __attribute__ ((weak, __const__))
+# else
+# undef CONFIG_HAVE_WEAKFUNCTIONS
+# define weak_alias(name, aliasname)
+# define weak_function
+# define weak_const_function
+#endif
+
+/* The noreturn attribute informs GCC that the function will not return. */
+
+# define noreturn_function __attribute__ ((noreturn))
+
+/* The packed attribute informs GCC that the stucture elements are packed,
+ * ignoring other alignment rules.
+ */
+
+# define packed_struct __attribute__ ((packed))
+
+/* GCC does not support the reentrant or naked attributes */
+
+# define reentrant_function
+# define naked_function
+
+/* GCC has does not use storage classes to qualify addressing */
+
+# define FAR
+# define NEAR
+# define DSEG
+# define CODE
+
+/* Handle cases where sizeof(int) is 16-bits, sizeof(long) is 32-bits, and
+ * pointers are 16-bits.
+ */
+
+#if defined(__m32c__)
+/* Select the small, 16-bit addressing model */
+
+# define CONFIG_SMALL_MEMORY 1
+
+/* Long and int are not the same size */
+
+# define CONFIG_LONG_IS_NOT_INT 1
+
+/* Pointers and int are the same size */
+
+# undef CONFIG_PTR_IS_NOT_INT
+
+#elif defined(__AVR__)
+/* Select the small, 16-bit addressing model */
+
+# define CONFIG_SMALL_MEMORY 1
+
+/* Long and int are not the same size */
+
+# define CONFIG_LONG_IS_NOT_INT 1
+
+/* Pointers and int are the same size */
+
+# undef CONFIG_PTR_IS_NOT_INT
+
+/* Uses a 32-bit FAR pointer only from accessing data outside of the 16-bit
+ * data space.
+ */
+
+# define CONFIG_HAVE_FARPOINTER 1
+
+#elif defined(__mc68hc1x__)
+/* Select the small, 16-bit addressing model */
+
+# define CONFIG_SMALL_MEMORY 1
+
+/* Normally, mc68hc1x code is compiled with the -mshort option
+ * which results in a 16-bit integer. If -mnoshort is defined
+ * then an integer is 32-bits. GCC will defined __INT__ accordingly:
+ */
+
+# if __INT__ == 16
+/* int is 16-bits, long is 32-bits */
+
+# define CONFIG_LONG_IS_NOT_INT 1
+
+/* Pointers and int are the same size (16-bits) */
+
+# undef CONFIG_PTR_IS_NOT_INT
+#else
+/* int and long are both 32-bits */
+
+# undef CONFIG_LONG_IS_NOT_INT
+
+/* Pointers and int are NOT the same size */
+
+# define CONFIG_PTR_IS_NOT_INT 1
+#endif
+
+#else
+/* Select the large, 32-bit addressing model */
+
+# undef CONFIG_SMALL_MEMORY
+
+/* Long and int are (probably) the same size (32-bits) */
+
+# undef CONFIG_LONG_IS_NOT_INT
+
+/* Pointers and int are the same size (32-bits) */
+
+# undef CONFIG_PTR_IS_NOT_INT
+#endif
+
+/* GCC supports inlined functions */
+
+# define CONFIG_HAVE_INLINE 1
+
+/* GCC supports both types double and long long */
+
+# define CONFIG_HAVE_DOUBLE 1
+# define CONFIG_HAVE_LONG_LONG 1
+
+/* Structures and unions can be assigned and passed as values */
+
+# define CONFIG_CAN_PASS_STRUCTS 1
+
+/* SDCC-specific definitions ************************************************/
+
+#elif defined(SDCC)
+
+/* Pre-processor */
+
+# define CONFIG_CPP_HAVE_VARARGS 1 /* Supports variable argument macros */
+# define CONFIG_CPP_HAVE_WARNING 1 /* Supports #warning */
+
+/* Intriniscs */
+
+# define CONFIG_HAVE_FUNCTIONNAME 1 /* Has __FUNCTION__ */
+# define CONFIG_HAVE_FILENAME 1 /* Has __FILE__ */
+
+/* Pragmas
+ *
+ * Disable warnings for unused function arguments */
+
+# pragma disable_warning 85
+
+/* Attributes
+ *
+ * SDCC does not support weak symbols */
+
+# undef CONFIG_HAVE_WEAKFUNCTIONS
+# define weak_alias(name, aliasname)
+# define weak_function
+# define weak_const_function
+
+/* SDCC does not support the noreturn or packed attributes */
+
+# define noreturn_function
+# define packed_struct
+
+/* SDCC does support "naked" function s*/
+
+# define naked_function __naked
+
+/* The reentrant attribute informs SDCC that the function
+ * must be reentrant. In this case, SDCC will store input
+ * arguments on the stack to support reentrancy.
+ */
+
+# define reentrant_function __reentrant
+
+/* It is assumed that the system is build using the small
+ * data model with storage defaulting to internal RAM.
+ * The NEAR storage class can also be used to address data
+ * in internal RAM; FAR can be used to address data in
+ * external RAM.
+ */
+
+#if defined(__z80) || defined(__gbz80)
+# define FAR
+# define NEAR
+# define CODE
+# define DSEG
+#else
+# define FAR __xdata
+# define NEAR __data
+# define CODE __code
+# if defined(SDCC_MODEL_SMALL)
+# define DSEG __data
+# else
+# define DSEG __xdata
+# endif
+#endif
+
+/* Select small, 16-bit address model */
+
+# define CONFIG_SMALL_MEMORY 1
+
+/* Long and int are not the same size */
+
+# define CONFIG_LONG_IS_NOT_INT 1
+
+/* The generic pointer and int are not the same size
+ * (for some SDCC architectures)
+ */
+
+#if !defined(__z80) && !defined(__gbz80)
+# define CONFIG_PTR_IS_NOT_INT 1
+#endif
+
+/* SDCC does not support inline functions */
+
+# undef CONFIG_HAVE_INLINE
+# define inline
+
+/* SDCC does not support type long long or type double */
+
+# undef CONFIG_HAVE_LONG_LONG
+# undef CONFIG_HAVE_DOUBLE
+
+/* Structures and unions cannot be passed as values or used
+ * in assignments.
+ */
+
+# undef CONFIG_CAN_PASS_STRUCTS
+
+/* Zilog-specific definitions ***********************************************/
+
+#elif defined(__ZILOG__)
+
+/* At present, only the following Zilog compilers are recognized */
+
+# if !defined(__ZNEO__) && !defined(__EZ8__) && !defined(__EZ80__)
+# warning "Unrecognized Zilog compiler"
+# endif
+
+/* Pre-processor */
+
+# undef CONFIG_CPP_HAVE_VARARGS /* No variable argument macros */
+# undef CONFIG_CPP_HAVE_WARNING /* Does not support #warning */
+
+/* Intrinsics */
+
+# define CONFIG_HAVE_FUNCTIONNAME 1 /* Has __FUNCTION__ */
+# define CONFIG_HAVE_FILENAME 1 /* Has __FILE__ */
+
+/* Attributes
+ *
+ * The Zilog compiler does not support weak symbols
+ */
+
+# undef CONFIG_HAVE_WEAKFUNCTIONS
+# define weak_alias(name, aliasname)
+# define weak_function
+# define weak_const_function
+
+/* The Zilog compiler does not support the noreturn, packed, or naked attributes */
+
+# define noreturn_function
+# define packed_struct
+# define naked_function
+
+/* The Zilog compiler does not support the reentrant attribute */
+
+# define reentrant_function
+
+/* Addressing.
+ *
+ * Z16F ZNEO: Far is 24-bits; near is 16-bits of address.
+ * The supported model is (1) all code on ROM, and (2) all data
+ * and stacks in external (far) RAM.
+ * Z8Encore!: Far is 16-bits; near is 8-bits of address.
+ * The supported model is (1) all code on ROM, and (2) all data
+ * and stacks in internal (far) RAM.
+ * Z8Acclaim: In Z80 mode, all pointers are 16-bits. In ADL mode, all pointers
+ * are 24 bits.
+ */
+
+# if defined(__ZNEO__)
+# define FAR _Far
+# define NEAR _Near
+# define DSEG _Far
+# define CODE _Erom
+# undef CONFIG_SMALL_MEMORY /* Select the large, 32-bit addressing model */
+# undef CONFIG_LONG_IS_NOT_INT /* Long and int are the same size */
+# undef CONFIG_PTR_IS_NOT_INT /* FAR pointers and int are the same size */
+# elif defined(__EZ8__)
+# define FAR far
+# define NEAR near
+# define DSEG far
+# define CODE rom
+# define CONFIG_SMALL_MEMORY 1 /* Select small, 16-bit address model */
+# define CONFIG_LONG_IS_NOT_INT 1 /* Long and int are not the same size */
+# undef CONFIG_PTR_IS_NOT_INT /* FAR pointers and int are the same size */
+# elif defined(__EZ80__)
+# define FAR
+# define NEAR
+# define DSEG
+# define CODE
+# undef CONFIG_SMALL_MEMORY /* Select the large, 32-bit addressing model */
+# define CONFIG_LONG_IS_NOT_INT 1 /* Long and int are not the same size */
+# ifdef CONFIG_EZ80_Z80MODE
+# define CONFIG_PTR_IS_NOT_INT 1 /* Pointers and int are not the same size */
+# else
+# undef CONFIG_PTR_IS_NOT_INT /* Pointers and int are the same size */
+# endif
+# endif
+
+/* The Zilog compiler does not support inline functions */
+
+# undef CONFIG_HAVE_INLINE
+# define inline
+
+/* Older Zilog compilers support both types double and long long, but the size
+ * is 32-bits (same as long and single precision) so it is safer to say that
+ * they are not supported. Later versions are more ANSII compliant and
+ * simply do not support long long or double.
+ */
+
+# undef CONFIG_HAVE_DOUBLE
+# undef CONFIG_HAVE_LONG_LONG
+
+/* Structures and unions can be assigned and passed as values */
+
+# define CONFIG_CAN_PASS_STRUCTS 1
+
+/* Unknown compiler *********************************************************/
+
+#else
+
+# undef CONFIG_CPP_HAVE_VARARGS
+# undef CONFIG_CPP_HAVE_WARNING
+# undef CONFIG_HAVE_FUNCTIONNAME
+# undef CONFIG_HAVE_FILENAME
+# undef CONFIG_HAVE_WEAKFUNCTIONS
+# define weak_alias(name, aliasname)
+# define weak_function
+# define weak_const_function
+# define noreturn_function
+# define packed_struct
+# define reentrant_function
+# define naked_function
+
+
+# define FAR
+# define NEAR
+# define DSEG
+# define CODE
+
+# undef CONFIG_SMALL_MEMORY
+# undef CONFIG_LONG_IS_NOT_INT
+# undef CONFIG_PTR_IS_NOT_INT
+# undef CONFIG_HAVE_INLINE
+# define inline
+# undef CONFIG_HAVE_LONG_LONG
+# undef CONFIG_HAVE_DOUBLE
+# undef CONFIG_CAN_PASS_STRUCTS
+
+#endif
+
+/****************************************************************************
+ * Global Function Prototypes
+ ****************************************************************************/
+
+/****************************************************************************
+ * Global Function Prototypes
+ ****************************************************************************/
+
+#ifdef __cplusplus
+#define EXTERN extern "C"
+extern "C" {
+#else
+#define EXTERN extern
+#endif
+
+
+#undef EXTERN
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __INCLUDE_NUTTX_COMPILER_H */