Index: runtime/vm/globals.h |
diff --git a/runtime/vm/globals.h b/runtime/vm/globals.h |
index ffb6d3ff036d6d57901f18b22bf8245770d26b98..be3981885c6392664c0e6c378e36477a299aa0f4 100644 |
--- a/runtime/vm/globals.h |
+++ b/runtime/vm/globals.h |
@@ -22,121 +22,6 @@ |
namespace dart { |
-// 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__) |
-#define HOST_ARCH_X64 1 |
-#define ARCH_IS_64_BIT 1 |
-#elif defined(_M_IX86) || defined(__i386__) |
-#define HOST_ARCH_IA32 1 |
-#define ARCH_IS_32_BIT 1 |
-#elif defined(__ARMEL__) |
-#define HOST_ARCH_ARM 1 |
-#define ARCH_IS_32_BIT 1 |
-#else |
-#error Architecture was not detected as supported by Dart. |
-#endif |
- |
-#if !defined(TARGET_ARCH_ARM) |
-#if !defined(TARGET_ARCH_X64) |
-#if !defined(TARGET_ARCH_IA32) |
-// No target architecture specified pick the one matching the host architecture. |
-#if defined(HOST_ARCH_ARM) |
-#define TARGET_ARCH_ARM 1 |
-#elif defined(HOST_ARCH_X64) |
-#define TARGET_ARCH_X64 1 |
-#elif defined(HOST_ARCH_IA32) |
-#define TARGET_ARCH_IA32 1 |
-#else |
-#error Automatic target architecture detection failed. |
-#endif |
-#endif |
-#endif |
-#endif |
- |
-// Verify that host and target architectures match, we cannot |
-// have a 64 bit Dart VM generating 32 bit code or vice-versa. |
-#if defined(TARGET_ARCH_X64) |
-#if !defined(ARCH_IS_64_BIT) |
-#error Mismatched Host/Target architectures. |
-#endif |
-#elif defined(TARGET_ARCH_IA32) || defined(TARGET_ARCH_ARM) |
-#if !defined(ARCH_IS_32_BIT) |
-#error Mismatched Host/Target architectures. |
-#endif |
-#endif |
- |
- |
-// Printf format for intptr_t on Windows. |
-#if !defined(PRIxPTR) && defined(TARGET_OS_WINDOWS) |
-#if defined(ARCH_IS_32_BIT) |
-#define PRIxPTR "x" |
-#else |
-#define PRIxPTR "llx" |
-#endif // defined(ARCH_IS_32_BIT) |
-#endif // !defined(PRIxPTR) && defined(TARGET_OS_WINDOWS) |
- |
- |
-// Suffixes for 64-bit integer literals. |
-#ifdef _MSC_VER |
-#define DART_INT64_C(x) x##I64 |
-#define DART_UINT64_C(x) x##UI64 |
-#else |
-#define DART_INT64_C(x) x##LL |
-#define DART_UINT64_C(x) x##ULL |
-#endif |
- |
- |
-// The following macro works on both 32 and 64-bit platforms. |
-// Usage: instead of writing 0x1234567890123456 |
-// write DART_2PART_UINT64_C(0x12345678,90123456); |
-#define DART_2PART_UINT64_C(a, b) \ |
- (((static_cast<uint64_t>(a) << 32) + 0x##b##u)) |
- |
- |
-// Types for native machine words. Guaranteed to be able to hold pointers and |
-// integers. |
-typedef intptr_t word; |
-typedef uintptr_t uword; |
- |
-// A type large enough to contain the value of the C++ vtable. This is needed |
-// to support the handle operations. |
-typedef uword cpp_vtable; |
- |
-// Byte sizes. |
-const int kWordSize = sizeof(word); |
-#ifdef ARCH_IS_32_BIT |
-const int kWordSizeLog2 = 2; |
-#else |
-const int kWordSizeLog2 = 3; |
-#endif |
- |
-// Bit sizes. |
-const int kBitsPerByte = 8; |
-const int kBitsPerByteLog2 = 3; |
-const int kBitsPerWord = kWordSize * kBitsPerByte; |
- |
-// System-wide named constants. |
-const int KB = 1024; |
-const int MB = KB * KB; |
-const int GB = KB * KB * KB; |
-const intptr_t kIntptrOne = 1; |
-const intptr_t kIntptrMin = (kIntptrOne << (kBitsPerWord - 1)); |
-const intptr_t kIntptrMax = ~kIntptrMin; |
- |
-// Time constants. |
-const int kMillisecondsPerSecond = 1000; |
-const int kMicrosecondsPerMillisecond = 1000; |
-const int kMicrosecondsPerSecond = (kMicrosecondsPerMillisecond * |
- kMillisecondsPerSecond); |
-const int kNanosecondsPerMicrosecond = 1000; |
-const int kNanosecondsPerMillisecond = (kNanosecondsPerMicrosecond * |
- kMicrosecondsPerMillisecond); |
-const int kNanosecondsPerSecond = (kNanosecondsPerMicrosecond * |
- kMicrosecondsPerSecond); |
- |
// The expression ARRAY_SIZE(array) is a compile-time constant of type |
// size_t which represents the number of elements of the given |
// array. You should only use ARRAY_SIZE on statically allocated |
@@ -166,108 +51,9 @@ const intptr_t kOffsetOfPtr = 32; |
(reinterpret_cast<type*>(kOffsetOfPtr)->accessor())) - kOffsetOfPtr) |
-// Use implicit_cast as a safe version of static_cast or const_cast |
-// for upcasting in the type hierarchy (i.e. casting a pointer to Foo |
-// to a pointer to SuperclassOfFoo or casting a pointer to Foo to |
-// a const pointer to Foo). |
-// When you use implicit_cast, the compiler checks that the cast is safe. |
-// Such explicit implicit_casts are necessary in surprisingly many |
-// situations where C++ demands an exact type match instead of an |
-// argument type convertable to a target type. |
-// |
-// The From type can be inferred, so the preferred syntax for using |
-// implicit_cast is the same as for static_cast etc.: |
-// |
-// implicit_cast<ToType>(expr) |
-// |
-// implicit_cast would have been part of the C++ standard library, |
-// but the proposal was submitted too late. It will probably make |
-// its way into the language in the future. |
-template<typename To, typename From> |
-inline To implicit_cast(From const &f) { |
- return f; |
-} |
- |
- |
-// Use like this: down_cast<T*>(foo); |
-template<typename To, typename From> // use like this: down_cast<T*>(foo); |
-inline To down_cast(From* f) { // so we only accept pointers |
- // Ensures that To is a sub-type of From *. This test is here only |
- // for compile-time type checking, and has no overhead in an |
- // optimized build at run-time, as it will be optimized away completely. |
- if (false) { |
- implicit_cast<From*, To>(0); |
- } |
- return static_cast<To>(f); |
-} |
- |
- |
-// The type-based aliasing rule allows the compiler to assume that |
-// pointers of different types (for some definition of different) |
-// never alias each other. Thus the following code does not work: |
-// |
-// float f = foo(); |
-// int fbits = *(int*)(&f); |
-// |
-// The compiler 'knows' that the int pointer can't refer to f since |
-// the types don't match, so the compiler may cache f in a register, |
-// leaving random data in fbits. Using C++ style casts makes no |
-// difference, however a pointer to char data is assumed to alias any |
-// other pointer. This is the 'memcpy exception'. |
-// |
-// The bit_cast function uses the memcpy exception to move the bits |
-// from a variable of one type to a variable of another type. Of |
-// course the end result is likely to be implementation dependent. |
-// Most compilers (gcc-4.2 and MSVC 2005) will completely optimize |
-// bit_cast away. |
-// |
-// There is an additional use for bit_cast. Recent gccs will warn when |
-// they see casts that may result in breakage due to the type-based |
-// aliasing rule. If you have checked that there is no breakage you |
-// can use bit_cast to cast one pointer type to another. This confuses |
-// gcc enough that it can no longer see that you have cast one pointer |
-// type to another thus avoiding the warning. |
-template <class D, class S> |
-inline D bit_cast(const S& source) { |
- // Compile time assertion: sizeof(D) == sizeof(S). A compile error |
- // here means your D and S have different sizes. |
- typedef char VerifySizesAreEqual[sizeof(D) == sizeof(S) ? 1 : -1]; |
- |
- D destination; |
- // This use of memcpy is safe: source and destination cannot overlap. |
- memcpy(&destination, &source, sizeof(destination)); |
- return destination; |
-} |
- |
- |
-// Similar to bit_cast, but allows copying from types of unrelated |
-// sizes. This method was introduced to enable the strict aliasing |
-// optimizations of GCC 4.4. Basically, GCC mindlessly relies on |
-// obscure details in the C++ standard that make reinterpret_cast |
-// virtually useless. |
-template<class D, class S> |
-inline D bit_copy(const S& source) { |
- D destination; |
- // This use of memcpy is safe: source and destination cannot overlap. |
- memcpy(&destination, |
- reinterpret_cast<const void*>(&source), |
- sizeof(destination)); |
- return destination; |
-} |
- |
-// A macro to ensure that memcpy cannot be called. memcpy does not handle |
-// overlapping memory regions. Even though this is well documented it seems |
-// to be used in error quite often. To avoid problems we disallow the direct |
-// use of memcpy here. |
-// |
-// On Windows the basic libraries use memcpy and therefore compilation will |
-// fail if memcpy is overwritten even if user code does not use memcpy. |
-#if defined(memcpy) |
-#undef memcpy |
-#endif |
-#if !defined(TARGET_OS_WINDOWS) |
-#define memcpy "Please use memmove instead of memcpy." |
-#endif |
+// A type large enough to contain the value of the C++ vtable. This is needed |
+// to support the handle operations. |
+typedef uword cpp_vtable; |
// When using GCC we can use GCC attributes to ensure that certain |