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