Browse Source
Can choose the C++ standard (C++98/11/14/17/2a) Can link with standard C++ library (libstdc++) Add support of C++ exceptions Add support of C++ RTTI Add C++ options to subsys/cpp/Kconfig Implements new and delete using k_malloc and k_free if CONFIG_HEAP_MEM_POOL_SIZE is defined Signed-off-by: Benoit Leforestier <benoit.leforestier@gmail.com>pull/10905/head
7 changed files with 233 additions and 63 deletions
@ -0,0 +1,70 @@ |
|||||||
|
# Kconfig - C++ configuration options |
||||||
|
|
||||||
|
# |
||||||
|
# Copyright (c) 2018 B. Leforestier |
||||||
|
# |
||||||
|
# SPDX-License-Identifier: Apache-2.0 |
||||||
|
# |
||||||
|
|
||||||
|
menu "C++ Options" |
||||||
|
|
||||||
|
config CPLUSPLUS |
||||||
|
bool "Enable C++ support for the application" |
||||||
|
help |
||||||
|
This option enables the use of applications built with C++. |
||||||
|
|
||||||
|
choice |
||||||
|
prompt "C++ Standard" |
||||||
|
default STD_CPP11 |
||||||
|
help |
||||||
|
C++ Standards. |
||||||
|
|
||||||
|
config STD_CPP98 |
||||||
|
bool "C++ 98" |
||||||
|
help |
||||||
|
1998 C++ standard as modified by the 2003 technical corrigendum |
||||||
|
and some later defect reports. |
||||||
|
|
||||||
|
config STD_CPP11 |
||||||
|
bool "C++ 11" |
||||||
|
help |
||||||
|
2011 C++ standard, previously known as C++0x. |
||||||
|
|
||||||
|
config STD_CPP14 |
||||||
|
bool "C++ 14" |
||||||
|
help |
||||||
|
2014 C++ standard. |
||||||
|
|
||||||
|
config STD_CPP17 |
||||||
|
bool "C++ 17" |
||||||
|
help |
||||||
|
2017 C++ standard, previously known as C++0x. |
||||||
|
|
||||||
|
config STD_CPP2A |
||||||
|
bool "C++ 2a" |
||||||
|
help |
||||||
|
Next revision of the C++ standard, which is expected to be published in 2020. |
||||||
|
|
||||||
|
endchoice |
||||||
|
|
||||||
|
config LIB_CPLUSPLUS |
||||||
|
depends on CPLUSPLUS |
||||||
|
bool "Link with STD C++ library" |
||||||
|
help |
||||||
|
Link with STD C++ Library. |
||||||
|
|
||||||
|
config EXCEPTIONS |
||||||
|
depends on CPLUSPLUS |
||||||
|
select LIB_CPLUSPLUS |
||||||
|
bool "Enable C++ exceptions support" |
||||||
|
help |
||||||
|
This option enables support of C++ exceptions. |
||||||
|
|
||||||
|
config RTTI |
||||||
|
depends on CPLUSPLUS |
||||||
|
select LIB_CPLUSPLUS |
||||||
|
bool "Enable C++ RTTI support" |
||||||
|
help |
||||||
|
This option enables support of C++ RTTI. |
||||||
|
|
||||||
|
endmenu |
@ -0,0 +1,118 @@ |
|||||||
|
/*
|
||||||
|
* Copyright (c) 2018 |
||||||
|
* |
||||||
|
* SPDX-License-Identifier: Apache-2.0 |
||||||
|
*/ |
||||||
|
|
||||||
|
#if defined(CONFIG_LIB_CPLUSPLUS) |
||||||
|
#include <new> |
||||||
|
#endif // CONFIG_LIB_CPLUSPLUS
|
||||||
|
#include <kernel.h> |
||||||
|
|
||||||
|
void* operator new(size_t size) |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
void* ptr = k_malloc(size); |
||||||
|
#if defined(__cpp_exceptions) && defined(CONFIG_LIB_CPLUSPLUS) |
||||||
|
if (!ptr) |
||||||
|
throw std::bad_alloc(); |
||||||
|
#endif |
||||||
|
return ptr; |
||||||
|
#else |
||||||
|
ARG_UNUSED(size); |
||||||
|
return NULL; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void* operator new[](size_t size) |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
void* ptr = k_malloc(size); |
||||||
|
#if defined(__cpp_exceptions) && defined(CONFIG_LIB_CPLUSPLUS) |
||||||
|
if (!ptr) |
||||||
|
throw std::bad_alloc(); |
||||||
|
#endif |
||||||
|
return ptr; |
||||||
|
#else |
||||||
|
ARG_UNUSED(size); |
||||||
|
return NULL; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void operator delete(void* ptr) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
k_free(ptr); |
||||||
|
#else |
||||||
|
ARG_UNUSED(ptr); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void operator delete[](void* ptr) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
k_free(ptr); |
||||||
|
#else |
||||||
|
ARG_UNUSED(ptr); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
#if defined(CONFIG_LIB_CPLUSPLUS) |
||||||
|
void* operator new(size_t size, const std::nothrow_t&) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
return k_malloc(size); |
||||||
|
#else |
||||||
|
ARG_UNUSED(size); |
||||||
|
return NULL; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void* operator new[](size_t size, const std::nothrow_t&) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
return k_malloc(size); |
||||||
|
#else |
||||||
|
ARG_UNUSED(size); |
||||||
|
return NULL; |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void operator delete(void* ptr, const std::nothrow_t&) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
k_free(ptr); |
||||||
|
#else |
||||||
|
ARG_UNUSED(ptr); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void operator delete[](void* ptr, const std::nothrow_t&) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
k_free(ptr); |
||||||
|
#else |
||||||
|
ARG_UNUSED(ptr); |
||||||
|
#endif |
||||||
|
} |
||||||
|
#endif // CONFIG_LIB_CPLUSPLUS
|
||||||
|
|
||||||
|
#if (__cplusplus > 201103L) |
||||||
|
void operator delete(void* ptr, size_t) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
k_free(ptr); |
||||||
|
#else |
||||||
|
ARG_UNUSED(ptr); |
||||||
|
#endif |
||||||
|
} |
||||||
|
|
||||||
|
void operator delete[](void* ptr, size_t) noexcept |
||||||
|
{ |
||||||
|
#if (CONFIG_HEAP_MEM_POOL_SIZE > 0) |
||||||
|
k_free(ptr); |
||||||
|
#else |
||||||
|
ARG_UNUSED(ptr); |
||||||
|
#endif |
||||||
|
} |
||||||
|
#endif // __cplusplus > 201103L
|
Loading…
Reference in new issue