v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
access-builder.cc
Go to the documentation of this file.
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
6
19
20namespace v8 {
21namespace internal {
22namespace compiler {
23
24// static
26 FieldAccess access = {kUntaggedBase, 0,
27 MaybeHandle<Name>(), OptionalMapRef(),
29 kNoWriteBarrier, "ExternalIntPtr"};
30 return access;
31}
32
33// static
36 MaybeHandle<Name>(), OptionalMapRef(),
37 Type::OtherInternal(), MachineType::MapInHeader(),
38 write_barrier, "Map"};
39 return access;
40}
41
42// static
44 FieldAccess access = {kTaggedBase,
45 offsetof(HeapNumber, value_),
47 OptionalMapRef(),
51 "HeapNumberValue"};
52 return access;
53}
54
55// static
57 FieldAccess access = {
61 OptionalMapRef(),
65 "HeapInt32Value"};
66 return access;
67}
68
69// static
71 FieldAccess access = {
75 OptionalMapRef(),
79 "HeapInt32ValueUpperValue"};
80 return access;
81}
82
83// static
86 offsetof(Oddball, to_number_raw_));
88 Hole::kRawNumericValueOffset);
89 return ForHeapNumberValue();
90}
91
92// static
94 FieldAccess access = {kTaggedBase,
95 offsetof(BigInt, bitfield_),
97 OptionalMapRef(),
101 "BigIntBitfield"};
102 return access;
103}
104
105#ifdef BIGINT_NEEDS_PADDING
106// static
107FieldAccess AccessBuilder::ForBigIntOptionalPadding() {
108 static_assert(arraysize(BigInt::padding_) == sizeof(uint32_t));
109 FieldAccess access = {
110 kTaggedBase, offsetof(BigInt, padding_), MaybeHandle<Name>(),
111 OptionalMapRef(), TypeCache::Get()->kInt32, MachineType::Uint32(),
112 kNoWriteBarrier, "BigIntOptionalPadding"};
113 return access;
114}
115#endif
116
117// static
120 FieldAccess access = {
122 OptionalMapRef(), TypeCache::Get()->kBigUint64, MachineType::Uint64(),
123 kNoWriteBarrier, "BigIntLeastSignificantDigit64"};
124 return access;
125}
126
127// static
129 FieldAccess access = {kTaggedBase, JSObject::kPropertiesOrHashOffset,
130 MaybeHandle<Name>(), OptionalMapRef(),
132 kFullWriteBarrier, "JSObjectPropertiesOrHash"};
133 return access;
134}
135
136// static
138 FieldAccess access = {
139 kTaggedBase, JSObject::kPropertiesOrHashOffset,
140 MaybeHandle<Name>(), OptionalMapRef(),
142 kPointerWriteBarrier, "JSObjectPropertiesOrHashKnownPointer"};
143 return access;
144}
145
146// static
148 FieldAccess access = {kTaggedBase, JSObject::kElementsOffset,
149 MaybeHandle<Name>(), OptionalMapRef(),
150 Type::Internal(), MachineType::TaggedPointer(),
151 kPointerWriteBarrier, "JSObjectElements"};
152 return access;
153}
154
155// static
157 MapRef map, int index, MachineType machine_type) {
158 int const offset = map.GetInObjectPropertyOffset(index);
159 FieldAccess access = {kTaggedBase, offset,
160 MaybeHandle<Name>(), OptionalMapRef(),
161 Type::NonInternal(), machine_type,
162 kFullWriteBarrier, "JSObjectInObjectProperty"};
163 return access;
164}
165
166// static
168 int offset, WriteBarrierKind write_barrier_kind) {
169 FieldAccess access = {kTaggedBase, offset,
170 MaybeHandle<Name>(), OptionalMapRef(),
171 Type::NonInternal(), MachineType::AnyTagged(),
172 write_barrier_kind, "JSObjectOffset"};
173 return access;
174}
175
176// static
178 FieldAccess access = {kTaggedBase, JSCollection::kTableOffset,
179 MaybeHandle<Name>(), OptionalMapRef(),
180 Type::OtherInternal(), MachineType::TaggedPointer(),
181 kPointerWriteBarrier, "JSCollectionTable"};
182 return access;
183}
184
185// static
187 FieldAccess access = {
188 kTaggedBase, JSCollectionIterator::kTableOffset,
189 MaybeHandle<Name>(), OptionalMapRef(),
190 Type::OtherInternal(), MachineType::TaggedPointer(),
191 kPointerWriteBarrier, "JSCollectionIteratorTable"};
192 return access;
193}
194
195// static
197 FieldAccess access = {kTaggedBase,
198 JSCollectionIterator::kIndexOffset,
200 OptionalMapRef(),
204 "JSCollectionIteratorIndex"};
205 return access;
206}
207
208// static
210 FieldAccess access = {
212 JSExternalObject::kValueOffset,
214 OptionalMapRef(),
215 Type::ExternalPointer(),
218 "JSExternalObjectValue",
220 false,
222 };
223 return access;
224}
225
226#ifdef V8_ENABLE_SANDBOX
227// static
228FieldAccess AccessBuilder::ForJSExternalObjectPointerHandle() {
229 FieldAccess access = {
230 kTaggedBase, JSExternalObject::kValueOffset, MaybeHandle<Name>(),
231 OptionalMapRef(), TypeCache::Get()->kUint32, MachineType::Uint32(),
232 kNoWriteBarrier, "JSExternalObjectPointerHandle"};
233 return access;
234}
235#endif
236
237// static
239 FieldAccess access = {
240 kTaggedBase, JSFunction::kPrototypeOrInitialMapOffset,
241 MaybeHandle<Name>(), OptionalMapRef(),
243 kPointerWriteBarrier, "JSFunctionPrototypeOrInitialMap"};
244 return access;
245}
246
247// static
249 FieldAccess access = {kTaggedBase, JSFunction::kContextOffset,
250 MaybeHandle<Name>(), OptionalMapRef(),
251 Type::Internal(), MachineType::TaggedPointer(),
252 kPointerWriteBarrier, "JSFunctionContext"};
253 return access;
254}
255
256// static
258 FieldAccess access = {
259 kTaggedBase, JSFunction::kSharedFunctionInfoOffset,
260 Handle<Name>(), OptionalMapRef(),
261 Type::OtherInternal(), MachineType::TaggedPointer(),
262 kPointerWriteBarrier, "JSFunctionSharedFunctionInfo"};
263 return access;
264}
265
266// static
268 FieldAccess access = {kTaggedBase, JSFunction::kFeedbackCellOffset,
269 Handle<Name>(), OptionalMapRef(),
270 Type::Internal(), MachineType::TaggedPointer(),
271 kPointerWriteBarrier, "JSFunctionFeedbackCell"};
272 return access;
273}
274
275#ifdef V8_ENABLE_LEAPTIERING
276// static
277FieldAccess AccessBuilder::ForJSFunctionDispatchHandleNoWriteBarrier() {
278 // We currently don't require write barriers when writing dispatch handles of
279 // JSFunctions because they are loaded from the function's FeedbackCell and
280 // so must already be reachable. If this ever changes, we'll need to
281 // implement write barrier support for dispatch handles in generated code.
282 FieldAccess access = {
283 kTaggedBase, JSFunction::kDispatchHandleOffset, Handle<Name>(),
284 OptionalMapRef(), TypeCache::Get()->kInt32, MachineType::Int32(),
285 kNoWriteBarrier, "JSFunctionDispatchHandle"};
286 return access;
287}
288#else
289#ifdef V8_ENABLE_SANDBOX
290// static
292 FieldAccess access = {kTaggedBase,
293 JSFunction::kCodeOffset,
294 MaybeHandle<Name>(),
295 OptionalMapRef(),
296 Type::OtherInternal(),
299 "JSFunctionCode"};
300 access.indirect_pointer_tag = kCodeIndirectPointerTag;
301 return access;
302}
303#else
304// static
306 FieldAccess access = {kTaggedBase, JSFunction::kCodeOffset,
307 Handle<Name>(), OptionalMapRef(),
308 Type::OtherInternal(), MachineType::TaggedPointer(),
309 kPointerWriteBarrier, "JSFunctionCode"};
310 return access;
311}
312#endif // V8_ENABLE_SANDBOX
313#endif // V8_ENABLE_LEAPTIERING
314
315// static
317 FieldAccess access = {
318 kTaggedBase, JSBoundFunction::kBoundTargetFunctionOffset,
319 Handle<Name>(), OptionalMapRef(),
320 Type::Callable(), MachineType::TaggedPointer(),
321 kPointerWriteBarrier, "JSBoundFunctionBoundTargetFunction"};
322 return access;
323}
324
325// static
327 FieldAccess access = {kTaggedBase, JSBoundFunction::kBoundThisOffset,
328 Handle<Name>(), OptionalMapRef(),
329 Type::NonInternal(), MachineType::AnyTagged(),
330 kFullWriteBarrier, "JSBoundFunctionBoundThis"};
331 return access;
332}
333
334// static
336 FieldAccess access = {
337 kTaggedBase, JSBoundFunction::kBoundArgumentsOffset,
338 Handle<Name>(), OptionalMapRef(),
339 Type::Internal(), MachineType::TaggedPointer(),
340 kPointerWriteBarrier, "JSBoundFunctionBoundArguments"};
341 return access;
342}
343
344// static
346 FieldAccess access = {kTaggedBase, JSGeneratorObject::kContextOffset,
347 Handle<Name>(), OptionalMapRef(),
348 Type::Internal(), MachineType::TaggedPointer(),
349 kPointerWriteBarrier, "JSGeneratorObjectContext"};
350 return access;
351}
352
353// static
355 FieldAccess access = {kTaggedBase,
356 JSGeneratorObject::kFunctionOffset,
357 Handle<Name>(),
358 OptionalMapRef(),
359 Type::CallableFunction(),
362 "JSGeneratorObjectFunction"};
363 return access;
364}
365
366// static
368 FieldAccess access = {
369 kTaggedBase, JSGeneratorObject::kReceiverOffset,
370 Handle<Name>(), OptionalMapRef(),
371 Type::Internal(), MachineType::TaggedPointer(),
372 kPointerWriteBarrier, "JSGeneratorObjectReceiver"};
373 return access;
374}
375
376// static
378 FieldAccess access = {
379 kTaggedBase, JSGeneratorObject::kContinuationOffset,
380 Handle<Name>(), OptionalMapRef(),
382 kNoWriteBarrier, "JSGeneratorObjectContinuation"};
383 return access;
384}
385
386// static
388 FieldAccess access = {
389 kTaggedBase, JSGeneratorObject::kInputOrDebugPosOffset,
390 Handle<Name>(), OptionalMapRef(),
391 Type::NonInternal(), MachineType::AnyTagged(),
392 kFullWriteBarrier, "JSGeneratorObjectInputOrDebugPos"};
393 return access;
394}
395
396// static
398 FieldAccess access = {
399 kTaggedBase, JSGeneratorObject::kParametersAndRegistersOffset,
400 Handle<Name>(), OptionalMapRef(),
401 Type::Internal(), MachineType::TaggedPointer(),
402 kPointerWriteBarrier, "JSGeneratorObjectParametersAndRegisters"};
403 return access;
404}
405
406// static
408 FieldAccess access = {
409 kTaggedBase, JSGeneratorObject::kResumeModeOffset,
410 Handle<Name>(), OptionalMapRef(),
412 kNoWriteBarrier, "JSGeneratorObjectResumeMode"};
413 return access;
414}
415
416// static
418 FieldAccess access = {
419 kTaggedBase, JSAsyncFunctionObject::kPromiseOffset,
420 Handle<Name>(), OptionalMapRef(),
421 Type::OtherObject(), MachineType::TaggedPointer(),
422 kPointerWriteBarrier, "JSAsyncFunctionObjectPromise"};
423 return access;
424}
425
426// static
428 FieldAccess access = {
429 kTaggedBase, JSAsyncGeneratorObject::kQueueOffset,
430 Handle<Name>(), OptionalMapRef(),
431 Type::NonInternal(), MachineType::AnyTagged(),
432 kFullWriteBarrier, "JSAsyncGeneratorObjectQueue"};
433 return access;
434}
435
436// static
438 FieldAccess access = {
439 kTaggedBase, JSAsyncGeneratorObject::kIsAwaitingOffset,
440 Handle<Name>(), OptionalMapRef(),
442 kNoWriteBarrier, "JSAsyncGeneratorObjectIsAwaiting"};
443 return access;
444}
445
446// static
448 TypeCache const* type_cache = TypeCache::Get();
449 FieldAccess access = {kTaggedBase,
450 JSArray::kLengthOffset,
451 Handle<Name>(),
452 OptionalMapRef(),
453 type_cache->kJSArrayLengthType,
456 "JSArrayLength"};
457 if (IsDoubleElementsKind(elements_kind)) {
458 access.type = type_cache->kFixedDoubleArrayLengthType;
459 access.machine_type = MachineType::TaggedSigned();
460 access.write_barrier_kind = kNoWriteBarrier;
461 } else if (IsFastElementsKind(elements_kind)) {
462 access.type = type_cache->kFixedArrayLengthType;
463 access.machine_type = MachineType::TaggedSigned();
464 access.write_barrier_kind = kNoWriteBarrier;
465 }
466 return access;
467}
468
469// static
471 FieldAccess access = {
472 kTaggedBase, JSArrayBuffer::kBitFieldOffset, MaybeHandle<Name>(),
473 OptionalMapRef(), TypeCache::Get()->kUint8, MachineType::Uint32(),
474 kNoWriteBarrier, "JSArrayBufferBitField"};
475 return access;
476}
477
478// static
480 FieldAccess access = {kTaggedBase,
481 JSArrayBuffer::kRawByteLengthOffset,
483 OptionalMapRef(),
487 "JSArrayBufferByteLength"};
488#ifdef V8_ENABLE_SANDBOX
489 access.is_bounded_size_access = true;
490#endif
491 return access;
492}
493
494// static
496 FieldAccess access = {kTaggedBase, JSArrayBufferView::kBufferOffset,
497 MaybeHandle<Name>(), OptionalMapRef(),
498 Type::OtherInternal(), MachineType::TaggedPointer(),
499 kPointerWriteBarrier, "JSArrayBufferViewBuffer"};
500 access.is_immutable = true;
501 return access;
502}
503
504// static
506 FieldAccess access = {kTaggedBase,
507 JSArrayBufferView::kRawByteLengthOffset,
509 OptionalMapRef(),
513 "JSArrayBufferViewByteLength"};
514#ifdef V8_ENABLE_SANDBOX
515 access.is_bounded_size_access = true;
516#endif
517 return access;
518}
519
520// static
522 FieldAccess access = {kTaggedBase,
523 JSArrayBufferView::kRawByteOffsetOffset,
525 OptionalMapRef(),
529 "JSArrayBufferViewByteOffset"};
530#ifdef V8_ENABLE_SANDBOX
531 access.is_bounded_size_access = true;
532#endif
533 return access;
534}
535
536// static
538 FieldAccess access = {kTaggedBase,
539 JSArrayBufferView::kBitFieldOffset,
541 OptionalMapRef(),
545 "JSArrayBufferViewBitField"};
546 return access;
547}
548
549// static
551 FieldAccess access = {kTaggedBase,
552 JSTypedArray::kRawLengthOffset,
554 OptionalMapRef(),
558 "JSTypedArrayLength"};
559#ifdef V8_ENABLE_SANDBOX
560 access.is_bounded_size_access = true;
561#endif
562 return access;
563}
564
565// static
567 FieldAccess access = {kTaggedBase, JSTypedArray::kBasePointerOffset,
568 MaybeHandle<Name>(), OptionalMapRef(),
569 Type::OtherInternal(), MachineType::AnyTagged(),
570 kFullWriteBarrier, "JSTypedArrayBasePointer"};
571 return access;
572}
573
574// static
576 FieldAccess access = {
578 JSTypedArray::kExternalPointerOffset,
580 OptionalMapRef(),
581#ifdef V8_ENABLE_SANDBOX
582 Type::SandboxedPointer(),
584#else
585 Type::ExternalPointer(),
587#endif
589 "JSTypedArrayExternalPointer",
591 false,
592 };
593 return access;
594}
595
596// static
598 FieldAccess access = {
600 JSDataView::kDataPointerOffset,
602 OptionalMapRef(),
603#ifdef V8_ENABLE_SANDBOX
604 Type::SandboxedPointer(),
606#else
607 Type::ExternalPointer(),
609#endif
611 "JSDataViewDataPointer",
613 false,
614 };
615 return access;
616}
617
618// static
620 FieldAccess access = {kTaggedBase,
621 JSDate::kValueOffset,
623 OptionalMapRef(),
627 "JSDateValue"};
628 return access;
629}
630
631// static
633 FieldAccess access = {
634 kTaggedBase, JSDate::kYearOffset + index * kTaggedSize,
635 MaybeHandle<Name>(), OptionalMapRef(),
636 Type::Number(), MachineType::AnyTagged(),
637 kFullWriteBarrier, "JSDateField"};
638 return access;
639}
640
641// static
643 FieldAccess access = {kTaggedBase, JSIteratorResult::kDoneOffset,
644 MaybeHandle<Name>(), OptionalMapRef(),
645 Type::NonInternal(), MachineType::AnyTagged(),
646 kFullWriteBarrier, "JSIteratorResultDone"};
647 return access;
648}
649
650// static
652 FieldAccess access = {kTaggedBase, JSIteratorResult::kValueOffset,
653 MaybeHandle<Name>(), OptionalMapRef(),
654 Type::NonInternal(), MachineType::AnyTagged(),
655 kFullWriteBarrier, "JSIteratorResultValue"};
656 return access;
657}
658
659// static
661 FieldAccess access = {kTaggedBase, JSPrimitiveWrapper::kValueOffset,
662 MaybeHandle<Name>(), OptionalMapRef(),
663 Type::NonInternal(), MachineType::AnyTagged(),
664 kFullWriteBarrier, "JSPrimitiveWrapperValue"};
665 return access;
666}
667
668#ifdef V8_ENABLE_SANDBOX
669// static
671 FieldAccess access = {kTaggedBase,
672 JSRegExp::kDataOffset,
674 OptionalMapRef(),
675 Type::OtherInternal(),
678 "JSRegExpData"};
679 access.indirect_pointer_tag = kRegExpDataIndirectPointerTag;
680 return access;
681}
682#else
683// static
685 FieldAccess access = {kTaggedBase, JSRegExp::kDataOffset,
686 MaybeHandle<Name>(), OptionalMapRef(),
687 Type::OtherInternal(), MachineType::TaggedPointer(),
688 kPointerWriteBarrier, "JSRegExpData"};
689 return access;
690}
691#endif // V8_ENABLE_SANDBOX
692
693// static
695 FieldAccess access = {kTaggedBase, JSRegExp::kFlagsOffset,
696 MaybeHandle<Name>(), OptionalMapRef(),
697 Type::NonInternal(), MachineType::AnyTagged(),
698 kFullWriteBarrier, "JSRegExpFlags"};
699 return access;
700}
701
702// static
705 MaybeHandle<Name>(), OptionalMapRef(),
706 Type::NonInternal(), MachineType::AnyTagged(),
707 kFullWriteBarrier, "JSRegExpLastIndex"};
708 return access;
709}
710
711// static
713 FieldAccess access = {kTaggedBase, JSRegExp::kSourceOffset,
714 MaybeHandle<Name>(), OptionalMapRef(),
715 Type::NonInternal(), MachineType::AnyTagged(),
716 kFullWriteBarrier, "JSRegExpSource"};
717 return access;
718}
719
720// static
722 FieldAccess access = {kTaggedBase,
723 offsetof(FixedArray, length_),
725 OptionalMapRef(),
729 "FixedArrayLength"};
730 access.is_immutable = true;
731 return access;
732}
733
734// static
736 FieldAccess access = {kTaggedBase,
737 offsetof(WeakFixedArray, length_),
739 OptionalMapRef(),
743 "WeakFixedArrayLength"};
744 access.is_immutable = true;
745 return access;
746}
747
748// static
750 FieldAccess access = {
752 MaybeHandle<Name>(), OptionalMapRef(),
754 kPointerWriteBarrier, "SloppyArgumentsElementsContext"};
755 return access;
756}
757
758// static
760 FieldAccess access = {
762 MaybeHandle<Name>(), OptionalMapRef(),
764 kPointerWriteBarrier, "SloppyArgumentsElementsArguments"};
765 return access;
766}
767
768// static
770 FieldAccess access = {
771 kTaggedBase, PropertyArray::kLengthAndHashOffset,
772 MaybeHandle<Name>(), OptionalMapRef(),
774 kNoWriteBarrier, "PropertyArrayLengthAndHash"};
775 return access;
776}
777
778// static
780 FieldAccess access = {
781 kTaggedBase, DescriptorArray::kEnumCacheOffset,
782 Handle<Name>(), OptionalMapRef(),
783 Type::OtherInternal(), MachineType::TaggedPointer(),
784 kPointerWriteBarrier, "DescriptorArrayEnumCache"};
785 return access;
786}
787
788// static
790 FieldAccess access = {kTaggedBase,
791 Map::kBitFieldOffset,
792 Handle<Name>(),
793 OptionalMapRef(),
797 "MapBitField"};
798 return access;
799}
800
801// static
803 FieldAccess access = {kTaggedBase,
804 Map::kBitField2Offset,
805 Handle<Name>(),
806 OptionalMapRef(),
810 "MapBitField2"};
811 return access;
812}
813
814// static
816 FieldAccess access = {kTaggedBase,
817 Map::kBitField3Offset,
818 Handle<Name>(),
819 OptionalMapRef(),
823 "MapBitField3"};
824 return access;
825}
826
827// static
829 FieldAccess access = {kTaggedBase, Map::kInstanceDescriptorsOffset,
830 Handle<Name>(), OptionalMapRef(),
831 Type::OtherInternal(), MachineType::TaggedPointer(),
832 kPointerWriteBarrier, "MapDescriptors"};
833 return access;
834}
835
836// static
838 FieldAccess access = {
839 kTaggedBase, Map::kInstanceTypeOffset, Handle<Name>(),
840 OptionalMapRef(), TypeCache::Get()->kUint16, MachineType::Uint16(),
841 kNoWriteBarrier, "MapInstanceType"};
842 access.is_immutable = true;
843 return access;
844}
845
846// static
848 FieldAccess access = {kTaggedBase, Map::kPrototypeOffset,
849 Handle<Name>(), OptionalMapRef(),
851 kPointerWriteBarrier, "MapPrototype"};
852 return access;
853}
854
855// static
857 FieldAccess access = {
858 kTaggedBase, Map::kConstructorOrBackPointerOrNativeContextOffset,
859 Handle<Name>(), OptionalMapRef(),
861 kPointerWriteBarrier, "MapNativeContext"};
862 return access;
863}
864
865// static
867 FieldAccess access = {
868 kTaggedBase, SourceTextModule::kRegularExportsOffset,
869 Handle<Name>(), OptionalMapRef(),
870 Type::OtherInternal(), MachineType::TaggedPointer(),
871 kPointerWriteBarrier, "ModuleRegularExports"};
872 return access;
873}
874
875// static
877 FieldAccess access = {
878 kTaggedBase, SourceTextModule::kRegularImportsOffset,
879 Handle<Name>(), OptionalMapRef(),
880 Type::OtherInternal(), MachineType::TaggedPointer(),
881 kPointerWriteBarrier, "ModuleRegularImports"};
882 return access;
883}
884
885// static
887 FieldAccess access = {kTaggedBase, offsetof(Name, raw_hash_field_),
888 Handle<Name>(), OptionalMapRef(),
889 Type::Unsigned32(), MachineType::Uint32(),
890 kNoWriteBarrier, "NameRawHashField"};
891 return access;
892}
893
894// static
896 FieldAccess access = {kTaggedBase, FreeSpace::kSizeOffset,
897 MaybeHandle<Name>(), OptionalMapRef(),
900 return access;
901}
902
903// static
905 FieldAccess access = {kTaggedBase,
906 offsetof(String, length_),
907 Handle<Name>(),
908 OptionalMapRef(),
912 "StringLength"};
913 access.is_immutable = true;
914 return access;
915}
916
917// static
919 FieldAccess access = {kTaggedBase, offsetof(ConsString, first_),
920 Handle<Name>(), OptionalMapRef(),
921 Type::String(), MachineType::TaggedPointer(),
922 kPointerWriteBarrier, "ConsStringFirst"};
923 // Not immutable since flattening can mutate.
924 access.is_immutable = false;
925 return access;
926}
927
928// static
930 FieldAccess access = {kTaggedBase, offsetof(ConsString, second_),
931 Handle<Name>(), OptionalMapRef(),
932 Type::String(), MachineType::TaggedPointer(),
933 kPointerWriteBarrier, "ConsStringSecond"};
934 // Not immutable since flattening can mutate.
935 access.is_immutable = false;
936 return access;
937}
938
939// static
941 FieldAccess access = {kTaggedBase, offsetof(ThinString, actual_),
942 Handle<Name>(), OptionalMapRef(),
943 Type::String(), MachineType::TaggedPointer(),
944 kPointerWriteBarrier, "ThinStringActual"};
945 access.is_immutable = true;
946 return access;
947}
948
949// static
951 FieldAccess access = {kTaggedBase, offsetof(SlicedString, offset_),
952 Handle<Name>(), OptionalMapRef(),
954 kNoWriteBarrier, "SlicedStringOffset"};
955 access.is_immutable = true;
956 return access;
957}
958
959// static
961 FieldAccess access = {kTaggedBase, offsetof(SlicedString, parent_),
962 Handle<Name>(), OptionalMapRef(),
963 Type::String(), MachineType::TaggedPointer(),
964 kPointerWriteBarrier, "SlicedStringParent"};
965 access.is_immutable = true;
966 return access;
967}
968
969// static
971 FieldAccess access = {
973 offsetof(ExternalString, resource_data_),
974 Handle<Name>(),
975 OptionalMapRef(),
976 Type::ExternalPointer(),
979 "ExternalStringResourceData",
981 false,
983 };
984 return access;
985}
986
987// static
994
995// static
1002
1003// static
1005 FieldAccess access = {
1006 kTaggedBase, JSArrayIterator::kIteratedObjectOffset,
1007 Handle<Name>(), OptionalMapRef(),
1008 Type::Receiver(), MachineType::TaggedPointer(),
1009 kPointerWriteBarrier, "JSArrayIteratorIteratedObject"};
1010 return access;
1011}
1012
1013// static
1015 // In generic case, cap to 2^53-1 (per ToLength() in spec) via
1016 // kPositiveSafeInteger
1017 FieldAccess access = {kTaggedBase,
1018 JSArrayIterator::kNextIndexOffset,
1019 Handle<Name>(),
1020 OptionalMapRef(),
1024 "JSArrayIteratorNextIndex"};
1025 return access;
1026}
1027
1028// static
1030 FieldAccess access = {kTaggedBase,
1031 JSArrayIterator::kKindOffset,
1032 Handle<Name>(),
1033 OptionalMapRef(),
1037 "JSArrayIteratorKind"};
1038 return access;
1039}
1040
1041// static
1043 FieldAccess access = {kTaggedBase, JSStringIterator::kStringOffset,
1044 Handle<Name>(), OptionalMapRef(),
1045 Type::String(), MachineType::TaggedPointer(),
1046 kPointerWriteBarrier, "JSStringIteratorString"};
1047 return access;
1048}
1049
1050// static
1052 FieldAccess access = {kTaggedBase,
1053 JSStringIterator::kIndexOffset,
1054 Handle<Name>(),
1055 OptionalMapRef(),
1059 "JSStringIteratorIndex"};
1060 return access;
1061}
1062
1063// static
1065 constexpr int offset = JSStrictArgumentsObject::kLengthOffset;
1066 static_assert(offset == JSSloppyArgumentsObject::kLengthOffset);
1067 FieldAccess access = {kTaggedBase, offset,
1068 Handle<Name>(), OptionalMapRef(),
1069 Type::NonInternal(), MachineType::AnyTagged(),
1070 kFullWriteBarrier, "ArgumentsLength"};
1071 return access;
1072}
1073
1074// static
1076 FieldAccess access = {
1077 kTaggedBase, JSSloppyArgumentsObject::kCalleeOffset,
1078 Handle<Name>(), OptionalMapRef(),
1079 Type::NonInternal(), MachineType::AnyTagged(),
1080 kFullWriteBarrier, "ArgumentsCallee"};
1081 return access;
1082}
1083
1084// static
1086 size_t index, WriteBarrierKind write_barrier_kind) {
1087 int offset = FixedArray::OffsetOfElementAt(static_cast<int>(index));
1088 FieldAccess access = {kTaggedBase, offset,
1089 Handle<Name>(), OptionalMapRef(),
1091 write_barrier_kind, "FixedArraySlot"};
1092 return access;
1093}
1094
1095// static
1098 FieldAccess access = {kTaggedBase, offset,
1099 Handle<Name>(), OptionalMapRef(),
1101 kFullWriteBarrier, "FeedbackVectorSlot"};
1102 return access;
1103}
1104
1105// static
1108 FieldAccess access = {kTaggedBase, offset,
1109 Handle<Name>(), OptionalMapRef(),
1111 kFullWriteBarrier, "PropertyArraySlot"};
1112 return access;
1113}
1114
1115// static
1118 FieldAccess access = {kTaggedBase, offset,
1119 Handle<Name>(), OptionalMapRef(),
1121 kFullWriteBarrier, "WeakFixedArraySlot"};
1122 return access;
1123}
1124// static
1126 FieldAccess access = {kTaggedBase, Cell::kValueOffset,
1127 Handle<Name>(), OptionalMapRef(),
1129 kFullWriteBarrier, "CellValue"};
1130 return access;
1131}
1132
1133// static
1135 FieldAccess access = {kTaggedBase, ScopeInfo::kFlagsOffset,
1136 MaybeHandle<Name>(), OptionalMapRef(),
1137 Type::Unsigned32(), MachineType::Uint32(),
1138 kNoWriteBarrier, "ScopeInfoFlags"};
1139 return access;
1140}
1141
1142// static
1144 int offset = Context::OffsetOfElementAt(static_cast<int>(index));
1146 Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
1147 FieldAccess access = {kTaggedBase, offset,
1148 Handle<Name>(), OptionalMapRef(),
1150 kFullWriteBarrier, "ContextSlot"};
1151 return access;
1152}
1153
1154// static
1156 int offset = Context::OffsetOfElementAt(static_cast<int>(index));
1158 Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
1159 FieldAccess access = {kTaggedBase, offset,
1160 Handle<Name>(), OptionalMapRef(),
1162 kPointerWriteBarrier, "ContextSlotKnownPointer"};
1163 return access;
1164}
1165
1166// static
1168 int offset = Context::OffsetOfElementAt(static_cast<int>(index));
1170 Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
1171 FieldAccess access = {kTaggedBase, offset,
1172 Handle<Name>(), OptionalMapRef(),
1174 kNoWriteBarrier, "Smi"};
1175 return access;
1176}
1177
1178// static
1185
1186// static
1193
1194// static
1201
1202// statics
1207 switch (kind) {
1209 access.type = Type::SignedSmall();
1210 access.machine_type = MachineType::TaggedSigned();
1211 access.write_barrier_kind = kNoWriteBarrier;
1212 break;
1213 case HOLEY_SMI_ELEMENTS:
1214 access.type = TypeCache::Get()->kHoleySmi;
1215 break;
1216 case PACKED_ELEMENTS:
1217 access.type = Type::NonInternal();
1218 break;
1219 case HOLEY_ELEMENTS:
1220 break;
1222 access.type = Type::Number();
1223 access.write_barrier_kind = kNoWriteBarrier;
1224 access.machine_type = MachineType::Float64();
1225 break;
1227 access.type = Type::NumberOrHole();
1228 access.write_barrier_kind = kNoWriteBarrier;
1229 access.machine_type = MachineType::Float64();
1230 break;
1231 default:
1232 UNREACHABLE();
1233 }
1234 return access;
1235}
1236
1237// static
1244
1245// static
1247 FieldAccess access = {kTaggedBase, EnumCache::kKeysOffset,
1248 MaybeHandle<Name>(), OptionalMapRef(),
1249 Type::OtherInternal(), MachineType::TaggedPointer(),
1250 kPointerWriteBarrier, "EnumCacheKeys"};
1251 return access;
1252}
1253
1254// static
1256 FieldAccess access = {kTaggedBase, EnumCache::kIndicesOffset,
1257 MaybeHandle<Name>(), OptionalMapRef(),
1258 Type::OtherInternal(), MachineType::TaggedPointer(),
1259 kPointerWriteBarrier, "EnumCacheIndices"};
1260 return access;
1261}
1262
1263// static
1265 bool is_external) {
1266 BaseTaggedness taggedness = is_external ? kUntaggedBase : kTaggedBase;
1267 int header_size = is_external ? 0 : OFFSET_OF_DATA_START(ByteArray);
1268 switch (type) {
1269 case kExternalInt8Array: {
1270 ElementAccess access = {taggedness, header_size, Type::Signed32(),
1272 return access;
1273 }
1276 ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
1278 return access;
1279 }
1280 case kExternalInt16Array: {
1281 ElementAccess access = {taggedness, header_size, Type::Signed32(),
1283 return access;
1284 }
1285 case kExternalUint16Array: {
1286 ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
1288 return access;
1289 }
1290 case kExternalInt32Array: {
1291 ElementAccess access = {taggedness, header_size, Type::Signed32(),
1293 return access;
1294 }
1295 case kExternalUint32Array: {
1296 ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
1298 return access;
1299 }
1300 case kExternalFloat16Array: {
1301 // Accesses to Float16Array use float16 raw bits because spotty native
1302 // fp16 support across architectures. See
1303 // MachineRepresentation::kFloat16RawBits, which is used during simplified
1304 // lowering to insert the correct conversions.
1305 ElementAccess access = {taggedness, header_size, Type::Number(),
1307 return access;
1308 }
1309 case kExternalFloat32Array: {
1310 ElementAccess access = {taggedness, header_size, Type::Number(),
1312 return access;
1313 }
1314 case kExternalFloat64Array: {
1315 ElementAccess access = {taggedness, header_size, Type::Number(),
1317 return access;
1318 }
1320 ElementAccess access = {taggedness, header_size, Type::SignedBigInt64(),
1322 return access;
1323 }
1325 ElementAccess access = {taggedness, header_size, Type::UnsignedBigInt64(),
1327 return access;
1328 }
1329 }
1330 UNREACHABLE();
1331}
1332
1333// static
1335 ElementAccess access = {
1337 (mode == ForInMode::kGeneric ? Type::String()
1338 : Type::InternalizedString()),
1340 return access;
1341}
1342
1343// static
1345 FieldAccess access = {
1349 OptionalMapRef(),
1353 "HashTableBaseNumberOfElements"};
1354 return access;
1355}
1356
1357// static
1359 FieldAccess access = {kTaggedBase,
1363 OptionalMapRef(),
1367 "HashTableBaseNumberOfDeletedElement"};
1368 return access;
1369}
1370
1371// static
1373 FieldAccess access = {
1377 OptionalMapRef(),
1381 "HashTableBaseCapacity"};
1382 return access;
1383}
1384
1385// static
1387 // TODO(turbofan): This will be redundant with the HashTableBase
1388 // methods above once the hash table unification is done.
1389 static_assert(OrderedHashMap::NextTableOffset() ==
1391 FieldAccess const access = {
1393 MaybeHandle<Name>(), OptionalMapRef(),
1395 kFullWriteBarrier, "OrderedHashMapOrSetNextTable"};
1396 return access;
1397}
1398
1399// static
1401 // TODO(turbofan): This will be redundant with the HashTableBase
1402 // methods above once the hash table unification is done.
1403 static_assert(OrderedHashMap::NumberOfBucketsOffset() ==
1405 FieldAccess const access = {kTaggedBase,
1408 OptionalMapRef(),
1412 "OrderedHashMapOrSetNumberOfBuckets"};
1413 return access;
1414}
1415
1416// static
1418 // TODO(turbofan): This will be redundant with the HashTableBase
1419 // methods above once the hash table unification is done.
1422 FieldAccess const access = {kTaggedBase,
1425 OptionalMapRef(),
1429 "OrderedHashMapOrSetNumberOfDeletedElements"};
1430 return access;
1431}
1432
1433// static
1435 // TODO(turbofan): This will be redundant with the HashTableBase
1436 // methods above once the hash table unification is done.
1439 FieldAccess const access = {kTaggedBase,
1442 OptionalMapRef(),
1446 "OrderedHashMapOrSetNumberOfElements"};
1447 return access;
1448}
1449
1450// static
1459
1460// static
1462 FieldAccess access = {
1464 FixedArray::OffsetOfElementAt(NameDictionary::kNextEnumerationIndexIndex),
1466 OptionalMapRef(),
1470 "DictionaryNextEnumerationIndex"};
1471 return access;
1472}
1473
1474// static
1476 FieldAccess access = {
1478 FixedArray::OffsetOfElementAt(NameDictionary::kObjectHashIndex),
1480 OptionalMapRef(),
1484 "DictionaryObjectHashIndex"};
1485 return access;
1486}
1487
1488// static
1490 FieldAccess access = {
1494 OptionalMapRef(),
1498 "NameDictionaryFlagsIndex"};
1499 return access;
1500}
1501
1502// static
1504 FieldAccess access = {kTaggedBase,
1505 FeedbackCell::kInterruptBudgetOffset,
1506 Handle<Name>(),
1507 OptionalMapRef(),
1511 "FeedbackCellInterruptBudget"};
1512 return access;
1513}
1514
1515#ifdef V8_ENABLE_LEAPTIERING
1516// static
1517FieldAccess AccessBuilder::ForFeedbackCellDispatchHandleNoWriteBarrier() {
1518 // Dispatch handles in FeedbackCells are effectively const-after-init and so
1519 // they are marked as kNoWriteBarrier here (because the fields will not be
1520 // written to).
1521 FieldAccess access = {kTaggedBase,
1522 FeedbackCell::kDispatchHandleOffset,
1523 Handle<Name>(),
1524 OptionalMapRef(),
1528 "FeedbackCellDispatchHandle"};
1529 return access;
1530}
1531#endif // V8_ENABLE_LEAPTIERING
1532
1533// static
1535 FieldAccess access = {kTaggedBase,
1536 FeedbackVector::kInvocationCountOffset,
1537 Handle<Name>(),
1538 OptionalMapRef(),
1542 "FeedbackVectorInvocationCount"};
1543 return access;
1544}
1545
1546// static
1548 FieldAccess access = {
1549 kTaggedBase, FeedbackVector::kFlagsOffset, Handle<Name>(),
1550 OptionalMapRef(), TypeCache::Get()->kUint16, MachineType::Uint16(),
1551 kNoWriteBarrier, "FeedbackVectorFlags"};
1552 return access;
1553}
1554
1555// static
1557 FieldAccess access = {
1558 kTaggedBase, FeedbackVector::kClosureFeedbackCellArrayOffset,
1559 Handle<Name>(), OptionalMapRef(),
1561 kFullWriteBarrier, "FeedbackVectorClosureFeedbackCellArray"};
1562 return access;
1563}
1564
1565#if V8_ENABLE_WEBASSEMBLY
1566// static
1567FieldAccess AccessBuilder::ForWasmArrayLength() {
1568 return {compiler::kTaggedBase,
1569 WasmArray::kLengthOffset,
1571 compiler::OptionalMapRef(),
1572 compiler::Type::OtherInternal(),
1575 "WasmArrayLength"};
1576}
1577
1578// static
1579FieldAccess AccessBuilder::ForWasmDispatchTableLength() {
1580 return {compiler::kTaggedBase,
1582 MaybeHandle<Name>{},
1583 compiler::OptionalMapRef{},
1584 compiler::Type::OtherInternal(),
1587 "WasmDispatchTableLength"};
1588}
1589#endif // V8_ENABLE_WEBASSEMBLY
1590
1591// static
1593 FieldAccess access = {
1594 kTaggedBase, ContextSidePropertyCell::kPropertyDetailsRawOffset,
1595 MaybeHandle<Name>(), OptionalMapRef(),
1597 kNoWriteBarrier, "ContextSidePropertyDetails"};
1598 return access;
1599}
1600
1601} // namespace compiler
1602} // namespace internal
1603} // namespace v8
Address * arguments_
Builtins::Kind kind
Definition builtins.cc:40
static uint32_t SizeFor(uint32_t length)
Definition bigint.h:252
static V8_INLINE constexpr int OffsetOfElementAt(int index)
Definition contexts.h:512
static V8_INLINE constexpr int SlotOffset(int index)
Definition contexts.h:516
static constexpr int OffsetOfElementAt(int index)
static const int kCapacityIndex
Definition hash-table.h:96
static const int kNumberOfDeletedElementsIndex
Definition hash-table.h:95
static const int kNumberOfElementsIndex
Definition hash-table.h:94
static constexpr int kMapOffset
static constexpr int kLastIndexOffset
Definition js-regexp.h:108
static constexpr MachineType MapInHeader()
static constexpr MachineType Float64()
static constexpr MachineType Pointer()
static constexpr MachineType Uint8()
static constexpr MachineType Int32()
static constexpr MachineType AnyTagged()
static constexpr MachineType Uint64()
static constexpr MachineType Uint32()
static constexpr MachineType SandboxedPointer()
static constexpr MachineType TaggedSigned()
static constexpr MachineType IndirectPointer()
static constexpr MachineType Uint16()
static constexpr MachineType Int16()
static constexpr MachineType Float32()
static constexpr MachineType Int64()
static constexpr MachineType TaggedPointer()
static constexpr MachineType UintPtr()
static constexpr MachineType Int8()
static constexpr MachineType IntPtr()
static const int kFlagsIndex
Definition dictionary.h:247
static constexpr int OffsetOfElementAt(int index)
static constexpr size_t kLengthOffset
static FieldAccess ForJSArrayBufferViewBuffer()
static ElementAccess ForFixedArrayElement()
static ElementAccess ForSloppyArgumentsElementsMappedEntry()
static ElementAccess ForSeqTwoByteStringCharacter()
static FieldAccess ForJSCollectionIteratorTable()
static FieldAccess ForJSArrayBufferViewByteLength()
static FieldAccess ForMap(WriteBarrierKind write_barrier=kMapWriteBarrier)
static FieldAccess ForJSArrayBufferViewByteOffset()
static FieldAccess ForContextSlotSmi(size_t index)
static FieldAccess ForJSExternalObjectValue()
static ElementAccess ForSeqOneByteStringCharacter()
static FieldAccess ForJSBoundFunctionBoundTargetFunction()
static FieldAccess ForJSBoundFunctionBoundArguments()
static FieldAccess ForJSObjectOffset(int offset, WriteBarrierKind write_barrier_kind=kFullWriteBarrier)
static FieldAccess ForSloppyArgumentsElementsArguments()
static FieldAccess ForFixedArraySlot(size_t index, WriteBarrierKind write_barrier_kind=kFullWriteBarrier)
static FieldAccess ForJSArrayIteratorNextIndex()
static FieldAccess ForJSObjectPropertiesOrHashKnownPointer()
static FieldAccess ForJSArrayIteratorIteratedObject()
static FieldAccess ForHeapInt32UpperValue()
static FieldAccess ForJSArrayBufferByteLength()
static FieldAccess ForHashTableBaseNumberOfElements()
static FieldAccess ForJSBoundFunctionBoundThis()
static FieldAccess ForJSCollectionIteratorIndex()
static FieldAccess ForOrderedHashMapOrSetNextTable()
static FieldAccess ForJSArrayBufferBitField()
static FieldAccess ForFeedbackVectorSlot(int index)
static FieldAccess ForJSObjectInObjectProperty(MapRef map, int index, MachineType machine_type=MachineType::AnyTagged())
static FieldAccess ForExternalStringResourceData()
static FieldAccess ForContextSlotKnownPointer(size_t index)
static FieldAccess ForJSGeneratorObjectContext()
static FieldAccess ForJSFunctionSharedFunctionInfo()
static FieldAccess ForJSDateField(JSDate::FieldIndex index)
static FieldAccess ForJSGeneratorObjectInputOrDebugPos()
static FieldAccess ForFeedbackVectorInvocationCount()
static FieldAccess ForJSArrayLength(ElementsKind elements_kind)
static ElementAccess ForOrderedHashMapEntryValue()
static FieldAccess ForJSIteratorResultValue()
static ElementAccess ForJSForInCacheArrayElement(ForInMode mode)
static FieldAccess ForFeedbackCellInterruptBudget()
static FieldAccess ForJSPrimitiveWrapperValue()
static FieldAccess ForFeedbackVectorClosureFeedbackCellArray()
static FieldAccess ForOrderedHashMapOrSetNumberOfBuckets()
static FieldAccess ForJSAsyncFunctionObjectPromise()
static FieldAccess ForContextSlot(size_t index)
static FieldAccess ForJSObjectPropertiesOrHash()
static FieldAccess ForJSFunctionFeedbackCell()
static ElementAccess ForFixedDoubleArrayElement()
static FieldAccess ForBigIntLeastSignificantDigit64()
static FieldAccess ForJSGeneratorObjectReceiver()
static FieldAccess ForHashTableBaseNumberOfDeletedElement()
static FieldAccess ForJSTypedArrayExternalPointer()
static FieldAccess ForNameDictionaryFlagsIndex()
static FieldAccess ForHeapNumberOrOddballOrHoleValue()
static FieldAccess ForWeakFixedArraySlot(int index)
static FieldAccess ForJSGeneratorObjectFunction()
static FieldAccess ForDictionaryNextEnumerationIndex()
static FieldAccess ForJSGeneratorObjectResumeMode()
static FieldAccess ForSloppyArgumentsElementsContext()
static ElementAccess ForTypedArrayElement(ExternalArrayType type, bool is_external)
static FieldAccess ForJSAsyncGeneratorObjectQueue()
static FieldAccess ForJSAsyncGeneratorObjectIsAwaiting()
static FieldAccess ForPropertyArraySlot(int index)
static FieldAccess ForPropertyArrayLengthAndHash()
static FieldAccess ForJSGeneratorObjectContinuation()
static ElementAccess ForWeakFixedArrayElement()
static FieldAccess ForJSTypedArrayBasePointer()
static FieldAccess ForJSFunctionPrototypeOrInitialMap()
static FieldAccess ForDescriptorArrayEnumCache()
static FieldAccess ForJSDataViewDataPointer()
static FieldAccess ForJSArrayBufferViewBitField()
static FieldAccess ForOrderedHashMapOrSetNumberOfDeletedElements()
static FieldAccess ForOrderedHashMapOrSetNumberOfElements()
static FieldAccess ForDictionaryObjectHashIndex()
static FieldAccess ForJSGeneratorObjectParametersAndRegisters()
static TypeCache const * Get()
Operand const offset_
Register const value_
Handle< Context > context_
int32_t offset
const int length_
Definition mul-fft.cc:473
constexpr int kTaggedSize
Definition globals.h:542
DONT_OVERRIDE DISABLE_ALLOCATION_SITES HOLEY_ELEMENTS
bool IsFastElementsKind(ElementsKind kind)
DONT_OVERRIDE DISABLE_ALLOCATION_SITES DISABLE_ALLOCATION_SITES HOLEY_DOUBLE_ELEMENTS
const int kHeapObjectTag
Definition v8-internal.h:72
@ kExternalObjectValueTag
@ kExternalStringResourceDataTag
@ kExternalFloat64Array
Definition globals.h:2461
@ kExternalUint32Array
Definition globals.h:2458
@ kExternalBigInt64Array
Definition globals.h:2463
@ kExternalInt32Array
Definition globals.h:2457
@ kExternalInt8Array
Definition globals.h:2453
@ kExternalUint8ClampedArray
Definition globals.h:2462
@ kExternalUint8Array
Definition globals.h:2454
@ kExternalUint16Array
Definition globals.h:2456
@ kExternalFloat32Array
Definition globals.h:2460
@ kExternalInt16Array
Definition globals.h:2455
@ kExternalFloat16Array
Definition globals.h:2459
@ kExternalBigUint64Array
Definition globals.h:2464
constexpr int kIeeeDoubleExponentWordOffset
Definition globals.h:1763
constexpr bool IsDoubleElementsKind(ElementsKind kind)
constexpr int kIeeeDoubleMantissaWordOffset
Definition globals.h:1762
Local< T > Handle
BytecodeSequenceNode * parent_
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define arraysize(array)
Definition macros.h:67
#define OFFSET_OF_DATA_START(Type)
#define STATIC_ASSERT_FIELD_OFFSETS_EQUAL(Offset1, Offset2)
Definition utils.h:262