1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-22 18:54:02 +01:00

Add secondary libstdc++ 4.8 and 5.1 detection mechanisms

Summary:
The date-based approach to detecting unsupported versions of libstdc++
does not handle bug fix releases of older versions. As an example, the
`__GLIBCXX__` value associated with version 5.1, `20150422`, is less
than the values associated with versions 4.8.5 and 4.9.3.

This patch adds secondary checks based on certain properties in
sufficiently new versions of libstdc++.

Reviewers: jfb, tstellar, rnk, sfertile, nemanjai

Reviewed By: jfb

Subscribers: mgorny, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D58682

llvm-svn: 355638
This commit is contained in:
Hubert Tong 2019-03-07 21:28:33 +00:00
parent 2c18b0ad47
commit 55192374db

View File

@ -58,6 +58,8 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
set(OLD_CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS})
set(OLD_CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES})
set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -std=c++0x")
# Test for libstdc++ version of at least 4.8 by checking for _ZNKSt17bad_function_call4whatEv.
# Note: We should check _GLIBCXX_RELEASE when possible (i.e., for GCC 7.1 and up).
check_cxx_source_compiles("
#include <iosfwd>
#if defined(__GLIBCXX__)
@ -65,12 +67,20 @@ if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
#error Unsupported libstdc++ version
#endif
#endif
int main() { return 0; }
#if defined(__GLIBCXX__)
extern const char _ZNKSt17bad_function_call4whatEv[];
const char *chk = _ZNKSt17bad_function_call4whatEv;
#else
const char *chk = \"\";
#endif
int main() { ++chk; return 0; }
"
LLVM_LIBSTDCXX_MIN)
if(NOT LLVM_LIBSTDCXX_MIN)
message(FATAL_ERROR "libstdc++ version must be at least ${GCC_MIN}.")
endif()
# Test for libstdc++ version of at least 5.1 by checking for std::iostream_category().
# Note: We should check _GLIBCXX_RELEASE when possible (i.e., for GCC 7.1 and up).
check_cxx_source_compiles("
#include <iosfwd>
#if defined(__GLIBCXX__)
@ -78,6 +88,10 @@ int main() { return 0; }
#error Unsupported libstdc++ version
#endif
#endif
#if defined(__GLIBCXX__)
#include <ios>
void foo(void) { (void) std::iostream_category(); }
#endif
int main() { return 0; }
"
LLVM_LIBSTDCXX_SOFT_ERROR)