|
@@ -348,6 +348,13 @@ inline void GOOGLE_UNALIGNED_STORE64(void *p, uint64 v) {
|
|
}
|
|
}
|
|
#endif
|
|
#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)
|
|
#if defined(_MSC_VER)
|
|
#define GOOGLE_THREAD_LOCAL __declspec(thread)
|
|
#define GOOGLE_THREAD_LOCAL __declspec(thread)
|
|
#else
|
|
#else
|
|
@@ -413,12 +420,13 @@ class Bits {
|
|
}
|
|
}
|
|
|
|
|
|
static uint32 Log2FloorNonZero64(uint64 n) {
|
|
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
|
|
// 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.
|
|
// implementation instead.
|
|
-#if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_OS_NACL)
|
|
|
|
|
|
+#if defined(__GNUC__) && !defined(GOOGLE_PROTOBUF_USE_PORTABLE_LOG2)
|
|
return 63 ^ static_cast<uint32>(__builtin_clzll(n));
|
|
return 63 ^ static_cast<uint32>(__builtin_clzll(n));
|
|
#else
|
|
#else
|
|
return Log2FloorNonZero64_Portable(n);
|
|
return Log2FloorNonZero64_Portable(n);
|