Add __libcpp_version file and __libcpp_library_version function.
This patch does two seperate things. First it adds a file called "__libcpp_version" which only contains the current libc++ version (currently 4000). This file is not intended for use as a header. This file is used by Clang in order to easily determine the installed libc++ version. This allows Clang to enable/disable certain language features only when the library supports them. The second change is the addition of _LIBCPP_LIBRARY_VERSION macro, which returns the version of the installed dylib since it may be different than the headers. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@285382 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -908,6 +908,13 @@ extern "C" void __sanitizer_annotate_contiguous_container(
|
|||||||
#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
|
#define _LIBCPP_HAS_NO_BUILTIN_ADDRESSOF
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
_LIBCPP_FUNC_VIS _LIBCPP_WEAK int __libcpp_library_version();
|
||||||
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
|
|
||||||
|
#define _LIBCPP_LIBRARY_VERSION \
|
||||||
|
(_VSTD::__libcpp_library_version ? _VSTD::__libcpp_library_version() : -1)
|
||||||
|
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
#endif // _LIBCPP_CONFIG
|
#endif // _LIBCPP_CONFIG
|
||||||
|
|||||||
1
include/__libcpp_version
Normal file
1
include/__libcpp_version
Normal file
@@ -0,0 +1 @@
|
|||||||
|
4000
|
||||||
@@ -16,6 +16,11 @@ New entries should be added directly below the "Version" header.
|
|||||||
Version 4.0
|
Version 4.0
|
||||||
-----------
|
-----------
|
||||||
|
|
||||||
|
* rTBD - Add __libcpp_library_version
|
||||||
|
|
||||||
|
all platforms
|
||||||
|
-------------
|
||||||
|
Symbol added: _ZNSt3__124__libcpp_library_versionEv
|
||||||
|
|
||||||
* r285101 - Add -fvisibility-inlines-hidden when building libc++.
|
* r285101 - Add -fvisibility-inlines-hidden when building libc++.
|
||||||
|
|
||||||
|
|||||||
@@ -1141,6 +1141,7 @@
|
|||||||
{'type': 'FUNC', 'name': '_ZNSt3__121recursive_timed_mutexD1Ev'}
|
{'type': 'FUNC', 'name': '_ZNSt3__121recursive_timed_mutexD1Ev'}
|
||||||
{'type': 'FUNC', 'name': '_ZNSt3__121recursive_timed_mutexD2Ev'}
|
{'type': 'FUNC', 'name': '_ZNSt3__121recursive_timed_mutexD2Ev'}
|
||||||
{'type': 'FUNC', 'name': '_ZNSt3__121undeclare_no_pointersEPcm'}
|
{'type': 'FUNC', 'name': '_ZNSt3__121undeclare_no_pointersEPcm'}
|
||||||
|
{'type': 'FUNC', 'name': '_ZNSt3__124__libcpp_library_versionEv'}
|
||||||
{'type': 'FUNC', 'name': '_ZNSt3__125__num_get_signed_integralIlEET_PKcS3_Rji'}
|
{'type': 'FUNC', 'name': '_ZNSt3__125__num_get_signed_integralIlEET_PKcS3_Rji'}
|
||||||
{'type': 'FUNC', 'name': '_ZNSt3__125__num_get_signed_integralIxEET_PKcS3_Rji'}
|
{'type': 'FUNC', 'name': '_ZNSt3__125__num_get_signed_integralIxEET_PKcS3_Rji'}
|
||||||
{'type': 'FUNC', 'name': '_ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE'}
|
{'type': 'FUNC', 'name': '_ZNSt3__125notify_all_at_thread_exitERNS_18condition_variableENS_11unique_lockINS_5mutexEEE'}
|
||||||
|
|||||||
14
src/libcpp_version.cpp
Normal file
14
src/libcpp_version.cpp
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
#include "__config"
|
||||||
|
|
||||||
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
||||||
|
|
||||||
|
// Test that _LIBCPP_VERSION and __libcpp_version are in sync.
|
||||||
|
// The __libcpp_version file stores only a number representing the libc++
|
||||||
|
// version so it can be easily parsed by clang.
|
||||||
|
static_assert(_LIBCPP_VERSION ==
|
||||||
|
#include "__libcpp_version"
|
||||||
|
, "version file does not match");
|
||||||
|
|
||||||
|
int __libcpp_library_version() { return _LIBCPP_VERSION; }
|
||||||
|
|
||||||
|
_LIBCPP_END_NAMESPACE_STD
|
||||||
29
test/libcxx/version.pass.cpp
Normal file
29
test/libcxx/version.pass.cpp
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
// -*- C++ -*-
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
//
|
||||||
|
// The LLVM Compiler Infrastructure
|
||||||
|
//
|
||||||
|
// This file is dual licensed under the MIT and the University of Illinois Open
|
||||||
|
// Source Licenses. See LICENSE.TXT for details.
|
||||||
|
//
|
||||||
|
//===----------------------------------------------------------------------===//
|
||||||
|
|
||||||
|
// Test the _LIBCPP_VERSION and _LIBCPP_LIBRARY_VERSION macros
|
||||||
|
|
||||||
|
#include <__config>
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_VERSION
|
||||||
|
#error _LIBCPP_VERSION must be defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef _LIBCPP_LIBRARY_VERSION
|
||||||
|
#error _LIBCPP_LIBRARY_VERSION must be defined
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
int main() {
|
||||||
|
assert(_LIBCPP_VERSION == _LIBCPP_LIBRARY_VERSION);
|
||||||
|
assert(std::__libcpp_library_version);
|
||||||
|
assert(_LIBCPP_LIBRARY_VERSION == std::__libcpp_library_version());
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user