13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
28a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Redistribution and use in source and binary forms, with or without
38a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// modification, are permitted provided that the following conditions are
48a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// met:
58a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
68a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions of source code must retain the above copyright
78a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       notice, this list of conditions and the following disclaimer.
88a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Redistributions in binary form must reproduce the above
98a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       copyright notice, this list of conditions and the following
108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       disclaimer in the documentation and/or other materials provided
118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       with the distribution.
128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//     * Neither the name of Google Inc. nor the names of its
138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       contributors may be used to endorse or promote products derived
148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//       from this software without specific prior written permission.
158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifndef V8_V8GLOBALS_H_
298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define V8_V8GLOBALS_H_
308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#include "globals.h"
323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#include "checks.h"
338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace v8 {
358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace internal {
368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// This file contains constants and global declarations related to the
388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// V8 system.
398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Mask for the sign bit in a smi.
418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kSmiSignMask = kIntptrSignBit;
428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kObjectAlignmentBits = kPointerSizeLog2;
448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kObjectAlignment = 1 << kObjectAlignmentBits;
458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kObjectAlignmentMask = kObjectAlignment - 1;
468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for pointers.
488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kPointerAlignment = (1 << kPointerSizeLog2);
498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kPointerAlignmentMask = kPointerAlignment - 1;
508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for maps.
528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#if V8_HOST_ARCH_64_BIT
538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentBits = kObjectAlignmentBits;
548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else
558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentBits = kObjectAlignmentBits + 3;
568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif
578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignment = (1 << kMapAlignmentBits);
588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentMask = kMapAlignment - 1;
598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for generated code is 32 bytes (to improve cache line
618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// utilization).
628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kCodeAlignmentBits = 5;
638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kCodeAlignment = 1 << kCodeAlignmentBits;
648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kCodeAlignmentMask = kCodeAlignment - 1;
658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Tag information for Failure.
678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kFailureTag = 3;
688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kFailureTagSize = 2;
698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kFailureTagMask = (1 << kFailureTagSize) - 1;
708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Zap-value: The value used for zapping dead objects.
731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Should be a recognizable hex value tagged as a failure.
748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef V8_HOST_ARCH_64_BIT
758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kZapValue =
761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    reinterpret_cast<Address>(V8_UINT64_C(0xdeadbeedbeadbeef));
778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kHandleZapValue =
781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    reinterpret_cast<Address>(V8_UINT64_C(0x1baddead0baddeaf));
798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kFromSpaceZapValue =
801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    reinterpret_cast<Address>(V8_UINT64_C(0x1beefdad0beefdaf));
81b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst uint64_t kDebugZapValue = V8_UINT64_C(0xbadbaddbbadbaddb);
821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst uint64_t kSlotsZapValue = V8_UINT64_C(0xbeefdeadbeefdeef);
833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint64_t kFreeListZapValue = 0xfeed1eaffeed1eaf;
848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else
851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kZapValue = reinterpret_cast<Address>(0xdeadbeef);
861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kHandleZapValue = reinterpret_cast<Address>(0xbaddeaf);
871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kFromSpaceZapValue = reinterpret_cast<Address>(0xbeefdaf);
881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst uint32_t kSlotsZapValue = 0xbeefdeef;
898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint32_t kDebugZapValue = 0xbadbaddb;
903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint32_t kFreeListZapValue = 0xfeed1eaf;
918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif
928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Number of bits to represent the page size for paged spaces. The value of 20
953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// gives 1Mb bytes per page.
963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst int kPageSizeBits = 20;
978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On Intel architecture, cache line size is 64 bytes.
998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On ARM it may be less (32 bytes), but as far this constant is
1008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// used for aligning data, it doesn't hurt to align on a greater value.
1018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kProcessorCacheLineSize = 64;
1028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Constants relevant to double precision floating point numbers.
1048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// If looking only at the top 32 bits, the QNaN mask is bits 19 to 30.
1058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint32_t kQuietNaNHighBitsMask = 0xfff << (51 - 32);
1068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// -----------------------------------------------------------------------------
1098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Forward declarations for frequently used classes
1108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AccessorInfo;
1128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Allocation;
1138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Arguments;
1148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Assembler;
1158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AssertNoAllocation;
1168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Code;
1178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass CodeGenerator;
1188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass CodeStub;
1198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Context;
1208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Debug;
1218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Debugger;
1228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass DebugInfo;
1238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Descriptor;
1248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass DescriptorArray;
1258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass ExternalReference;
1268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FixedArray;
1278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionTemplateInfo;
1283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass MemoryChunk;
129c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass SeededNumberDictionary;
130c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdochclass UnseededNumberDictionary;
1318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass StringDictionary;
1328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate <typename T> class Handle;
1338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Heap;
1348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass HeapObject;
1358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass IC;
1368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass InterceptorInfo;
1378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSArray;
1388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSFunction;
1398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSObject;
1408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass LargeObjectSpace;
1418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass LookupResult;
1428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MacroAssembler;
1438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Map;
1448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MapSpace;
1458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MarkCompactCollector;
1468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass NewSpace;
1478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Object;
1488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MaybeObject;
1498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass OldSpace;
150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass Foreign;
1518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Scope;
1523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass ScopeInfo;
1538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Script;
1548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Smi;
1558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate <typename Config, class Allocator = FreeStoreAllocationPolicy>
1568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    class SplayTree;
1578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass String;
1588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Struct;
1598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Variable;
1608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RelocInfo;
1618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Deserializer;
1628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MessageLocation;
1638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass ObjectGroup;
1648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass TickSample;
1658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass VirtualMemory;
1668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Mutex;
1678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef bool (*WeakSlotCallback)(Object** pointer);
1698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochtypedef bool (*WeakSlotCallbackWithHeap)(Heap* heap, Object** pointer);
171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// -----------------------------------------------------------------------------
1738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Miscellaneous
1748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// NOTE: SpaceIterator depends on AllocationSpace enumeration values being
1768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// consecutive.
1778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum AllocationSpace {
1788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NEW_SPACE,            // Semispaces collected with copying collector.
1798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  OLD_POINTER_SPACE,    // May contain pointers to new space.
1808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  OLD_DATA_SPACE,       // Must not have pointers to new space.
1818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CODE_SPACE,           // No pointers to new space, marked executable.
1828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MAP_SPACE,            // Only and all map objects.
1838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  CELL_SPACE,           // Only and all cell objects.
1848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  LO_SPACE,             // Promoted large objects.
1858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  FIRST_SPACE = NEW_SPACE,
1878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  LAST_SPACE = LO_SPACE,
1888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  FIRST_PAGED_SPACE = OLD_POINTER_SPACE,
1898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  LAST_PAGED_SPACE = CELL_SPACE
1908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
1918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kSpaceTagSize = 3;
1928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kSpaceTagMask = (1 << kSpaceTagSize) - 1;
1938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
1958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A flag that indicates whether objects should be pretenured when
1968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// allocated (allocated directly into the old generation) or not
1978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (allocated in the young generation if the object size and type
1988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// allows).
1998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum PretenureFlag { NOT_TENURED, TENURED };
2008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum GarbageCollector { SCAVENGER, MARK_COMPACTOR };
2028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum Executability { NOT_EXECUTABLE, EXECUTABLE };
2048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochenum VisitMode {
206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  VISIT_ALL,
207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  VISIT_ALL_IN_SCAVENGE,
208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  VISIT_ALL_IN_SWEEP_NEWSPACE,
209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  VISIT_ONLY_STRONG
210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
2118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Flag indicating whether code is built into the VM (one of the natives files).
2138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum NativesFlag { NOT_NATIVES_CODE, NATIVES_CODE };
2148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A CodeDesc describes a buffer holding instructions and relocation
2178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// information. The instructions start at the beginning of the buffer
2188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// and grow forward, the relocation information starts at the end of
2198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// the buffer and grows backward.
2208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//
2218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |<--------------- buffer_size ---------------->|
2228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |<-- instr_size -->|        |<-- reloc_size -->|
2238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  +==================+========+==================+
2248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |   instructions   |  free  |    reloc info    |
2258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  +==================+========+==================+
2268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  ^
2278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  |
2288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang//  buffer
2298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct CodeDesc {
2318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  byte* buffer;
2328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int buffer_size;
2338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int instr_size;
2348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int reloc_size;
2358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  Assembler* origin;
2368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function used for iterating objects in heap spaces,
2408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// for example, scanning heap objects.
2418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef int (*HeapObjectCallback)(HeapObject* obj);
2428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function used for checking constraints when copying/relocating
2458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// objects. Returns true if an object can be copied/relocated from its
2468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// old_addr to a new_addr.
2478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef bool (*ConstraintCallback)(Address new_addr, Address old_addr);
2488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function on inline caches, used for iterating over inline caches
2518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// in compiled code.
2528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef void (*InlineCacheCallback)(Code* code, Address ic);
2538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// State for inline cache call sites. Aliased as IC::State.
2568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InlineCacheState {
2578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Has never been executed.
2588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  UNINITIALIZED,
2598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Has been executed but monomorhic state has been delayed.
2608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  PREMONOMORPHIC,
2618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Has been executed and only one receiver type has been seen.
2628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MONOMORPHIC,
2638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Like MONOMORPHIC but check failed due to prototype.
2648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MONOMORPHIC_PROTOTYPE_FAILURE,
2658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Multiple receiver types have been seen.
2668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MEGAMORPHIC,
2678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Special states for debug break or step in prepare stubs.
2688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DEBUG_BREAK,
2698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DEBUG_PREPARE_STEP_IN
2708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochenum CheckType {
274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  RECEIVER_MAP_CHECK,
275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  STRING_CHECK,
276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  NUMBER_CHECK,
277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  BOOLEAN_CHECK
278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch};
279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum CallFunctionFlags {
2828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  NO_CALL_FUNCTION_FLAGS = 0,
283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Receiver might implicitly be the global objects. If it is, the
284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // hole is passed to the call function stub.
2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  RECEIVER_MIGHT_BE_IMPLICIT = 1 << 0,
2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // The call target is cached in the instruction stream.
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  RECORD_CALL_TARGET = 1 << 1
2888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InlineCacheHolderFlag {
2928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  OWN_MAP,  // For fast properties objects.
2938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  PROTOTYPE_MAP  // For slow properties objects (except GlobalObjects).
2948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
2958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// The Store Buffer (GC).
2983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtypedef enum {
2993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  kStoreBufferFullEvent,
3003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  kStoreBufferStartScanningPagesEvent,
3013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  kStoreBufferScanningPageEvent
3023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} StoreBufferEvent;
3033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
3053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtypedef void (*StoreBufferCallback)(Heap* heap,
3063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    MemoryChunk* page,
3073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    StoreBufferEvent event);
3088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Whether to remove map transitions and constant transitions from a
3118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// DescriptorArray.
3128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum TransitionFlag {
3138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  REMOVE_TRANSITIONS,
3148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  KEEP_TRANSITIONS
3158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Union used for fast testing of specific double values.
3198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion DoubleRepresentation {
3208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double  value;
3218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  int64_t bits;
3228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  DoubleRepresentation(double x) { value = x; }
3238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Union used for customized checking of the IEEE double types
3278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// inlined within v8 runtime, rather than going to the underlying
3288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// platform headers and libraries
3298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion IeeeDoubleLittleEndianArchType {
3308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double d;
3318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  struct {
3328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_low  :32;
3338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_high :20;
3348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int exp      :11;
3358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int sign     :1;
3368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  } bits;
3378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion IeeeDoubleBigEndianArchType {
3418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  double d;
3428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  struct {
3438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int sign     :1;
3448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int exp      :11;
3458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_high :20;
3468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    unsigned int man_low  :32;
3478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  } bits;
3488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// AccessorCallback
3528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct AccessorDescriptor {
3538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MaybeObject* (*getter)(Object* object, void* data);
3548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  MaybeObject* (*setter)(JSObject* object, Object* value, void* data);
3558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void* data;
3568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// Logging and profiling.  A StateTag represents a possible state of
3603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// the VM. The logger maintains a stack of these. Creating a VMState
3613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// object enters a state by pushing on the stack, and destroying a
3623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// VMState object leaves a state by popping the current state from the
3633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// stack.
3648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define STATE_TAG_LIST(V) \
3668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(JS)                   \
3678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(GC)                   \
3688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(COMPILER)             \
3698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(OTHER)                \
3708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  V(EXTERNAL)
3718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum StateTag {
3738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define DEF_STATE_TAG(name) name,
3748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  STATE_TAG_LIST(DEF_STATE_TAG)
3758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#undef DEF_STATE_TAG
3768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  // Pseudo-types.
3778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  state_tag_count
3788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang};
3798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// -----------------------------------------------------------------------------
3828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Macros
3838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Testers for test.
3858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define HAS_SMI_TAG(value) \
3878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag)
3888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define HAS_FAILURE_TAG(value) \
3908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  ((reinterpret_cast<intptr_t>(value) & kFailureTagMask) == kFailureTag)
3918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OBJECT_POINTER_ALIGN returns the value aligned as a HeapObject pointer
3938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define OBJECT_POINTER_ALIGN(value)                             \
3948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kObjectAlignmentMask) & ~kObjectAlignmentMask)
3958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
3968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// POINTER_SIZE_ALIGN returns the value aligned as a pointer.
3978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define POINTER_SIZE_ALIGN(value)                               \
3988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kPointerAlignmentMask) & ~kPointerAlignmentMask)
3998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// MAP_POINTER_ALIGN returns the value aligned as a map pointer.
4018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define MAP_POINTER_ALIGN(value)                                \
4028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kMapAlignmentMask) & ~kMapAlignmentMask)
4038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// CODE_POINTER_ALIGN returns the value aligned as a generated code segment.
4058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define CODE_POINTER_ALIGN(value)                               \
4068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  (((value) + kCodeAlignmentMask) & ~kCodeAlignmentMask)
4078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Support for tracking C++ memory allocation.  Insert TRACK_MEMORY("Fisk")
4098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// inside a C++ class and new and delete will be overloaded so logging is
4108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// performed.
4118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// This file (globals.h) is included before log.h, so we use direct calls to
4128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// the Logger rather than the LOG macro.
4138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef DEBUG
4148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define TRACK_MEMORY(name) \
4158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void* operator new(size_t size) { \
4168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    void* result = ::operator new(size); \
41744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Logger::NewEventStatic(name, result, size); \
4188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    return result; \
4198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  } \
4208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  void operator delete(void* object) { \
42144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Logger::DeleteEventStatic(name, object); \
4228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang    ::operator delete(object); \
4238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang  }
4248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else
4258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define TRACK_MEMORY(name)
4268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif
4278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
4298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Feature flags bit positions. They are mostly based on the CPUID spec.
4308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (We assign CPUID itself to one of the currently reserved bits --
4318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// feel free to change this if needed.)
4328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On X86/X64, values below 32 are bits in EDX, values above 32 are bits in ECX.
4338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum CpuFeature { SSE4_1 = 32 + 19,  // x86
4348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  SSE3 = 32 + 0,     // x86
4358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  SSE2 = 26,   // x86
4368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  CMOV = 15,   // x86
4378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  RDTSC = 4,   // x86
4388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  CPUID = 10,  // x86
4398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  VFP3 = 1,    // ARM
4408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang                  ARMv7 = 2,   // ARM
44144f0eee88ff00398ff7f715fab053374d808c90dSteve Block                  SAHF = 0,    // x86
44244f0eee88ff00398ff7f715fab053374d808c90dSteve Block                  FPU = 1};    // MIPS
4438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Used to specify if a macro instruction must perform a smi check on tagged
446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// values.
447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochenum SmiCheckType {
4483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DONT_DO_SMI_CHECK,
449257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DO_SMI_CHECK
450257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// Used to specify whether a receiver is implicitly or explicitly
454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// provided to a call.
455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochenum CallKind {
4563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CALL_AS_METHOD,
457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  CALL_AS_FUNCTION
458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch};
459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
4603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum ScopeType {
4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  EVAL_SCOPE,      // The top-level scope for an eval source.
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  FUNCTION_SCOPE,  // The top-level scope for a function.
4643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  MODULE_SCOPE,    // The scope introduced by a module literal
4653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GLOBAL_SCOPE,    // The top-level scope for a program or a top-level eval.
4663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CATCH_SCOPE,     // The scope introduced by catch.
4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  BLOCK_SCOPE,     // The scope introduced by a new block.
4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  WITH_SCOPE       // The scope introduced by with.
4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
4703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint32_t kHoleNanUpper32 = 0x7FFFFFFF;
4733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint32_t kHoleNanLower32 = 0xFFFFFFFF;
4743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst uint32_t kNaNOrInfinityLowerBoundUpper32 = 0x7FF00000;
4753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochconst uint64_t kHoleNanInt64 =
4773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    (static_cast<uint64_t>(kHoleNanUpper32) << 32) | kHoleNanLower32;
4783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochconst uint64_t kLastNonNaNInt64 =
4793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    (static_cast<uint64_t>(kNaNOrInfinityLowerBoundUpper32) << 32);
4803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
4813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum VariableMode {
4833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // User declared variables:
4843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  VAR,             // declared via 'var', and 'function' declarations
4853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONST,           // declared via 'const' declarations
4873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CONST_HARMONY,   // declared via 'const' declarations in harmony mode
4893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  LET,             // declared via 'let' declarations
4913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Variables introduced by the compiler:
4933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DYNAMIC,         // always require dynamic lookup (we don't know
4943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // the declaration)
4953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
4963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DYNAMIC_GLOBAL,  // requires dynamic lookup, but we know that the
4973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // variable is global unless it has been shadowed
4983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // by an eval-introduced variable
4993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  DYNAMIC_LOCAL,   // requires dynamic lookup, but we know that the
5013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // variable is local and where it is unless it
5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // has been shadowed by an eval-introduced
5033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // variable
5043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  INTERNAL,        // like VAR, but not user-visible (may or may not
5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // be in a context)
5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  TEMPORARY        // temporary variables (not user-visible), never
5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                   // in a context
5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ES6 Draft Rev3 10.2 specifies declarative environment records with mutable
5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// and immutable bindings that can be in two states: initialized and
5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// uninitialized. In ES5 only immutable bindings have these two states. When
5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// accessing a binding, it needs to be checked for initialization. However in
5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// the following cases the binding is initialized immediately after creation
5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// so the initialization check can always be skipped:
5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 1. Var declared local variables.
5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//      var foo;
5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 2. A local variable introduced by a function declaration.
5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//      function foo() {}
5233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 3. Parameters
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//      function x(foo) {}
5253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 4. Catch bound variables.
5263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//      try {} catch (foo) {}
5273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 6. Function variables of named function expressions.
5283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//      var x = function foo() {}
5293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 7. Implicit binding of 'this'.
5303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// 8. Implicit binding of 'arguments' in functions.
5313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
5323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// ES5 specified object environment records which are introduced by ES elements
5333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// such as Program and WithStatement that associate identifier bindings with the
5343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// properties of some object. In the specification only mutable bindings exist
5353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// (which may be non-writable) and have no distinct initialization step. However
5363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// V8 allows const declarations in global code with distinct creation and
5373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// initialization steps which are represented by non-writable properties in the
5383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// global object. As a result also these bindings need to be checked for
5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// initialization.
5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch//
5413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// The following enum specifies a flag that indicates if the binding needs a
5423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// distinct initialization step (kNeedsInitialization) or if the binding is
5433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// immediately initialized upon creation (kCreatedInitialized).
5443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum InitializationFlag {
5453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  kNeedsInitialization,
5463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  kCreatedInitialized
5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum ClearExceptionFlag {
5513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  KEEP_EXCEPTION,
5523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  CLEAR_EXCEPTION
5533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch};
5543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
5568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} }  // namespace v8::internal
5578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang
5588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif  // V8_V8GLOBALS_H_
559