diff mbox series

[oe,meta-oe,1/3] flatbuffers: Fix build with clang on big-endian machines

Message ID 20170920041429.8047-1-raj.khem@gmail.com
State Accepted
Commit 281b007d48b86fd15adb10fb52e6ea10d40009c4
Headers show
Series [oe,meta-oe,1/3] flatbuffers: Fix build with clang on big-endian machines | expand

Commit Message

Khem Raj Sept. 20, 2017, 4:14 a.m. UTC
Signed-off-by: Khem Raj <raj.khem@gmail.com>

---
 ...-Move-EndianSwap-template-to-flatbuffers-.patch | 113 +++++++++++++++++++++
 ..._builtin_bswap16-when-building-with-clang.patch |  30 ++++++
 .../flatbuffers/flatbuffers_1.7.1.bb               |   6 +-
 3 files changed, 147 insertions(+), 2 deletions(-)
 create mode 100644 meta-oe/recipes-devtools/flatbuffers/files/0001-flatbuffers-Move-EndianSwap-template-to-flatbuffers-.patch
 create mode 100644 meta-oe/recipes-devtools/flatbuffers/files/0002-use-__builtin_bswap16-when-building-with-clang.patch

-- 
2.14.1

-- 
_______________________________________________
Openembedded-devel mailing list
Openembedded-devel@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-devel
diff mbox series

Patch

