re PR other/85161 (Test case failures in libbacktrace on powerpc64 BE starting with...
authorJakub Jelinek <jakub@redhat.com>
Wed, 4 Apr 2018 17:18:14 +0000 (19:18 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 4 Apr 2018 17:18:14 +0000 (19:18 +0200)
PR other/85161
* elf.c (elf_zlib_fetch): Fix up predefined macro names in test for
big endian, only use 32-bit loads if endianity macros are predefined
and indicate big or little endian.

From-SVN: r259096

libbacktrace/ChangeLog
libbacktrace/elf.c

index 64733a82ca23172c66d6c5e0137ae548f78ea8df..85c8742b8a8fe7608617c06c40c4515921d881a9 100644 (file)
@@ -1,3 +1,10 @@
+2018-04-04  Jakub Jelinek  <jakub@redhat.com>
+
+       PR other/85161
+       * elf.c (elf_zlib_fetch): Fix up predefined macro names in test for
+       big endian, only use 32-bit loads if endianity macros are predefined
+       and indicate big or little endian.
+
 2018-02-14  Igor Tsimbalist  <igor.v.tsimbalist@intel.com>
 
        PR target/84148
index 19da5a97b23ac7fb42c65020f5c9dd02b2fb0374..0fd5e6f9d0d45bd3acbe131a8a30a0fa38afbf0d 100644 (file)
@@ -1086,12 +1086,19 @@ elf_zlib_fetch (const unsigned char **ppin, const unsigned char *pinend,
       return 0;
     }
 
+#if defined(__BYTE_ORDER__) && defined(__ORDER_LITTLE_ENDIAN__) \
+    && defined(__ORDER_BIG_ENDIAN__) \
+    && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ \
+        || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__)
   /* We've ensured that PIN is aligned.  */
   next = *(const uint32_t *)pin;
 
-#if __BYTE_ORDER == __ORDER_BIG_ENDIAN
+#if __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
   next = __builtin_bswap32 (next);
 #endif
+#else
+  next = pin[0] | (pin[1] << 8) | (pin[2] << 16) | (pin[3] << 24);
+#endif
 
   val |= (uint64_t)next << bits;
   bits += 32;