|
@@ -0,0 +1,273 @@
|
|
|
+Allow C99-depending features of libstdc++ with uClibc
|
|
|
+
|
|
|
+The libstdc++ code is fairly restrictive on how it checks for C99
|
|
|
+compatibility: it requires *complete* C99 support to enable certain
|
|
|
+features. For example, uClibc provides a good number of C99 features,
|
|
|
+but not C99 complex number support. For this reason, libstdc++
|
|
|
+completely disables many the standard C++ methods that can in fact
|
|
|
+work because uClibc provides the necessary functions.
|
|
|
+
|
|
|
+This patch is similar and highly inspired from
|
|
|
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=58393, but implemented in
|
|
|
+a way that doesn't involve changing the configure.ac script, as
|
|
|
+autoreconfiguring gcc is complicated. It simply relies on the fact
|
|
|
+that uClibc defines the __UCLIBC__ definition.
|
|
|
+
|
|
|
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
|
|
+
|
|
|
+Index: b/libstdc++-v3/config/locale/generic/c_locale.h
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/config/locale/generic/c_locale.h
|
|
|
++++ b/libstdc++-v3/config/locale/generic/c_locale.h
|
|
|
+@@ -70,7 +70,7 @@
|
|
|
+ __builtin_va_list __args;
|
|
|
+ __builtin_va_start(__args, __fmt);
|
|
|
+
|
|
|
+-#ifdef _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
|
|
|
+ #else
|
|
|
+ const int __ret = __builtin_vsprintf(__out, __fmt, __args);
|
|
|
+Index: b/libstdc++-v3/config/locale/gnu/c_locale.h
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/config/locale/gnu/c_locale.h
|
|
|
++++ b/libstdc++-v3/config/locale/gnu/c_locale.h
|
|
|
+@@ -88,7 +88,7 @@
|
|
|
+ __builtin_va_list __args;
|
|
|
+ __builtin_va_start(__args, __fmt);
|
|
|
+
|
|
|
+-#ifdef _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ const int __ret = __builtin_vsnprintf(__out, __size, __fmt, __args);
|
|
|
+ #else
|
|
|
+ const int __ret = __builtin_vsprintf(__out, __fmt, __args);
|
|
|
+Index: b/libstdc++-v3/include/bits/basic_string.h
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/bits/basic_string.h
|
|
|
++++ b/libstdc++-v3/include/bits/basic_string.h
|
|
|
+@@ -2811,7 +2811,7 @@
|
|
|
+ _GLIBCXX_END_NAMESPACE_VERSION
|
|
|
+ } // namespace
|
|
|
+
|
|
|
+-#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99) \
|
|
|
++#if ((__cplusplus >= 201103L) && (defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)) \
|
|
|
+ && !defined(_GLIBCXX_HAVE_BROKEN_VSWPRINTF))
|
|
|
+
|
|
|
+ #include <ext/string_conversions.h>
|
|
|
+Index: b/libstdc++-v3/include/bits/locale_facets.tcc
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/bits/locale_facets.tcc
|
|
|
++++ b/libstdc++-v3/include/bits/locale_facets.tcc
|
|
|
+@@ -987,7 +987,7 @@
|
|
|
+ char __fbuf[16];
|
|
|
+ __num_base::_S_format_float(__io, __fbuf, __mod);
|
|
|
+
|
|
|
+-#ifdef _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ // First try a buffer perhaps big enough (most probably sufficient
|
|
|
+ // for non-ios_base::fixed outputs)
|
|
|
+ int __cs_size = __max_digits * 3;
|
|
|
+Index: b/libstdc++-v3/include/bits/locale_facets_nonio.tcc
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/bits/locale_facets_nonio.tcc
|
|
|
++++ b/libstdc++-v3/include/bits/locale_facets_nonio.tcc
|
|
|
+@@ -572,7 +572,7 @@
|
|
|
+ {
|
|
|
+ const locale __loc = __io.getloc();
|
|
|
+ const ctype<_CharT>& __ctype = use_facet<ctype<_CharT> >(__loc);
|
|
|
+-#ifdef _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ // First try a buffer perhaps big enough.
|
|
|
+ int __cs_size = 64;
|
|
|
+ char* __cs = static_cast<char*>(__builtin_alloca(__cs_size));
|
|
|
+Index: b/libstdc++-v3/include/c_compatibility/math.h
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_compatibility/math.h
|
|
|
++++ b/libstdc++-v3/include/c_compatibility/math.h
|
|
|
+@@ -56,7 +56,7 @@
|
|
|
+ using std::floor;
|
|
|
+ using std::fmod;
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ using std::fpclassify;
|
|
|
+ using std::isfinite;
|
|
|
+ using std::isinf;
|
|
|
+Index: b/libstdc++-v3/include/c_compatibility/wchar.h
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_compatibility/wchar.h
|
|
|
++++ b/libstdc++-v3/include/c_compatibility/wchar.h
|
|
|
+@@ -103,7 +103,7 @@
|
|
|
+ using std::wmemset;
|
|
|
+ using std::wcsftime;
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ using std::wcstold;
|
|
|
+ using std::wcstoll;
|
|
|
+ using std::wcstoull;
|
|
|
+Index: b/libstdc++-v3/include/c_global/cstdlib
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_global/cstdlib
|
|
|
++++ b/libstdc++-v3/include/c_global/cstdlib
|
|
|
+@@ -182,7 +182,7 @@
|
|
|
+ _GLIBCXX_END_NAMESPACE_VERSION
|
|
|
+ } // namespace
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ #undef _Exit
|
|
|
+ #undef llabs
|
|
|
+Index: b/libstdc++-v3/include/c_global/cwchar
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_global/cwchar
|
|
|
++++ b/libstdc++-v3/include/c_global/cwchar
|
|
|
+@@ -232,7 +232,7 @@
|
|
|
+ _GLIBCXX_END_NAMESPACE_VERSION
|
|
|
+ } // namespace
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ #undef wcstold
|
|
|
+ #undef wcstoll
|
|
|
+@@ -289,7 +289,7 @@
|
|
|
+ using std::vwscanf;
|
|
|
+ #endif
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ using std::wcstold;
|
|
|
+ using std::wcstoll;
|
|
|
+ using std::wcstoull;
|
|
|
+Index: b/libstdc++-v3/include/c_std/cstdio
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_std/cstdio
|
|
|
++++ b/libstdc++-v3/include/c_std/cstdio
|
|
|
+@@ -139,7 +139,7 @@
|
|
|
+ using ::vsprintf;
|
|
|
+ } // namespace std
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ #undef snprintf
|
|
|
+ #undef vfscanf
|
|
|
+Index: b/libstdc++-v3/include/c_std/cstdlib
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_std/cstdlib
|
|
|
++++ b/libstdc++-v3/include/c_std/cstdlib
|
|
|
+@@ -180,7 +180,7 @@
|
|
|
+ _GLIBCXX_END_NAMESPACE_VERSION
|
|
|
+ } // namespace
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ #undef _Exit
|
|
|
+ #undef llabs
|
|
|
+Index: b/libstdc++-v3/include/c_std/cwchar
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_std/cwchar
|
|
|
++++ b/libstdc++-v3/include/c_std/cwchar
|
|
|
+@@ -228,7 +228,7 @@
|
|
|
+ _GLIBCXX_END_NAMESPACE_VERSION
|
|
|
+ } // namespace
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ #undef wcstold
|
|
|
+ #undef wcstoll
|
|
|
+Index: b/libstdc++-v3/include/ext/vstring.h
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/ext/vstring.h
|
|
|
++++ b/libstdc++-v3/include/ext/vstring.h
|
|
|
+@@ -2571,7 +2571,7 @@
|
|
|
+ _GLIBCXX_END_NAMESPACE_VERSION
|
|
|
+ } // namespace
|
|
|
+
|
|
|
+-#if ((__cplusplus >= 201103L) && defined(_GLIBCXX_USE_C99))
|
|
|
++#if ((__cplusplus >= 201103L) && (defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)))
|
|
|
+
|
|
|
+ #include <ext/string_conversions.h>
|
|
|
+
|
|
|
+Index: b/libstdc++-v3/include/tr1/cstdio
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/tr1/cstdio
|
|
|
++++ b/libstdc++-v3/include/tr1/cstdio
|
|
|
+@@ -33,7 +33,7 @@
|
|
|
+
|
|
|
+ #include <cstdio>
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ namespace std _GLIBCXX_VISIBILITY(default)
|
|
|
+ {
|
|
|
+Index: b/libstdc++-v3/include/tr1/cstdlib
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/tr1/cstdlib
|
|
|
++++ b/libstdc++-v3/include/tr1/cstdlib
|
|
|
+@@ -35,7 +35,7 @@
|
|
|
+
|
|
|
+ #if _GLIBCXX_HOSTED
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ namespace std _GLIBCXX_VISIBILITY(default)
|
|
|
+ {
|
|
|
+Index: b/libstdc++-v3/include/tr1/cwchar
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/tr1/cwchar
|
|
|
++++ b/libstdc++-v3/include/tr1/cwchar
|
|
|
+@@ -52,7 +52,7 @@
|
|
|
+ using std::vwscanf;
|
|
|
+ #endif
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ using std::wcstold;
|
|
|
+ using std::wcstoll;
|
|
|
+ using std::wcstoull;
|
|
|
+Index: b/libstdc++-v3/include/tr1/stdlib.h
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/tr1/stdlib.h
|
|
|
++++ b/libstdc++-v3/include/tr1/stdlib.h
|
|
|
+@@ -33,7 +33,7 @@
|
|
|
+
|
|
|
+ #if _GLIBCXX_HOSTED
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ using std::tr1::atoll;
|
|
|
+ using std::tr1::strtoll;
|
|
|
+Index: b/libstdc++-v3/src/c++11/debug.cc
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/src/c++11/debug.cc
|
|
|
++++ b/libstdc++-v3/src/c++11/debug.cc
|
|
|
+@@ -787,7 +787,7 @@
|
|
|
+ int __n __attribute__ ((__unused__)),
|
|
|
+ const char* __fmt, _Tp __s) const throw ()
|
|
|
+ {
|
|
|
+-#ifdef _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+ std::snprintf(__buf, __n, __fmt, __s);
|
|
|
+ #else
|
|
|
+ std::sprintf(__buf, __fmt, __s);
|
|
|
+Index: b/libstdc++-v3/include/c_global/cstdio
|
|
|
+===================================================================
|
|
|
+--- a/libstdc++-v3/include/c_global/cstdio
|
|
|
++++ b/libstdc++-v3/include/c_global/cstdio
|
|
|
+@@ -138,7 +138,7 @@
|
|
|
+ using ::vsprintf;
|
|
|
+ } // namespace
|
|
|
+
|
|
|
+-#if _GLIBCXX_USE_C99
|
|
|
++#if defined(_GLIBCXX_USE_C99) || defined(__UCLIBC__)
|
|
|
+
|
|
|
+ #undef snprintf
|
|
|
+ #undef vfscanf
|