mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
C++: add provisions for optional RTTI support
Ref. https://github.com/espressif/esp-idf/issues/1684 This change allows RTTI to be enabled in menuconfig. For full RTTI support, libstdc++.a in the toolchain should be built without -fno-rtti, as it is done now. Generally if libstdc++.a is built with RTTI, applications which do not use RTTI (and build with -fno-rtti) could still include typeinfo structures referenced from STL classes’ vtables. This change works around this, by moving all typeinfo structures from libstdc++.a into a non-loadable section, placed into a non-existent memory region starting at address 0. This can be done because when the application is compiled with -fno-rtti, typeinfo structures are not used at run time. This way, typeinfo structures do not contribute to the application binary size. If the application is build with RTTI support, typeinfo structures are linked into the application .rodata section as usual. Note that this commit does not actually enable RTTI support. The respective Kconfig option is hidden, and will be made visible when the toolchain is updated.
This commit is contained in:
parent
57a13b09cc
commit
3d0466ccd1
@ -22,6 +22,12 @@ else()
|
|||||||
list(APPEND cxx_compile_options "-fno-exceptions")
|
list(APPEND cxx_compile_options "-fno-exceptions")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(CONFIG_COMPILER_CXX_RTTI)
|
||||||
|
list(APPEND cxx_compile_options "-frtti")
|
||||||
|
else()
|
||||||
|
list(APPEND cxx_compile_options "-fno-rtti")
|
||||||
|
endif()
|
||||||
|
|
||||||
if(CONFIG_COMPILER_DISABLE_GCC8_WARNINGS)
|
if(CONFIG_COMPILER_DISABLE_GCC8_WARNINGS)
|
||||||
list(APPEND compile_options "-Wno-parentheses"
|
list(APPEND compile_options "-Wno-parentheses"
|
||||||
"-Wno-sizeof-pointer-memaccess"
|
"-Wno-sizeof-pointer-memaccess"
|
||||||
|
9
Kconfig
9
Kconfig
@ -149,6 +149,15 @@ mainmenu "Espressif IoT Development Framework Configuration"
|
|||||||
Size (in bytes) of the emergency memory pool for C++ exceptions. This pool will be used to allocate
|
Size (in bytes) of the emergency memory pool for C++ exceptions. This pool will be used to allocate
|
||||||
memory for thrown exceptions when there is not enough memory on the heap.
|
memory for thrown exceptions when there is not enough memory on the heap.
|
||||||
|
|
||||||
|
config COMPILER_CXX_RTTI
|
||||||
|
# Invisible option, until the toolchain with RTTI support is released.
|
||||||
|
# Use prompt "Enable C++ run-time type info (RTTI)" when updating.
|
||||||
|
bool
|
||||||
|
help
|
||||||
|
Enabling this option compiles all C++ files with RTTI support enabled.
|
||||||
|
This increases binary size (typically by tens of kB) but allows using
|
||||||
|
dynamic_cast conversion and typeid operator.
|
||||||
|
|
||||||
choice COMPILER_STACK_CHECK_MODE
|
choice COMPILER_STACK_CHECK_MODE
|
||||||
prompt "Stack smashing protection mode"
|
prompt "Stack smashing protection mode"
|
||||||
default COMPILER_STACK_CHECK_MODE_NONE
|
default COMPILER_STACK_CHECK_MODE_NONE
|
||||||
|
@ -56,6 +56,11 @@ else()
|
|||||||
target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.extram.bss.ld")
|
target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.extram.bss.ld")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if(NOT CONFIG_COMPILER_CXX_RTTI)
|
||||||
|
# This has to be linked before esp32.project.ld
|
||||||
|
target_linker_script(${COMPONENT_LIB} INTERFACE "ld/esp32.discard-rtti.ld")
|
||||||
|
endif()
|
||||||
|
|
||||||
# Process the template file through the linker script generation mechanism, and use the output for linking the
|
# Process the template file through the linker script generation mechanism, and use the output for linking the
|
||||||
# final binary
|
# final binary
|
||||||
target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/ld/esp32.project.ld.in"
|
target_linker_script(${COMPONENT_LIB} INTERFACE "${CMAKE_CURRENT_LIST_DIR}/ld/esp32.project.ld.in"
|
||||||
|
@ -9,14 +9,19 @@ ifdef CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY
|
|||||||
LINKER_SCRIPTS += esp32.extram.bss.ld
|
LINKER_SCRIPTS += esp32.extram.bss.ld
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#Linker scripts used to link the final application.
|
ifndef CONFIG_COMPILER_CXX_RTTI
|
||||||
#Warning: These linker scripts are only used when the normal app is compiled; the bootloader
|
# This linker script must come before esp32.project.ld
|
||||||
#specifies its own scripts.
|
LINKER_SCRIPTS += esp32.discard-rtti.ld
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Linker scripts used to link the final application.
|
||||||
|
# Warning: These linker scripts are only used when the normal app is compiled; the bootloader
|
||||||
|
# specifies its own scripts.
|
||||||
LINKER_SCRIPTS += $(COMPONENT_BUILD_DIR)/esp32.project.ld esp32.peripherals.ld
|
LINKER_SCRIPTS += $(COMPONENT_BUILD_DIR)/esp32.project.ld esp32.peripherals.ld
|
||||||
|
|
||||||
#ld_include_panic_highint_hdl is added as an undefined symbol because otherwise the
|
# ld_include_panic_highint_hdl is added as an undefined symbol because otherwise the
|
||||||
#linker will ignore panic_highint_hdl.S as it has no other files depending on any
|
# linker will ignore panic_highint_hdl.S as it has no other files depending on any
|
||||||
#symbols in it.
|
# symbols in it.
|
||||||
COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/ld \
|
COMPONENT_ADD_LDFLAGS += -L $(COMPONENT_PATH)/ld \
|
||||||
-T esp32_out.ld \
|
-T esp32_out.ld \
|
||||||
-u ld_include_panic_highint_hdl \
|
-u ld_include_panic_highint_hdl \
|
||||||
|
11
components/esp32/ld/esp32.discard-rtti.ld
Normal file
11
components/esp32/ld/esp32.discard-rtti.ld
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
/* This is only included if CONFIG_COMPILER_CXX_RTTI is not set, to
|
||||||
|
* move RTTI sections of libstdc++ to an unused non-loadable memory region.
|
||||||
|
*/
|
||||||
|
|
||||||
|
SECTIONS
|
||||||
|
{
|
||||||
|
.rodata.discard-rtti (NOLOAD):
|
||||||
|
{
|
||||||
|
*libstdc++.a:(.rodata._ZTI* .rodata._ZTS*)
|
||||||
|
} > discard_seg
|
||||||
|
}
|
@ -86,6 +86,11 @@ MEMORY
|
|||||||
/* external memory ,including data and text */
|
/* external memory ,including data and text */
|
||||||
extern_ram_seg(RWX) : org = 0x3F800000,
|
extern_ram_seg(RWX) : org = 0x3F800000,
|
||||||
len = 0x400000
|
len = 0x400000
|
||||||
|
|
||||||
|
/* This is not a memory range which can really be accessed; we use it as a "bitbucket"
|
||||||
|
where non-loadable sections, which aren't used at run time, can be discarded.
|
||||||
|
*/
|
||||||
|
discard_seg (R) : org = 0x00000000, len = 0x10000000
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE)
|
#if defined(CONFIG_ESP32_USE_FIXED_STATIC_RAM_SIZE)
|
||||||
|
@ -452,7 +452,6 @@ CXXFLAGS ?=
|
|||||||
EXTRA_CXXFLAGS ?=
|
EXTRA_CXXFLAGS ?=
|
||||||
CXXFLAGS := $(strip \
|
CXXFLAGS := $(strip \
|
||||||
-std=gnu++11 \
|
-std=gnu++11 \
|
||||||
-fno-rtti \
|
|
||||||
$(OPTIMIZATION_FLAGS) $(DEBUG_FLAGS) \
|
$(OPTIMIZATION_FLAGS) $(DEBUG_FLAGS) \
|
||||||
$(COMMON_FLAGS) \
|
$(COMMON_FLAGS) \
|
||||||
$(COMMON_WARNING_FLAGS) \
|
$(COMMON_WARNING_FLAGS) \
|
||||||
@ -465,6 +464,12 @@ else
|
|||||||
CXXFLAGS += -fno-exceptions
|
CXXFLAGS += -fno-exceptions
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
ifdef CONFIG_COMPILER_CXX_RTTI
|
||||||
|
CXXFLAGS += -frtti
|
||||||
|
else
|
||||||
|
CXXFLAGS += -fno-rtti
|
||||||
|
endif
|
||||||
|
|
||||||
ARFLAGS := cru
|
ARFLAGS := cru
|
||||||
|
|
||||||
export CFLAGS CPPFLAGS CXXFLAGS ARFLAGS
|
export CFLAGS CPPFLAGS CXXFLAGS ARFLAGS
|
||||||
|
@ -114,8 +114,7 @@ function(__build_set_default_build_specifications)
|
|||||||
list(APPEND c_compile_options "-std=gnu99"
|
list(APPEND c_compile_options "-std=gnu99"
|
||||||
"-Wno-old-style-declaration")
|
"-Wno-old-style-declaration")
|
||||||
|
|
||||||
list(APPEND cxx_compile_options "-std=gnu++11"
|
list(APPEND cxx_compile_options "-std=gnu++11")
|
||||||
"-fno-rtti")
|
|
||||||
|
|
||||||
idf_build_set_property(COMPILE_DEFINITIONS "${compile_definitions}" APPEND)
|
idf_build_set_property(COMPILE_DEFINITIONS "${compile_definitions}" APPEND)
|
||||||
idf_build_set_property(COMPILE_OPTIONS "${compile_options}" APPEND)
|
idf_build_set_property(COMPILE_OPTIONS "${compile_options}" APPEND)
|
||||||
|
Loading…
Reference in New Issue
Block a user