Add support for NaCl in atomicops.
This does additionally a significant cleanup in platform_macros.h (initially
pulled from v8).
It implemented some subtleties that we don't use like the HOST/TARGET arch
distinction.
Changes related to NaCl support come from Chromium's build/build_config.h.
BUG=392
diff --git a/src/google/protobuf/stubs/atomicops.h b/src/google/protobuf/stubs/atomicops.h
index d452a05..1315682 100644
--- a/src/google/protobuf/stubs/atomicops.h
+++ b/src/google/protobuf/stubs/atomicops.h
@@ -63,12 +63,12 @@
namespace internal {
typedef int32 Atomic32;
-#ifdef GOOGLE_PROTOBUF_HOST_ARCH_64_BIT
+#ifdef GOOGLE_PROTOBUF_ARCH_64_BIT
// We need to be able to go between Atomic64 and AtomicWord implicitly. This
// means Atomic64 and AtomicWord should be the same type on 64-bit.
-#if defined(__APPLE__)
-// MacOS is an exception to the implicit conversion rule above,
-// because it uses long for intptr_t.
+#if defined(GOOGLE_PROTOBUF_OS_NACL)
+// NaCl's intptr_t is not actually 64-bits on 64-bit!
+// http://code.google.com/p/nativeclient/issues/detail?id=1162
typedef int64 Atomic64;
#else
typedef intptr_t Atomic64;
@@ -130,7 +130,7 @@
Atomic32 Release_Load(volatile const Atomic32* ptr);
// 64-bit atomic operations (only available on 64-bit processors).
-#ifdef GOOGLE_PROTOBUF_HOST_ARCH_64_BIT
+#ifdef GOOGLE_PROTOBUF_ARCH_64_BIT
Atomic64 NoBarrier_CompareAndSwap(volatile Atomic64* ptr,
Atomic64 old_value,
Atomic64 new_value);
@@ -150,7 +150,7 @@
Atomic64 NoBarrier_Load(volatile const Atomic64* ptr);
Atomic64 Acquire_Load(volatile const Atomic64* ptr);
Atomic64 Release_Load(volatile const Atomic64* ptr);
-#endif // GOOGLE_PROTOBUF_HOST_ARCH_64_BIT
+#endif // GOOGLE_PROTOBUF_ARCH_64_BIT
} // namespace internal
} // namespace protobuf
@@ -162,8 +162,7 @@
// MSVC.
#if defined(_MSC_VER)
-#if defined(GOOGLE_PROTOBUF_HOST_ARCH_IA32) || \
- defined(GOOGLE_PROTOBUF_HOST_ARCH_X64)
+#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
#include <google/protobuf/stubs/atomicops_internals_x86_msvc.h>
#else
GOOGLE_PROTOBUF_ATOMICOPS_ERROR
@@ -175,12 +174,11 @@
// GCC.
#elif defined(__GNUC__)
-#if defined(GOOGLE_PROTOBUF_HOST_ARCH_IA32) || \
- defined(GOOGLE_PROTOBUF_HOST_ARCH_X64)
+#if defined(GOOGLE_PROTOBUF_ARCH_IA32) || defined(GOOGLE_PROTOBUF_ARCH_X64)
#include <google/protobuf/stubs/atomicops_internals_x86_gcc.h>
-#elif defined(GOOGLE_PROTOBUF_HOST_ARCH_ARM)
+#elif defined(GOOGLE_PROTOBUF_ARCH_ARM)
#include <google/protobuf/stubs/atomicops_internals_arm_gcc.h>
-#elif defined(GOOGLE_PROTOBUF_HOST_ARCH_MIPS)
+#elif defined(GOOGLE_PROTOBUF_ARCH_MIPS)
#include <google/protobuf/stubs/atomicops_internals_mips_gcc.h>
#else
GOOGLE_PROTOBUF_ATOMICOPS_ERROR
diff --git a/src/google/protobuf/stubs/platform_macros.h b/src/google/protobuf/stubs/platform_macros.h
index 0cda2b4..cba9fbd 100644
--- a/src/google/protobuf/stubs/platform_macros.h
+++ b/src/google/protobuf/stubs/platform_macros.h
@@ -38,92 +38,27 @@
// http://www.agner.org/optimize/calling_conventions.pdf
// or with gcc, run: "echo | gcc -E -dM -"
#if defined(_M_X64) || defined(__x86_64__)
-#define GOOGLE_PROTOBUF_HOST_ARCH_X64 1
-#define GOOGLE_PROTOBUF_HOST_ARCH_64_BIT 1
-#define GOOGLE_PROTOBUF_HOST_CAN_READ_UNALIGNED 1
+#define GOOGLE_PROTOBUF_ARCH_X64 1
+#define GOOGLE_PROTOBUF_ARCH_64_BIT 1
#elif defined(_M_IX86) || defined(__i386__)
-#define GOOGLE_PROTOBUF_HOST_ARCH_IA32 1
-#define GOOGLE_PROTOBUF_HOST_ARCH_32_BIT 1
-#define GOOGLE_PROTOBUF_HOST_CAN_READ_UNALIGNED 1
+#define GOOGLE_PROTOBUF_ARCH_IA32 1
+#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
#elif defined(__ARMEL__)
-#define GOOGLE_PROTOBUF_HOST_ARCH_ARM 1
-#define GOOGLE_PROTOBUF_HOST_ARCH_32_BIT 1
-// Some CPU-OS combinations allow unaligned access on ARM. We assume
-// that unaligned accesses are not allowed unless the build system
-// defines the CAN_USE_UNALIGNED_ACCESSES macro to be non-zero.
-#if CAN_USE_UNALIGNED_ACCESSES
-#define GOOGLE_PROTOBUF_HOST_CAN_READ_UNALIGNED 1
-#endif
+#define GOOGLE_PROTOBUF_ARCH_ARM 1
+#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
#elif defined(__MIPSEL__)
-#define GOOGLE_PROTOBUF_HOST_ARCH_MIPS 1
-#define GOOGLE_PROTOBUF_HOST_ARCH_32_BIT 1
+#define GOOGLE_PROTOBUF_ARCH_MIPS 1
+#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
+#elif defined(__pnacl__)
+#define GOOGLE_PROTOBUF_ARCH_32_BIT 1
#else
#error Host architecture was not detected as supported by protobuf
#endif
-// Target architecture detection. This may be set externally. If not, detect
-// in the same way as the host architecture, that is, target the native
-// environment as presented by the compiler.
-#if !defined(GOOGLE_PROTOBUF_TARGET_ARCH_X64) && \
- !defined(GOOGLE_PROTOBUF_TARGET_ARCH_IA32) && \
- !defined(GOOGLE_PROTOBUF_TARGET_ARCH_ARM) && \
- !defined(GOOGLE_PROTOBUF_TARGET_ARCH_MIPS)
-#if defined(_M_X64) || defined(__x86_64__)
-#define GOOGLE_PROTOBUF_TARGET_ARCH_X64 1
-#elif defined(_M_IX86) || defined(__i386__)
-#define GOOGLE_PROTOBUF_TARGET_ARCH_IA32 1
-#elif defined(__ARMEL__)
-#define GOOGLE_PROTOBUF_TARGET_ARCH_ARM 1
-#elif defined(__MIPSEL__)
-#define GOOGLE_PROTOBUF_TARGET_ARCH_MIPS 1
-#else
-#error Target architecture was not detected as supported by protobuf
-#endif
-#endif
-
-// Check for supported combinations of host and target architectures.
-#if defined(GOOGLE_PROTOBUF_TARGET_ARCH_IA32) && \
- !defined(GOOGLE_PROTOBUF_HOST_ARCH_IA32)
-#error Target architecture ia32 is only supported on ia32 host
-#endif
-#if defined(GOOGLE_PROTOBUF_TARGET_ARCH_X64) && \
- !defined(GOOGLE_PROTOBUF_HOST_ARCH_X64)
-#error Target architecture x64 is only supported on x64 host
-#endif
-#if (defined(GOOGLE_PROTOBUF_TARGET_ARCH_ARM) && \
- !(defined(GOOGLE_PROTOBUF_HOST_ARCH_IA32) || \
- defined(GOOGLE_PROTOBUF_HOST_ARCH_ARM)))
-#error Target architecture arm is only supported on arm and ia32 host
-#endif
-#if (defined(GOOGLE_PROTOBUF_TARGET_ARCH_MIPS) && \
- !(defined(GOOGLE_PROTOBUF_HOST_ARCH_IA32) || \
- defined(GOOGLE_PROTOBUF_HOST_ARCH_MIPS)))
-#error Target architecture mips is only supported on mips and ia32 host
-#endif
-
-// Define unaligned read for the target architectures supporting it.
-#if defined(GOOGLE_PROTOBUF_TARGET_ARCH_X64) || \
- defined(GOOGLE_PROTOBUF_TARGET_ARCH_IA32)
-#define GOOGLE_PROTOBUF_TARGET_CAN_READ_UNALIGNED 1
-#elif GOOGLE_PROTOBUF_TARGET_ARCH_ARM
-// Some CPU-OS combinations allow unaligned access on ARM. We assume
-// that unaligned accesses are not allowed unless the build system
-// defines the CAN_USE_UNALIGNED_ACCESSES macro to be non-zero.
-#if CAN_USE_UNALIGNED_ACCESSES
-#define GOOGLE_PROTOBUF_TARGET_CAN_READ_UNALIGNED 1
-#endif
-#elif GOOGLE_PROTOBUF_TARGET_ARCH_MIPS
-#else
-#error Target architecture is not supported by protobuf
-#endif
-
-#if (defined(__APPLE__) && defined(__MACH__)) || \
- defined(__FreeBSD__) || defined(__OpenBSD__)
-#define GOOGLE_PROTOBUF_USING_BSD_ABI
-#endif
-
#if defined(__APPLE__)
#define GOOGLE_PROTOBUF_OS_APPLE
+#elif defined(__native_client__)
+#define GOOGLE_PROTOBUF_OS_NACL
#endif
#endif // GOOGLE_PROTOBUF_PLATFORM_MACROS_H_