Commit daced74d authored by pliard@google.com's avatar pliard@google.com

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
parent d0e03932
......@@ -63,12 +63,12 @@ namespace protobuf {
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 Acquire_Load(volatile const Atomic32* ptr);
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 @@ void Release_Store(volatile Atomic64* ptr, Atomic64 value);
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 @@ Atomic64 Release_Load(volatile const Atomic64* ptr);
// 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 @@ GOOGLE_PROTOBUF_ATOMICOPS_ERROR
// 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
......
......@@ -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_
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment