X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=cfg%2Fcompiler.h;h=ac60848f5da9eec2b3877e62d8ace28e1ac3847e;hb=HEAD;hp=456309427f51c74aca850ae9f41c6605fac00867;hpb=c41211f2309fd5499f0ff6768314a0a260d27d1d;p=bertos.git diff --git a/cfg/compiler.h b/cfg/compiler.h deleted file mode 100755 index 45630942..00000000 --- a/cfg/compiler.h +++ /dev/null @@ -1,438 +0,0 @@ -/*! - * \file - * - * - * \brief Additional support macros for compiler independance - * - * \version $Id$ - * \author Bernardo Innocenti - */ - -/*#* - *#* $Log$ - *#* Revision 1.4 2005/06/14 06:15:10 bernie - *#* Add X86_64 support. - *#* - *#* Revision 1.3 2005/04/12 01:37:01 bernie - *#* Metrowerks touchups from HeCo. - *#* - *#* Revision 1.2 2005/04/11 19:10:27 bernie - *#* Include top-level headers from cfg/ subdir. - *#* - *#* Revision 1.1 2005/04/11 19:04:13 bernie - *#* Move top-level headers to cfg/ subdir. - *#* - *#* Revision 1.44 2005/03/29 06:39:59 bernie - *#* setjmp.h, time_t: Remove ancient retrocompatibility; Remove MSVC double to float hack. - *#* - *#* Revision 1.43 2005/03/01 23:15:12 bernie - *#* Remove compatibility hack. - *#* - *#* Revision 1.42 2005/02/16 20:28:46 bernie - *#* Move PGM macros to mware/pgm.h - *#* - *#* Revision 1.41 2005/01/22 04:19:22 bernie - *#* MTIME_INFINITE: New constant. - *#* - *#* Revision 1.40 2005/01/20 18:46:04 aleph - *#* Add progmem datatypes; PSTR() definition. - *#*/ -#ifndef DEVLIB_COMPILER_H -#define DEVLIB_COMPILER_H - -#include - - -#if defined __GNUC__ && defined __GNUC_MINOR__ - #define GNUC_PREREQ(maj, min) \ - ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) -#else - #define GNUC_PREREQ(maj, min) 0 -#endif - -/* Some CW versions do not allow enabling C99 from the settings panel. */ -#if defined(__MWERKS__) - #pragma c99 on -#endif - -#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) - #define COMPILER_C99 1 -#else - #define COMPILER_C99 0 -#endif - - -/*! Concatenate two different preprocessor tokens (allowing macros to expand) */ -#define PP_CAT(x,y) PP_CAT__(x,y) -#define PP_CAT__(x,y) x ## y -#define PP_CAT3(x,y,z) PP_CAT(PP_CAT(x,y),z) -#define PP_CAT4(x,y,z,w) PP_CAT(PP_CAT3(x,y,z),w) -#define PP_CAT5(x,y,z,w,j) PP_CAT(PP_CAT4(x,y,z,w),j) - -/*! String-ize a token (allowing macros to expand) */ -#define PP_STRINGIZE(x) PP_STRINGIZE__(x) -#define PP_STRINGIZE__(x) #x - - -#if defined(__IAR_SYSTEMS_ICC) || defined(__IAR_SYSTEMS_ICC__) - #pragma language=extended - #define INTERRUPT(x) interrupt [x] - #define REGISTER shortad - #define INLINE /* unsupported */ - - /* - * Imported from . Unfortunately, we can't just include - * this header because it typedefs jmp_buf to be an array of chars. - * This would allow the compiler to place the buffer on an odd address. - * The CPU _should_ be able to perform word accesses to - * unaligned data, but there are *BUGS* in the 80196KC with - * some combinations of opcodes and addressing modes. One of - * these, "ST SP,[?GR]+" is used in the longjmp() implementation - * provided by the IAR compiler ANSI C library. When ?GR contains - * an odd address, surprisingly the CPU will copy the high order - * byte of the source operand (SP) in the low order byte of the - * destination operand (the memory location pointed to by ?GR). - * - * We also need to replace the library setjmp()/longjmp() with - * our own versions because the IAR implementation "forgets" to - * save the contents of local registers (?LR). - */ - struct _JMP_BUF - { - void *sp; /* Stack pointer */ - void *return_addr; /* Return address */ - int lr[6]; /* 6 local registers */ - }; - - typedef struct _JMP_BUF jmp_buf[1]; - - int setjmp(jmp_buf env); - void longjmp(jmp_buf env, int val); - - /* Fake bool support */ - #define true (1==1) - #define false (1!=1) - typedef unsigned char bool; - -#elif defined(_MSC_VER) /* Win32 emulation support */ - - /* MSVC doesn't provide . */ - #ifndef __cplusplus - #define true (1==1) - #define false (1!=1) - typedef int bool; - #endif /* !__cplusplus */ - - /* These C99 functions are oddly named in MSVCRT32.lib */ - #define snprintf _snprintf - #define vsnprintf _vsnprintf - -#elif defined(__GNUC__) - - /* Compiler features */ - #define COMPILER_VARIADIC_MACROS 1 /* Even in C++ */ - #define COMPILER_TYPEOF 1 - #define COMPILER_STATEMENT_EXPRESSIONS 1 - - /* GCC attributes */ - #define FORMAT(type,fmt,first) __attribute__((__format__(type, fmt, first))) - #define NORETURN __attribute__((__noreturn__)) - #define UNUSED_ARG(type,arg) __attribute__((__unused__)) type arg - #define UNUSED_VAR(type,name) __attribute__((__unused__)) type name - #define USED_VAR(type,name) __attribute__((__used__)) type name - #define INLINE static inline __attribute__((__always_inline__)) - #define LIKELY(x) __builtin_expect(!!(x), 1) - #define UNLIKELY(x) __builtin_expect(!!(x), 0) - #define PURE_FUNC __attribute__((pure)) - #define CONST_FUNC __attribute__((const)) - #define UNUSED_FUNC __attribute__((unused)) - #define USED_FUNC __attribute__((__used__)) - #define RESTRICT __restrict__ - #define MUST_CHECK __attribute__((warn_unused_result)) - #if GNUC_PREREQ(3,1) - #define DEPRECATED __attribute__((__deprecated__)) - #endif - - #if CPU_AVR - #include - #include - #else - /* Include some standard C89/C99 stuff */ - #include - #include - #endif - - #ifndef __cplusplus - /* - * Disallow some C++ keywords as identifiers in C programs, - * for improved portability. - */ - #pragma GCC poison new delete class template typename - #pragma GCC poison private protected public operator - #pragma GCC poison friend mutable using namespace - #pragma GCC poison cin cout cerr clog - #endif - -#elif defined(__MWERKS__) - - /* Compiler features */ - #define COMPILER_VARIADIC_MACROS 1 - #define COMPILER_TYPEOF 1 - #define COMPILER_STATEMENT_EXPRESSIONS 1 - - #define typeof __typeof__ - - #define UNUSED_ARG(type,arg) type - - #include - #include - #include - - // CodeWarrior has size_t as built-in type, but does not define this symbol. - #define _SIZE_T_DEFINED - -#else - #error unknown compiler -#endif - - -/* Defaults for compiler extensions. */ - -/*! - * \def COMPILER_VARIADIC_MACROS - * Support for macros with variable arguments. - */ -#ifndef COMPILER_VARIADIC_MACROS -#define COMPILER_VARIADIC_MACROS (COMPILER_C99 != 0) -#endif - -/*! - * \def COMPILER_TYPEOF - * Support for macros with variable arguments. - */ -#ifndef COMPILER_TYPEOF -#define COMPILER_TYPEOF 0 -#endif - -/*! - * \def COMPILER_STATEMENT_EXPRESSIONS - * Support for macros with variable arguments. - */ -#ifndef COMPILER_STATEMENT_EXPRESSIONS -#define COMPILER_STATEMENT_EXPRESSIONS 0 -#endif - -/* A few defaults for missing compiler features. */ -#ifndef INLINE -#define INLINE static inline -#endif -#ifndef NORETURN -#define NORETURN /* nothing */ -#endif -#ifndef FORMAT -#define FORMAT(type,fmt,first) /* nothing */ -#endif -#ifndef DEPRECATED -#define DEPRECATED /* nothing */ -#endif -#ifndef UNUSED_ARG -#define UNUSED_ARG(type,arg) type arg -#endif -#define UNUSED UNUSED_ARG /* OBSOLETE */ -#ifndef UNUSED_VAR -#define UNUSED_VAR(type,name) type name -#endif -#ifndef USED_VAR -#define USED_VAR(type,name) type name -#endif -#ifndef REGISTER -#define REGISTER /* nothing */ -#endif -#ifndef INTERRUPT -#define INTERRUPT(x) ERROR_NOT_IMPLEMENTED -#endif -#ifndef LIKELY -#define LIKELY(x) x -#endif -#ifndef UNLIKELY -#define UNLIKELY(x) x -#endif -#ifndef PURE_FUNC -#define PURE_FUNC /* nothing */ -#endif -#ifndef CONST_FUNC -#define CONST_FUNC /* nothing */ -#endif -#ifndef UNUSED_FUNC -#define UNUSED_FUNC /* nothing */ -#endif -#ifndef USED_FUNC -#define USED_FUNC /* nothing */ -#endif -#ifndef RESTRICT -#define RESTRICT /* nothing */ -#endif -#ifndef MUST_CHECK -#define MUST_CHECK /* nothing */ -#endif - -/* Misc definitions */ -#ifndef NULL -#define NULL (void *)0 -#endif -#ifndef EOF -#define EOF (-1) -#endif - - -/* Support for hybrid C/C++ applications. */ -#ifdef __cplusplus - #define EXTERN_C extern "C" - #define EXTERN_C_BEGIN extern "C" { - #define EXTERN_C_END } -#else - #define EXTERN_C extern - #define EXTERN_C_BEGIN /* nothing */ - #define EXTERN_C_END /* nothing */ -#endif - - -#if (defined(_MSC_VER) || defined(__IAR_SYSTEMS_ICC) || defined(__IAR_SYSTEMS_ICC__)) - /*! - * \name ISO C99 fixed-size types - * - * These should be in , but many compilers lack them. - * \{ - */ - typedef signed char int8_t; - typedef unsigned char uint8_t; - typedef short int int16_t; - typedef unsigned short int uint16_t; - typedef long int int32_t; /* _WIN64 safe */ - typedef unsigned long int uint32_t; /* _WIN64 safe */ - - #ifdef _MSC_VER - typedef __int64 int64_t; - typedef unsigned __int64 uint64_t; - #else - typedef long long int64_t; - typedef unsigned long long uint64_t; - #endif - /* \} */ -#elif defined(__GNUC__) && CPU_AVR - /* avr-libc is weird... (Fixed in avr-libc-1.2, hack to be removed soon) */ - #include -#else - /* This is the correct location. */ - #include -#endif - -#if CPU_AVR_ATMEGA8 - /* - * The ATmega8 has a very small Flash, so we can't afford - * to link in support routines for 32bit integer arithmetic. - */ - typedef int16_t mtime_t; /*!< Type for time expressed in milliseconds. */ - typedef int16_t utime_t; /*!< Type for time expressed in microseconds. */ - #define SIZEOF_MTIME_T (16 / CPU_BITS_PER_CHAR) - #define SIZEOF_UTIME_T (16 / CPU_BITS_PER_CHAR) - #define MTIME_INFINITE 0x7FFFL -#else - typedef int32_t mtime_t; /*!< Type for time expressed in milliseconds. */ - typedef int32_t utime_t; /*!< Type for time expressed in microseconds. */ - #define SIZEOF_MTIME_T (32 / CPU_BITS_PER_CHAR) - #define SIZEOF_UTIME_T (32 / CPU_BITS_PER_CHAR) - #define MTIME_INFINITE 0x7FFFFFFFL -#endif - -/*! Bulk storage large enough for both pointers or integers. */ -typedef void * iptr_t; -typedef const void * const_iptr_t; - -typedef unsigned char sig_t; /*!< Type for signal bits. */ -typedef unsigned char sigmask_t; /*!< Type for signal masks. */ -typedef unsigned char page_t; /*!< Type for banked memory pages. */ - - -/*! - * \name Standard type definitions. - * - * These should be in or , but many compilers - * and C libraries lack them. - * - * We check for some common definitions to avoid redefinitions: - * - * glibc, avr-libc: _SIZE_T_DEFINED - * Darwin libc: _BSD_SIZE_T_DEFINED_ - * - * \{ - */ -#if !(defined(size_t) || defined(_SIZE_T_DEFINED) || defined(_BSD_SIZE_T_DEFINED_)) - #if CPU_REG_BITS > 32 - /* 64bit. */ - typedef unsigned long size_t; - #else - /* 32bit or 16bit. */ - typedef unsigned int size_t; - #endif -#endif - -#if !(defined(ssize_t) || defined(__ssize_t_defined)) - #if CPU_REG_BITS > 32 - /* 64bit (32bit for _WIN64). */ - typedef long ssize_t; - #else - /* 32bit or 16bit. */ - typedef int ssize_t; - #endif -#endif -/*\}*/ - - -/*! - * \name Types for hardware registers. - * - * Only use these types for registers whose contents can - * be changed asynchronously by external hardware. - * - * \{ - */ -#if CPU_DSP56K - /* Registers can be accessed only through 16-bit pointers */ - typedef volatile uint16_t reg16_t; -#else - typedef volatile uint8_t reg8_t; - typedef volatile uint16_t reg16_t; - typedef volatile uint32_t reg32_t; -#endif -/*\}*/ - - -/* Quasi-ANSI macros */ -#ifndef offsetof - /*! - * Return the byte offset of the member \a m in struct \a s. - * - * \note This macro should be defined in "stddef.h" and is sometimes - * compiler-specific (g++ has a builtin for it). - */ - #define offsetof(s,m) (size_t)&(((s *)0)->m) -#endif -#ifndef countof - /*! - * Count the number of elements in the static array \a a. - * - * \note This macro is non-standard, but implements a very common idiom - */ - #define countof(a) (sizeof(a) / sizeof(*(a))) -#endif - -/*! Issue a compilation error if the \a condition is false */ -#define STATIC_ASSERT(condition) \ - UNUSED_VAR(extern char,PP_CAT(CT_ASSERT___, __LINE__)[(condition) ? 1 : -1]) - -#endif /* DEVLIB_COMPILER_H */