diff options
Diffstat (limited to 'components/libc/compilers/gcc')
| -rw-r--r-- | components/libc/compilers/gcc/SConscript | 15 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/README.md | 10 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/SConscript | 28 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/libc.c | 50 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/libc.h | 28 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/libc_syms.c | 52 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/machine/time.h | 12 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/stdio.c | 80 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/newlib/syscalls.c | 335 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/partial/SConscript | 15 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/partial/mips/SConscript | 20 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/partial/mips/readme.md | 4 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/partial/mips/sys/select.h | 52 | ||||
| -rw-r--r-- | components/libc/compilers/gcc/partial/readme.md | 2 |
14 files changed, 703 insertions, 0 deletions
diff --git a/components/libc/compilers/gcc/SConscript b/components/libc/compilers/gcc/SConscript new file mode 100644 index 0000000000..4c815c49b8 --- /dev/null +++ b/components/libc/compilers/gcc/SConscript @@ -0,0 +1,15 @@ +# RT-Thread building script for bridge + +import os +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/components/libc/compilers/gcc/newlib/README.md b/components/libc/compilers/gcc/newlib/README.md new file mode 100644 index 0000000000..62172e6a55 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/README.md @@ -0,0 +1,10 @@ +# NEWLIB (GCC) porting for RT-Thread + +Please define RT_USING_LIBC and compile RT-Thread with GCC compiler. + + + +## More Information + +https://sourceware.org/newlib/libc.html#Reentrancy + diff --git a/components/libc/compilers/gcc/newlib/SConscript b/components/libc/compilers/gcc/newlib/SConscript new file mode 100644 index 0000000000..cef546e17c --- /dev/null +++ b/components/libc/compilers/gcc/newlib/SConscript @@ -0,0 +1,28 @@ +from building import * +Import('rtconfig') + +src = [] +cwd = GetCurrentDir() +group = [] +LIBS = [] +CPPDEFINES = [] +CPPPATH = [cwd] + +if rtconfig.PLATFORM == 'gcc': + if GetDepend('RT_USING_LIBC'): + CPPDEFINES += ['RT_USING_NEWLIB'] + # link with libc and libm: + # libm is a frequently used lib. Newlib is compiled with -ffunction-sections in + # recent GCC tool chains. The linker would just link in the functions that have + # been referenced. So setting this won't result in bigger text size. + LIBS += ['c', 'm'] + + src += Glob('*.c') + if GetDepend('RT_USING_MODULE') == False: + SrcRemove(src, ['libc_syms.c']) + else: + src += ['syscalls.c'] + + group = DefineGroup('libc', src, depend = [], CPPPATH = CPPPATH, CPPDEFINES = CPPDEFINES, LIBS = LIBS) + +Return('group') diff --git a/components/libc/compilers/gcc/newlib/libc.c b/components/libc/compilers/gcc/newlib/libc.c new file mode 100644 index 0000000000..9834a9a015 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/libc.c @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#include <rtthread.h> +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <sys/time.h> + +#include "libc.h" + +#ifdef RT_USING_PTHREADS +#include <pthread.h> +#endif + +int _EXFUN(putenv,(char *__string)); + +int libc_system_init(void) +{ +#if defined(RT_USING_DFS) & defined(RT_USING_DFS_DEVFS) & defined(RT_USING_CONSOLE) + rt_device_t dev_console; + + dev_console = rt_console_get_device(); + if (dev_console) + { + #if defined(RT_USING_POSIX) + libc_stdio_set_console(dev_console->parent.name, O_RDWR); + #else + libc_stdio_set_console(dev_console->parent.name, O_WRONLY); + #endif + } + + /* set PATH and HOME */ + putenv("PATH=/bin"); + putenv("HOME=/home"); +#endif + +#if defined RT_USING_PTHREADS && !defined RT_USING_COMPONENTS_INIT + pthread_system_init(); +#endif + + return 0; +} +INIT_COMPONENT_EXPORT(libc_system_init); diff --git a/components/libc/compilers/gcc/newlib/libc.h b/components/libc/compilers/gcc/newlib/libc.h new file mode 100644 index 0000000000..c470698aa6 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/libc.h @@ -0,0 +1,28 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#ifndef __RTT_LIBC_H__ +#define __RTT_LIBC_H__ + +#ifndef _EXFUN +#define _EXFUN(name, proto) name proto +#endif + +#ifdef __cplusplus +extern "C" { +#endif +int libc_system_init(void); +int libc_stdio_get_console(void); +int libc_stdio_set_console(const char* device_name, int mode); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/components/libc/compilers/gcc/newlib/libc_syms.c b/components/libc/compilers/gcc/newlib/libc_syms.c new file mode 100644 index 0000000000..aaf6980d6b --- /dev/null +++ b/components/libc/compilers/gcc/newlib/libc_syms.c @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#include <rtthread.h> +#include <rtm.h> + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +RTM_EXPORT(strcpy); +RTM_EXPORT(strncpy); +RTM_EXPORT(strlen); +RTM_EXPORT(strcat); +RTM_EXPORT(strstr); +RTM_EXPORT(strchr); +RTM_EXPORT(strcmp); +RTM_EXPORT(strtol); +RTM_EXPORT(strtoul); +RTM_EXPORT(strncmp); + +RTM_EXPORT(memcpy); +RTM_EXPORT(memcmp); +RTM_EXPORT(memmove); +RTM_EXPORT(memset); +RTM_EXPORT(memchr); + +RTM_EXPORT(putchar); +RTM_EXPORT(puts); +RTM_EXPORT(printf); +RTM_EXPORT(sprintf); +RTM_EXPORT(snprintf); + +RTM_EXPORT(fwrite); + +#include <setjmp.h> +RTM_EXPORT(longjmp); +RTM_EXPORT(setjmp); + +RTM_EXPORT(exit); +RTM_EXPORT(abort); + +RTM_EXPORT(rand); + +#include <assert.h> +RTM_EXPORT(__assert_func); diff --git a/components/libc/compilers/gcc/newlib/machine/time.h b/components/libc/compilers/gcc/newlib/machine/time.h new file mode 100644 index 0000000000..ff754d2473 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/machine/time.h @@ -0,0 +1,12 @@ +#ifndef _MACHTIME_H_ +#define _MACHTIME_H_ + +#include <rtconfig.h> +#define _CLOCKS_PER_SEC_ RT_TICK_PER_SECOND + +#ifdef __SPU__ +#include <sys/_timespec.h> +int nanosleep (const struct timespec *, struct timespec *); +#endif + +#endif /* _MACHTIME_H_ */ diff --git a/components/libc/compilers/gcc/newlib/stdio.c b/components/libc/compilers/gcc/newlib/stdio.c new file mode 100644 index 0000000000..baccafad87 --- /dev/null +++ b/components/libc/compilers/gcc/newlib/stdio.c @@ -0,0 +1,80 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2017/10/15 bernard the first version + */ +#include <stdio.h> +#include <stdlib.h> +#include <fcntl.h> +#include <rtthread.h> +#include "libc.h" + +#define STDIO_DEVICE_NAME_MAX 32 + +int _EXFUN(fileno, (FILE *)); + +static FILE* std_console = NULL; + +int libc_stdio_set_console(const char* device_name, int mode) +{ + FILE *fp; + char name[STDIO_DEVICE_NAME_MAX]; + char *file_mode; + + snprintf(name, sizeof(name) - 1, "/dev/%s", device_name); + name[STDIO_DEVICE_NAME_MAX - 1] = '\0'; + + if (mode == O_RDWR) file_mode = "r+"; + else if (mode == O_WRONLY) file_mode = "wb"; + else file_mode = "rb"; + + fp = fopen(name, file_mode); + if (fp) + { + setvbuf(fp, NULL, _IONBF, 0); + + if (std_console) + { + fclose(std_console); + std_console = NULL; + } + std_console = fp; + + if (mode == O_RDWR) + { + _GLOBAL_REENT->_stdin = std_console; + } + else + { + _GLOBAL_REENT->_stdin = NULL; + } + + if (mode == O_RDONLY) + { + _GLOBAL_REENT->_stdout = NULL; + _GLOBAL_REENT->_stderr = NULL; + } + else + { + _GLOBAL_REENT->_stdout = std_console; + _GLOBAL_REENT->_stderr = std_console; + } + + _GLOBAL_REENT->__sdidinit = 1; + } + + if (std_console) return fileno(std_console); + + return -1; +} + +int libc_stdio_get_console(void) { + if (std_console) + return fileno(std_console); + else + return -1; +} diff --git a/components/libc/compilers/gcc/newlib/syscalls.c b/components/libc/compilers/gcc/newlib/syscalls.c new file mode 100644 index 0000000000..f5a2c16ecc --- /dev/null +++ b/components/libc/compilers/gcc/newlib/syscalls.c @@ -0,0 +1,335 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-02-11 Meco Man remove _gettimeofday_r() and _times_r() + * 2020-02-13 Meco Man re-implement exit() and abort() + * 2020-02-21 Meco Man improve and beautify syscalls + * 2020-02-24 Meco Man fix bug of _isatty_r() + */ + +#include <reent.h> +#include <rtthread.h> +#include <stddef.h> +#include <unistd.h> +#include <sys/errno.h> + +#define DBG_TAG "newlib.syscalls" +#define DBG_LVL DBG_INFO +#include <rtdbg.h> + +#ifdef RT_USING_HEAP /* Memory routine */ +void *_malloc_r (struct _reent *ptr, size_t size) +{ + void* result; + + result = (void*)rt_malloc (size); + if (result == RT_NULL) + { + ptr->_errno = ENOMEM; + } + + return result; +} + +void *_realloc_r (struct _reent *ptr, void *old, size_t newlen) +{ + void* result; + + result = (void*)rt_realloc (old, newlen); + if (result == RT_NULL) + { + ptr->_errno = ENOMEM; + } + + return result; +} + +void *_calloc_r (struct _reent *ptr, size_t size, size_t len) +{ + void* result; + + result = (void*)rt_calloc (size, len); + if (result == RT_NULL) + { + ptr->_errno = ENOMEM; + } + + return result; +} + +void _free_r (struct _reent *ptr, void *addr) +{ + rt_free (addr); +} + +#else +void * +_sbrk_r(struct _reent *ptr, ptrdiff_t incr) +{ + LOG_E("Please enable RT_USING_HEAP or RT_USING_LIBC"); + RT_ASSERT(0); + return RT_NULL; +} +#endif /*RT_USING_HEAP*/ + +void __libc_init_array(void) +{ + /* we not use __libc init_aray to initialize C++ objects */ + /* __libc_init_array is ARM code, not Thumb; it will cause a hardfault. */ +} + +#ifdef RT_USING_LIBC +#include <reent.h> +#include <stdio.h> +#include "libc.h" +#ifdef RT_USING_DFS +#include <dfs_posix.h> +#endif +#ifdef RT_USING_MODULE +#include <dlmodule.h> +#endif + +/* Reentrant versions of system calls. */ + +#ifndef _REENT_ONLY +int *__errno () +{ + return _rt_errno(); +} +#endif + +int _getpid_r(struct _reent *ptr) +{ + return 0; +} + +int _close_r(struct _reent *ptr, int fd) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + return close(fd); +#endif +} + +int _execve_r(struct _reent *ptr, const char * name, char *const *argv, char *const *env) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _fcntl_r(struct _reent *ptr, int fd, int cmd, int arg) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _fork_r(struct _reent *ptr) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _fstat_r(struct _reent *ptr, int fd, struct stat *pstat) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _isatty_r(struct _reent *ptr, int fd) +{ + if (fd >=0 && fd < 3) + { + return 1; + } + else + { + return 0; + } +} + +int _kill_r(struct _reent *ptr, int pid, int sig) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +int _link_r(struct _reent *ptr, const char *old, const char *new) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +_off_t _lseek_r(struct _reent *ptr, int fd, _off_t pos, int whence) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + _off_t rc; + + rc = lseek(fd, pos, whence); + return rc; +#endif +} + +int _mkdir_r(struct _reent *ptr, const char *name, int mode) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = mkdir(name, mode); + return rc; +#endif +} + +int _open_r(struct _reent *ptr, const char *file, int flags, int mode) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = open(file, flags, mode); + return rc; +#endif +} + +_ssize_t _read_r(struct _reent *ptr, int fd, void *buf, size_t nbytes) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + _ssize_t rc; + if (libc_stdio_get_console() < 0 && fd == STDIN_FILENO) + { + LOG_W("Do not invoke standard input before initializing libc"); + return 0; + } + rc = read(fd, buf, nbytes); + return rc; +#endif +} + +int _rename_r(struct _reent *ptr, const char *old, const char *new) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = rename(old, new); + return rc; +#endif +} + +int _stat_r(struct _reent *ptr, const char *file, struct stat *pstat) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + int rc; + + rc = stat(file, pstat); + return rc; +#endif +} + +int _unlink_r(struct _reent *ptr, const char *file) +{ +#ifndef RT_USING_DFS + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#else + return unlink(file); +#endif +} + +int _wait_r(struct _reent *ptr, int *status) +{ + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +} + +_ssize_t _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes) +{ +#ifndef RT_USING_DFS +#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE) + if (STDOUT_FILENO == fd) + { + rt_device_t console; + + console = rt_console_get_device(); + if (console) return rt_device_write(console, -1, buf, nbytes); + } + + return 0; +#else + /* return "not supported" */ + ptr->_errno = ENOTSUP; + return -1; +#endif /*RT_USING_DEVICE*/ +#else + _ssize_t rc; + if (libc_stdio_get_console() < 0 && fd == STDOUT_FILENO) + { + LOG_W("Do not invoke standard output before initializing libc"); + return 0; + } + rc = write(fd, buf, nbytes); + return rc; +#endif +} + +/* for exit() and abort() */ +__attribute__ ((noreturn)) void _exit (int status) +{ + extern void __rt_libc_exit(int status); + __rt_libc_exit(status); + while(1); +} + +mode_t umask(mode_t mask) +{ + return 022; +} + +int flock(int fd, int operation) +{ + return 0; +} + +/* +These functions are implemented and replaced by the 'common/time.c' file +int _gettimeofday_r(struct _reent *ptr, struct timeval *__tp, void *__tzp); +_CLOCK_T_ _times_r(struct _reent *ptr, struct tms *ptms); +*/ + +#endif /* RT_USING_LIBC */ diff --git a/components/libc/compilers/gcc/partial/SConscript b/components/libc/compilers/gcc/partial/SConscript new file mode 100644 index 0000000000..4c815c49b8 --- /dev/null +++ b/components/libc/compilers/gcc/partial/SConscript @@ -0,0 +1,15 @@ +# RT-Thread building script for bridge + +import os +from building import * + +cwd = GetCurrentDir() +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/components/libc/compilers/gcc/partial/mips/SConscript b/components/libc/compilers/gcc/partial/mips/SConscript new file mode 100644 index 0000000000..7651233d46 --- /dev/null +++ b/components/libc/compilers/gcc/partial/mips/SConscript @@ -0,0 +1,20 @@ +from shutil import copy +from building import * + +Import('rtconfig') + +src = [] +cwd = GetCurrentDir() +CPPPATH = [cwd] +group = [] + +if rtconfig.PLATFORM == 'gcc' and ('mips' in rtconfig.PREFIX): # identify mips gcc tool chain + try: + # There is no 'sys/select.h' in tthe mips gcc toolchain; it will be copied from 'nogcc/sys/select.h' + copy("../../../common/nogcc/sys/select.h", "./sys/select.h") + except: + pass + + group = DefineGroup('libc', src, depend = [], CPPPATH = CPPPATH) + +Return('group') diff --git a/components/libc/compilers/gcc/partial/mips/readme.md b/components/libc/compilers/gcc/partial/mips/readme.md new file mode 100644 index 0000000000..a3eeb06c5d --- /dev/null +++ b/components/libc/compilers/gcc/partial/mips/readme.md @@ -0,0 +1,4 @@ +These files don't exist in the mips gcc toolchain. They will be generated by scons automatically , and **DO NOT** change them: + +- sys/select.h + diff --git a/components/libc/compilers/gcc/partial/mips/sys/select.h b/components/libc/compilers/gcc/partial/mips/sys/select.h new file mode 100644 index 0000000000..575ad3a1b5 --- /dev/null +++ b/components/libc/compilers/gcc/partial/mips/sys/select.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-07-21 Meco Man The first version + */ + +#ifndef __SYS_SELECT_H__ +#define __SYS_SELECT_H__ + +#include <rtconfig.h> +#include <sys/types.h> +#include <sys/time.h> + +#ifndef FD_SETSIZE +#define FD_SETSIZE 32 +#endif + +#ifdef SAL_USING_POSIX +#ifdef FD_SETSIZE +#undef FD_SETSIZE +#endif +#define FD_SETSIZE DFS_FD_MAX +#endif /* SAL_USING_POSIX */ + +#define NBBY 8 /* number of bits in a byte */ + +typedef long fd_mask; + +#define NFDBITS (sizeof (fd_mask) * NBBY) /* bits per mask */ +#ifndef howmany +#define howmany(x,y) (((x)+((y)-1))/(y)) +#endif + +#ifndef _SYS_TYPES_FD_SET /* MIPS */ +typedef struct _types_fd_set { + fd_mask fds_bits[howmany(FD_SETSIZE, NFDBITS)]; +} _types_fd_set; +#define fd_set _types_fd_set + +#define FD_SET(n, p) ((p)->fds_bits[(n)/NFDBITS] |= (1L << ((n) % NFDBITS))) +#define FD_CLR(n, p) ((p)->fds_bits[(n)/NFDBITS] &= ~(1L << ((n) % NFDBITS))) +#define FD_ISSET(n, p) ((p)->fds_bits[(n)/NFDBITS] & (1L << ((n) % NFDBITS))) +#define FD_ZERO(p) memset((void*)(p), 0, sizeof(*(p))) +#endif /* _SYS_TYPES_FD_SET */ + +int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout); + +#endif /* __SYS_SELECT_H__ */ diff --git a/components/libc/compilers/gcc/partial/readme.md b/components/libc/compilers/gcc/partial/readme.md new file mode 100644 index 0000000000..959fc29f35 --- /dev/null +++ b/components/libc/compilers/gcc/partial/readme.md @@ -0,0 +1,2 @@ +This folder is for some particular targets. + |
