瀏覽代碼

Merge pull request #4018 from acozzette/android-portable-log2-floor

Use the portable version of Log2Floor for Clang with older Android NDK versions
Adam Cozzette 7 年之前
父節點
當前提交
0fcca8f910
共有 1 個文件被更改,包括 12 次插入4 次删除
  1. 12 4
      src/google/protobuf/stubs/port.h

+ 12 - 4
src/google/protobuf/stubs/port.h

@@ -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);