diff --git a/meta-oe/recipes-devtools/flatbuffers/files/0001-flatbuffers-Move-EndianSwap-template-to-flatbuffers-.patch b/meta-oe/recipes-devtools/flatbuffers/files/0001-flatbuffers-Move-EndianSwap-template-to-flatbuffers-.patch
new file mode 100644
index 000000000..d736f012b
--- /dev/null
+++ b/meta-oe/recipes-devtools/flatbuffers/files/0001-flatbuffers-Move-EndianSwap-template-to-flatbuffers-.patch
@@ -0,0 +1,113 @@ 
+From a614d8e20fa9e4fd16b699d581ddac2956c120f5 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 19 Sep 2017 10:04:02 -0700
+Subject: [PATCH 1/2] flatbuffers: Move EndianSwap template to
+ flatbuffers/base.h
+
+Clang complains
+call to function 'EndianSwap' that is neither visible in the template definition nor found by argument-dependent lookup
+     return EndianSwap(t);
+
+This seems to be due to limitation of two-phase lookup of dependent names in template definitions
+
+Its not being found using associated namespaces therefore
+it has to be made visible at the template definition site as well
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+Upstream-Status: Submitted
+
+ include/flatbuffers/base.h        | 33 +++++++++++++++++++++++++++++++++
+ include/flatbuffers/flatbuffers.h | 32 --------------------------------
+ 2 files changed, 33 insertions(+), 32 deletions(-)
+
+diff --git a/include/flatbuffers/base.h b/include/flatbuffers/base.h
+index f051755..c73fb2d 100644
+--- a/include/flatbuffers/base.h
++++ b/include/flatbuffers/base.h
+@@ -150,6 +150,39 @@ typedef uintmax_t largest_scalar_t;
+ // We support aligning the contents of buffers up to this size.
+ #define FLATBUFFERS_MAX_ALIGNMENT 16
+ 
++template<typename T> T EndianSwap(T t) {
++  #if defined(_MSC_VER)
++    #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort
++    #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong
++    #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64
++  #else
++    #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408
++      // __builtin_bswap16 was missing prior to GCC 4.8.
++      #define FLATBUFFERS_BYTESWAP16(x) \
++        static_cast<uint16_t>(__builtin_bswap32(static_cast<uint32_t>(x) << 16))
++    #else
++      #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16
++    #endif
++    #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32
++    #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64
++  #endif
++  if (sizeof(T) == 1) {   // Compile-time if-then's.
++    return t;
++  } else if (sizeof(T) == 2) {
++    auto r = FLATBUFFERS_BYTESWAP16(*reinterpret_cast<uint16_t *>(&t));
++    return *reinterpret_cast<T *>(&r);
++  } else if (sizeof(T) == 4) {
++    auto r = FLATBUFFERS_BYTESWAP32(*reinterpret_cast<uint32_t *>(&t));
++    return *reinterpret_cast<T *>(&r);
++  } else if (sizeof(T) == 8) {
++    auto r = FLATBUFFERS_BYTESWAP64(*reinterpret_cast<uint64_t *>(&t));
++    return *reinterpret_cast<T *>(&r);
++  } else {
++    assert(0);
++  }
++}
++
++
+ template<typename T> T EndianScalar(T t) {
+   #if FLATBUFFERS_LITTLEENDIAN
+     return t;
+diff --git a/include/flatbuffers/flatbuffers.h b/include/flatbuffers/flatbuffers.h
+index 9216cf4..f749dcb 100644
+--- a/include/flatbuffers/flatbuffers.h
++++ b/include/flatbuffers/flatbuffers.h
+@@ -37,38 +37,6 @@ inline void EndianCheck() {
+   (void)endiantest;
+ }
+ 
+-template<typename T> T EndianSwap(T t) {
+-  #if defined(_MSC_VER)
+-    #define FLATBUFFERS_BYTESWAP16 _byteswap_ushort
+-    #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong
+-    #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64
+-  #else
+-    #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408
+-      // __builtin_bswap16 was missing prior to GCC 4.8.
+-      #define FLATBUFFERS_BYTESWAP16(x) \
+-        static_cast<uint16_t>(__builtin_bswap32(static_cast<uint32_t>(x) << 16))
+-    #else
+-      #define FLATBUFFERS_BYTESWAP16 __builtin_bswap16
+-    #endif
+-    #define FLATBUFFERS_BYTESWAP32 __builtin_bswap32
+-    #define FLATBUFFERS_BYTESWAP64 __builtin_bswap64
+-  #endif
+-  if (sizeof(T) == 1) {   // Compile-time if-then's.
+-    return t;
+-  } else if (sizeof(T) == 2) {
+-    auto r = FLATBUFFERS_BYTESWAP16(*reinterpret_cast<uint16_t *>(&t));
+-    return *reinterpret_cast<T *>(&r);
+-  } else if (sizeof(T) == 4) {
+-    auto r = FLATBUFFERS_BYTESWAP32(*reinterpret_cast<uint32_t *>(&t));
+-    return *reinterpret_cast<T *>(&r);
+-  } else if (sizeof(T) == 8) {
+-    auto r = FLATBUFFERS_BYTESWAP64(*reinterpret_cast<uint64_t *>(&t));
+-    return *reinterpret_cast<T *>(&r);
+-  } else {
+-    assert(0);
+-  }
+-}
+-
+ template<typename T> FLATBUFFERS_CONSTEXPR size_t AlignOf() {
+   #ifdef _MSC_VER
+     return __alignof(T);
+-- 
+2.14.1
+
diff --git a/meta-oe/recipes-devtools/flatbuffers/files/0002-use-__builtin_bswap16-when-building-with-clang.patch b/meta-oe/recipes-devtools/flatbuffers/files/0002-use-__builtin_bswap16-when-building-with-clang.patch
new file mode 100644
index 000000000..460159f27
--- /dev/null
+++ b/meta-oe/recipes-devtools/flatbuffers/files/0002-use-__builtin_bswap16-when-building-with-clang.patch
@@ -0,0 +1,30 @@ 
+From 626fe5e043de25e970ebdf061b88c646fa689113 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem@gmail.com>
+Date: Tue, 19 Sep 2017 10:09:31 -0700
+Subject: [PATCH 2/2] use __builtin_bswap16 when building with clang
+
+clang pretends to be gcc 4.2.0 and therefore the code does
+not use __builtin_bswap16 but tries to synthesize it
+
+Signed-off-by: Khem Raj <raj.khem@gmail.com>
+---
+Upstream-Status: Submitted
+ include/flatbuffers/base.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/flatbuffers/base.h b/include/flatbuffers/base.h
+index c73fb2d..13e8fac 100644
+--- a/include/flatbuffers/base.h
++++ b/include/flatbuffers/base.h
+@@ -156,7 +156,7 @@ template<typename T> T EndianSwap(T t) {
+     #define FLATBUFFERS_BYTESWAP32 _byteswap_ulong
+     #define FLATBUFFERS_BYTESWAP64 _byteswap_uint64
+   #else
+-    #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408
++    #if defined(__GNUC__) && __GNUC__ * 100 + __GNUC_MINOR__ < 408 && !defined(__clang__)
+       // __builtin_bswap16 was missing prior to GCC 4.8.
+       #define FLATBUFFERS_BYTESWAP16(x) \
+         static_cast<uint16_t>(__builtin_bswap32(static_cast<uint32_t>(x) << 16))
+-- 
+2.14.1
+
diff --git a/meta-oe/recipes-devtools/flatbuffers/flatbuffers_1.7.1.bb b/meta-oe/recipes-devtools/flatbuffers/flatbuffers_1.7.1.bb
index be0bef21d..a8df44485 100644
--- a/meta-oe/recipes-devtools/flatbuffers/flatbuffers_1.7.1.bb
+++ b/meta-oe/recipes-devtools/flatbuffers/flatbuffers_1.7.1.bb
@@ -13,8 +13,10 @@  LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=a873c5645c184d51e0f9b34e1d7cf559"
 SRCREV = "25a15950f5a24d7217689739ed8f6dac64912d62"
 
 SRC_URI = "git://github.com/google/flatbuffers.git \
-    file://0001-correct-version-for-so-lib.patch \
-"
+           file://0001-correct-version-for-so-lib.patch \
+           file://0001-flatbuffers-Move-EndianSwap-template-to-flatbuffers-.patch \
+           file://0002-use-__builtin_bswap16-when-building-with-clang.patch \
+           "
 
 # Make sure C++11 is used, required for example for GCC 4.9
 CXXFLAGS += "-std=c++11"