Accepting request 752684 from home:alois:branches:devel:libraries:c_c++

fix big endian build

OBS-URL: https://build.opensuse.org/request/show/752684
OBS-URL: https://build.opensuse.org/package/show/devel:libraries:c_c++/fmt?expand=0&rev=10
This commit is contained in:
Luigi Baldoni 2019-12-01 09:17:42 +00:00 committed by Git OBS Bridge
parent 2a9e845bee
commit 093c9ccab8
6 changed files with 215 additions and 0 deletions

102
fmt-bigendian_1.patch Normal file
View File

@ -0,0 +1,102 @@
From bb205d940d8929d086eadb59705349dbdaa1a274 Mon Sep 17 00:00:00 2001
From: Victor Zverovich <victor.zverovich@gmail.com>
Date: Fri, 29 Nov 2019 05:15:59 -0800
Subject: [PATCH] Fix fallback pointer formatting on big endian
---
include/fmt/format-inl.h | 2 +-
include/fmt/format.h | 40 ++++++++++++++++++++++++++++------------
test/format-impl-test.cc | 2 +-
3 files changed, 30 insertions(+), 14 deletions(-)
Index: fmt-6.0.0/include/fmt/format-inl.h
===================================================================
--- fmt-6.0.0.orig/include/fmt/format-inl.h
+++ fmt-6.0.0/include/fmt/format-inl.h
@@ -241,7 +241,7 @@ FMT_FUNC void system_error::init(int err
namespace internal {
template <> FMT_FUNC int count_digits<4>(internal::fallback_uintptr n) {
- // Assume little endian; pointer formatting is implementation-defined anyway.
+ // fallback_uintptr is always stored in little endian.
int i = static_cast<int>(sizeof(void*)) - 1;
while (i > 0 && n.value[i] == 0) --i;
auto char_digits = std::numeric_limits<unsigned char>::digits / 4;
Index: fmt-6.0.0/include/fmt/format.h
===================================================================
--- fmt-6.0.0.orig/include/fmt/format.h
+++ fmt-6.0.0/include/fmt/format.h
@@ -196,17 +196,7 @@ FMT_END_NAMESPACE
FMT_BEGIN_NAMESPACE
namespace internal {
-// A fallback implementation of uintptr_t for systems that lack it.
-struct fallback_uintptr {
- unsigned char value[sizeof(void*)];
-};
-#ifdef UINTPTR_MAX
-using uintptr_t = ::uintptr_t;
-#else
-using uintptr_t = fallback_uintptr;
-#endif
-
-// An equivalent of `*reinterpret_cast<Dest*>(&source)` that doesn't produce
+// An equivalent of `*reinterpret_cast<Dest*>(&source)` that doesn't have
// undefined behavior (e.g. due to type aliasing).
// Example: uint64_t d = bit_cast<uint64_t>(2.718);
template <typename Dest, typename Source>
@@ -217,6 +207,32 @@ inline Dest bit_cast(const Source& sourc
return dest;
}
+inline bool is_big_endian() {
+ auto u = 1u;
+ struct bytes { char data[sizeof(u)]; };
+ return bit_cast<bytes>(u).data[0] == 0;
+}
+
+// A fallback implementation of uintptr_t for systems that lack it.
+struct fallback_uintptr {
+ unsigned char value[sizeof(void*)];
+
+ fallback_uintptr() = default;
+ explicit fallback_uintptr(const void* p) {
+ *this = bit_cast<fallback_uintptr>(p);
+ if (is_big_endian()) std::memmove(value, value, sizeof(void*));
+ }
+};
+#ifdef UINTPTR_MAX
+using uintptr_t = ::uintptr_t;
+inline uintptr_t to_uintptr(const void* p) { return bit_cast<uintptr_t>(p); }
+#else
+using uintptr_t = fallback_uintptr;
+inline fallback_uintptr to_uintptr(const void* p) {
+ return fallback_uintptr(p);
+}
+#endif
+
// An approximation of iterator_t for pre-C++20 systems.
template <typename T>
using iterator_t = decltype(std::begin(std::declval<T&>()));
@@ -1731,7 +1747,7 @@ class arg_formatter_base {
}
void write_pointer(const void* p) {
- writer_.write_pointer(internal::bit_cast<internal::uintptr_t>(p), specs_);
+ writer_.write_pointer(internal::to_uintptr(p), specs_);
}
protected:
Index: fmt-6.0.0/test/format-impl-test.cc
===================================================================
--- fmt-6.0.0.orig/test/format-impl-test.cc
+++ fmt-6.0.0/test/format-impl-test.cc
@@ -259,7 +259,7 @@ TEST(UtilTest, CountDigits) {
TEST(UtilTest, WriteUIntPtr) {
fmt::memory_buffer buf;
fmt::internal::writer writer(buf);
- writer.write_pointer(fmt::internal::bit_cast<fmt::internal::fallback_uintptr>(
+ writer.write_pointer(fmt::internal::fallback_uintptr(
reinterpret_cast<void*>(0xface)),
nullptr);
EXPECT_EQ("0xface", to_string(buf));

25
fmt-bigendian_2.patch Normal file
View File

@ -0,0 +1,25 @@
From aaf829bfb124fcd7953c33f38154027537efb072 Mon Sep 17 00:00:00 2001
From: Victor Zverovich <victor.zverovich@gmail.com>
Date: Fri, 29 Nov 2019 07:07:08 -0800
Subject: [PATCH] Fix fallback pointer formatting on big endian, take 2
---
include/fmt/format.h | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
Index: fmt-6.0.0/include/fmt/format.h
===================================================================
--- fmt-6.0.0.orig/include/fmt/format.h
+++ fmt-6.0.0/include/fmt/format.h
@@ -220,7 +220,10 @@ struct fallback_uintptr {
fallback_uintptr() = default;
explicit fallback_uintptr(const void* p) {
*this = bit_cast<fallback_uintptr>(p);
- if (is_big_endian()) std::memmove(value, value, sizeof(void*));
+ if (is_big_endian()) {
+ for (size_t i = 0, j = sizeof(void*) - 1; i < j; ++i, --j)
+ std::swap(value[i], value[j]);
+ }
}
};
#ifdef UINTPTR_MAX

35
fmt-bigendian_3.patch Normal file
View File

@ -0,0 +1,35 @@
From fafb03fa6d764f3cedf80e222a1e5998b80ef79c Mon Sep 17 00:00:00 2001
From: Victor Zverovich <victor.zverovich@gmail.com>
Date: Sat, 30 Nov 2019 06:35:52 -0800
Subject: [PATCH] Fix handling of fallback_uintptr
---
include/fmt/format.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
Index: fmt-6.0.0/include/fmt/format.h
===================================================================
--- fmt-6.0.0.orig/include/fmt/format.h
+++ fmt-6.0.0/include/fmt/format.h
@@ -281,6 +281,12 @@ template <typename Container>
inline typename Container::value_type* get_data(Container& c) {
return c.data();
}
+template <typename T> constexpr int digits() {
+ return std::numeric_limits<T>::digits;
+}
+template <> constexpr int digits<fallback_uintptr>() {
+ return sizeof(void*) * std::numeric_limits<unsigned char>::digits;
+}
#ifdef _SECURE_SCL
// Make a checked iterator to avoid MSVC warnings.
@@ -900,7 +906,7 @@ Char* format_uint(Char* buffer, internal
template <unsigned BASE_BITS, typename Char, typename It, typename UInt>
inline It format_uint(It out, UInt value, int num_digits, bool upper = false) {
// Buffer should be large enough to hold all digits (digits / BASE_BITS + 1).
- char buffer[std::numeric_limits<UInt>::digits / BASE_BITS + 1];
+ char buffer[digits<UInt>() / BASE_BITS + 1];
format_uint<BASE_BITS>(buffer, value, num_digits, upper);
return internal::copy_str<Char>(buffer, buffer + num_digits, out);
}

38
fmt-bigendian_4.patch Normal file
View File

@ -0,0 +1,38 @@
From ba6e330fd3a9c2d859d651c59d6206620940a265 Mon Sep 17 00:00:00 2001
From: Victor Zverovich <victor.zverovich@gmail.com>
Date: Sat, 30 Nov 2019 08:19:58 -0800
Subject: [PATCH] digits -> num_bits
---
include/fmt/format.h | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
Index: fmt-6.0.0/include/fmt/format.h
===================================================================
--- fmt-6.0.0.orig/include/fmt/format.h
+++ fmt-6.0.0/include/fmt/format.h
@@ -281,11 +281,12 @@ template <typename Container>
inline typename Container::value_type* get_data(Container& c) {
return c.data();
}
-template <typename T> constexpr int digits() {
+template <typename T> constexpr int num_bits() {
return std::numeric_limits<T>::digits;
}
-template <> constexpr int digits<fallback_uintptr>() {
- return sizeof(void*) * std::numeric_limits<unsigned char>::digits;
+template <> constexpr int num_bits<fallback_uintptr>() {
+ return static_cast<int>(sizeof(void*) *
+ std::numeric_limits<unsigned char>::digits);
}
#ifdef _SECURE_SCL
@@ -906,7 +907,7 @@ Char* format_uint(Char* buffer, internal
template <unsigned BASE_BITS, typename Char, typename It, typename UInt>
inline It format_uint(It out, UInt value, int num_digits, bool upper = false) {
// Buffer should be large enough to hold all digits (digits / BASE_BITS + 1).
- char buffer[digits<UInt>() / BASE_BITS + 1];
+ char buffer[num_bits<UInt>() / BASE_BITS + 1];
format_uint<BASE_BITS>(buffer, value, num_digits, upper);
return internal::copy_str<Char>(buffer, buffer + num_digits, out);
}

View File

@ -1,3 +1,10 @@
-------------------------------------------------------------------
Sun Dec 1 08:54:54 UTC 2019 - Luigi Baldoni <aloisio@gmx.com>
- Added fmt-bigendian_1.patch, fmt-bigendian_2.patch,
fmt-bigendian_3.patch and fmt-bigendian_4.patch to fix tests
on big endian targets
------------------------------------------------------------------- -------------------------------------------------------------------
Fri Nov 29 08:46:30 UTC 2019 - Luigi Baldoni <aloisio@gmx.com> Fri Nov 29 08:46:30 UTC 2019 - Luigi Baldoni <aloisio@gmx.com>

View File

@ -26,6 +26,14 @@ Group: Development/Libraries/C and C++
URL: http://fmtlib.net/ URL: http://fmtlib.net/
Source0: https://github.com/fmtlib/fmt/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz Source0: https://github.com/fmtlib/fmt/archive/%{version}.tar.gz#/%{name}-%{version}.tar.gz
Source1: baselibs.conf Source1: baselibs.conf
# PATCH-FIX-UPSTREAM fmt-bigendian_1.patch
Patch0: fmt-bigendian_1.patch
# PATCH-FIX-UPSTREAM fmt-bigendian_2.patch
Patch1: fmt-bigendian_2.patch
# PATCH-FIX-UPSTREAM fmt-bigendian_3.patch
Patch2: fmt-bigendian_3.patch
# PATCH-FIX-UPSTREAM fmt-bigendian_4.patch
Patch3: fmt-bigendian_4.patch
BuildRequires: cmake BuildRequires: cmake
BuildRequires: gcc-c++ BuildRequires: gcc-c++
BuildRequires: pkgconfig BuildRequires: pkgconfig