Home | History | Annotate | Download | only in compiler
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "src/compiler/access-builder.h"
      6 
      7 #include "src/compiler/type-cache.h"
      8 #include "src/contexts.h"
      9 #include "src/frames.h"
     10 #include "src/handles-inl.h"
     11 #include "src/heap/heap.h"
     12 #include "src/objects-inl.h"
     13 #include "src/objects/arguments.h"
     14 #include "src/objects/js-collection.h"
     15 #include "src/objects/js-generator.h"
     16 #include "src/objects/module.h"
     17 
     18 namespace v8 {
     19 namespace internal {
     20 namespace compiler {
     21 
     22 // static
     23 FieldAccess AccessBuilder::ForExternalTaggedValue() {
     24   FieldAccess access = {kUntaggedBase,       0,
     25                         MaybeHandle<Name>(), MaybeHandle<Map>(),
     26                         Type::Any(),         MachineType::AnyTagged(),
     27                         kNoWriteBarrier};
     28   return access;
     29 }
     30 
     31 // static
     32 FieldAccess AccessBuilder::ForExternalUint8Value() {
     33   FieldAccess access = {kUntaggedBase,           0,
     34                         MaybeHandle<Name>(),     MaybeHandle<Map>(),
     35                         TypeCache::Get().kUint8, MachineType::Uint8(),
     36                         kNoWriteBarrier};
     37   return access;
     38 }
     39 
     40 // static
     41 FieldAccess AccessBuilder::ForMap() {
     42   FieldAccess access = {kTaggedBase,           HeapObject::kMapOffset,
     43                         MaybeHandle<Name>(),   MaybeHandle<Map>(),
     44                         Type::OtherInternal(), MachineType::TaggedPointer(),
     45                         kMapWriteBarrier};
     46   return access;
     47 }
     48 
     49 
     50 // static
     51 FieldAccess AccessBuilder::ForHeapNumberValue() {
     52   FieldAccess access = {
     53       kTaggedBase,        HeapNumber::kValueOffset,  MaybeHandle<Name>(),
     54       MaybeHandle<Map>(), TypeCache::Get().kFloat64, MachineType::Float64(),
     55       kNoWriteBarrier};
     56   return access;
     57 }
     58 
     59 // static
     60 FieldAccess AccessBuilder::ForBigIntBitfield() {
     61   FieldAccess access = {
     62       kTaggedBase,        BigInt::kBitfieldOffset, MaybeHandle<Name>(),
     63       MaybeHandle<Map>(), TypeCache::Get().kInt32, MachineType::IntPtr(),
     64       kNoWriteBarrier};
     65   return access;
     66 }
     67 
     68 // static
     69 FieldAccess AccessBuilder::ForJSObjectPropertiesOrHash() {
     70   FieldAccess access = {kTaggedBase,         JSObject::kPropertiesOrHashOffset,
     71                         MaybeHandle<Name>(), MaybeHandle<Map>(),
     72                         Type::Any(),         MachineType::AnyTagged(),
     73                         kPointerWriteBarrier};
     74   return access;
     75 }
     76 
     77 
     78 // static
     79 FieldAccess AccessBuilder::ForJSObjectElements() {
     80   FieldAccess access = {kTaggedBase,         JSObject::kElementsOffset,
     81                         MaybeHandle<Name>(), MaybeHandle<Map>(),
     82                         Type::Internal(),    MachineType::TaggedPointer(),
     83                         kPointerWriteBarrier};
     84   return access;
     85 }
     86 
     87 
     88 // static
     89 FieldAccess AccessBuilder::ForJSObjectInObjectProperty(const MapRef& map,
     90                                                        int index) {
     91   int const offset = map.GetInObjectPropertyOffset(index);
     92   FieldAccess access = {kTaggedBase,         offset,
     93                         MaybeHandle<Name>(), MaybeHandle<Map>(),
     94                         Type::NonInternal(), MachineType::AnyTagged(),
     95                         kFullWriteBarrier};
     96   return access;
     97 }
     98 
     99 // static
    100 FieldAccess AccessBuilder::ForJSObjectOffset(
    101     int offset, WriteBarrierKind write_barrier_kind) {
    102   FieldAccess access = {kTaggedBase,         offset,
    103                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    104                         Type::NonInternal(), MachineType::AnyTagged(),
    105                         write_barrier_kind};
    106   return access;
    107 }
    108 
    109 // static
    110 FieldAccess AccessBuilder::ForJSCollectionTable() {
    111   FieldAccess access = {kTaggedBase,           JSCollection::kTableOffset,
    112                         MaybeHandle<Name>(),   MaybeHandle<Map>(),
    113                         Type::OtherInternal(), MachineType::TaggedPointer(),
    114                         kPointerWriteBarrier};
    115   return access;
    116 }
    117 
    118 // static
    119 FieldAccess AccessBuilder::ForJSCollectionIteratorTable() {
    120   FieldAccess access = {
    121       kTaggedBase,           JSCollectionIterator::kTableOffset,
    122       MaybeHandle<Name>(),   MaybeHandle<Map>(),
    123       Type::OtherInternal(), MachineType::TaggedPointer(),
    124       kPointerWriteBarrier};
    125   return access;
    126 }
    127 
    128 // static
    129 FieldAccess AccessBuilder::ForJSCollectionIteratorIndex() {
    130   FieldAccess access = {kTaggedBase,
    131                         JSCollectionIterator::kIndexOffset,
    132                         MaybeHandle<Name>(),
    133                         MaybeHandle<Map>(),
    134                         TypeCache::Get().kFixedArrayLengthType,
    135                         MachineType::TaggedSigned(),
    136                         kNoWriteBarrier};
    137   return access;
    138 }
    139 
    140 // static
    141 FieldAccess AccessBuilder::ForJSFunctionPrototypeOrInitialMap() {
    142   FieldAccess access = {
    143       kTaggedBase,         JSFunction::kPrototypeOrInitialMapOffset,
    144       MaybeHandle<Name>(), MaybeHandle<Map>(),
    145       Type::Any(),         MachineType::AnyTagged(),
    146       kFullWriteBarrier};
    147   return access;
    148 }
    149 
    150 // static
    151 FieldAccess AccessBuilder::ForJSFunctionContext() {
    152   FieldAccess access = {kTaggedBase,         JSFunction::kContextOffset,
    153                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    154                         Type::Internal(),    MachineType::AnyTagged(),
    155                         kPointerWriteBarrier};
    156   return access;
    157 }
    158 
    159 
    160 // static
    161 FieldAccess AccessBuilder::ForJSFunctionSharedFunctionInfo() {
    162   FieldAccess access = {
    163       kTaggedBase,           JSFunction::kSharedFunctionInfoOffset,
    164       Handle<Name>(),        MaybeHandle<Map>(),
    165       Type::OtherInternal(), MachineType::TaggedPointer(),
    166       kPointerWriteBarrier};
    167   return access;
    168 }
    169 
    170 // static
    171 FieldAccess AccessBuilder::ForJSFunctionFeedbackCell() {
    172   FieldAccess access = {kTaggedBase,         JSFunction::kFeedbackCellOffset,
    173                         Handle<Name>(),      MaybeHandle<Map>(),
    174                         Type::Internal(),    MachineType::TaggedPointer(),
    175                         kPointerWriteBarrier};
    176   return access;
    177 }
    178 
    179 // static
    180 FieldAccess AccessBuilder::ForJSFunctionCode() {
    181   FieldAccess access = {kTaggedBase,           JSFunction::kCodeOffset,
    182                         Handle<Name>(),        MaybeHandle<Map>(),
    183                         Type::OtherInternal(), MachineType::TaggedPointer(),
    184                         kPointerWriteBarrier};
    185   return access;
    186 }
    187 
    188 // static
    189 FieldAccess AccessBuilder::ForJSBoundFunctionBoundTargetFunction() {
    190   FieldAccess access = {
    191       kTaggedBase,         JSBoundFunction::kBoundTargetFunctionOffset,
    192       Handle<Name>(),      MaybeHandle<Map>(),
    193       Type::Callable(),    MachineType::TaggedPointer(),
    194       kPointerWriteBarrier};
    195   return access;
    196 }
    197 
    198 // static
    199 FieldAccess AccessBuilder::ForJSBoundFunctionBoundThis() {
    200   FieldAccess access = {kTaggedBase,         JSBoundFunction::kBoundThisOffset,
    201                         Handle<Name>(),      MaybeHandle<Map>(),
    202                         Type::NonInternal(), MachineType::AnyTagged(),
    203                         kFullWriteBarrier};
    204   return access;
    205 }
    206 
    207 // static
    208 FieldAccess AccessBuilder::ForJSBoundFunctionBoundArguments() {
    209   FieldAccess access = {
    210       kTaggedBase,         JSBoundFunction::kBoundArgumentsOffset,
    211       Handle<Name>(),      MaybeHandle<Map>(),
    212       Type::Internal(),    MachineType::TaggedPointer(),
    213       kPointerWriteBarrier};
    214   return access;
    215 }
    216 
    217 // static
    218 FieldAccess AccessBuilder::ForJSGeneratorObjectContext() {
    219   FieldAccess access = {kTaggedBase,         JSGeneratorObject::kContextOffset,
    220                         Handle<Name>(),      MaybeHandle<Map>(),
    221                         Type::Internal(),    MachineType::TaggedPointer(),
    222                         kPointerWriteBarrier};
    223   return access;
    224 }
    225 
    226 // static
    227 FieldAccess AccessBuilder::ForJSGeneratorObjectFunction() {
    228   FieldAccess access = {kTaggedBase,         JSGeneratorObject::kFunctionOffset,
    229                         Handle<Name>(),      MaybeHandle<Map>(),
    230                         Type::Function(),    MachineType::TaggedPointer(),
    231                         kPointerWriteBarrier};
    232   return access;
    233 }
    234 
    235 // static
    236 FieldAccess AccessBuilder::ForJSGeneratorObjectReceiver() {
    237   FieldAccess access = {kTaggedBase,         JSGeneratorObject::kReceiverOffset,
    238                         Handle<Name>(),      MaybeHandle<Map>(),
    239                         Type::Internal(),    MachineType::TaggedPointer(),
    240                         kPointerWriteBarrier};
    241   return access;
    242 }
    243 
    244 // static
    245 FieldAccess AccessBuilder::ForJSGeneratorObjectContinuation() {
    246   FieldAccess access = {
    247       kTaggedBase,         JSGeneratorObject::kContinuationOffset,
    248       Handle<Name>(),      MaybeHandle<Map>(),
    249       Type::SignedSmall(), MachineType::TaggedSigned(),
    250       kNoWriteBarrier};
    251   return access;
    252 }
    253 
    254 // static
    255 FieldAccess AccessBuilder::ForJSGeneratorObjectInputOrDebugPos() {
    256   FieldAccess access = {
    257       kTaggedBase,         JSGeneratorObject::kInputOrDebugPosOffset,
    258       Handle<Name>(),      MaybeHandle<Map>(),
    259       Type::NonInternal(), MachineType::AnyTagged(),
    260       kFullWriteBarrier};
    261   return access;
    262 }
    263 
    264 
    265 // static
    266 FieldAccess AccessBuilder::ForJSGeneratorObjectParametersAndRegisters() {
    267   FieldAccess access = {
    268       kTaggedBase,         JSGeneratorObject::kParametersAndRegistersOffset,
    269       Handle<Name>(),      MaybeHandle<Map>(),
    270       Type::Internal(),    MachineType::AnyTagged(),
    271       kPointerWriteBarrier};
    272   return access;
    273 }
    274 
    275 // static
    276 FieldAccess AccessBuilder::ForJSGeneratorObjectResumeMode() {
    277   FieldAccess access = {
    278       kTaggedBase,         JSGeneratorObject::kResumeModeOffset,
    279       Handle<Name>(),      MaybeHandle<Map>(),
    280       Type::SignedSmall(), MachineType::TaggedSigned(),
    281       kNoWriteBarrier};
    282   return access;
    283 }
    284 
    285 // static
    286 FieldAccess AccessBuilder::ForJSAsyncGeneratorObjectQueue() {
    287   FieldAccess access = {
    288       kTaggedBase,         JSAsyncGeneratorObject::kQueueOffset,
    289       Handle<Name>(),      MaybeHandle<Map>(),
    290       Type::NonInternal(), MachineType::AnyTagged(),
    291       kFullWriteBarrier};
    292   return access;
    293 }
    294 
    295 // static
    296 FieldAccess AccessBuilder::ForJSAsyncGeneratorObjectIsAwaiting() {
    297   FieldAccess access = {
    298       kTaggedBase,         JSAsyncGeneratorObject::kIsAwaitingOffset,
    299       Handle<Name>(),      MaybeHandle<Map>(),
    300       Type::SignedSmall(), MachineType::TaggedSigned(),
    301       kNoWriteBarrier};
    302   return access;
    303 }
    304 
    305 // static
    306 FieldAccess AccessBuilder::ForJSArrayLength(ElementsKind elements_kind) {
    307   TypeCache const& type_cache = TypeCache::Get();
    308   FieldAccess access = {kTaggedBase,
    309                         JSArray::kLengthOffset,
    310                         Handle<Name>(),
    311                         MaybeHandle<Map>(),
    312                         type_cache.kJSArrayLengthType,
    313                         MachineType::TaggedSigned(),
    314                         kFullWriteBarrier};
    315   if (IsDoubleElementsKind(elements_kind)) {
    316     access.type = type_cache.kFixedDoubleArrayLengthType;
    317     access.write_barrier_kind = kNoWriteBarrier;
    318   } else if (IsFastElementsKind(elements_kind)) {
    319     access.type = type_cache.kFixedArrayLengthType;
    320     access.write_barrier_kind = kNoWriteBarrier;
    321   }
    322   return access;
    323 }
    324 
    325 
    326 // static
    327 FieldAccess AccessBuilder::ForJSArrayBufferBackingStore() {
    328   FieldAccess access = {
    329       kTaggedBase,           JSArrayBuffer::kBackingStoreOffset,
    330       MaybeHandle<Name>(),   MaybeHandle<Map>(),
    331       Type::OtherInternal(), MachineType::Pointer(),
    332       kNoWriteBarrier};
    333   return access;
    334 }
    335 
    336 // static
    337 FieldAccess AccessBuilder::ForJSArrayBufferBitField() {
    338   FieldAccess access = {
    339       kTaggedBase,        JSArrayBuffer::kBitFieldOffset, MaybeHandle<Name>(),
    340       MaybeHandle<Map>(), TypeCache::Get().kUint8,        MachineType::Uint32(),
    341       kNoWriteBarrier};
    342   return access;
    343 }
    344 
    345 // static
    346 FieldAccess AccessBuilder::ForJSArrayBufferViewBuffer() {
    347   FieldAccess access = {kTaggedBase,           JSArrayBufferView::kBufferOffset,
    348                         MaybeHandle<Name>(),   MaybeHandle<Map>(),
    349                         Type::OtherInternal(), MachineType::TaggedPointer(),
    350                         kPointerWriteBarrier};
    351   return access;
    352 }
    353 
    354 // static
    355 FieldAccess AccessBuilder::ForJSArrayBufferViewByteLength() {
    356   FieldAccess access = {kTaggedBase,
    357                         JSArrayBufferView::kByteLengthOffset,
    358                         MaybeHandle<Name>(),
    359                         MaybeHandle<Map>(),
    360                         TypeCache::Get().kPositiveInteger,
    361                         MachineType::AnyTagged(),
    362                         kFullWriteBarrier};
    363   return access;
    364 }
    365 
    366 // static
    367 FieldAccess AccessBuilder::ForJSArrayBufferViewByteOffset() {
    368   FieldAccess access = {kTaggedBase,
    369                         JSArrayBufferView::kByteOffsetOffset,
    370                         MaybeHandle<Name>(),
    371                         MaybeHandle<Map>(),
    372                         TypeCache::Get().kPositiveInteger,
    373                         MachineType::AnyTagged(),
    374                         kFullWriteBarrier};
    375   return access;
    376 }
    377 
    378 // static
    379 FieldAccess AccessBuilder::ForJSTypedArrayLength() {
    380   FieldAccess access = {kTaggedBase,
    381                         JSTypedArray::kLengthOffset,
    382                         MaybeHandle<Name>(),
    383                         MaybeHandle<Map>(),
    384                         TypeCache::Get().kJSTypedArrayLengthType,
    385                         MachineType::TaggedSigned(),
    386                         kNoWriteBarrier};
    387   return access;
    388 }
    389 
    390 // static
    391 FieldAccess AccessBuilder::ForJSDateValue() {
    392   FieldAccess access = {kTaggedBase,
    393                         JSDate::kValueOffset,
    394                         MaybeHandle<Name>(),
    395                         MaybeHandle<Map>(),
    396                         TypeCache::Get().kJSDateValueType,
    397                         MachineType::AnyTagged(),
    398                         kFullWriteBarrier};
    399   return access;
    400 }
    401 
    402 // static
    403 FieldAccess AccessBuilder::ForJSDateField(JSDate::FieldIndex index) {
    404   FieldAccess access = {
    405       kTaggedBase,         JSDate::kValueOffset + index * kPointerSize,
    406       MaybeHandle<Name>(), MaybeHandle<Map>(),
    407       Type::Number(),      MachineType::AnyTagged(),
    408       kFullWriteBarrier};
    409   return access;
    410 }
    411 
    412 
    413 // static
    414 FieldAccess AccessBuilder::ForJSIteratorResultDone() {
    415   FieldAccess access = {kTaggedBase,         JSIteratorResult::kDoneOffset,
    416                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    417                         Type::NonInternal(), MachineType::AnyTagged(),
    418                         kFullWriteBarrier};
    419   return access;
    420 }
    421 
    422 
    423 // static
    424 FieldAccess AccessBuilder::ForJSIteratorResultValue() {
    425   FieldAccess access = {kTaggedBase,         JSIteratorResult::kValueOffset,
    426                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    427                         Type::NonInternal(), MachineType::AnyTagged(),
    428                         kFullWriteBarrier};
    429   return access;
    430 }
    431 
    432 // static
    433 FieldAccess AccessBuilder::ForJSRegExpData() {
    434   FieldAccess access = {kTaggedBase,         JSRegExp::kDataOffset,
    435                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    436                         Type::NonInternal(), MachineType::AnyTagged(),
    437                         kFullWriteBarrier};
    438   return access;
    439 }
    440 
    441 // static
    442 FieldAccess AccessBuilder::ForJSRegExpFlags() {
    443   FieldAccess access = {kTaggedBase,         JSRegExp::kFlagsOffset,
    444                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    445                         Type::NonInternal(), MachineType::AnyTagged(),
    446                         kFullWriteBarrier};
    447   return access;
    448 }
    449 
    450 // static
    451 FieldAccess AccessBuilder::ForJSRegExpLastIndex() {
    452   FieldAccess access = {kTaggedBase,         JSRegExp::kLastIndexOffset,
    453                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    454                         Type::NonInternal(), MachineType::AnyTagged(),
    455                         kFullWriteBarrier};
    456   return access;
    457 }
    458 
    459 // static
    460 FieldAccess AccessBuilder::ForJSRegExpSource() {
    461   FieldAccess access = {kTaggedBase,         JSRegExp::kSourceOffset,
    462                         MaybeHandle<Name>(), MaybeHandle<Map>(),
    463                         Type::NonInternal(), MachineType::AnyTagged(),
    464                         kFullWriteBarrier};
    465   return access;
    466 }
    467 
    468 
    469 // static
    470 FieldAccess AccessBuilder::ForFixedArrayLength() {
    471   FieldAccess access = {kTaggedBase,
    472                         FixedArray::kLengthOffset,
    473                         MaybeHandle<Name>(),
    474                         MaybeHandle<Map>(),
    475                         TypeCache::Get().kFixedArrayLengthType,
    476                         MachineType::TaggedSigned(),
    477                         kNoWriteBarrier};
    478   return access;
    479 }
    480 
    481 // static
    482 FieldAccess AccessBuilder::ForPropertyArrayLengthAndHash() {
    483   FieldAccess access = {
    484       kTaggedBase,         PropertyArray::kLengthAndHashOffset,
    485       MaybeHandle<Name>(), MaybeHandle<Map>(),
    486       Type::SignedSmall(), MachineType::TaggedSigned(),
    487       kNoWriteBarrier};
    488   return access;
    489 }
    490 
    491 // static
    492 FieldAccess AccessBuilder::ForFixedTypedArrayBaseBasePointer() {
    493   FieldAccess access = {
    494       kTaggedBase,           FixedTypedArrayBase::kBasePointerOffset,
    495       MaybeHandle<Name>(),   MaybeHandle<Map>(),
    496       Type::OtherInternal(), MachineType::AnyTagged(),
    497       kPointerWriteBarrier};
    498   return access;
    499 }
    500 
    501 // static
    502 FieldAccess AccessBuilder::ForFixedTypedArrayBaseExternalPointer() {
    503   FieldAccess access = {kTaggedBase,
    504                         FixedTypedArrayBase::kExternalPointerOffset,
    505                         MaybeHandle<Name>(),
    506                         MaybeHandle<Map>(),
    507                         Type::ExternalPointer(),
    508                         MachineType::Pointer(),
    509                         kNoWriteBarrier};
    510   return access;
    511 }
    512 
    513 // static
    514 FieldAccess AccessBuilder::ForDescriptorArrayEnumCache() {
    515   FieldAccess access = {
    516       kTaggedBase,           DescriptorArray::kEnumCacheOffset,
    517       Handle<Name>(),        MaybeHandle<Map>(),
    518       Type::OtherInternal(), MachineType::TaggedPointer(),
    519       kPointerWriteBarrier};
    520   return access;
    521 }
    522 
    523 // static
    524 FieldAccess AccessBuilder::ForMapBitField() {
    525   FieldAccess access = {
    526       kTaggedBase,        Map::kBitFieldOffset,    Handle<Name>(),
    527       MaybeHandle<Map>(), TypeCache::Get().kUint8, MachineType::Uint8(),
    528       kNoWriteBarrier};
    529   return access;
    530 }
    531 
    532 // static
    533 FieldAccess AccessBuilder::ForMapBitField2() {
    534   FieldAccess access = {
    535       kTaggedBase,        Map::kBitField2Offset,   Handle<Name>(),
    536       MaybeHandle<Map>(), TypeCache::Get().kUint8, MachineType::Uint8(),
    537       kNoWriteBarrier};
    538   return access;
    539 }
    540 
    541 // static
    542 FieldAccess AccessBuilder::ForMapBitField3() {
    543   FieldAccess access = {
    544       kTaggedBase,        Map::kBitField3Offset,   Handle<Name>(),
    545       MaybeHandle<Map>(), TypeCache::Get().kInt32, MachineType::Int32(),
    546       kNoWriteBarrier};
    547   return access;
    548 }
    549 
    550 
    551 // static
    552 FieldAccess AccessBuilder::ForMapDescriptors() {
    553   FieldAccess access = {kTaggedBase,           Map::kDescriptorsOffset,
    554                         Handle<Name>(),        MaybeHandle<Map>(),
    555                         Type::OtherInternal(), MachineType::TaggedPointer(),
    556                         kPointerWriteBarrier};
    557   return access;
    558 }
    559 
    560 
    561 // static
    562 FieldAccess AccessBuilder::ForMapInstanceType() {
    563   FieldAccess access = {
    564       kTaggedBase,        Map::kInstanceTypeOffset, Handle<Name>(),
    565       MaybeHandle<Map>(), TypeCache::Get().kUint16, MachineType::Uint16(),
    566       kNoWriteBarrier};
    567   return access;
    568 }
    569 
    570 
    571 // static
    572 FieldAccess AccessBuilder::ForMapPrototype() {
    573   FieldAccess access = {kTaggedBase,         Map::kPrototypeOffset,
    574                         Handle<Name>(),      MaybeHandle<Map>(),
    575                         Type::Any(),         MachineType::TaggedPointer(),
    576                         kPointerWriteBarrier};
    577   return access;
    578 }
    579 
    580 // static
    581 FieldAccess AccessBuilder::ForModuleRegularExports() {
    582   FieldAccess access = {kTaggedBase,           Module::kRegularExportsOffset,
    583                         Handle<Name>(),        MaybeHandle<Map>(),
    584                         Type::OtherInternal(), MachineType::TaggedPointer(),
    585                         kPointerWriteBarrier};
    586   return access;
    587 }
    588 
    589 // static
    590 FieldAccess AccessBuilder::ForModuleRegularImports() {
    591   FieldAccess access = {kTaggedBase,           Module::kRegularImportsOffset,
    592                         Handle<Name>(),        MaybeHandle<Map>(),
    593                         Type::OtherInternal(), MachineType::TaggedPointer(),
    594                         kPointerWriteBarrier};
    595   return access;
    596 }
    597 
    598 // static
    599 FieldAccess AccessBuilder::ForNameHashField() {
    600   FieldAccess access = {kTaggedBase,        Name::kHashFieldOffset,
    601                         Handle<Name>(),     MaybeHandle<Map>(),
    602                         Type::Unsigned32(), MachineType::Uint32(),
    603                         kNoWriteBarrier};
    604   return access;
    605 }
    606 
    607 // static
    608 FieldAccess AccessBuilder::ForStringLength() {
    609   FieldAccess access = {kTaggedBase,
    610                         String::kLengthOffset,
    611                         Handle<Name>(),
    612                         MaybeHandle<Map>(),
    613                         TypeCache::Get().kStringLengthType,
    614                         MachineType::TaggedSigned(),
    615                         kNoWriteBarrier};
    616   return access;
    617 }
    618 
    619 // static
    620 FieldAccess AccessBuilder::ForConsStringFirst() {
    621   FieldAccess access = {kTaggedBase,         ConsString::kFirstOffset,
    622                         Handle<Name>(),      MaybeHandle<Map>(),
    623                         Type::String(),      MachineType::TaggedPointer(),
    624                         kPointerWriteBarrier};
    625   return access;
    626 }
    627 
    628 // static
    629 FieldAccess AccessBuilder::ForConsStringSecond() {
    630   FieldAccess access = {kTaggedBase,         ConsString::kSecondOffset,
    631                         Handle<Name>(),      MaybeHandle<Map>(),
    632                         Type::String(),      MachineType::TaggedPointer(),
    633                         kPointerWriteBarrier};
    634   return access;
    635 }
    636 
    637 // static
    638 FieldAccess AccessBuilder::ForThinStringActual() {
    639   FieldAccess access = {kTaggedBase,         ThinString::kActualOffset,
    640                         Handle<Name>(),      MaybeHandle<Map>(),
    641                         Type::String(),      MachineType::TaggedPointer(),
    642                         kPointerWriteBarrier};
    643   return access;
    644 }
    645 
    646 // static
    647 FieldAccess AccessBuilder::ForSlicedStringOffset() {
    648   FieldAccess access = {kTaggedBase,         SlicedString::kOffsetOffset,
    649                         Handle<Name>(),      MaybeHandle<Map>(),
    650                         Type::SignedSmall(), MachineType::TaggedSigned(),
    651                         kNoWriteBarrier};
    652   return access;
    653 }
    654 
    655 // static
    656 FieldAccess AccessBuilder::ForSlicedStringParent() {
    657   FieldAccess access = {kTaggedBase,         SlicedString::kParentOffset,
    658                         Handle<Name>(),      MaybeHandle<Map>(),
    659                         Type::String(),      MachineType::TaggedPointer(),
    660                         kPointerWriteBarrier};
    661   return access;
    662 }
    663 
    664 // static
    665 FieldAccess AccessBuilder::ForExternalStringResourceData() {
    666   FieldAccess access = {kTaggedBase,
    667                         ExternalString::kResourceDataOffset,
    668                         Handle<Name>(),
    669                         MaybeHandle<Map>(),
    670                         Type::ExternalPointer(),
    671                         MachineType::Pointer(),
    672                         kNoWriteBarrier};
    673   return access;
    674 }
    675 
    676 // static
    677 ElementAccess AccessBuilder::ForExternalOneByteStringCharacter() {
    678   ElementAccess access = {kUntaggedBase, 0, TypeCache::Get().kUint8,
    679                           MachineType::Uint8(), kNoWriteBarrier};
    680   return access;
    681 }
    682 
    683 // static
    684 ElementAccess AccessBuilder::ForExternalTwoByteStringCharacter() {
    685   ElementAccess access = {kUntaggedBase, 0, TypeCache::Get().kUint16,
    686                           MachineType::Uint16(), kNoWriteBarrier};
    687   return access;
    688 }
    689 
    690 // static
    691 ElementAccess AccessBuilder::ForSeqOneByteStringCharacter() {
    692   ElementAccess access = {kTaggedBase, SeqOneByteString::kHeaderSize,
    693                           TypeCache::Get().kUint8, MachineType::Uint8(),
    694                           kNoWriteBarrier};
    695   return access;
    696 }
    697 
    698 // static
    699 ElementAccess AccessBuilder::ForSeqTwoByteStringCharacter() {
    700   ElementAccess access = {kTaggedBase, SeqTwoByteString::kHeaderSize,
    701                           TypeCache::Get().kUint16, MachineType::Uint16(),
    702                           kNoWriteBarrier};
    703   return access;
    704 }
    705 
    706 // static
    707 FieldAccess AccessBuilder::ForJSGlobalObjectGlobalProxy() {
    708   FieldAccess access = {kTaggedBase,         JSGlobalObject::kGlobalProxyOffset,
    709                         Handle<Name>(),      MaybeHandle<Map>(),
    710                         Type::Receiver(),    MachineType::TaggedPointer(),
    711                         kPointerWriteBarrier};
    712   return access;
    713 }
    714 
    715 // static
    716 FieldAccess AccessBuilder::ForJSGlobalObjectNativeContext() {
    717   FieldAccess access = {
    718       kTaggedBase,         JSGlobalObject::kNativeContextOffset,
    719       Handle<Name>(),      MaybeHandle<Map>(),
    720       Type::Internal(),    MachineType::TaggedPointer(),
    721       kPointerWriteBarrier};
    722   return access;
    723 }
    724 
    725 // static
    726 FieldAccess AccessBuilder::ForJSGlobalProxyNativeContext() {
    727   FieldAccess access = {
    728       kTaggedBase,         JSGlobalProxy::kNativeContextOffset,
    729       Handle<Name>(),      MaybeHandle<Map>(),
    730       Type::Internal(),    MachineType::TaggedPointer(),
    731       kPointerWriteBarrier};
    732   return access;
    733 }
    734 
    735 // static
    736 FieldAccess AccessBuilder::ForJSArrayIteratorIteratedObject() {
    737   FieldAccess access = {
    738       kTaggedBase,         JSArrayIterator::kIteratedObjectOffset,
    739       Handle<Name>(),      MaybeHandle<Map>(),
    740       Type::Receiver(),    MachineType::TaggedPointer(),
    741       kPointerWriteBarrier};
    742   return access;
    743 }
    744 
    745 // static
    746 FieldAccess AccessBuilder::ForJSArrayIteratorNextIndex() {
    747   // In generic case, cap to 2^53-1 (per ToLength() in spec) via
    748   // kPositiveSafeInteger
    749   FieldAccess access = {kTaggedBase,
    750                         JSArrayIterator::kNextIndexOffset,
    751                         Handle<Name>(),
    752                         MaybeHandle<Map>(),
    753                         TypeCache::Get().kPositiveSafeInteger,
    754                         MachineType::AnyTagged(),
    755                         kFullWriteBarrier};
    756   return access;
    757 }
    758 
    759 // static
    760 FieldAccess AccessBuilder::ForJSArrayIteratorKind() {
    761   FieldAccess access = {kTaggedBase,
    762                         JSArrayIterator::kKindOffset,
    763                         Handle<Name>(),
    764                         MaybeHandle<Map>(),
    765                         TypeCache::Get().kJSArrayIteratorKindType,
    766                         MachineType::TaggedSigned(),
    767                         kNoWriteBarrier};
    768   return access;
    769 }
    770 
    771 // static
    772 FieldAccess AccessBuilder::ForJSStringIteratorString() {
    773   FieldAccess access = {kTaggedBase,         JSStringIterator::kStringOffset,
    774                         Handle<Name>(),      MaybeHandle<Map>(),
    775                         Type::String(),      MachineType::TaggedPointer(),
    776                         kPointerWriteBarrier};
    777   return access;
    778 }
    779 
    780 // static
    781 FieldAccess AccessBuilder::ForJSStringIteratorIndex() {
    782   FieldAccess access = {kTaggedBase,
    783                         JSStringIterator::kNextIndexOffset,
    784                         Handle<Name>(),
    785                         MaybeHandle<Map>(),
    786                         TypeCache::Get().kStringLengthType,
    787                         MachineType::TaggedSigned(),
    788                         kNoWriteBarrier};
    789   return access;
    790 }
    791 
    792 // static
    793 FieldAccess AccessBuilder::ForValue() {
    794   FieldAccess access = {kTaggedBase,         JSValue::kValueOffset,
    795                         Handle<Name>(),      MaybeHandle<Map>(),
    796                         Type::NonInternal(), MachineType::AnyTagged(),
    797                         kFullWriteBarrier};
    798   return access;
    799 }
    800 
    801 
    802 // static
    803 FieldAccess AccessBuilder::ForArgumentsLength() {
    804   FieldAccess access = {kTaggedBase,         JSArgumentsObject::kLengthOffset,
    805                         Handle<Name>(),      MaybeHandle<Map>(),
    806                         Type::NonInternal(), MachineType::AnyTagged(),
    807                         kFullWriteBarrier};
    808   return access;
    809 }
    810 
    811 
    812 // static
    813 FieldAccess AccessBuilder::ForArgumentsCallee() {
    814   FieldAccess access = {
    815       kTaggedBase,         JSSloppyArgumentsObject::kCalleeOffset,
    816       Handle<Name>(),      MaybeHandle<Map>(),
    817       Type::NonInternal(), MachineType::AnyTagged(),
    818       kPointerWriteBarrier};
    819   return access;
    820 }
    821 
    822 
    823 // static
    824 FieldAccess AccessBuilder::ForFixedArraySlot(
    825     size_t index, WriteBarrierKind write_barrier_kind) {
    826   int offset = FixedArray::OffsetOfElementAt(static_cast<int>(index));
    827   FieldAccess access = {kTaggedBase,       offset,
    828                         Handle<Name>(),    MaybeHandle<Map>(),
    829                         Type::Any(),       MachineType::AnyTagged(),
    830                         write_barrier_kind};
    831   return access;
    832 }
    833 
    834 
    835 // static
    836 FieldAccess AccessBuilder::ForCellValue() {
    837   FieldAccess access = {kTaggedBase,      Cell::kValueOffset,
    838                         Handle<Name>(),   MaybeHandle<Map>(),
    839                         Type::Any(),      MachineType::AnyTagged(),
    840                         kFullWriteBarrier};
    841   return access;
    842 }
    843 
    844 // static
    845 FieldAccess AccessBuilder::ForContextSlot(size_t index) {
    846   int offset = Context::kHeaderSize + static_cast<int>(index) * kPointerSize;
    847   DCHECK_EQ(offset,
    848             Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
    849   FieldAccess access = {kTaggedBase,      offset,
    850                         Handle<Name>(),   MaybeHandle<Map>(),
    851                         Type::Any(),      MachineType::AnyTagged(),
    852                         kFullWriteBarrier};
    853   return access;
    854 }
    855 
    856 // static
    857 ElementAccess AccessBuilder::ForFixedArrayElement() {
    858   ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Any(),
    859                           MachineType::AnyTagged(), kFullWriteBarrier};
    860   return access;
    861 }
    862 
    863 // static
    864 ElementAccess AccessBuilder::ForFixedArrayElement(
    865     ElementsKind kind, LoadSensitivity load_sensitivity) {
    866   ElementAccess access = {kTaggedBase,       FixedArray::kHeaderSize,
    867                           Type::Any(),       MachineType::AnyTagged(),
    868                           kFullWriteBarrier, load_sensitivity};
    869   switch (kind) {
    870     case PACKED_SMI_ELEMENTS:
    871       access.type = Type::SignedSmall();
    872       access.machine_type = MachineType::TaggedSigned();
    873       access.write_barrier_kind = kNoWriteBarrier;
    874       break;
    875     case HOLEY_SMI_ELEMENTS:
    876       access.type = TypeCache::Get().kHoleySmi;
    877       break;
    878     case PACKED_ELEMENTS:
    879       access.type = Type::NonInternal();
    880       break;
    881     case HOLEY_ELEMENTS:
    882       break;
    883     case PACKED_DOUBLE_ELEMENTS:
    884       access.type = Type::Number();
    885       access.write_barrier_kind = kNoWriteBarrier;
    886       access.machine_type = MachineType::Float64();
    887       break;
    888     case HOLEY_DOUBLE_ELEMENTS:
    889       access.type = Type::NumberOrHole();
    890       access.write_barrier_kind = kNoWriteBarrier;
    891       access.machine_type = MachineType::Float64();
    892       break;
    893     default:
    894       UNREACHABLE();
    895       break;
    896   }
    897   return access;
    898 }
    899 
    900 // static
    901 ElementAccess AccessBuilder::ForFixedDoubleArrayElement() {
    902   ElementAccess access = {kTaggedBase, FixedDoubleArray::kHeaderSize,
    903                           TypeCache::Get().kFloat64, MachineType::Float64(),
    904                           kNoWriteBarrier};
    905   return access;
    906 }
    907 
    908 // static
    909 FieldAccess AccessBuilder::ForEnumCacheKeys() {
    910   FieldAccess access = {kTaggedBase,           EnumCache::kKeysOffset,
    911                         MaybeHandle<Name>(),   MaybeHandle<Map>(),
    912                         Type::OtherInternal(), MachineType::TaggedPointer(),
    913                         kPointerWriteBarrier};
    914   return access;
    915 }
    916 
    917 // static
    918 FieldAccess AccessBuilder::ForEnumCacheIndices() {
    919   FieldAccess access = {kTaggedBase,           EnumCache::kIndicesOffset,
    920                         MaybeHandle<Name>(),   MaybeHandle<Map>(),
    921                         Type::OtherInternal(), MachineType::TaggedPointer(),
    922                         kPointerWriteBarrier};
    923   return access;
    924 }
    925 
    926 // static
    927 ElementAccess AccessBuilder::ForTypedArrayElement(
    928     ExternalArrayType type, bool is_external,
    929     LoadSensitivity load_sensitivity) {
    930   BaseTaggedness taggedness = is_external ? kUntaggedBase : kTaggedBase;
    931   int header_size = is_external ? 0 : FixedTypedArrayBase::kDataOffset;
    932   switch (type) {
    933     case kExternalInt8Array: {
    934       ElementAccess access = {taggedness,       header_size,
    935                               Type::Signed32(), MachineType::Int8(),
    936                               kNoWriteBarrier,  load_sensitivity};
    937       return access;
    938     }
    939     case kExternalUint8Array:
    940     case kExternalUint8ClampedArray: {
    941       ElementAccess access = {taggedness,         header_size,
    942                               Type::Unsigned32(), MachineType::Uint8(),
    943                               kNoWriteBarrier,    load_sensitivity};
    944       return access;
    945     }
    946     case kExternalInt16Array: {
    947       ElementAccess access = {taggedness,       header_size,
    948                               Type::Signed32(), MachineType::Int16(),
    949                               kNoWriteBarrier,  load_sensitivity};
    950       return access;
    951     }
    952     case kExternalUint16Array: {
    953       ElementAccess access = {taggedness,         header_size,
    954                               Type::Unsigned32(), MachineType::Uint16(),
    955                               kNoWriteBarrier,    load_sensitivity};
    956       return access;
    957     }
    958     case kExternalInt32Array: {
    959       ElementAccess access = {taggedness,       header_size,
    960                               Type::Signed32(), MachineType::Int32(),
    961                               kNoWriteBarrier,  load_sensitivity};
    962       return access;
    963     }
    964     case kExternalUint32Array: {
    965       ElementAccess access = {taggedness,         header_size,
    966                               Type::Unsigned32(), MachineType::Uint32(),
    967                               kNoWriteBarrier,    load_sensitivity};
    968       return access;
    969     }
    970     case kExternalFloat32Array: {
    971       ElementAccess access = {taggedness,      header_size,
    972                               Type::Number(),  MachineType::Float32(),
    973                               kNoWriteBarrier, load_sensitivity};
    974       return access;
    975     }
    976     case kExternalFloat64Array: {
    977       ElementAccess access = {taggedness,      header_size,
    978                               Type::Number(),  MachineType::Float64(),
    979                               kNoWriteBarrier, load_sensitivity};
    980       return access;
    981     }
    982     case kExternalBigInt64Array:
    983     case kExternalBigUint64Array:
    984       // TODO(neis/jkummerow): Define appropriate types.
    985       UNIMPLEMENTED();
    986   }
    987   UNREACHABLE();
    988 }
    989 
    990 // static
    991 FieldAccess AccessBuilder::ForHashTableBaseNumberOfElements() {
    992   FieldAccess access = {
    993       kTaggedBase,
    994       FixedArray::OffsetOfElementAt(HashTableBase::kNumberOfElementsIndex),
    995       MaybeHandle<Name>(),
    996       MaybeHandle<Map>(),
    997       Type::SignedSmall(),
    998       MachineType::TaggedSigned(),
    999       kNoWriteBarrier};
   1000   return access;
   1001 }
   1002 
   1003 // static
   1004 FieldAccess AccessBuilder::ForHashTableBaseNumberOfDeletedElement() {
   1005   FieldAccess access = {
   1006       kTaggedBase, FixedArray::OffsetOfElementAt(
   1007                        HashTableBase::kNumberOfDeletedElementsIndex),
   1008       MaybeHandle<Name>(), MaybeHandle<Map>(), Type::SignedSmall(),
   1009       MachineType::TaggedSigned(), kNoWriteBarrier};
   1010   return access;
   1011 }
   1012 
   1013 // static
   1014 FieldAccess AccessBuilder::ForHashTableBaseCapacity() {
   1015   FieldAccess access = {
   1016       kTaggedBase,
   1017       FixedArray::OffsetOfElementAt(HashTableBase::kCapacityIndex),
   1018       MaybeHandle<Name>(),
   1019       MaybeHandle<Map>(),
   1020       Type::SignedSmall(),
   1021       MachineType::TaggedSigned(),
   1022       kNoWriteBarrier};
   1023   return access;
   1024 }
   1025 
   1026 // static
   1027 FieldAccess AccessBuilder::ForOrderedHashTableBaseNextTable() {
   1028   // TODO(turbofan): This will be redundant with the HashTableBase
   1029   // methods above once the hash table unification is done.
   1030   FieldAccess const access = {
   1031       kTaggedBase,         OrderedHashTableBase::kNextTableOffset,
   1032       MaybeHandle<Name>(), MaybeHandle<Map>(),
   1033       Type::Any(),         MachineType::AnyTagged(),
   1034       kFullWriteBarrier};
   1035   return access;
   1036 }
   1037 
   1038 // static
   1039 FieldAccess AccessBuilder::ForOrderedHashTableBaseNumberOfBuckets() {
   1040   // TODO(turbofan): This will be redundant with the HashTableBase
   1041   // methods above once the hash table unification is done.
   1042   FieldAccess const access = {kTaggedBase,
   1043                               OrderedHashTableBase::kNumberOfBucketsOffset,
   1044                               MaybeHandle<Name>(),
   1045                               MaybeHandle<Map>(),
   1046                               TypeCache::Get().kFixedArrayLengthType,
   1047                               MachineType::TaggedSigned(),
   1048                               kNoWriteBarrier};
   1049   return access;
   1050 }
   1051 
   1052 // static
   1053 FieldAccess AccessBuilder::ForOrderedHashTableBaseNumberOfDeletedElements() {
   1054   // TODO(turbofan): This will be redundant with the HashTableBase
   1055   // methods above once the hash table unification is done.
   1056   FieldAccess const access = {
   1057       kTaggedBase,
   1058       OrderedHashTableBase::kNumberOfDeletedElementsOffset,
   1059       MaybeHandle<Name>(),
   1060       MaybeHandle<Map>(),
   1061       TypeCache::Get().kFixedArrayLengthType,
   1062       MachineType::TaggedSigned(),
   1063       kNoWriteBarrier};
   1064   return access;
   1065 }
   1066 
   1067 // static
   1068 FieldAccess AccessBuilder::ForOrderedHashTableBaseNumberOfElements() {
   1069   // TODO(turbofan): This will be redundant with the HashTableBase
   1070   // methods above once the hash table unification is done.
   1071   FieldAccess const access = {kTaggedBase,
   1072                               OrderedHashTableBase::kNumberOfElementsOffset,
   1073                               MaybeHandle<Name>(),
   1074                               MaybeHandle<Map>(),
   1075                               TypeCache::Get().kFixedArrayLengthType,
   1076                               MachineType::TaggedSigned(),
   1077                               kNoWriteBarrier};
   1078   return access;
   1079 }
   1080 
   1081 // static
   1082 ElementAccess AccessBuilder::ForOrderedHashMapEntryValue() {
   1083   ElementAccess const access = {kTaggedBase,
   1084                                 OrderedHashMap::kHashTableStartOffset +
   1085                                     OrderedHashMap::kValueOffset * kPointerSize,
   1086                                 Type::Any(), MachineType::AnyTagged(),
   1087                                 kFullWriteBarrier};
   1088   return access;
   1089 }
   1090 
   1091 // static
   1092 FieldAccess AccessBuilder::ForDictionaryMaxNumberKey() {
   1093   FieldAccess access = {
   1094       kTaggedBase,
   1095       FixedArray::OffsetOfElementAt(NumberDictionary::kMaxNumberKeyIndex),
   1096       MaybeHandle<Name>(),
   1097       MaybeHandle<Map>(),
   1098       Type::Any(),
   1099       MachineType::AnyTagged(),
   1100       kNoWriteBarrier};
   1101   return access;
   1102 }
   1103 
   1104 // static
   1105 FieldAccess AccessBuilder::ForDictionaryNextEnumerationIndex() {
   1106   FieldAccess access = {
   1107       kTaggedBase,
   1108       FixedArray::OffsetOfElementAt(NameDictionary::kNextEnumerationIndexIndex),
   1109       MaybeHandle<Name>(),
   1110       MaybeHandle<Map>(),
   1111       Type::SignedSmall(),
   1112       MachineType::TaggedSigned(),
   1113       kNoWriteBarrier};
   1114   return access;
   1115 }
   1116 
   1117 // static
   1118 FieldAccess AccessBuilder::ForDictionaryObjectHashIndex() {
   1119   FieldAccess access = {
   1120       kTaggedBase,
   1121       FixedArray::OffsetOfElementAt(NameDictionary::kObjectHashIndex),
   1122       MaybeHandle<Name>(),
   1123       MaybeHandle<Map>(),
   1124       Type::SignedSmall(),
   1125       MachineType::TaggedSigned(),
   1126       kNoWriteBarrier};
   1127   return access;
   1128 }
   1129 
   1130 }  // namespace compiler
   1131 }  // namespace internal
   1132 }  // namespace v8
   1133