• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef V8_COMPILER_ACCESS_BUILDER_H_
6 #define V8_COMPILER_ACCESS_BUILDER_H_
7 
8 #include "src/base/compiler-specific.h"
9 #include "src/compiler/simplified-operator.h"
10 #include "src/compiler/write-barrier-kind.h"
11 #include "src/objects/elements-kind.h"
12 #include "src/objects/js-objects.h"
13 
14 namespace v8 {
15 namespace internal {
16 namespace compiler {
17 
18 // This access builder provides a set of static methods constructing commonly
19 // used FieldAccess and ElementAccess descriptors. These descriptors serve as
20 // parameters to simplified load/store operators.
21 class V8_EXPORT_PRIVATE AccessBuilder final
NON_EXPORTED_BASE(AllStatic)22     : public NON_EXPORTED_BASE(AllStatic) {
23  public:
24   // ===========================================================================
25   // Access to external values (based on external references).
26 
27   // Provides access to an IntPtr field identified by an external reference.
28   static FieldAccess ForExternalIntPtr();
29 
30   // ===========================================================================
31   // Access to heap object fields and elements (based on tagged pointer).
32 
33   // Provides access to HeapObject::map() field.
34   static FieldAccess ForMap();
35 
36   // Provides access to HeapNumber::value() field.
37   static FieldAccess ForHeapNumberValue();
38 
39   // Provides access to BigInt's bit field.
40   static FieldAccess ForBigIntBitfield();
41 
42   // Provides access to BigInt's 32 bit padding that is placed after the
43   // bitfield on 64 bit architectures without pointer compression. Do not use
44   // this on 32 bit architectures.
45   static FieldAccess ForBigIntOptionalPadding();
46 
47   // Provides access to BigInt's least significant digit on 64 bit
48   // architectures. Do not use this on 32 bit architectures.
49   static FieldAccess ForBigIntLeastSignificantDigit64();
50 
51   // Provides access to JSObject::properties() field.
52   static FieldAccess ForJSObjectPropertiesOrHash();
53 
54   // Provides access to JSObject::properties() field for known pointers.
55   static FieldAccess ForJSObjectPropertiesOrHashKnownPointer();
56 
57   // Provides access to JSObject::elements() field.
58   static FieldAccess ForJSObjectElements();
59 
60   // Provides access to JSObject inobject property fields.
61   static FieldAccess ForJSObjectInObjectProperty(const MapRef& map, int index);
62   static FieldAccess ForJSObjectOffset(
63       int offset, WriteBarrierKind write_barrier_kind = kFullWriteBarrier);
64 
65   // Provides access to JSCollecton::table() field.
66   static FieldAccess ForJSCollectionTable();
67 
68   // Provides access to JSCollectionIterator::table() field.
69   static FieldAccess ForJSCollectionIteratorTable();
70 
71   // Provides access to JSCollectionIterator::index() field.
72   static FieldAccess ForJSCollectionIteratorIndex();
73 
74   // Provides access to JSFunction::prototype_or_initial_map() field.
75   static FieldAccess ForJSFunctionPrototypeOrInitialMap();
76 
77   // Provides access to JSFunction::context() field.
78   static FieldAccess ForJSFunctionContext();
79 
80   // Provides access to JSFunction::shared() field.
81   static FieldAccess ForJSFunctionSharedFunctionInfo();
82 
83   // Provides access to JSFunction::feedback_cell() field.
84   static FieldAccess ForJSFunctionFeedbackCell();
85 
86   // Provides access to JSFunction::code() field.
87   static FieldAccess ForJSFunctionCode();
88 
89   // Provides access to JSBoundFunction::bound_target_function() field.
90   static FieldAccess ForJSBoundFunctionBoundTargetFunction();
91 
92   // Provides access to JSBoundFunction::bound_this() field.
93   static FieldAccess ForJSBoundFunctionBoundThis();
94 
95   // Provides access to JSBoundFunction::bound_arguments() field.
96   static FieldAccess ForJSBoundFunctionBoundArguments();
97 
98   // Provides access to JSGeneratorObject::context() field.
99   static FieldAccess ForJSGeneratorObjectContext();
100 
101   // Provides access to JSGeneratorObject::continuation() field.
102   static FieldAccess ForJSGeneratorObjectContinuation();
103 
104   // Provides access to JSGeneratorObject::input_or_debug_pos() field.
105   static FieldAccess ForJSGeneratorObjectInputOrDebugPos();
106 
107   // Provides access to JSGeneratorObject::parameters_and_registers() field.
108   static FieldAccess ForJSGeneratorObjectParametersAndRegisters();
109 
110   // Provides access to JSGeneratorObject::function() field.
111   static FieldAccess ForJSGeneratorObjectFunction();
112 
113   // Provides access to JSGeneratorObject::receiver() field.
114   static FieldAccess ForJSGeneratorObjectReceiver();
115 
116   // Provides access to JSGeneratorObject::resume_mode() field.
117   static FieldAccess ForJSGeneratorObjectResumeMode();
118 
119   // Provides access to JSAsyncFunctionObject::promise() field.
120   static FieldAccess ForJSAsyncFunctionObjectPromise();
121 
122   // Provides access to JSAsyncGeneratorObject::queue() field.
123   static FieldAccess ForJSAsyncGeneratorObjectQueue();
124 
125   // Provides access to JSAsyncGeneratorObject::is_awaiting() field.
126   static FieldAccess ForJSAsyncGeneratorObjectIsAwaiting();
127 
128   // Provides access to JSArray::length() field.
129   static FieldAccess ForJSArrayLength(ElementsKind elements_kind);
130 
131   // Provides access to JSArrayBuffer::bit_field() field.
132   static FieldAccess ForJSArrayBufferBitField();
133 
134   // Provides access to JSArrayBufferView::buffer() field.
135   static FieldAccess ForJSArrayBufferViewBuffer();
136 
137   // Provides access to JSArrayBufferView::byteLength() field.
138   static FieldAccess ForJSArrayBufferViewByteLength();
139 
140   // Provides access to JSArrayBufferView::byteOffset() field.
141   static FieldAccess ForJSArrayBufferViewByteOffset();
142 
143   // Provides access to JSTypedArray::length() field.
144   static FieldAccess ForJSTypedArrayLength();
145 
146   // Provides access to JSTypedArray::base_pointer() field.
147   static FieldAccess ForJSTypedArrayBasePointer();
148 
149   // Provides access to JSTypedArray::external_pointer() field.
150   static FieldAccess ForJSTypedArrayExternalPointer();
151 
152   // Provides access to JSDataView::data_pointer() field.
153   static FieldAccess ForJSDataViewDataPointer();
154 
155   // Provides access to JSDate::value() field.
156   static FieldAccess ForJSDateValue();
157 
158   // Provides access to JSDate fields.
159   static FieldAccess ForJSDateField(JSDate::FieldIndex index);
160 
161   // Provides access to JSIteratorResult::done() field.
162   static FieldAccess ForJSIteratorResultDone();
163 
164   // Provides access to JSIteratorResult::value() field.
165   static FieldAccess ForJSIteratorResultValue();
166 
167   // Provides access to JSRegExp::data() field.
168   static FieldAccess ForJSRegExpData();
169 
170   // Provides access to JSRegExp::flags() field.
171   static FieldAccess ForJSRegExpFlags();
172 
173   // Provides access to JSRegExp::last_index() field.
174   static FieldAccess ForJSRegExpLastIndex();
175 
176   // Provides access to JSRegExp::source() field.
177   static FieldAccess ForJSRegExpSource();
178 
179   // Provides access to FixedArray::length() field.
180   static FieldAccess ForFixedArrayLength();
181 
182   // Provides access to WeakFixedArray::length() field.
183   static FieldAccess ForWeakFixedArrayLength();
184 
185   // Provides access to SloppyArgumentsElements::context() field.
186   static FieldAccess ForSloppyArgumentsElementsContext();
187 
188   // Provides access to SloppyArgumentsElements::arguments() field.
189   static FieldAccess ForSloppyArgumentsElementsArguments();
190 
191   // Provides access to PropertyArray::length() field.
192   static FieldAccess ForPropertyArrayLengthAndHash();
193 
194   // Provides access to DescriptorArray::enum_cache() field.
195   static FieldAccess ForDescriptorArrayEnumCache();
196 
197   // Provides access to Map::bit_field() byte.
198   static FieldAccess ForMapBitField();
199 
200   // Provides access to Map::bit_field2() byte.
201   static FieldAccess ForMapBitField2();
202 
203   // Provides access to Map::bit_field3() field.
204   static FieldAccess ForMapBitField3();
205 
206   // Provides access to Map::descriptors() field.
207   static FieldAccess ForMapDescriptors();
208 
209   // Provides access to Map::instance_type() field.
210   static FieldAccess ForMapInstanceType();
211 
212   // Provides access to Map::prototype() field.
213   static FieldAccess ForMapPrototype();
214 
215   // Provides access to Map::native_context() field.
216   static FieldAccess ForMapNativeContext();
217 
218   // Provides access to Module::regular_exports() field.
219   static FieldAccess ForModuleRegularExports();
220 
221   // Provides access to Module::regular_imports() field.
222   static FieldAccess ForModuleRegularImports();
223 
224   // Provides access to Name::hash_field() field.
225   static FieldAccess ForNameHashField();
226 
227   // Provides access to String::length() field.
228   static FieldAccess ForStringLength();
229 
230   // Provides access to ConsString::first() field.
231   static FieldAccess ForConsStringFirst();
232 
233   // Provides access to ConsString::second() field.
234   static FieldAccess ForConsStringSecond();
235 
236   // Provides access to ThinString::actual() field.
237   static FieldAccess ForThinStringActual();
238 
239   // Provides access to SlicedString::offset() field.
240   static FieldAccess ForSlicedStringOffset();
241 
242   // Provides access to SlicedString::parent() field.
243   static FieldAccess ForSlicedStringParent();
244 
245   // Provides access to ExternalString::resource_data() field.
246   static FieldAccess ForExternalStringResourceData();
247 
248   // Provides access to SeqOneByteString characters.
249   static ElementAccess ForSeqOneByteStringCharacter();
250 
251   // Provides access to SeqTwoByteString characters.
252   static ElementAccess ForSeqTwoByteStringCharacter();
253 
254   // Provides access to JSGlobalProxy::native_context() field.
255   static FieldAccess ForJSGlobalProxyNativeContext();
256 
257   // Provides access to JSArrayIterator::iterated_object() field.
258   static FieldAccess ForJSArrayIteratorIteratedObject();
259 
260   // Provides access to JSArrayIterator::next_index() field.
261   static FieldAccess ForJSArrayIteratorNextIndex();
262 
263   // Provides access to JSArrayIterator::kind() field.
264   static FieldAccess ForJSArrayIteratorKind();
265 
266   // Provides access to JSStringIterator::string() field.
267   static FieldAccess ForJSStringIteratorString();
268 
269   // Provides access to JSStringIterator::index() field.
270   static FieldAccess ForJSStringIteratorIndex();
271 
272   // Provides access to Cell::value() field.
273   static FieldAccess ForCellValue();
274 
275   // Provides access to arguments object fields.
276   static FieldAccess ForArgumentsLength();
277   static FieldAccess ForArgumentsCallee();
278 
279   // Provides access to FixedArray slots.
280   static FieldAccess ForFixedArraySlot(
281       size_t index, WriteBarrierKind write_barrier_kind = kFullWriteBarrier);
282 
283   static FieldAccess ForFeedbackVectorSlot(int index);
284 
285   // Provides access to ScopeInfo flags.
286   static FieldAccess ForScopeInfoFlags();
287 
288   // Provides access to Context slots.
289   static FieldAccess ForContextSlot(size_t index);
290 
291   // Provides access to Context slots that are known to be pointers.
292   static FieldAccess ForContextSlotKnownPointer(size_t index);
293 
294   // Provides access to WeakFixedArray elements.
295   static ElementAccess ForWeakFixedArrayElement();
296   static FieldAccess ForWeakFixedArraySlot(int index);
297 
298   // Provides access to FixedArray elements.
299   static ElementAccess ForFixedArrayElement();
300   static ElementAccess ForFixedArrayElement(
301       ElementsKind kind,
302       LoadSensitivity load_sensitivity = LoadSensitivity::kUnsafe);
303 
304   // Provides access to SloppyArgumentsElements elements.
305   static ElementAccess ForSloppyArgumentsElementsMappedEntry();
306 
307   // Provides access to stack arguments
308   static ElementAccess ForStackArgument();
309 
310   // Provides access to FixedDoubleArray elements.
311   static ElementAccess ForFixedDoubleArrayElement();
312 
313   // Provides access to EnumCache::keys() field.
314   static FieldAccess ForEnumCacheKeys();
315 
316   // Provides access to EnumCache::indices() field.
317   static FieldAccess ForEnumCacheIndices();
318 
319   // Provides access to Fixed{type}TypedArray and External{type}Array elements.
320   static ElementAccess ForTypedArrayElement(
321       ExternalArrayType type, bool is_external,
322       LoadSensitivity load_sensitivity = LoadSensitivity::kUnsafe);
323 
324   // Provides access to HashTable fields.
325   static FieldAccess ForHashTableBaseNumberOfElements();
326   static FieldAccess ForHashTableBaseNumberOfDeletedElement();
327   static FieldAccess ForHashTableBaseCapacity();
328 
329   // Provides access to OrderedHashMapOrSet fields.
330   static FieldAccess ForOrderedHashMapOrSetNextTable();
331   static FieldAccess ForOrderedHashMapOrSetNumberOfBuckets();
332   static FieldAccess ForOrderedHashMapOrSetNumberOfElements();
333   static FieldAccess ForOrderedHashMapOrSetNumberOfDeletedElements();
334 
335   // Provides access to OrderedHashMap elements.
336   static ElementAccess ForOrderedHashMapEntryValue();
337 
338   // Provides access to Dictionary fields.
339   static FieldAccess ForDictionaryNextEnumerationIndex();
340   static FieldAccess ForDictionaryObjectHashIndex();
341 
342   // Provides access to FeedbackCell fields.
343   static FieldAccess ForFeedbackCellValue();
344   static FieldAccess ForFeedbackCellInterruptBudget();
345 
346   // Provides access to a FeedbackVector fields.
347   static FieldAccess ForFeedbackVectorInvocationCount();
348   static FieldAccess ForFeedbackVectorFlags();
349   static FieldAccess ForFeedbackVectorClosureFeedbackCellArray();
350 
351  private:
352   DISALLOW_IMPLICIT_CONSTRUCTORS(AccessBuilder);
353 };
354 
355 }  // namespace compiler
356 }  // namespace internal
357 }  // namespace v8
358 
359 #endif  // V8_COMPILER_ACCESS_BUILDER_H_
360