Home | History | Annotate | Download | only in src
      1 // Copyright 2012 the V8 project authors. All rights reserved.
      2 // Redistribution and use in source and binary forms, with or without
      3 // modification, are permitted provided that the following conditions are
      4 // met:
      5 //
      6 //     * Redistributions of source code must retain the above copyright
      7 //       notice, this list of conditions and the following disclaimer.
      8 //     * Redistributions in binary form must reproduce the above
      9 //       copyright notice, this list of conditions and the following
     10 //       disclaimer in the documentation and/or other materials provided
     11 //       with the distribution.
     12 //     * Neither the name of Google Inc. nor the names of its
     13 //       contributors may be used to endorse or promote products derived
     14 //       from this software without specific prior written permission.
     15 //
     16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     27 
     28 #ifndef V8_V8GLOBALS_H_
     29 #define V8_V8GLOBALS_H_
     30 
     31 #include "globals.h"
     32 #include "checks.h"
     33 
     34 namespace v8 {
     35 namespace internal {
     36 
     37 // This file contains constants and global declarations related to the
     38 // V8 system.
     39 
     40 // Mask for the sign bit in a smi.
     41 const intptr_t kSmiSignMask = kIntptrSignBit;
     42 
     43 const int kObjectAlignmentBits = kPointerSizeLog2;
     44 const intptr_t kObjectAlignment = 1 << kObjectAlignmentBits;
     45 const intptr_t kObjectAlignmentMask = kObjectAlignment - 1;
     46 
     47 // Desired alignment for pointers.
     48 const intptr_t kPointerAlignment = (1 << kPointerSizeLog2);
     49 const intptr_t kPointerAlignmentMask = kPointerAlignment - 1;
     50 
     51 // Desired alignment for double values.
     52 const intptr_t kDoubleAlignment = 8;
     53 const intptr_t kDoubleAlignmentMask = kDoubleAlignment - 1;
     54 
     55 // Desired alignment for generated code is 32 bytes (to improve cache line
     56 // utilization).
     57 const int kCodeAlignmentBits = 5;
     58 const intptr_t kCodeAlignment = 1 << kCodeAlignmentBits;
     59 const intptr_t kCodeAlignmentMask = kCodeAlignment - 1;
     60 
     61 // Tag information for Failure.
     62 const int kFailureTag = 3;
     63 const int kFailureTagSize = 2;
     64 const intptr_t kFailureTagMask = (1 << kFailureTagSize) - 1;
     65 
     66 
     67 // Zap-value: The value used for zapping dead objects.
     68 // Should be a recognizable hex value tagged as a failure.
     69 #ifdef V8_HOST_ARCH_64_BIT
     70 const Address kZapValue =
     71     reinterpret_cast<Address>(V8_UINT64_C(0xdeadbeedbeadbeef));
     72 const Address kHandleZapValue =
     73     reinterpret_cast<Address>(V8_UINT64_C(0x1baddead0baddeaf));
     74 const Address kGlobalHandleZapValue =
     75     reinterpret_cast<Address>(V8_UINT64_C(0x1baffed00baffedf));
     76 const Address kFromSpaceZapValue =
     77     reinterpret_cast<Address>(V8_UINT64_C(0x1beefdad0beefdaf));
     78 const uint64_t kDebugZapValue = V8_UINT64_C(0xbadbaddbbadbaddb);
     79 const uint64_t kSlotsZapValue = V8_UINT64_C(0xbeefdeadbeefdeef);
     80 const uint64_t kFreeListZapValue = 0xfeed1eaffeed1eaf;
     81 #else
     82 const Address kZapValue = reinterpret_cast<Address>(0xdeadbeef);
     83 const Address kHandleZapValue = reinterpret_cast<Address>(0xbaddeaf);
     84 const Address kGlobalHandleZapValue = reinterpret_cast<Address>(0xbaffedf);
     85 const Address kFromSpaceZapValue = reinterpret_cast<Address>(0xbeefdaf);
     86 const uint32_t kSlotsZapValue = 0xbeefdeef;
     87 const uint32_t kDebugZapValue = 0xbadbaddb;
     88 const uint32_t kFreeListZapValue = 0xfeed1eaf;
     89 #endif
     90 
     91 const int kCodeZapValue = 0xbadc0de;
     92 
     93 // Number of bits to represent the page size for paged spaces. The value of 20
     94 // gives 1Mb bytes per page.
     95 const int kPageSizeBits = 20;
     96 
     97 // On Intel architecture, cache line size is 64 bytes.
     98 // On ARM it may be less (32 bytes), but as far this constant is
     99 // used for aligning data, it doesn't hurt to align on a greater value.
    100 #define PROCESSOR_CACHE_LINE_SIZE 64
    101 
    102 // Constants relevant to double precision floating point numbers.
    103 // If looking only at the top 32 bits, the QNaN mask is bits 19 to 30.
    104 const uint32_t kQuietNaNHighBitsMask = 0xfff << (51 - 32);
    105 
    106 
    107 // -----------------------------------------------------------------------------
    108 // Forward declarations for frequently used classes
    109 
    110 class AccessorInfo;
    111 class Allocation;
    112 class Arguments;
    113 class Assembler;
    114 class Code;
    115 class CodeGenerator;
    116 class CodeStub;
    117 class Context;
    118 class Debug;
    119 class Debugger;
    120 class DebugInfo;
    121 class Descriptor;
    122 class DescriptorArray;
    123 class TransitionArray;
    124 class ExternalReference;
    125 class FixedArray;
    126 class FunctionTemplateInfo;
    127 class MemoryChunk;
    128 class SeededNumberDictionary;
    129 class UnseededNumberDictionary;
    130 class NameDictionary;
    131 template <typename T> class Handle;
    132 class Heap;
    133 class HeapObject;
    134 class IC;
    135 class InterceptorInfo;
    136 class JSReceiver;
    137 class JSArray;
    138 class JSFunction;
    139 class JSObject;
    140 class LargeObjectSpace;
    141 class LookupResult;
    142 class MacroAssembler;
    143 class Map;
    144 class MapSpace;
    145 class MarkCompactCollector;
    146 class NewSpace;
    147 class Object;
    148 class MaybeObject;
    149 class OldSpace;
    150 class Foreign;
    151 class Scope;
    152 class ScopeInfo;
    153 class Script;
    154 class Smi;
    155 template <typename Config, class Allocator = FreeStoreAllocationPolicy>
    156     class SplayTree;
    157 class String;
    158 class Name;
    159 class Struct;
    160 class Variable;
    161 class RelocInfo;
    162 class Deserializer;
    163 class MessageLocation;
    164 class VirtualMemory;
    165 class Mutex;
    166 class RecursiveMutex;
    167 
    168 typedef bool (*WeakSlotCallback)(Object** pointer);
    169 
    170 typedef bool (*WeakSlotCallbackWithHeap)(Heap* heap, Object** pointer);
    171 
    172 // -----------------------------------------------------------------------------
    173 // Miscellaneous
    174 
    175 // NOTE: SpaceIterator depends on AllocationSpace enumeration values being
    176 // consecutive.
    177 enum AllocationSpace {
    178   NEW_SPACE,            // Semispaces collected with copying collector.
    179   OLD_POINTER_SPACE,    // May contain pointers to new space.
    180   OLD_DATA_SPACE,       // Must not have pointers to new space.
    181   CODE_SPACE,           // No pointers to new space, marked executable.
    182   MAP_SPACE,            // Only and all map objects.
    183   CELL_SPACE,           // Only and all cell objects.
    184   PROPERTY_CELL_SPACE,  // Only and all global property cell objects.
    185   LO_SPACE,             // Promoted large objects.
    186 
    187   FIRST_SPACE = NEW_SPACE,
    188   LAST_SPACE = LO_SPACE,
    189   FIRST_PAGED_SPACE = OLD_POINTER_SPACE,
    190   LAST_PAGED_SPACE = PROPERTY_CELL_SPACE
    191 };
    192 const int kSpaceTagSize = 3;
    193 const int kSpaceTagMask = (1 << kSpaceTagSize) - 1;
    194 
    195 
    196 // A flag that indicates whether objects should be pretenured when
    197 // allocated (allocated directly into the old generation) or not
    198 // (allocated in the young generation if the object size and type
    199 // allows).
    200 enum PretenureFlag { NOT_TENURED, TENURED };
    201 
    202 enum MinimumCapacity {
    203   USE_DEFAULT_MINIMUM_CAPACITY,
    204   USE_CUSTOM_MINIMUM_CAPACITY
    205 };
    206 
    207 enum GarbageCollector { SCAVENGER, MARK_COMPACTOR };
    208 
    209 enum Executability { NOT_EXECUTABLE, EXECUTABLE };
    210 
    211 enum VisitMode {
    212   VISIT_ALL,
    213   VISIT_ALL_IN_SCAVENGE,
    214   VISIT_ALL_IN_SWEEP_NEWSPACE,
    215   VISIT_ONLY_STRONG
    216 };
    217 
    218 // Flag indicating whether code is built into the VM (one of the natives files).
    219 enum NativesFlag { NOT_NATIVES_CODE, NATIVES_CODE };
    220 
    221 
    222 // A CodeDesc describes a buffer holding instructions and relocation
    223 // information. The instructions start at the beginning of the buffer
    224 // and grow forward, the relocation information starts at the end of
    225 // the buffer and grows backward.
    226 //
    227 //  |<--------------- buffer_size ---------------->|
    228 //  |<-- instr_size -->|        |<-- reloc_size -->|
    229 //  +==================+========+==================+
    230 //  |   instructions   |  free  |    reloc info    |
    231 //  +==================+========+==================+
    232 //  ^
    233 //  |
    234 //  buffer
    235 
    236 struct CodeDesc {
    237   byte* buffer;
    238   int buffer_size;
    239   int instr_size;
    240   int reloc_size;
    241   Assembler* origin;
    242 };
    243 
    244 
    245 // Callback function used for iterating objects in heap spaces,
    246 // for example, scanning heap objects.
    247 typedef int (*HeapObjectCallback)(HeapObject* obj);
    248 
    249 
    250 // Callback function used for checking constraints when copying/relocating
    251 // objects. Returns true if an object can be copied/relocated from its
    252 // old_addr to a new_addr.
    253 typedef bool (*ConstraintCallback)(Address new_addr, Address old_addr);
    254 
    255 
    256 // Callback function on inline caches, used for iterating over inline caches
    257 // in compiled code.
    258 typedef void (*InlineCacheCallback)(Code* code, Address ic);
    259 
    260 
    261 // State for inline cache call sites. Aliased as IC::State.
    262 enum InlineCacheState {
    263   // Has never been executed.
    264   UNINITIALIZED,
    265   // Has been executed but monomorhic state has been delayed.
    266   PREMONOMORPHIC,
    267   // Has been executed and only one receiver type has been seen.
    268   MONOMORPHIC,
    269   // Like MONOMORPHIC but check failed due to prototype.
    270   MONOMORPHIC_PROTOTYPE_FAILURE,
    271   // Multiple receiver types have been seen.
    272   POLYMORPHIC,
    273   // Many receiver types have been seen.
    274   MEGAMORPHIC,
    275   // A generic handler is installed and no extra typefeedback is recorded.
    276   GENERIC,
    277   // Special state for debug break or step in prepare stubs.
    278   DEBUG_STUB
    279 };
    280 
    281 
    282 enum CheckType {
    283   RECEIVER_MAP_CHECK,
    284   STRING_CHECK,
    285   SYMBOL_CHECK,
    286   NUMBER_CHECK,
    287   BOOLEAN_CHECK
    288 };
    289 
    290 
    291 enum CallFunctionFlags {
    292   NO_CALL_FUNCTION_FLAGS = 0,
    293   // Receiver might implicitly be the global objects. If it is, the
    294   // hole is passed to the call function stub.
    295   RECEIVER_MIGHT_BE_IMPLICIT = 1 << 0,
    296   // The call target is cached in the instruction stream.
    297   RECORD_CALL_TARGET = 1 << 1
    298 };
    299 
    300 
    301 enum InlineCacheHolderFlag {
    302   OWN_MAP,  // For fast properties objects.
    303   PROTOTYPE_MAP  // For slow properties objects (except GlobalObjects).
    304 };
    305 
    306 
    307 // The Store Buffer (GC).
    308 typedef enum {
    309   kStoreBufferFullEvent,
    310   kStoreBufferStartScanningPagesEvent,
    311   kStoreBufferScanningPageEvent
    312 } StoreBufferEvent;
    313 
    314 
    315 typedef void (*StoreBufferCallback)(Heap* heap,
    316                                     MemoryChunk* page,
    317                                     StoreBufferEvent event);
    318 
    319 
    320 // Union used for fast testing of specific double values.
    321 union DoubleRepresentation {
    322   double  value;
    323   int64_t bits;
    324   DoubleRepresentation(double x) { value = x; }
    325 };
    326 
    327 
    328 // Union used for customized checking of the IEEE double types
    329 // inlined within v8 runtime, rather than going to the underlying
    330 // platform headers and libraries
    331 union IeeeDoubleLittleEndianArchType {
    332   double d;
    333   struct {
    334     unsigned int man_low  :32;
    335     unsigned int man_high :20;
    336     unsigned int exp      :11;
    337     unsigned int sign     :1;
    338   } bits;
    339 };
    340 
    341 
    342 union IeeeDoubleBigEndianArchType {
    343   double d;
    344   struct {
    345     unsigned int sign     :1;
    346     unsigned int exp      :11;
    347     unsigned int man_high :20;
    348     unsigned int man_low  :32;
    349   } bits;
    350 };
    351 
    352 
    353 // AccessorCallback
    354 struct AccessorDescriptor {
    355   MaybeObject* (*getter)(Isolate* isolate, Object* object, void* data);
    356   MaybeObject* (*setter)(
    357       Isolate* isolate, JSObject* object, Object* value, void* data);
    358   void* data;
    359 };
    360 
    361 
    362 // Logging and profiling.  A StateTag represents a possible state of
    363 // the VM. The logger maintains a stack of these. Creating a VMState
    364 // object enters a state by pushing on the stack, and destroying a
    365 // VMState object leaves a state by popping the current state from the
    366 // stack.
    367 
    368 enum StateTag {
    369   JS,
    370   GC,
    371   COMPILER,
    372   OTHER,
    373   EXTERNAL,
    374   IDLE
    375 };
    376 
    377 
    378 // -----------------------------------------------------------------------------
    379 // Macros
    380 
    381 // Testers for test.
    382 
    383 #define HAS_SMI_TAG(value) \
    384   ((reinterpret_cast<intptr_t>(value) & kSmiTagMask) == kSmiTag)
    385 
    386 #define HAS_FAILURE_TAG(value) \
    387   ((reinterpret_cast<intptr_t>(value) & kFailureTagMask) == kFailureTag)
    388 
    389 // OBJECT_POINTER_ALIGN returns the value aligned as a HeapObject pointer
    390 #define OBJECT_POINTER_ALIGN(value)                             \
    391   (((value) + kObjectAlignmentMask) & ~kObjectAlignmentMask)
    392 
    393 // POINTER_SIZE_ALIGN returns the value aligned as a pointer.
    394 #define POINTER_SIZE_ALIGN(value)                               \
    395   (((value) + kPointerAlignmentMask) & ~kPointerAlignmentMask)
    396 
    397 // CODE_POINTER_ALIGN returns the value aligned as a generated code segment.
    398 #define CODE_POINTER_ALIGN(value)                               \
    399   (((value) + kCodeAlignmentMask) & ~kCodeAlignmentMask)
    400 
    401 // Support for tracking C++ memory allocation.  Insert TRACK_MEMORY("Fisk")
    402 // inside a C++ class and new and delete will be overloaded so logging is
    403 // performed.
    404 // This file (globals.h) is included before log.h, so we use direct calls to
    405 // the Logger rather than the LOG macro.
    406 #ifdef DEBUG
    407 #define TRACK_MEMORY(name) \
    408   void* operator new(size_t size) { \
    409     void* result = ::operator new(size); \
    410     Logger::NewEventStatic(name, result, size); \
    411     return result; \
    412   } \
    413   void operator delete(void* object) { \
    414     Logger::DeleteEventStatic(name, object); \
    415     ::operator delete(object); \
    416   }
    417 #else
    418 #define TRACK_MEMORY(name)
    419 #endif
    420 
    421 
    422 // Feature flags bit positions. They are mostly based on the CPUID spec.
    423 // On X86/X64, values below 32 are bits in EDX, values above 32 are bits in ECX.
    424 enum CpuFeature { SSE4_1 = 32 + 19,  // x86
    425                   SSE3 = 32 + 0,     // x86
    426                   SSE2 = 26,   // x86
    427                   CMOV = 15,   // x86
    428                   VFP3 = 1,    // ARM
    429                   ARMv7 = 2,   // ARM
    430                   SUDIV = 3,   // ARM
    431                   UNALIGNED_ACCESSES = 4,  // ARM
    432                   MOVW_MOVT_IMMEDIATE_LOADS = 5,  // ARM
    433                   VFP32DREGS = 6,  // ARM
    434                   NEON = 7,    // ARM
    435                   SAHF = 0,    // x86
    436                   FPU = 1};    // MIPS
    437 
    438 
    439 // Used to specify if a macro instruction must perform a smi check on tagged
    440 // values.
    441 enum SmiCheckType {
    442   DONT_DO_SMI_CHECK,
    443   DO_SMI_CHECK
    444 };
    445 
    446 
    447 // Used to specify whether a receiver is implicitly or explicitly
    448 // provided to a call.
    449 enum CallKind {
    450   CALL_AS_METHOD,
    451   CALL_AS_FUNCTION
    452 };
    453 
    454 
    455 enum ScopeType {
    456   EVAL_SCOPE,      // The top-level scope for an eval source.
    457   FUNCTION_SCOPE,  // The top-level scope for a function.
    458   MODULE_SCOPE,    // The scope introduced by a module literal
    459   GLOBAL_SCOPE,    // The top-level scope for a program or a top-level eval.
    460   CATCH_SCOPE,     // The scope introduced by catch.
    461   BLOCK_SCOPE,     // The scope introduced by a new block.
    462   WITH_SCOPE       // The scope introduced by with.
    463 };
    464 
    465 
    466 const uint32_t kHoleNanUpper32 = 0x7FFFFFFF;
    467 const uint32_t kHoleNanLower32 = 0xFFFFFFFF;
    468 const uint32_t kNaNOrInfinityLowerBoundUpper32 = 0x7FF00000;
    469 
    470 const uint64_t kHoleNanInt64 =
    471     (static_cast<uint64_t>(kHoleNanUpper32) << 32) | kHoleNanLower32;
    472 const uint64_t kLastNonNaNInt64 =
    473     (static_cast<uint64_t>(kNaNOrInfinityLowerBoundUpper32) << 32);
    474 
    475 
    476 // The order of this enum has to be kept in sync with the predicates below.
    477 enum VariableMode {
    478   // User declared variables:
    479   VAR,             // declared via 'var', and 'function' declarations
    480 
    481   CONST,           // declared via 'const' declarations
    482 
    483   LET,             // declared via 'let' declarations (first lexical)
    484 
    485   CONST_HARMONY,   // declared via 'const' declarations in harmony mode
    486 
    487   MODULE,          // declared via 'module' declaration (last lexical)
    488 
    489   // Variables introduced by the compiler:
    490   INTERNAL,        // like VAR, but not user-visible (may or may not
    491                    // be in a context)
    492 
    493   TEMPORARY,       // temporary variables (not user-visible), stack-allocated
    494                    // unless the scope as a whole has forced context allocation
    495 
    496   DYNAMIC,         // always require dynamic lookup (we don't know
    497                    // the declaration)
    498 
    499   DYNAMIC_GLOBAL,  // requires dynamic lookup, but we know that the
    500                    // variable is global unless it has been shadowed
    501                    // by an eval-introduced variable
    502 
    503   DYNAMIC_LOCAL    // requires dynamic lookup, but we know that the
    504                    // variable is local and where it is unless it
    505                    // has been shadowed by an eval-introduced
    506                    // variable
    507 };
    508 
    509 
    510 inline bool IsDynamicVariableMode(VariableMode mode) {
    511   return mode >= DYNAMIC && mode <= DYNAMIC_LOCAL;
    512 }
    513 
    514 
    515 inline bool IsDeclaredVariableMode(VariableMode mode) {
    516   return mode >= VAR && mode <= MODULE;
    517 }
    518 
    519 
    520 inline bool IsLexicalVariableMode(VariableMode mode) {
    521   return mode >= LET && mode <= MODULE;
    522 }
    523 
    524 
    525 inline bool IsImmutableVariableMode(VariableMode mode) {
    526   return mode == CONST || (mode >= CONST_HARMONY && mode <= MODULE);
    527 }
    528 
    529 
    530 // ES6 Draft Rev3 10.2 specifies declarative environment records with mutable
    531 // and immutable bindings that can be in two states: initialized and
    532 // uninitialized. In ES5 only immutable bindings have these two states. When
    533 // accessing a binding, it needs to be checked for initialization. However in
    534 // the following cases the binding is initialized immediately after creation
    535 // so the initialization check can always be skipped:
    536 // 1. Var declared local variables.
    537 //      var foo;
    538 // 2. A local variable introduced by a function declaration.
    539 //      function foo() {}
    540 // 3. Parameters
    541 //      function x(foo) {}
    542 // 4. Catch bound variables.
    543 //      try {} catch (foo) {}
    544 // 6. Function variables of named function expressions.
    545 //      var x = function foo() {}
    546 // 7. Implicit binding of 'this'.
    547 // 8. Implicit binding of 'arguments' in functions.
    548 //
    549 // ES5 specified object environment records which are introduced by ES elements
    550 // such as Program and WithStatement that associate identifier bindings with the
    551 // properties of some object. In the specification only mutable bindings exist
    552 // (which may be non-writable) and have no distinct initialization step. However
    553 // V8 allows const declarations in global code with distinct creation and
    554 // initialization steps which are represented by non-writable properties in the
    555 // global object. As a result also these bindings need to be checked for
    556 // initialization.
    557 //
    558 // The following enum specifies a flag that indicates if the binding needs a
    559 // distinct initialization step (kNeedsInitialization) or if the binding is
    560 // immediately initialized upon creation (kCreatedInitialized).
    561 enum InitializationFlag {
    562   kNeedsInitialization,
    563   kCreatedInitialized
    564 };
    565 
    566 
    567 enum ClearExceptionFlag {
    568   KEEP_EXCEPTION,
    569   CLEAR_EXCEPTION
    570 };
    571 
    572 
    573 enum MinusZeroMode {
    574   TREAT_MINUS_ZERO_AS_ZERO,
    575   FAIL_ON_MINUS_ZERO
    576 };
    577 
    578 } }  // namespace v8::internal
    579 
    580 #endif  // V8_V8GLOBALS_H_
    581