From 63a0afca7093d9c4e63dd27cb4dc1f1974d328a0 Mon Sep 17 00:00:00 2001 From: Adam Cozzette Date: Thu, 7 Dec 2017 14:31:54 -0800 Subject: Use the portable version of Log2Floor for Clang with older Android NDK versions This is necessary for avoiding a strange compiler error that we have already run into with older versions of Clang on NaCl. --- src/google/protobuf/stubs/port.h | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/google/protobuf/stubs') diff --git a/src/google/protobuf/stubs/port.h b/src/google/protobuf/stubs/port.h index cecefdcb..30bd7b1d 100644 --- a/src/google/protobuf/stubs/port.h +++ b/src/google/protobuf/stubs/port.h @@ -348,6 +348,13 @@ inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) { } #endif +#if defined(GOOGLE_PROTOBUF_OS_NACL) \ + || (defined(__ANDROID__) && defined(__clang__) \ + && (__clang_major__ == 3 && __clang_minor__ == 8) \ + && (__clang_patchlevel__ < 275480)) +# define GOOGLE_PROTOBUF_USE_PORTABLE_LOG2 +#endif + #if defined(_MSC_VER) #define GOOGLE_THREAD_LOCAL __declspec(thread) #else @@ -413,12 +420,13 @@ class Bits { } static uint32 Log2FloorNonZero64(uint64 n) { - // arm-nacl-clang runs into an instruction-selection failure when it - // encounters __builtin_clzll: + // Older versions of clang run into an instruction-selection failure when + // it encounters __builtin_clzll: // https://bugs.chromium.org/p/nativeclient/issues/detail?id=4395 - // To work around this, when we build for NaCl we use the portable + // This includes arm-nacl-clang and clang in older Android NDK versions. + // To work around this, when we build with those we use the portable // implementation instead. -#if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_OS_NACL) +#if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_USE_PORTABLE_LOG2) return 63 ^ static_cast(__builtin_clzll(n)); #else return Log2FloorNonZero64_Portable(n); -- cgit v1.2.3