diff --git a/libcxx/CMakeLists.txt b/libcxx/CMakeLists.txt index f1942e963ccc31..da492cdd3d3c0e 100644 --- a/libcxx/CMakeLists.txt +++ b/libcxx/CMakeLists.txt @@ -127,6 +127,9 @@ option(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS to provide compile-time errors when using features unavailable on some version of the shared library they shipped should turn this on and see `include/__configuration/availability.h` for more details." OFF) +option(LIBCXX_ENABLE_OVERRIDDEN_FUNCTION_DETECTION + "Whether to support detecting if an overridable function (typically a weak symbol) + has been overidden by a user or not." ON) if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") set(LIBCXX_DEFAULT_TEST_CONFIG "llvm-libc++-shared-gcc.cfg.in") @@ -763,6 +766,7 @@ config_define_if_not(LIBCXX_ENABLE_UNICODE _LIBCPP_HAS_NO_UNICODE) config_define_if_not(LIBCXX_ENABLE_WIDE_CHARACTERS _LIBCPP_HAS_NO_WIDE_CHARACTERS) config_define_if_not(LIBCXX_ENABLE_TIME_ZONE_DATABASE _LIBCPP_HAS_NO_TIME_ZONE_DATABASE) config_define_if_not(LIBCXX_ENABLE_VENDOR_AVAILABILITY_ANNOTATIONS _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS) +config_define_if_not(LIBCXX_ENABLE_OVERRIDDEN_FUNCTION_DETECTION _LIBCPP_HAS_NO_OVERRIDDEN_FUNCTION_DETECTION) if (LIBCXX_ENABLE_ASSERTIONS) message(DEPRECATION "LIBCXX_ENABLE_ASSERTIONS is deprecated and will be removed in LLVM 20. Please use LIBCXX_HARDENING_MODE instead.") diff --git a/libcxx/include/__config_site.in b/libcxx/include/__config_site.in index bf2d31d8eeb1b9..b30304a2c34651 100644 --- a/libcxx/include/__config_site.in +++ b/libcxx/include/__config_site.in @@ -22,6 +22,7 @@ #cmakedefine _LIBCPP_HAS_THREAD_API_WIN32 #cmakedefine _LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS #cmakedefine _LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS +#cmakedefine _LIBCPP_HAS_NO_OVERRIDDEN_FUNCTION_DETECTION #cmakedefine _LIBCPP_NO_VCRUNTIME #cmakedefine _LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION @_LIBCPP_TYPEINFO_COMPARISON_IMPLEMENTATION@ #cmakedefine _LIBCPP_HAS_NO_FILESYSTEM diff --git a/libcxx/src/include/overridable_function.h b/libcxx/src/include/overridable_function.h index 6c70f6242ddd63..f80176727ade55 100644 --- a/libcxx/src/include/overridable_function.h +++ b/libcxx/src/include/overridable_function.h @@ -63,7 +63,7 @@ // want to be defining special sections inside user's executables which use our headers. // -#if defined(_LIBCPP_OBJECT_FORMAT_MACHO) +#if defined(_LIBCPP_OBJECT_FORMAT_MACHO) && !defined(_LIBCPP_HAS_NO_OVERRIDDEN_FUNCTION_DETECTION) # define _LIBCPP_CAN_DETECT_OVERRIDDEN_FUNCTION 1 # define _LIBCPP_MAKE_OVERRIDABLE_FUNCTION_DETECTABLE \ @@ -97,7 +97,7 @@ _LIBCPP_HIDE_FROM_ABI bool __is_function_overridden(_Ret (*__fptr)(_Args...)) no _LIBCPP_END_NAMESPACE_STD // The NVPTX linker cannot create '__start/__stop' sections. -#elif defined(_LIBCPP_OBJECT_FORMAT_ELF) && !defined(__NVPTX__) +#elif defined(_LIBCPP_OBJECT_FORMAT_ELF) && !defined(__NVPTX__) && !defined(_LIBCPP_HAS_NO_OVERRIDDEN_FUNCTION_DETECTION) # define _LIBCPP_CAN_DETECT_OVERRIDDEN_FUNCTION 1 # define _LIBCPP_MAKE_OVERRIDABLE_FUNCTION_DETECTABLE __attribute__((__section__("__lcxx_override")))