From 154f4e2e0dbf8dea54742cea091863ea39e2961e Mon Sep 17 00:00:00 2001 From: Pavel Kirienko Date: Fri, 11 Apr 2014 02:09:43 +0400 Subject: [PATCH] STM32: libstdc++ tweaks. Code size reduced to 61k (release, -Os, LTO) with no functional changes. Shall be refactored later. --- .../stm32/test_stm32f107/Makefile | 4 +- .../stm32/test_stm32f107/src/dummy.cpp | 85 +++++++++++++++++++ 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/libuavcan_drivers/stm32/test_stm32f107/Makefile b/libuavcan_drivers/stm32/test_stm32f107/Makefile index 433059fa7a..64e0e45fbe 100644 --- a/libuavcan_drivers/stm32/test_stm32f107/Makefile +++ b/libuavcan_drivers/stm32/test_stm32f107/Makefile @@ -43,6 +43,8 @@ SERIAL_CLI_PORT_NUMBER = 2 RELEASE_OPT = -Os -fomit-frame-pointer DEBUG_OPT = -Os -g3 -#USE_OPT = -flto -u_port_lock -u_port_unlock -uchThdExit +USE_OPT = -flto -u_port_lock -u_port_unlock -u_exit -u_kill -u_getpid -uchThdExit +USE_OPT += -fno-unwind-tables -fno-stack-protector +USE_CPPOPT = -fno-threadsafe-statics include crdr_chibios/rules_stm32f105_107.mk diff --git a/libuavcan_drivers/stm32/test_stm32f107/src/dummy.cpp b/libuavcan_drivers/stm32/test_stm32f107/src/dummy.cpp index 9bc49289b2..40688fe47e 100644 --- a/libuavcan_drivers/stm32/test_stm32f107/src/dummy.cpp +++ b/libuavcan_drivers/stm32/test_stm32f107/src/dummy.cpp @@ -3,6 +3,7 @@ */ #include +#include /* * stdlibc++ workaround. @@ -48,3 +49,87 @@ void __throw_future_error(int) { std::abort(); } void __throw_bad_function_call() { std::abort(); } } + +/* + * The default pulls in 70K of garbage + */ +namespace __gnu_cxx +{ + +void __verbose_terminate_handler() +{ + std::abort(); +} + +} + +__extension__ typedef int __guard __attribute__((mode (__DI__))); + +extern "C" void __cxa_atexit(void(*)(void *), void*, void*) { } + +extern "C" int __aeabi_atexit(void*, void(*)(void*), void*) +{ + return 0; +} + +extern "C" int __cxa_guard_acquire(__guard* g) { return !*(char*)(g); } +extern "C" void __cxa_guard_release (__guard* g) { *(char *)g = 1; } +extern "C" void __cxa_guard_abort (__guard*) { } + +/* + * The default pulls in about 12K of garbage + */ +extern "C" void __cxa_pure_virtual() +{ + std::abort(); +} + + +void* operator new(size_t) +{ + std::abort(); + return reinterpret_cast(0xFFFFFFFF); +} + +void* operator new[](size_t) +{ + std::abort(); + return reinterpret_cast(0xFFFFFFFF); +} + +void operator delete(void*) +{ + std::abort(); +} + +void operator delete[](void*) +{ + std::abort(); +} + +/* + * sbrk function for getting space for malloc and friends + */ +extern "C" +{ + +extern int _end; + +caddr_t _sbrk(int incr) +{ + static unsigned char *heap = NULL; + unsigned char *prev_heap; + + if (heap == NULL) + { + heap = (unsigned char *) &_end; + } + prev_heap = heap; + /* check removed to show basic approach */ + + heap += incr; + + return (caddr_t) prev_heap; +} + +}