From 248fb1c6c08521bb2c1674b344c4ce8dde5197ab Mon Sep 17 00:00:00 2001 From: Joakim Gebart Date: Fri, 29 May 2015 02:37:35 +0200 Subject: [PATCH 1/7] sys/cpp11-compat: Add C++ runtime helpers cppsupport.cpp contains functions which are necessary in order to use some features of the C++ language, e.g. calling static constructors or virtual functions. TODO/Not implemented yet: - Test virtual functions - Handle exceptions (stack unwinding) - Run time type identification (RTTI) --- sys/Makefile.include | 3 + sys/cpp11-compat/cppsupport.cpp | 147 ++++++++++++++++++++++++++++++++ 2 files changed, 150 insertions(+) create mode 100644 sys/cpp11-compat/cppsupport.cpp diff --git a/sys/Makefile.include b/sys/Makefile.include index 6ee00a8b96..cedc4c608a 100644 --- a/sys/Makefile.include +++ b/sys/Makefile.include @@ -30,6 +30,9 @@ endif ifneq (,$(filter cpp11-compat,$(USEMODULE))) USEMODULE_INCLUDES += $(RIOTBASE)/sys/cpp11-compat/include + # make sure cppsupport.o is linked explicitly because __dso_handle is not + # found if it is hidden away inside a static object. + export UNDEF += $(BINDIR)cpp11-compat/cppsupport.o endif ifneq (,$(filter ng_slip,$(USEMODULE))) diff --git a/sys/cpp11-compat/cppsupport.cpp b/sys/cpp11-compat/cppsupport.cpp new file mode 100644 index 0000000000..2274b7a305 --- /dev/null +++ b/sys/cpp11-compat/cppsupport.cpp @@ -0,0 +1,147 @@ +/* + * Copyright (C) 2015 Eistec AB + * + * This file is subject to the terms and conditions of the GNU Lesser General + * Public License v2.1. See the file LICENSE in the top level directory for more + * details. + */ + +/** + * @ingroup cpp11-compat + * @{ + * + * @file + * @brief C++ runtime support functions + * + * Tested with GCC-4.9.2 and Clang-3.6 + * + * @author Joakim Gebart + */ + +#include +#include +#include + +extern "C" { +#include "panic.h" +} + +/** + * @brief DSO handle + * + * This symbol is used by dynamic shared objects to identify them, but it is + * somehow pulled in as a dependency by the compiler-generated global (static) + * constructor code. + */ +void *__dso_handle __attribute__((weak)) = NULL; + +/** + * @brief Definition of a pure virtual function + * + * Calling this function is an error. + */ +extern "C" void __cxa_pure_virtual () +{ + core_panic(123, "PURE VIRTUAL CALL"); +} + +/** + * @brief Register a function to be called by exit or when a shared library is unloaded. + * + * Not really used on an embedded system where you pull the power to shut down + * the program. + * + * This is only called by code automatically generated by the C++ compiler. + * + * @return 0 on success + * @return non-zero on failure. + */ +extern "C" int __cxa_atexit (void (*) (void *), void *, void *) +{ + /* We just pretend everything is dandy. */ + return 0; +} + +namespace __gnu_cxx { +/** + * @brief Override the G++ verbose termination handler + * + * The default implementation of __gnu_cxx::__verbose_terminate_handler comes + * with gcc and will print the name of unhandled exceptions to stderr before + * terminating the program. However, in order to get the name of the exceptions + * a large chunk of name demangling code is pulled in as well (several tens of + * kBytes!). + * + * @note Depending on the version of the compiler and what settings were used + * when building the toolchain __gnu_cxx::__verbose_terminate_handler may or may + * not be pulled in. std::abort may be used instead by default in some + * toolchains. + * + * @see http://www.webalice.it/fede.tft/cpp_on_microcontrollers_tricks/cpp_on_microcontrollers_tricks.html + */ +void __verbose_terminate_handler() +{ + core_panic(123, "UNHANDLED C++ EXCEPTION"); +} +} /* namespace __gnu_cxx */ + +/* Implementations of new and delete operators taken from public domain code + * at http://pastebin.com/7VKUuTJa (downloaded on Wed 24 Jun 2015 09:00:07 PM CEST) + * Author: Eric Agan + * The license text reads: + * > "Public domain, use however you wish. + * > "If you really need a license, consider it MIT." + */ + +/* tinynew.cpp + + Overrides operators new and delete + globally to reduce code size. + + Public domain, use however you wish. + If you really need a license, consider it MIT: + http://www.opensource.org/licenses/mit-license.php + + - Eric Agan + Elegant Invention + */ + +void* operator new(std::size_t size) { + return std::malloc(size); +} + +void* operator new[](std::size_t size) { + return std::malloc(size); +} + +void operator delete(void* ptr) noexcept { + std::free(ptr); +} + +void operator delete[](void* ptr) noexcept { + std::free(ptr); +} + +/* Optionally you can override the 'nothrow' versions as well. + This is useful if you want to catch failed allocs with your + own debug code, or keep track of heap usage for example, + rather than just eliminate exceptions. + */ + +void* operator new(std::size_t size, const std::nothrow_t&) noexcept { + return std::malloc(size); +} + +void* operator new[](std::size_t size, const std::nothrow_t&) noexcept { + return std::malloc(size); +} + +void operator delete(void* ptr, const std::nothrow_t&) noexcept { + std::free(ptr); +} + +void operator delete[](void* ptr, const std::nothrow_t&) noexcept { + std::free(ptr); +} + +/** @} */ From 62b14356463a7d6776bdfca66f4e0df76ebc94f9 Mon Sep 17 00:00:00 2001 From: Joakim Gebart Date: Thu, 25 Jun 2015 09:21:55 +0200 Subject: [PATCH 2/7] cortexm: Remove __dso_handle from startup.c in favour of sys/cpp11-compat/cppsupport.cpp --- cpu/cortexm_common/vectors_cortexm.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/cpu/cortexm_common/vectors_cortexm.c b/cpu/cortexm_common/vectors_cortexm.c index 9fab189ae2..542c6b3d60 100644 --- a/cpu/cortexm_common/vectors_cortexm.c +++ b/cpu/cortexm_common/vectors_cortexm.c @@ -48,11 +48,6 @@ extern uint32_t _estack; */ #define STACK_CANARY_WORD 0xE7FEE7FEu -/** - * @brief Required by g++ cross compiler - */ -void *__dso_handle; - /** * @brief Pre-start routine for CPU-specific settings */ From d670d6eb5146204c0fc9f81813ba2a76e949a239 Mon Sep 17 00:00:00 2001 From: Joakim Gebart Date: Wed, 3 Jun 2015 07:18:25 +0200 Subject: [PATCH 3/7] sys/cpp11-compat: condition variable: fix includes --- sys/cpp11-compat/condition_variable.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sys/cpp11-compat/condition_variable.cpp b/sys/cpp11-compat/condition_variable.cpp index 791270997a..1f2541d133 100644 --- a/sys/cpp11-compat/condition_variable.cpp +++ b/sys/cpp11-compat/condition_variable.cpp @@ -18,12 +18,12 @@ * @} */ -#include #include #include #include "irq.h" #include "sched.h" +#include "timex.h" #include "vtimer.h" #include "priority_queue.h" From 0a11d79e9d7c9477773e6cf6f1de4a407d7a975b Mon Sep 17 00:00:00 2001 From: Joakim Gebart Date: Wed, 3 Jun 2015 07:35:11 +0200 Subject: [PATCH 4/7] sys/cpp11-compat: chrono: remove unused include cstdio --- sys/cpp11-compat/include/riot/chrono.hpp | 1 - 1 file changed, 1 deletion(-) diff --git a/sys/cpp11-compat/include/riot/chrono.hpp b/sys/cpp11-compat/include/riot/chrono.hpp index 2e53c2be87..8b332e6bde 100644 --- a/sys/cpp11-compat/include/riot/chrono.hpp +++ b/sys/cpp11-compat/include/riot/chrono.hpp @@ -26,7 +26,6 @@ #define RIOT_CHRONO_HPP #include -#include #include #include "time.h" From 2e36564ea187a2fe1ca967e8b34797e60163cfb7 Mon Sep 17 00:00:00 2001 From: Joakim Gebart Date: Fri, 29 May 2015 02:43:38 +0200 Subject: [PATCH 5/7] tests/cpp11_thread: Clean up Makefile - Remove BOARD_WHITELIST - Clean up CXXFLAGS - Clean up CFLAGS - Blacklist boards where the C++ library is too large on Travis --- tests/cpp11_thread/Makefile | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/cpp11_thread/Makefile b/tests/cpp11_thread/Makefile index 49afd6a6be..93bea51fdc 100644 --- a/tests/cpp11_thread/Makefile +++ b/tests/cpp11_thread/Makefile @@ -4,22 +4,28 @@ APPLICATION = cpp11_thread # If no BOARD is found in the environment, use this default: BOARD ?= native +# ROM is overflowing for these boards when using +# gcc-arm-none-eabi-4.9.3.2015q2-1trusty1 from ppa:terry.guo/gcc-arm-embedded +# (Travis is using this PPA currently, 2015-06-23) +# Debian jessie libstdc++-arm-none-eabi-newlib-4.8.3-9+4 works fine, though. +# Remove this line if Travis is upgraded to a different toolchain which does +# not pull in all C++ locale code whenever exceptions are used. +BOARD_INSUFFICIENT_RAM := stm32f0discovery spark-core nucleo-f334 + # This has to be the absolute path to the RIOT base directory: RIOTBASE ?= $(CURDIR)/../.. # Comment this out to disable code in RIOT that does safety checking # which is not needed in a production environment but helps in the # development process: -CFLAGS += -DDEVELHELP -Wno-deprecated +CFLAGS += -DDEVELHELP # Change this to 0 show compiler invocation lines by default: QUIET ?= 1 -BOARD_WHITELIST := stm32f4discovery native - # If you want to add some extra flags when compile c++ files, add these flags # to CXXEXFLAGS variable -CXXEXFLAGS += -std=c++11 -g -O0 -Wno-deprecated +CXXEXFLAGS += -std=c++11 USEMODULE += cpp11-compat USEMODULE += vtimer From 01694161bc327f1570dc7bf182d1448908459ff3 Mon Sep 17 00:00:00 2001 From: Joakim Gebart Date: Fri, 29 May 2015 02:47:40 +0200 Subject: [PATCH 6/7] tests/cpp11_mutex: Clean up Makefile - Remove BOARD_WHITELIST - Clean up CXXFLAGS - Clean up CFLAGS - Blacklist boards where the C++ library is too large on Travis --- tests/cpp11_mutex/Makefile | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/cpp11_mutex/Makefile b/tests/cpp11_mutex/Makefile index e247ae456a..ff57b41fcd 100644 --- a/tests/cpp11_mutex/Makefile +++ b/tests/cpp11_mutex/Makefile @@ -4,22 +4,28 @@ APPLICATION = cpp11_mutex # If no BOARD is found in the environment, use this default: BOARD ?= native +# ROM is overflowing for these boards when using +# gcc-arm-none-eabi-4.9.3.2015q2-1trusty1 from ppa:terry.guo/gcc-arm-embedded +# (Travis is using this PPA currently, 2015-06-23) +# Debian jessie libstdc++-arm-none-eabi-newlib-4.8.3-9+4 works fine, though. +# Remove this line if Travis is upgraded to a different toolchain which does +# not pull in all C++ locale code whenever exceptions are used. +BOARD_INSUFFICIENT_RAM := stm32f0discovery spark-core nucleo-f334 + # This has to be the absolute path to the RIOT base directory: RIOTBASE ?= $(CURDIR)/../.. # Comment this out to disable code in RIOT that does safety checking # which is not needed in a production environment but helps in the # development process: -CFLAGS += -DDEVELHELP -Wno-deprecated +CFLAGS += -DDEVELHELP # Change this to 0 show compiler invocation lines by default: QUIET ?= 1 -BOARD_WHITELIST := stm32f4discovery native - # If you want to add some extra flags when compile c++ files, add these flags # to CXXEXFLAGS variable -CXXEXFLAGS += -std=c++11 -g -O0 -Wno-deprecated +CXXEXFLAGS += -std=c++11 USEMODULE += cpp11-compat USEMODULE += vtimer From f3330abf8d8fdc95f309deb7162e371933bff93e Mon Sep 17 00:00:00 2001 From: Joakim Gebart Date: Fri, 29 May 2015 02:48:12 +0200 Subject: [PATCH 7/7] tests/cpp11_condition_variable: Clean up Makefile - Remove BOARD_WHITELIST - Clean up CXXFLAGS - Clean up CFLAGS - Blacklist boards where the C++ library is too large on Travis --- tests/cpp11_condition_variable/Makefile | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/cpp11_condition_variable/Makefile b/tests/cpp11_condition_variable/Makefile index 31f4446f71..8cdd04026e 100644 --- a/tests/cpp11_condition_variable/Makefile +++ b/tests/cpp11_condition_variable/Makefile @@ -4,22 +4,28 @@ APPLICATION = cpp11_condition_variable # If no BOARD is found in the environment, use this default: BOARD ?= native +# ROM is overflowing for these boards when using +# gcc-arm-none-eabi-4.9.3.2015q2-1trusty1 from ppa:terry.guo/gcc-arm-embedded +# (Travis is using this PPA currently, 2015-06-23) +# Debian jessie libstdc++-arm-none-eabi-newlib-4.8.3-9+4 works fine, though. +# Remove this line if Travis is upgraded to a different toolchain which does +# not pull in all C++ locale code whenever exceptions are used. +BOARD_INSUFFICIENT_RAM := stm32f0discovery spark-core nucleo-f334 + # This has to be the absolute path to the RIOT base directory: RIOTBASE ?= $(CURDIR)/../.. # Comment this out to disable code in RIOT that does safety checking # which is not needed in a production environment but helps in the # development process: -CFLAGS += -DDEVELHELP -Wno-deprecated +CFLAGS += -DDEVELHELP # Change this to 0 show compiler invocation lines by default: QUIET ?= 1 -BOARD_WHITELIST := stm32f4discovery native - # If you want to add some extra flags when compile c++ files, add these flags # to CXXEXFLAGS variable -CXXEXFLAGS += -std=c++11 -g -O0 -Wno-deprecated +CXXEXFLAGS += -std=c++11 USEMODULE += cpp11-compat USEMODULE += vtimer