nuttx/libs/libxx/libcxxabi.cmake
yinshengkai ad76a4f7a9 libcxxabi: libcxxabi enables exceptions by default
In the following code, even though the application does not use exceptions, an exception is still thrown in libcxx

If libcxxabi is not enabled, the toolchain default implementation will be used. However, arm-gcc does not enable thread
support by default, which will cause errors in a multi-threaded environment.

Therefore, we need to use libcxxabi to ensure normal functions in a multi-threaded environment.

using namespace std;

void foo(bool recur);
int bar(bool recur)
{
  if (recur) {
      foo(false);
  }
  return 0xFAFAFA;
}

void foo(bool recur)
{
  static int i = bar(recur);
  cout << "Static is:" << i << "\n";
}

int main(int argc, char *argv[])
{
  foo(true);
  return 0;
}

Signed-off-by: yinshengkai <yinshengkai@xiaomi.com>
2024-09-06 09:52:33 +08:00

115 lines
3.5 KiB
CMake

# ##############################################################################
# libs/libxx/libcxxabi.cmake
#
# Licensed to the Apache Software Foundation (ASF) under one or more contributor
# license agreements. See the NOTICE file distributed with this work for
# additional information regarding copyright ownership. The ASF licenses this
# file to you under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
#
# ##############################################################################
if(NOT EXISTS ${CMAKE_CURRENT_LIST_DIR}/libcxxabi)
set(LIBCXXABI_VERSION ${CONFIG_LIBCXXABI_VERSION})
FetchContent_Declare(
libcxxabi
DOWNLOAD_NAME "libcxxabi-${LIBCXXABI_VERSION}.src.tar.xz"
DOWNLOAD_DIR ${CMAKE_CURRENT_LIST_DIR}
URL "https://github.com/llvm/llvm-project/releases/download/llvmorg-${LIBCXXABI_VERSION}/libcxxabi-${LIBCXXABI_VERSION}.src.tar.xz"
SOURCE_DIR
${CMAKE_CURRENT_LIST_DIR}/libcxxabi
BINARY_DIR
${CMAKE_BINARY_DIR}/libs/libc/libcxxabi
CONFIGURE_COMMAND
""
BUILD_COMMAND
""
INSTALL_COMMAND
""
TEST_COMMAND
""
PATCH_COMMAND ""
DOWNLOAD_NO_PROGRESS true
TIMEOUT 30)
FetchContent_GetProperties(libcxxabi)
if(NOT libcxxabi_POPULATED)
FetchContent_Populate(libcxxabi)
endif()
endif()
nuttx_add_system_library(libcxxabi)
set(SRCS)
# C++ABI files
list(
APPEND
SRCS
cxa_aux_runtime.cpp
cxa_default_handlers.cpp
cxa_demangle.cpp
cxa_exception_storage.cpp
cxa_guard.cpp
cxa_handlers.cpp
cxa_thread_atexit.cpp
cxa_vector.cpp
cxa_virtual.cpp)
# C++ STL files
list(APPEND SRCS stdlib_exception.cpp stdlib_new_delete.cpp
stdlib_stdexcept.cpp stdlib_typeinfo.cpp)
# Internal files
list(APPEND SRCS abort_message.cpp fallback_malloc.cpp private_typeinfo.cpp)
# Always compile libcxxabi with exception
list(APPEND SRCS cxa_exception.cpp cxa_personality.cpp)
target_compile_options(libcxxabi PRIVATE -fexceptions)
if(CONFIG_LIBCXXABI)
add_compile_definitions(LIBCXX_BUILDING_LIBCXXABI)
endif()
set(TARGET_SRCS)
foreach(src ${SRCS})
string(PREPEND src libcxxabi/src/)
list(APPEND TARGET_SRCS ${src})
endforeach()
# RTTI is required for building the libcxxabi library
target_compile_options(libcxxabi PRIVATE -frtti)
if(CONFIG_SIM_UBSAN OR CONFIG_MM_UBSAN)
target_compile_options(libcxxabi PRIVATE -fno-sanitize=vptr)
endif()
# Fix compilation error on ARM32:libcxxabi/src/cxa_personality.cpp:594:22:
# error: '_URC_FATAL_PHASE1_ERROR' was not declared in this scope 594 |
# results.reason = _URC_FATAL_PHASE1_ERROR;
if(CONFIG_ARCH_ARM)
target_compile_definitions(libcxxabi
PRIVATE _URC_FATAL_PHASE2_ERROR=_URC_FAILURE)
target_compile_definitions(libcxxabi
PRIVATE _URC_FATAL_PHASE1_ERROR=_URC_FAILURE)
endif()
target_sources(libcxxabi PRIVATE ${TARGET_SRCS})
target_compile_options(libcxxabi PRIVATE -frtti)
target_include_directories(
libcxxabi BEFORE PRIVATE ${CMAKE_CURRENT_LIST_DIR}/libcxxabi/include
${CMAKE_CURRENT_LIST_DIR}/libcxx/src)