Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(221)

Unified Diff: src/globals.h

Issue 20734002: Implement correct OS and CC detection. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Reverted changes to atomicops*.h Created 7 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/gdb-jit.cc ('k') | src/ia32/macro-assembler-ia32.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/globals.h
diff --git a/src/globals.h b/src/globals.h
index 26fd53114c62d582501e5d37c2c7791cb60cd99b..851fa47e16fe2c6cf8b7fc417494cf5f0d7d99d0 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -28,46 +28,120 @@
#ifndef V8_GLOBALS_H_
#define V8_GLOBALS_H_
-// Define V8_INFINITY
-#define V8_INFINITY INFINITY
+// ----------------------------------------------------------------------------
+// Operating system detection (V8_OS_x)
+//
+// ANDROID - Android
+// BSD4 - Any BSD 4.4 system
+// CYGWIN - Cygwin
+// DARWIN - Darwin / Mac OS X
+// FREEBSD - FreeBSD
+// LINUX - Linux
+// NACL - Native Client
+// NETBSD - NetBSD
+// OPENBSD - OpenBSD
+// SOLARIS - Solaris
+// UNIX - Any UNIX BSD/SYSV system
+// WIN32 - Win32 (Windows 2000/XP/Vista/7 and Windows Server 2003/2008)
+
+#if defined(ANDROID) || defined(__ANDROID__)
+# define V8_OS_ANDROID 1
+# define V8_OS_LINUX 1
+# define V8_OS_UNIX 1
+#elif defined(__APPLE__) && defined(__MACH__)
+# define V8_OS_DARWIN 1
+# define V8_OS_BSD4 1
+# define V8_OS_UNIX 1
+#elif defined(__CYGWIN__)
+# define V8_OS_CYGWIN 1
+# define V8_OS_UNIX 1
+#elif defined(WIN64) || defined(_WIN64) || defined(__WIN64__)
+# define V8_OS_WIN32 1
+# define V8_OS_WIN64 1
+#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || \
+ (defined(__MWERKS__) && defined(__INTEL__))
+# define V8_OS_WIN32 1
+#elif defined(__sun) || defined(sun)
+# define V8_OS_SOLARIS 1
+# define V8_OS_UNIX 1
+#elif defined(__native_client__)
+# define V8_OS_NACL 1
+#elif defined(__linux__) || defined(__linux)
+# define V8_OS_LINUX 1
+# define V8_OS_UNIX 1
+#elif defined(__FreeBSD__) || defined(__DragonFly__)
+# define V8_OS_FREEBSD 1
+# define V8_OS_BSD4 1
+# define V8_OS_UNIX 1
+#elif defined(__NetBSD__)
+# define V8_OS_NETBSD 1
+# define V8_OS_BSD4 1
+# define V8_OS_UNIX 1
+#elif defined(__OpenBSD__)
+# define V8_OS_OPENBSD 1
+# define V8_OS_BSD4 1
+# define V8_OS_UNIX 1
+#else
+# error Operating system was not detected as supported by v8
+#endif
-// GCC specific stuff
-#ifdef __GNUC__
-#define __GNUC_VERSION_FOR_INFTY__ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100)
+// ----------------------------------------------------------------------------
+// Compiler detection (V8_CC_x)
+//
+// CLANG - C++ front-end for the LLVM compiler
+// GNU - GNU C++ or compatible
+// INTEL - Intel C++ for Linux or Windows
+// MINGW - Minimalistic GNU for Windows Compiler
+// MIPS - MIPSpro C++
+// MSVC - Microsoft Visual C/C++ or compatible
+// RVCT - ARM Realview Compiler Suite
-// Unfortunately, the INFINITY macro cannot be used with the '-pedantic'
-// warning flag and certain versions of GCC due to a bug:
-// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11931
-// For now, we use the more involved template-based version from <limits>, but
-// only when compiling with GCC versions affected by the bug (2.96.x - 4.0.x)
-// __GNUC_PREREQ is not defined in GCC for Mac OS X, so we define our own macro
-#if __GNUC_VERSION_FOR_INFTY__ >= 29600 && __GNUC_VERSION_FOR_INFTY__ < 40100
-#include <limits>
-#undef V8_INFINITY
-#define V8_INFINITY std::numeric_limits<double>::infinity()
+#if defined(_MSC_VER)
+# define V8_CC_MSVC 1
+# if defined(__INTEL_COMPILER)
+# define V8_CC_INTEL 1
+# endif
+#elif defined(__GNUC__)
+# define V8_CC_GNU 1
+# define V8_GNUC_PREREQ(major, minor) \
+ ((major) > __GNUC__ || ((major) == __GNUC__ && (minor) >= __GNUC_MINOR__))
+# if defined(__MINGW64__)
+# define V8_CC_MINGW 1
+# define V8_CC_MINGW64 1
+# elif defined(__MINGW32__)
+# define V8_CC_MINGW 1
+# define V8_CC_MINGW32 1
+# elif defined(__ARMCC__) || defined(__CC_ARM)
+# define V8_CC_RVCT 1 // ARM Realview Compiler Suite also masquerades as GCC
+# elif defined(__INTEL_COMPILER)
+# define V8_CC_INTEL 1 // Intel C++ also masquerades as GCC 3.2.0
+# elif defined(__clang__)
+# define V8_CC_CLANG 1 // Clang also masquerades as GCC 4.2.1
+# endif
+#elif defined(__ARMCC__) || defined(__CC_ARM)
+# define V8_CC_RVCT 1
+#elif defined(__INTEL_COMPILER)
+# define V8_CC_INTEL 1
+#elif defined(__SUNPRO_CC) || defined(__SUNPRO_C)
+# define V8_CC_SUN 1
+#else
+# error Compiler was not detected as supported by v8
#endif
-#undef __GNUC_VERSION_FOR_INFTY__
-#endif // __GNUC__
-
-#ifdef _MSC_VER
-#undef V8_INFINITY
-#define V8_INFINITY HUGE_VAL
+#ifndef V8_GNUC_PREREQ
+#define V8_GNUC_PREREQ(major, minor) 0
#endif
-#include "../include/v8stdint.h"
-
-namespace v8 {
-namespace internal {
-
+// ----------------------------------------------------------------------------
// Processor architecture detection. For more info on what's defined, see:
// http://msdn.microsoft.com/en-us/library/b0084kay.aspx
// http://www.agner.org/optimize/calling_conventions.pdf
// or with gcc, run: "echo | gcc -E -dM -"
+
#if defined(_M_X64) || defined(__x86_64__)
-#if defined(__native_client__)
+#if V8_OS_NACL
// For Native Client builds of V8, use V8_TARGET_ARCH_ARM, so that V8
// generates ARM machine code, together with a portable ARM simulator
// compiled for the host architecture in question.
@@ -81,7 +155,7 @@ namespace internal {
#define V8_HOST_ARCH_X64 1
#define V8_HOST_ARCH_64_BIT 1
#define V8_HOST_CAN_READ_UNALIGNED 1
-#endif // __native_client__
+#endif // V8_OS_NACL
#elif defined(_M_IX86) || defined(__i386__)
#define V8_HOST_ARCH_IA32 1
#define V8_HOST_ARCH_32_BIT 1
@@ -101,7 +175,7 @@ namespace internal {
defined(__ARM_ARCH_7__)
# define CAN_USE_ARMV7_INSTRUCTIONS 1
# ifndef CAN_USE_VFP3_INSTRUCTIONS
-# define CAN_USE_VFP3_INSTRUCTIONS
+# define CAN_USE_VFP3_INSTRUCTIONS 1
# endif
#endif
@@ -111,13 +185,13 @@ namespace internal {
// environment as presented by the compiler.
#if !V8_TARGET_ARCH_X64 && !V8_TARGET_ARCH_IA32 && \
!V8_TARGET_ARCH_ARM && !V8_TARGET_ARCH_MIPS
-#if defined(_M_X64) || defined(__x86_64__)
+#if V8_HOST_ARCH_X64
#define V8_TARGET_ARCH_X64 1
-#elif defined(_M_IX86) || defined(__i386__)
+#elif V8_HOST_ARCH_IA32
#define V8_TARGET_ARCH_IA32 1
-#elif defined(__ARMEL__)
+#elif V8_HOST_ARCH_ARM
#define V8_TARGET_ARCH_ARM 1
-#elif defined(__MIPSEL__)
+#elif V8_HOST_ARCH_MIPS
#define V8_TARGET_ARCH_MIPS 1
#else
#error Target architecture was not detected as supported by v8
@@ -163,6 +237,27 @@ namespace internal {
#error Unknown target architecture endiannes
#endif
+// Define V8_INFINITY
+#if V8_CC_GNU && V8_GNUC_PREREQ(2, 96) && !V8_GNUC_PREREQ(4, 1)
+// Unfortunately, the INFINITY macro cannot be used with the '-pedantic'
+// warning flag and certain versions of GCC due to a bug:
+// http://gcc.gnu.org/bugzilla/show_bug.cgi?id=11931
+// For now, we use the more involved template-based version from <limits>, but
+// only when compiling with GCC versions affected by the bug (2.96.x - 4.0.x)
+#include <limits>
+#define V8_INFINITY std::numeric_limits<double>::infinity()
+#elif V8_CC_MSVC
+#define V8_INFINITY HUGE_VAL
+#else
+#define V8_INFINITY INFINITY
+#endif
+
+
+#include "../include/v8stdint.h"
+
+namespace v8 {
+namespace internal {
+
// Support for alternative bool type. This is only enabled if the code is
// compiled with USE_MYBOOL defined. This catches some nasty type bugs.
// For instance, 'bool b = "false";' results in b == true! This is a hidden
@@ -187,12 +282,12 @@ typedef byte* Address;
// than defining __STDC_CONSTANT_MACROS before including <stdint.h>, and it
// works on compilers that don't have it (like MSVC).
#if V8_HOST_ARCH_64_BIT
-#if defined(_MSC_VER)
+#if V8_CC_MSVC
#define V8_UINT64_C(x) (x ## UI64)
#define V8_INT64_C(x) (x ## I64)
#define V8_INTPTR_C(x) (x ## I64)
#define V8_PTR_PREFIX "ll"
-#elif defined(__MINGW64__)
+#elif V8_CC_MINGW64
#define V8_UINT64_C(x) (x ## ULL)
#define V8_INT64_C(x) (x ## LL)
#define V8_INTPTR_C(x) (x ## LL)
@@ -218,16 +313,11 @@ typedef byte* Address;
#define V8PRIuPTR V8_PTR_PREFIX "u"
// Fix for Mac OS X defining uintptr_t as "unsigned long":
-#if defined(__APPLE__) && defined(__MACH__)
+#if V8_OS_DARWIN
#undef V8PRIxPTR
#define V8PRIxPTR "lx"
#endif
-#if (defined(__APPLE__) && defined(__MACH__)) || \
- defined(__FreeBSD__) || defined(__OpenBSD__)
-#define USING_BSD_ABI
-#endif
-
// -----------------------------------------------------------------------------
// Constants
@@ -358,15 +448,15 @@ F FUNCTION_CAST(Address addr) {
// Define used for helping GCC to make better inlining. Don't bother for debug
// builds. On GCC 3.4.5 using __attribute__((always_inline)) causes compilation
// errors in debug build.
-#if defined(__GNUC__) && !defined(DEBUG)
-#if (__GNUC__ >= 4)
+#if V8_CC_GNU && !defined(DEBUG)
+#if V8_GNUC_PREREQ(4, 0)
#define INLINE(header) inline header __attribute__((always_inline))
#define NO_INLINE(header) header __attribute__((noinline))
#else
#define INLINE(header) inline __attribute__((always_inline)) header
#define NO_INLINE(header) __attribute__((noinline)) header
#endif
-#elif defined(_MSC_VER) && !defined(DEBUG)
+#elif V8_CC_MSVC && !defined(DEBUG)
#define INLINE(header) __forceinline header
#define NO_INLINE(header) header
#else
@@ -375,7 +465,7 @@ F FUNCTION_CAST(Address addr) {
#endif
-#if defined(__GNUC__) && __GNUC__ >= 4
+#if V8_GNUC_PREREQ(4, 0)
#define MUST_USE_RESULT __attribute__ ((warn_unused_result))
#else
#define MUST_USE_RESULT
« no previous file with comments | « src/gdb-jit.cc ('k') | src/ia32/macro-assembler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698