mirror of
				https://github.com/esp8266/Arduino.git
				synced 2025-10-30 04:26:50 +03:00 
			
		
		
		
	* Use newlib libc library This change adds libcmin.a, which is created from newlib libc by selectively removing some of the object files (mostly related to heap management). The list of files is available in tools/sdk/lib/make_libcmin.sh. Files which are not needed are commented out. This change adds support for various functions which were missing, like sscanf, strftime, etc. * Fix some of the time functions * Redirect stdout to serial * Implement __putc_r * Switch to custom newlib build Built from https://github.com/igrr/newlib-xtensa using: ./configure --with-newlib --enable-multilib --disable-newlib-io-c99-formats --enable-newlib-supplied-syscalls --enable-target-optspace --program-transform-name="s&^&xtensa-lx106-elf-&" --disable-option-checking --with-target-subdir=xtensa-lx106-elf --target=xtensa-lx106-elf --enable-newlib-nano-formatted-io --enable-newlib-reent-small --prefix=path-to-arduino-core/tools/sdk/libc CROSS_CFLAGS="-DMALLOC_PROVIDED -DSIGNAL_PROVIDED -DABORT_PROVIDED" make make install * Update tests
		
			
				
	
	
		
			141 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			141 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* Provide support for both ANSI and non-ANSI environments.  */
 | |
| 
 | |
| /* Some ANSI environments are "broken" in the sense that __STDC__ cannot be
 | |
|    relied upon to have it's intended meaning.  Therefore we must use our own
 | |
|    concoction: _HAVE_STDC.  Always use _HAVE_STDC instead of __STDC__ in newlib
 | |
|    sources!
 | |
| 
 | |
|    To get a strict ANSI C environment, define macro __STRICT_ANSI__.  This will
 | |
|    "comment out" the non-ANSI parts of the ANSI header files (non-ANSI header
 | |
|    files aren't affected).  */
 | |
| 
 | |
| #ifndef	_ANSIDECL_H_
 | |
| #define	_ANSIDECL_H_
 | |
| 
 | |
| #include <newlib.h>
 | |
| #include <sys/config.h>
 | |
| 
 | |
| /* First try to figure out whether we really are in an ANSI C environment.  */
 | |
| /* FIXME: This probably needs some work.  Perhaps sys/config.h can be
 | |
|    prevailed upon to give us a clue.  */
 | |
| 
 | |
| #ifdef __STDC__
 | |
| #define _HAVE_STDC
 | |
| #endif
 | |
| 
 | |
| /*  ISO C++.  */
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| #if !(defined(_BEGIN_STD_C) && defined(_END_STD_C))
 | |
| #ifdef _HAVE_STD_CXX
 | |
| #define _BEGIN_STD_C namespace std { extern "C" {
 | |
| #define _END_STD_C  } }
 | |
| #else
 | |
| #define _BEGIN_STD_C extern "C" {
 | |
| #define _END_STD_C  }
 | |
| #endif
 | |
| #if __GNUC_PREREQ (3, 3)
 | |
| #define _NOTHROW __attribute__ ((__nothrow__))
 | |
| #else
 | |
| #define _NOTHROW throw()
 | |
| #endif
 | |
| #endif
 | |
| #else
 | |
| #define _BEGIN_STD_C
 | |
| #define _END_STD_C
 | |
| #define _NOTHROW
 | |
| #endif
 | |
| 
 | |
| #ifdef _HAVE_STDC
 | |
| #define	_PTR		void *
 | |
| #define	_AND		,
 | |
| #define	_NOARGS		void
 | |
| #define	_CONST		const
 | |
| #define	_VOLATILE	volatile
 | |
| #define	_SIGNED		signed
 | |
| #define	_DOTS		, ...
 | |
| #define _VOID void
 | |
| #ifdef __CYGWIN__
 | |
| #define	_EXFUN_NOTHROW(name, proto)	__cdecl name proto _NOTHROW
 | |
| #define	_EXFUN(name, proto)		__cdecl name proto
 | |
| #define	_EXPARM(name, proto)		(* __cdecl name) proto
 | |
| #define	_EXFNPTR(name, proto)		(__cdecl * name) proto
 | |
| #else
 | |
| #define	_EXFUN_NOTHROW(name, proto)	name proto _NOTHROW
 | |
| #define	_EXFUN(name, proto)		name proto
 | |
| #define _EXPARM(name, proto)		(* name) proto
 | |
| #define _EXFNPTR(name, proto)		(* name) proto
 | |
| #endif
 | |
| #define	_DEFUN(name, arglist, args)	name(args)
 | |
| #define	_DEFUN_VOID(name)		name(_NOARGS)
 | |
| #define _CAST_VOID (void)
 | |
| #ifndef _LONG_DOUBLE
 | |
| #define _LONG_DOUBLE long double
 | |
| #endif
 | |
| #ifndef _PARAMS
 | |
| #define _PARAMS(paramlist)		paramlist
 | |
| #endif
 | |
| #else	
 | |
| #define	_PTR		char *
 | |
| #define	_AND		;
 | |
| #define	_NOARGS
 | |
| #define	_CONST
 | |
| #define	_VOLATILE
 | |
| #define	_SIGNED
 | |
| #define	_DOTS
 | |
| #define _VOID void
 | |
| #define	_EXFUN(name, proto)		name()
 | |
| #define	_EXFUN_NOTHROW(name, proto)	name()
 | |
| #define	_DEFUN(name, arglist, args)	name arglist args;
 | |
| #define	_DEFUN_VOID(name)		name()
 | |
| #define _CAST_VOID
 | |
| #define _LONG_DOUBLE double
 | |
| #ifndef _PARAMS
 | |
| #define _PARAMS(paramlist)		()
 | |
| #endif
 | |
| #endif
 | |
| 
 | |
| /* Support gcc's __attribute__ facility.  */
 | |
| 
 | |
| #ifdef __GNUC__
 | |
| #define _ATTRIBUTE(attrs) __attribute__ (attrs)
 | |
| #else
 | |
| #define _ATTRIBUTE(attrs)
 | |
| #endif
 | |
| 
 | |
| /*  The traditional meaning of 'extern inline' for GCC is not
 | |
|   to emit the function body unless the address is explicitly
 | |
|   taken.  However this behaviour is changing to match the C99
 | |
|   standard, which uses 'extern inline' to indicate that the
 | |
|   function body *must* be emitted.  Likewise, a function declared
 | |
|   without either 'extern' or 'static' defaults to extern linkage
 | |
|   (C99 6.2.2p5), and the compiler may choose whether to use the
 | |
|   inline version or call the extern linkage version (6.7.4p6).
 | |
|   If we are using GCC, but do not have the new behaviour, we need
 | |
|   to use extern inline; if we are using a new GCC with the
 | |
|   C99-compatible behaviour, or a non-GCC compiler (which we will
 | |
|   have to hope is C99, since there is no other way to achieve the
 | |
|   effect of omitting the function if it isn't referenced) we use
 | |
|   'static inline', which c99 defines to mean more-or-less the same
 | |
|   as the Gnu C 'extern inline'.  */
 | |
| #if defined(__GNUC__) && !defined(__GNUC_STDC_INLINE__)
 | |
| /* We're using GCC, but without the new C99-compatible behaviour.  */
 | |
| #define _ELIDABLE_INLINE extern __inline__ _ATTRIBUTE ((__always_inline__))
 | |
| #else
 | |
| /* We're using GCC in C99 mode, or an unknown compiler which
 | |
|   we just have to hope obeys the C99 semantics of inline.  */
 | |
| #define _ELIDABLE_INLINE static __inline__
 | |
| #endif
 | |
| 
 | |
| #if __GNUC_PREREQ (3, 1)
 | |
| #define _NOINLINE		__attribute__ ((__noinline__))
 | |
| #define _NOINLINE_STATIC	_NOINLINE static
 | |
| #else
 | |
| /* On non-GNU compilers and GCC prior to version 3.1 the compiler can't be
 | |
|    trusted not to inline if it is static. */
 | |
| #define _NOINLINE
 | |
| #define _NOINLINE_STATIC
 | |
| #endif
 | |
| 
 | |
| #endif /* _ANSIDECL_H_ */
 |