esp-idf/components/cxx/CMakeLists.txt
Jakob Hasse 2552c7ba0f [C++]: wrapper functions around unwind code
* Replaced all C++ exception related
  functions with wrappers if -fno-exception
  is used. This prevents linking of the
  corresponding code in libgcc. The code
  size will decrease by around 7-9 KB when
  building with -fno-exception.
* added no except test app

Closes https://github.com/espressif/esp-idf/pull/5380
Closes https://github.com/espressif/esp-idf/issues/5363
Closes https://github.com/espressif/esp-idf/issues/5224
Closes IDFGH-3153
Closes IDF-2577
2021-04-20 14:27:58 +08:00

62 lines
2.3 KiB
CMake

idf_component_register(SRCS "cxx_exception_stubs.cpp"
"cxx_guards.cpp"
# Make sure that pthread is in component list
PRIV_REQUIRES pthread)
if(NOT CONFIG_CXX_EXCEPTIONS)
set(WRAP_FUNCTIONS
_Unwind_SetEnableExceptionFdeSorting
__register_frame_info_bases
__register_frame_info
__register_frame
__register_frame_info_table_bases
__register_frame_info_table
__register_frame_table
__deregister_frame_info_bases
__deregister_frame_info
_Unwind_Find_FDE
_Unwind_GetGR
_Unwind_GetCFA
_Unwind_GetIP
_Unwind_GetIPInfo
_Unwind_GetRegionStart
_Unwind_GetDataRelBase
_Unwind_GetTextRelBase
_Unwind_SetIP
_Unwind_SetGR
_Unwind_GetLanguageSpecificData
_Unwind_FindEnclosingFunction
_Unwind_Resume
_Unwind_RaiseException
_Unwind_DeleteException
_Unwind_ForcedUnwind
_Unwind_Resume_or_Rethrow
_Unwind_Backtrace
__cxa_call_unexpected
__gxx_personality_v0)
foreach(wrap ${WRAP_FUNCTIONS})
target_link_libraries(${COMPONENT_LIB} INTERFACE "-Wl,--wrap=${wrap}")
endforeach()
endif()
target_link_libraries(${COMPONENT_LIB} PUBLIC stdc++ gcc)
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u __cxa_guard_dummy")
# Force libpthread to appear later than libstdc++ in link line since libstdc++ depends on libpthread.
# Furthermore, force libcxx to appear later than libgcc because some libgcc unwind code is wrapped, if C++
# exceptions are disabled. libcxx (this component) provides the unwind code wrappers.
# This is to prevent linking of libgcc's unwind code which considerably increases the binary size.
idf_component_get_property(pthread pthread COMPONENT_LIB)
idf_component_get_property(cxx cxx COMPONENT_LIB)
add_library(stdcpp_pthread INTERFACE)
target_link_libraries(stdcpp_pthread INTERFACE stdc++ $<TARGET_FILE:${pthread}>)
target_link_libraries(${COMPONENT_LIB} PUBLIC stdcpp_pthread)
add_library(libgcc_cxx INTERFACE)
target_link_libraries(libgcc_cxx INTERFACE gcc $<TARGET_FILE:${cxx}>)
target_link_libraries(${COMPONENT_LIB} PUBLIC libgcc_cxx)
if(NOT CONFIG_COMPILER_CXX_EXCEPTIONS)
target_link_libraries(${COMPONENT_LIB} INTERFACE "-u __cxx_fatal_exception")
endif()