v8globals.h revision 1e0659c275bb392c045087af4f6b0d7565cb3d77
18a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Copyright 2010 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" 328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace v8 { 348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangnamespace internal { 358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// This file contains constants and global declarations related to the 378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// V8 system. 388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Mask for the sign bit in a smi. 408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kSmiSignMask = kIntptrSignBit; 418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kObjectAlignmentBits = kPointerSizeLog2; 438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kObjectAlignment = 1 << kObjectAlignmentBits; 448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kObjectAlignmentMask = kObjectAlignment - 1; 458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for pointers. 478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kPointerAlignment = (1 << kPointerSizeLog2); 488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kPointerAlignmentMask = kPointerAlignment - 1; 498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for maps. 518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#if V8_HOST_ARCH_64_BIT 528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentBits = kObjectAlignmentBits; 538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else 548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentBits = kObjectAlignmentBits + 3; 558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif 568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignment = (1 << kMapAlignmentBits); 578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kMapAlignmentMask = kMapAlignment - 1; 588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Desired alignment for generated code is 32 bytes (to improve cache line 608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// utilization). 618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kCodeAlignmentBits = 5; 628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kCodeAlignment = 1 << kCodeAlignmentBits; 638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kCodeAlignmentMask = kCodeAlignment - 1; 648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Tag information for Failure. 668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kFailureTag = 3; 678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kFailureTagSize = 2; 688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst intptr_t kFailureTagMask = (1 << kFailureTagSize) - 1; 698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Zap-value: The value used for zapping dead objects. 721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Should be a recognizable hex value tagged as a failure. 738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef V8_HOST_ARCH_64_BIT 748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kZapValue = 751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block reinterpret_cast<Address>(V8_UINT64_C(0xdeadbeedbeadbeef)); 768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kHandleZapValue = 771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block reinterpret_cast<Address>(V8_UINT64_C(0x1baddead0baddeaf)); 788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst Address kFromSpaceZapValue = 791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block reinterpret_cast<Address>(V8_UINT64_C(0x1beefdad0beefdaf)); 80b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdochconst uint64_t kDebugZapValue = V8_UINT64_C(0xbadbaddbbadbaddb); 811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst uint64_t kSlotsZapValue = V8_UINT64_C(0xbeefdeadbeefdeef); 828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else 831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kZapValue = reinterpret_cast<Address>(0xdeadbeef); 841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kHandleZapValue = reinterpret_cast<Address>(0xbaddeaf); 851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst Address kFromSpaceZapValue = reinterpret_cast<Address>(0xbeefdaf); 861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockconst uint32_t kSlotsZapValue = 0xbeefdeef; 878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint32_t kDebugZapValue = 0xbadbaddb; 888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif 898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Number of bits to represent the page size for paged spaces. The value of 13 928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// gives 8K bytes per page. 938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kPageSizeBits = 13; 948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On Intel architecture, cache line size is 64 bytes. 968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On ARM it may be less (32 bytes), but as far this constant is 978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// used for aligning data, it doesn't hurt to align on a greater value. 988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kProcessorCacheLineSize = 64; 998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Constants relevant to double precision floating point numbers. 1018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Quiet NaNs have bits 51 to 62 set, possibly the sign bit, and no 1038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// other bits set. 1048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint64_t kQuietNaNMask = static_cast<uint64_t>(0xfff) << 51; 1058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// If looking only at the top 32 bits, the QNaN mask is bits 19 to 30. 1068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst uint32_t kQuietNaNHighBitsMask = 0xfff << (51 - 32); 1078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ----------------------------------------------------------------------------- 1108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Forward declarations for frequently used classes 1118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (sorted alphabetically) 1128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AccessorInfo; 1148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Allocation; 1158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Arguments; 1168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Assembler; 1178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AssertNoAllocation; 1188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass BreakableStatement; 1198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Code; 1208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass CodeGenerator; 1218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass CodeStub; 1228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Context; 1238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Debug; 1248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Debugger; 1258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass DebugInfo; 1268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Descriptor; 1278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass DescriptorArray; 1288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Expression; 1298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass ExternalReference; 1308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FixedArray; 1318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionEntry; 1328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionLiteral; 1338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass FunctionTemplateInfo; 1348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass NumberDictionary; 1358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass StringDictionary; 1368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate <typename T> class Handle; 1378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Heap; 1388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass HeapObject; 1398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass IC; 1408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass InterceptorInfo; 1418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass IterationStatement; 1428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSArray; 1438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSFunction; 1448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass JSObject; 1458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass LargeObjectSpace; 1468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass LookupResult; 1478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MacroAssembler; 1488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Map; 1498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MapSpace; 1508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MarkCompactCollector; 1518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass NewSpace; 1528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass NodeVisitor; 1538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Object; 1548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MaybeObject; 1558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass OldSpace; 1568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Property; 1578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Proxy; 1588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpNode; 1598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct RegExpCompileData; 1608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpTree; 1618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpCompiler; 1628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RegExpVisitor; 1638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Scope; 1648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate<class Allocator = FreeStoreAllocationPolicy> class ScopeInfo; 1658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass SerializedScopeInfo; 1668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Script; 1678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Slot; 1688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Smi; 1698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtemplate <typename Config, class Allocator = FreeStoreAllocationPolicy> 1708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang class SplayTree; 1718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Statement; 1728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass String; 1738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Struct; 1748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass SwitchStatement; 1758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass AstVisitor; 1768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Variable; 1778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass VariableProxy; 1788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass RelocInfo; 1798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Deserializer; 1808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass MessageLocation; 1818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass ObjectGroup; 1828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass TickSample; 1838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass VirtualMemory; 1848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangclass Mutex; 1858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef bool (*WeakSlotCallback)(Object** pointer); 1878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ----------------------------------------------------------------------------- 1898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Miscellaneous 1908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 1918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// NOTE: SpaceIterator depends on AllocationSpace enumeration values being 1928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// consecutive. 1938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum AllocationSpace { 1948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang NEW_SPACE, // Semispaces collected with copying collector. 1958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang OLD_POINTER_SPACE, // May contain pointers to new space. 1968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang OLD_DATA_SPACE, // Must not have pointers to new space. 1978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CODE_SPACE, // No pointers to new space, marked executable. 1988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang MAP_SPACE, // Only and all map objects. 1998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CELL_SPACE, // Only and all cell objects. 2008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang LO_SPACE, // Promoted large objects. 2018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang FIRST_SPACE = NEW_SPACE, 2038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang LAST_SPACE = LO_SPACE, 2048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang FIRST_PAGED_SPACE = OLD_POINTER_SPACE, 2058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang LAST_PAGED_SPACE = CELL_SPACE 2068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 2078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kSpaceTagSize = 3; 2088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangconst int kSpaceTagMask = (1 << kSpaceTagSize) - 1; 2098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A flag that indicates whether objects should be pretenured when 2128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// allocated (allocated directly into the old generation) or not 2138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (allocated in the young generation if the object size and type 2148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// allows). 2158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum PretenureFlag { NOT_TENURED, TENURED }; 2168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum GarbageCollector { SCAVENGER, MARK_COMPACTOR }; 2188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum Executability { NOT_EXECUTABLE, EXECUTABLE }; 2208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum VisitMode { VISIT_ALL, VISIT_ALL_IN_SCAVENGE, VISIT_ONLY_STRONG }; 2228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Flag indicating whether code is built into the VM (one of the natives files). 2248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum NativesFlag { NOT_NATIVES_CODE, NATIVES_CODE }; 2258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A CodeDesc describes a buffer holding instructions and relocation 2288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// information. The instructions start at the beginning of the buffer 2298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// and grow forward, the relocation information starts at the end of 2308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// the buffer and grows backward. 2318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// 2328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// |<--------------- buffer_size ---------------->| 2338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// |<-- instr_size -->| |<-- reloc_size -->| 2348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// +==================+========+==================+ 2358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// | instructions | free | reloc info | 2368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// +==================+========+==================+ 2378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ^ 2388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// | 2398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// buffer 2408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct CodeDesc { 2428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang byte* buffer; 2438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang int buffer_size; 2448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang int instr_size; 2458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang int reloc_size; 2468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang Assembler* origin; 2478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 2488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function on object slots, used for iterating heap object slots in 2518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// HeapObjects, global pointers to heap objects, etc. The callback allows the 2528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// callback function to change the value of the slot. 2538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef void (*ObjectSlotCallback)(HeapObject** pointer); 2548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function used for iterating objects in heap spaces, 2578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// for example, scanning heap objects. 2588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef int (*HeapObjectCallback)(HeapObject* obj); 2598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function used for checking constraints when copying/relocating 2628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// objects. Returns true if an object can be copied/relocated from its 2638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// old_addr to a new_addr. 2648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef bool (*ConstraintCallback)(Address new_addr, Address old_addr); 2658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Callback function on inline caches, used for iterating over inline caches 2688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// in compiled code. 2698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangtypedef void (*InlineCacheCallback)(Code* code, Address ic); 2708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// State for inline cache call sites. Aliased as IC::State. 2738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InlineCacheState { 2748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // Has never been executed. 2758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang UNINITIALIZED, 2768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // Has been executed but monomorhic state has been delayed. 2778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang PREMONOMORPHIC, 2788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // Has been executed and only one receiver type has been seen. 2798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang MONOMORPHIC, 2808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // Like MONOMORPHIC but check failed due to prototype. 2818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang MONOMORPHIC_PROTOTYPE_FAILURE, 2828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // Multiple receiver types have been seen. 2838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang MEGAMORPHIC, 2848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // Special states for debug break or step in prepare stubs. 2858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang DEBUG_BREAK, 2868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang DEBUG_PREPARE_STEP_IN 2878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 2888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 2898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochenum CheckType { 291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RECEIVER_MAP_CHECK, 292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch STRING_CHECK, 293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch NUMBER_CHECK, 294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BOOLEAN_CHECK 295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InLoopFlag { 2998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang NOT_IN_LOOP, 3008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang IN_LOOP 3018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum CallFunctionFlags { 3058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang NO_CALL_FUNCTION_FLAGS = 0, 3068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang RECEIVER_MIGHT_BE_VALUE = 1 << 0 // Receiver might not be a JSObject. 3078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum InlineCacheHolderFlag { 3118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang OWN_MAP, // For fast properties objects. 3128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang PROTOTYPE_MAP // For slow properties objects (except GlobalObjects). 3138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Type of properties. 3178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Order of properties is significant. 3188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Must fit in the BitField PropertyDetails::TypeField. 3198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A copy of this is in mirror-debugger.js. 3208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum PropertyType { 3218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang NORMAL = 0, // only in slow mode 3228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang FIELD = 1, // only in fast mode 3238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CONSTANT_FUNCTION = 2, // only in fast mode 3248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CALLBACKS = 3, 3258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang INTERCEPTOR = 4, // only in lookup results, not in descriptors. 3268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang MAP_TRANSITION = 5, // only in fast mode 3278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CONSTANT_TRANSITION = 6, // only in fast mode 3288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang NULL_DESCRIPTOR = 7, // only in fast mode 3298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // All properties before MAP_TRANSITION are real. 3308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang FIRST_PHANTOM_PROPERTY_TYPE = MAP_TRANSITION, 3318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // There are no IC stubs for NULL_DESCRIPTORS. Therefore, 3328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // NULL_DESCRIPTOR can be used as the type flag for IC stubs for 3338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // nonexistent properties. 3348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang NONEXISTENT = NULL_DESCRIPTOR 3358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Whether to remove map transitions and constant transitions from a 3398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// DescriptorArray. 3408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum TransitionFlag { 3418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang REMOVE_TRANSITIONS, 3428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang KEEP_TRANSITIONS 3438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Union used for fast testing of specific double values. 3478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion DoubleRepresentation { 3488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang double value; 3498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang int64_t bits; 3508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang DoubleRepresentation(double x) { value = x; } 3518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Union used for customized checking of the IEEE double types 3558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// inlined within v8 runtime, rather than going to the underlying 3568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// platform headers and libraries 3578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion IeeeDoubleLittleEndianArchType { 3588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang double d; 3598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang struct { 3608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int man_low :32; 3618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int man_high :20; 3628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int exp :11; 3638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int sign :1; 3648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } bits; 3658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangunion IeeeDoubleBigEndianArchType { 3698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang double d; 3708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang struct { 3718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int sign :1; 3728a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int exp :11; 3738a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int man_high :20; 3748a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang unsigned int man_low :32; 3758a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } bits; 3768a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3778a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// AccessorCallback 3808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangstruct AccessorDescriptor { 3818a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang MaybeObject* (*getter)(Object* object, void* data); 3828a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang MaybeObject* (*setter)(JSObject* object, Object* value, void* data); 3838a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang void* data; 3848a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 3858a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3868a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3878a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Logging and profiling. 3888a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// A StateTag represents a possible state of the VM. When compiled with 3898a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ENABLE_VMSTATE_TRACKING, the logger maintains a stack of these. 3908a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Creating a VMState object enters a state by pushing on the stack, and 3918a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// destroying a VMState object leaves a state by popping the current state 3928a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// from the stack. 3938a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 3948a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define STATE_TAG_LIST(V) \ 3958a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang V(JS) \ 3968a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang V(GC) \ 3978a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang V(COMPILER) \ 3988a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang V(OTHER) \ 3998a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang V(EXTERNAL) 4008a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4018a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum StateTag { 4028a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define DEF_STATE_TAG(name) name, 4038a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang STATE_TAG_LIST(DEF_STATE_TAG) 4048a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#undef DEF_STATE_TAG 4058a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang // Pseudo-types. 4068a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang state_tag_count 4078a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang}; 4088a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4098a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4108a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// ----------------------------------------------------------------------------- 4118a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Macros 4128a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4138a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Testers for test. 4148a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4158a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define HAS_SMI_TAG(value) \ 4168a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag) 4178a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4188a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define HAS_FAILURE_TAG(value) \ 4198a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang ((reinterpret_cast<intptr_t>(value) & kFailureTagMask) == kFailureTag) 4208a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4218a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// OBJECT_POINTER_ALIGN returns the value aligned as a HeapObject pointer 4228a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define OBJECT_POINTER_ALIGN(value) \ 4238a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang (((value) + kObjectAlignmentMask) & ~kObjectAlignmentMask) 4248a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4258a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// POINTER_SIZE_ALIGN returns the value aligned as a pointer. 4268a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define POINTER_SIZE_ALIGN(value) \ 4278a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang (((value) + kPointerAlignmentMask) & ~kPointerAlignmentMask) 4288a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4298a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// MAP_POINTER_ALIGN returns the value aligned as a map pointer. 4308a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define MAP_POINTER_ALIGN(value) \ 4318a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang (((value) + kMapAlignmentMask) & ~kMapAlignmentMask) 4328a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4338a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// CODE_POINTER_ALIGN returns the value aligned as a generated code segment. 4348a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define CODE_POINTER_ALIGN(value) \ 4358a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang (((value) + kCodeAlignmentMask) & ~kCodeAlignmentMask) 4368a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4378a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Support for tracking C++ memory allocation. Insert TRACK_MEMORY("Fisk") 4388a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// inside a C++ class and new and delete will be overloaded so logging is 4398a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// performed. 4408a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// This file (globals.h) is included before log.h, so we use direct calls to 4418a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// the Logger rather than the LOG macro. 4428a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#ifdef DEBUG 4438a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define TRACK_MEMORY(name) \ 4448a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang void* operator new(size_t size) { \ 4458a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang void* result = ::operator new(size); \ 4468a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang Logger::NewEvent(name, result, size); \ 4478a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang return result; \ 4488a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } \ 4498a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang void operator delete(void* object) { \ 4508a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang Logger::DeleteEvent(name, object); \ 4518a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang ::operator delete(object); \ 4528a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang } 4538a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#else 4548a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#define TRACK_MEMORY(name) 4558a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif 4568a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4578a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4588a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// Feature flags bit positions. They are mostly based on the CPUID spec. 4598a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// (We assign CPUID itself to one of the currently reserved bits -- 4608a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// feel free to change this if needed.) 4618a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang// On X86/X64, values below 32 are bits in EDX, values above 32 are bits in ECX. 4628a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wangenum CpuFeature { SSE4_1 = 32 + 19, // x86 4638a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang SSE3 = 32 + 0, // x86 4648a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang SSE2 = 26, // x86 4658a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CMOV = 15, // x86 4668a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang RDTSC = 4, // x86 4678a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang CPUID = 10, // x86 4688a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang VFP3 = 1, // ARM 4698a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang ARMv7 = 2, // ARM 4708a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang SAHF = 0}; // x86 4718a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// The Strict Mode (ECMA-262 5th edition, 4.2.2). 4731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockenum StrictModeFlag { 4741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kNonStrictMode, 4751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kStrictMode 4761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 4771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4788a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang} } // namespace v8::internal 4798a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang 4808a31eba00023874d4a1dcdc5f411cc4336776874Shimeng (Simon) Wang#endif // V8_V8GLOBALS_H_ 481