aboutsummaryrefslogtreecommitdiff
path: root/libbacktrace/elf.c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2018-04-04 19:18:14 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2018-04-04 19:18:14 +0200
commitc5c4b2ae6e33f8541d6d6300276fff3381706d81 (patch)
tree0fc23d219540f64c9e5f4d9e269450d14560245f /libbacktrace/elf.c
parent600583ab730f6cedd762b0e46a14061e2a6e097c (diff)
downloadgcc-c5c4b2ae6e33f8541d6d6300276fff3381706d81.zip
gcc-c5c4b2ae6e33f8541d6d6300276fff3381706d81.tar.gz
gcc-c5c4b2ae6e33f8541d6d6300276fff3381706d81.tar.bz2
re PR other/85161 (Test case failures in libbacktrace on powerpc64 BE starting with r253456)
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
Diffstat (limited to 'libbacktrace/elf.c')
-rw-r--r--libbacktrace/elf.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/libbacktrace/elf.c b/libbacktrace/elf.c
index 19da5a9..0fd5e6f 100644
--- a/libbacktrace/elf.c
+++ b/libbacktrace/elf.c
@@ -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;