Fix configuring and building libc++ w/o an ABI library.
Typically libc++ uses libc++abi or libcxxrt to provide the ABI and runtime bits of the C++ STL. However we also support building w/o an ABI library entirely. This patch fixes building libc++ w/o an ABI library (and incorporates the `~type_info()` fix in D28211). The main changes in this patch are: 1) Add `-DLIBCXX_CXX_ABI=default` instead of using the empty string to mean "default". 2) Fix CMake bits which treated "none" as "default" on OS X. 3) Teach the source files to respect `-D_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY`. 4) Define ~type_info() when _LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY is defined. Unfortunately this patch doesn't help clean up the macro mess that we use to configure for different ABI libraries. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@290839 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -87,13 +87,13 @@ if (NOT LIBCXX_ENABLE_SHARED AND NOT LIBCXX_ENABLE_STATIC)
|
|||||||
endif()
|
endif()
|
||||||
|
|
||||||
# ABI Library options ---------------------------------------------------------
|
# ABI Library options ---------------------------------------------------------
|
||||||
set(LIBCXX_CXX_ABI "${LIBCXX_CXX_ABI}" CACHE STRING
|
set(LIBCXX_CXX_ABI "default" CACHE STRING
|
||||||
"Specify C++ ABI library to use." FORCE)
|
"Specify C++ ABI library to use.")
|
||||||
set(CXXABIS none libcxxabi libcxxrt libstdc++ libsupc++)
|
set(CXXABIS none default libcxxabi libcxxrt libstdc++ libsupc++)
|
||||||
set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
|
set_property(CACHE LIBCXX_CXX_ABI PROPERTY STRINGS ;${CXXABIS})
|
||||||
|
|
||||||
# Setup the default options if LIBCXX_CXX_ABI is not specified.
|
# Setup the default options if LIBCXX_CXX_ABI is not specified.
|
||||||
if (NOT LIBCXX_CXX_ABI)
|
if (LIBCXX_CXX_ABI STREQUAL "default")
|
||||||
find_path(
|
find_path(
|
||||||
LIBCXX_LIBCXXABI_INCLUDES_INTERNAL
|
LIBCXX_LIBCXXABI_INCLUDES_INTERNAL
|
||||||
cxxabi.h
|
cxxabi.h
|
||||||
@@ -107,7 +107,7 @@ if (NOT LIBCXX_CXX_ABI)
|
|||||||
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}")
|
set(LIBCXX_CXX_ABI_INCLUDE_PATHS "${LIBCXX_LIBCXXABI_INCLUDES_INTERNAL}")
|
||||||
set(LIBCXX_CXX_ABI_INTREE 1)
|
set(LIBCXX_CXX_ABI_INTREE 1)
|
||||||
else()
|
else()
|
||||||
set(LIBCXX_CXX_ABI_LIBNAME "none")
|
set(LIBCXX_CXX_ABI_LIBNAME "default")
|
||||||
endif()
|
endif()
|
||||||
else()
|
else()
|
||||||
set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
|
set(LIBCXX_CXX_ABI_LIBNAME "${LIBCXX_CXX_ABI}")
|
||||||
@@ -125,6 +125,7 @@ option(LIBCXX_ENABLE_STATIC_ABI_LIBRARY "Statically link the ABI library" OFF)
|
|||||||
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
|
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE OFF)
|
||||||
if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_ENABLE_STATIC_ABI_LIBRARY
|
if (LLVM_HAVE_LINK_VERSION_SCRIPT AND NOT LIBCXX_ENABLE_STATIC_ABI_LIBRARY
|
||||||
AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"
|
AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"
|
||||||
|
AND NOT LIBCXX_CXX_ABI_LIBNAME STREQUAL "default"
|
||||||
AND PYTHONINTERP_FOUND
|
AND PYTHONINTERP_FOUND
|
||||||
AND LIBCXX_ENABLE_SHARED)
|
AND LIBCXX_ENABLE_SHARED)
|
||||||
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
|
set(ENABLE_LINKER_SCRIPT_DEFAULT_VALUE ON)
|
||||||
|
|||||||
@@ -102,7 +102,11 @@ elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxrt")
|
|||||||
setup_abi_lib("-DLIBCXXRT"
|
setup_abi_lib("-DLIBCXXRT"
|
||||||
"cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
|
"cxxrt" "cxxabi.h;unwind.h;unwind-arm.h;unwind-itanium.h" ""
|
||||||
)
|
)
|
||||||
elseif (NOT "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
|
elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none")
|
||||||
|
list(APPEND LIBCXX_COMPILE_FLAGS "-D_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY")
|
||||||
|
elseif ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "default")
|
||||||
|
# Nothing TODO
|
||||||
|
else()
|
||||||
message(FATAL_ERROR
|
message(FATAL_ERROR
|
||||||
"Currently libstdc++, libsupc++, libcxxabi, libcxxrt and none are "
|
"Currently libstdc++, libsupc++, libcxxabi, libcxxrt and none are "
|
||||||
"supported for c++ abi."
|
"supported for c++ abi."
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ add_link_flags_if(LIBCXX_CXX_ABI_LIBRARY_PATH "-L${LIBCXX_CXX_ABI_LIBRARY_PATH}"
|
|||||||
add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}")
|
add_library_flags_if(LIBCXX_COVERAGE_LIBRARY "${LIBCXX_COVERAGE_LIBRARY}")
|
||||||
|
|
||||||
if (APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR
|
if (APPLE AND (LIBCXX_CXX_ABI_LIBNAME STREQUAL "libcxxabi" OR
|
||||||
LIBCXX_CXX_ABI_LIBNAME STREQUAL "none"))
|
LIBCXX_CXX_ABI_LIBNAME STREQUAL "default"))
|
||||||
set(LIBCXX_OSX_REEXPORT_SYSTEM_ABI_LIBRARY ON)
|
set(LIBCXX_OSX_REEXPORT_SYSTEM_ABI_LIBRARY ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ if (DEFINED TARGET_TRIPLE
|
|||||||
AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/${TARGET_TRIPLE}.abilist"
|
AND EXISTS "${CMAKE_CURRENT_LIST_DIR}/${TARGET_TRIPLE}.abilist"
|
||||||
AND TARGET cxx_shared
|
AND TARGET cxx_shared
|
||||||
AND ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi" OR
|
AND ("${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "libcxxabi" OR
|
||||||
(APPLE AND "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "none"))
|
(APPLE AND "${LIBCXX_CXX_ABI_LIBNAME}" STREQUAL "default"))
|
||||||
AND NOT LIBCXX_ABI_UNSTABLE
|
AND NOT LIBCXX_ABI_UNSTABLE
|
||||||
AND LIBCXX_ABI_VERSION EQUAL "1")
|
AND LIBCXX_ABI_VERSION EQUAL "1")
|
||||||
set(LIBCXX_HAS_ABILIST_CONFIGURATION 1 CACHE INTERNAL "")
|
set(LIBCXX_HAS_ABILIST_CONFIGURATION 1 CACHE INTERNAL "")
|
||||||
|
|||||||
@@ -12,7 +12,8 @@
|
|||||||
#include "exception"
|
#include "exception"
|
||||||
#include "new"
|
#include "new"
|
||||||
|
|
||||||
#if defined(__APPLE__) && !defined(LIBCXXRT)
|
#if defined(__APPLE__) && !defined(LIBCXXRT) && \
|
||||||
|
!defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
|
|
||||||
using namespace __cxxabiv1;
|
using namespace __cxxabiv1;
|
||||||
@@ -106,7 +107,8 @@ bool uncaught_exception() _NOEXCEPT { return uncaught_exceptions() > 0; }
|
|||||||
|
|
||||||
int uncaught_exceptions() _NOEXCEPT
|
int uncaught_exceptions() _NOEXCEPT
|
||||||
{
|
{
|
||||||
#if defined(__APPLE__) || defined(_LIBCPPABI_VERSION)
|
#if !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY) && \
|
||||||
|
(defined(__APPLE__) || defined(_LIBCPPABI_VERSION))
|
||||||
// on Darwin, there is a helper function so __cxa_get_globals is private
|
// on Darwin, there is a helper function so __cxa_get_globals is private
|
||||||
# if _LIBCPPABI_VERSION > 1101
|
# if _LIBCPPABI_VERSION > 1101
|
||||||
return __cxa_uncaught_exceptions();
|
return __cxa_uncaught_exceptions();
|
||||||
|
|||||||
@@ -13,7 +13,8 @@
|
|||||||
|
|
||||||
#include "new"
|
#include "new"
|
||||||
|
|
||||||
#if defined(__APPLE__) && !defined(LIBCXXRT)
|
#if defined(__APPLE__) && !defined(LIBCXXRT) && \
|
||||||
|
!defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
|
|
||||||
#ifndef _LIBCPPABI_VERSION
|
#ifndef _LIBCPPABI_VERSION
|
||||||
@@ -26,7 +27,8 @@
|
|||||||
#if defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI)
|
#if defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI)
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
#endif // defined(LIBCXX_BUILDING_LIBCXXABI)
|
#endif // defined(LIBCXX_BUILDING_LIBCXXABI)
|
||||||
#if !defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__)
|
#if defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY) || \
|
||||||
|
(!defined(_LIBCPPABI_VERSION) && !defined(__GLIBCXX__))
|
||||||
static std::new_handler __new_handler;
|
static std::new_handler __new_handler;
|
||||||
#endif // _LIBCPPABI_VERSION
|
#endif // _LIBCPPABI_VERSION
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -14,7 +14,8 @@
|
|||||||
#include "__refstring"
|
#include "__refstring"
|
||||||
|
|
||||||
/* For _LIBCPPABI_VERSION */
|
/* For _LIBCPPABI_VERSION */
|
||||||
#if defined(LIBCXX_BUILDING_LIBCXXABI) || defined(__APPLE__) || defined(LIBCXXRT)
|
#if !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY) && \
|
||||||
|
(defined(LIBCXX_BUILDING_LIBCXXABI) || defined(__APPLE__) || defined(LIBCXXRT))
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -8,13 +8,19 @@
|
|||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(LIBCXXRT) || \
|
#if !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY) && \
|
||||||
defined(LIBCXX_BUILDING_LIBCXXABI)
|
(defined(__APPLE__) || defined(LIBCXXRT) || defined(LIBCXX_BUILDING_LIBCXXABI))
|
||||||
#include <cxxabi.h>
|
#include <cxxabi.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "typeinfo"
|
#include "typeinfo"
|
||||||
|
|
||||||
|
#if defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
|
||||||
|
std::type_info::~type_info()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION)
|
#if !defined(LIBCXXRT) && !defined(_LIBCPPABI_VERSION)
|
||||||
|
|
||||||
std::bad_cast::bad_cast() _NOEXCEPT
|
std::bad_cast::bad_cast() _NOEXCEPT
|
||||||
@@ -47,7 +53,7 @@ std::bad_typeid::what() const _NOEXCEPT
|
|||||||
return "std::bad_typeid";
|
return "std::bad_typeid";
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __APPLE__
|
#if defined(__APPLE__) && !defined(_LIBCPP_BUILDING_HAS_NO_ABI_LIBRARY)
|
||||||
// On Darwin, the cxa_bad_* functions cannot be in the lower level library
|
// On Darwin, the cxa_bad_* functions cannot be in the lower level library
|
||||||
// because bad_cast and bad_typeid are defined in his higher level library
|
// because bad_cast and bad_typeid are defined in his higher level library
|
||||||
void __cxxabiv1::__cxa_bad_typeid()
|
void __cxxabiv1::__cxa_bad_typeid()
|
||||||
|
|||||||
Reference in New Issue
Block a user