blob: 722bbf020ee5ab12b348be5d5493a96e041b09af [file] [log] [blame]
Ben Murdochb8a8cc12014-11-26 15:28:44 +00001// 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"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +00006
7#include "src/contexts.h"
8#include "src/frames.h"
Ben Murdoch097c5b22016-05-18 11:27:45 +01009#include "src/handles-inl.h"
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000010#include "src/heap/heap.h"
11#include "src/type-cache.h"
Ben Murdochb8a8cc12014-11-26 15:28:44 +000012
13namespace v8 {
14namespace internal {
15namespace compiler {
16
17// static
18FieldAccess AccessBuilder::ForMap() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000019 FieldAccess access = {kTaggedBase, HeapObject::kMapOffset,
20 MaybeHandle<Name>(), Type::Any(),
21 MachineType::AnyTagged()};
22 return access;
23}
24
25
26// static
27FieldAccess AccessBuilder::ForHeapNumberValue() {
28 FieldAccess access = {kTaggedBase, HeapNumber::kValueOffset,
29 MaybeHandle<Name>(), TypeCache().Get().kFloat64,
30 MachineType::Float64()};
31 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000032}
33
34
35// static
36FieldAccess AccessBuilder::ForJSObjectProperties() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000037 FieldAccess access = {kTaggedBase, JSObject::kPropertiesOffset,
38 MaybeHandle<Name>(), Type::Internal(),
39 MachineType::AnyTagged()};
40 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000041}
42
43
44// static
45FieldAccess AccessBuilder::ForJSObjectElements() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000046 FieldAccess access = {kTaggedBase, JSObject::kElementsOffset,
47 MaybeHandle<Name>(), Type::Internal(),
48 MachineType::AnyTagged()};
49 return access;
50}
51
52
53// static
54FieldAccess AccessBuilder::ForJSObjectInObjectProperty(Handle<Map> map,
55 int index) {
56 int const offset = map->GetInObjectPropertyOffset(index);
57 FieldAccess access = {kTaggedBase, offset, MaybeHandle<Name>(),
58 Type::Tagged(), MachineType::AnyTagged()};
59 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000060}
61
62
63// static
64FieldAccess AccessBuilder::ForJSFunctionContext() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000065 FieldAccess access = {kTaggedBase, JSFunction::kContextOffset,
66 MaybeHandle<Name>(), Type::Internal(),
67 MachineType::AnyTagged()};
68 return access;
69}
70
71
72// static
73FieldAccess AccessBuilder::ForJSFunctionSharedFunctionInfo() {
74 FieldAccess access = {kTaggedBase, JSFunction::kSharedFunctionInfoOffset,
75 Handle<Name>(), Type::Any(), MachineType::AnyTagged()};
76 return access;
77}
78
79
80// static
81FieldAccess AccessBuilder::ForJSArrayLength(ElementsKind elements_kind) {
82 TypeCache const& type_cache = TypeCache::Get();
83 FieldAccess access = {kTaggedBase, JSArray::kLengthOffset, Handle<Name>(),
84 type_cache.kJSArrayLengthType,
85 MachineType::AnyTagged()};
86 if (IsFastDoubleElementsKind(elements_kind)) {
87 access.type = type_cache.kFixedDoubleArrayLengthType;
88 } else if (IsFastElementsKind(elements_kind)) {
89 access.type = type_cache.kFixedArrayLengthType;
90 }
91 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +000092}
93
94
95// static
96FieldAccess AccessBuilder::ForJSArrayBufferBackingStore() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +000097 FieldAccess access = {kTaggedBase, JSArrayBuffer::kBackingStoreOffset,
98 MaybeHandle<Name>(), Type::UntaggedPointer(),
99 MachineType::Pointer()};
100 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000101}
102
103
104// static
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000105FieldAccess AccessBuilder::ForJSArrayBufferBitField() {
106 FieldAccess access = {kTaggedBase, JSArrayBuffer::kBitFieldOffset,
107 MaybeHandle<Name>(), TypeCache::Get().kInt8,
108 MachineType::Int8()};
109 return access;
110}
111
112
113// static
114FieldAccess AccessBuilder::ForJSArrayBufferViewBuffer() {
115 FieldAccess access = {kTaggedBase, JSArrayBufferView::kBufferOffset,
116 MaybeHandle<Name>(), Type::TaggedPointer(),
117 MachineType::AnyTagged()};
118 return access;
119}
120
121
122// static
123FieldAccess AccessBuilder::ForJSDateField(JSDate::FieldIndex index) {
124 FieldAccess access = {
125 kTaggedBase, JSDate::kValueOffset + index * kPointerSize,
126 MaybeHandle<Name>(), Type::Number(), MachineType::AnyTagged()};
127 return access;
128}
129
130
131// static
132FieldAccess AccessBuilder::ForJSIteratorResultDone() {
133 FieldAccess access = {kTaggedBase, JSIteratorResult::kDoneOffset,
134 MaybeHandle<Name>(), Type::Any(),
135 MachineType::AnyTagged()};
136 return access;
137}
138
139
140// static
141FieldAccess AccessBuilder::ForJSIteratorResultValue() {
142 FieldAccess access = {kTaggedBase, JSIteratorResult::kValueOffset,
143 MaybeHandle<Name>(), Type::Any(),
144 MachineType::AnyTagged()};
145 return access;
146}
147
148
149// static
150FieldAccess AccessBuilder::ForJSRegExpFlags() {
151 FieldAccess access = {kTaggedBase, JSRegExp::kFlagsOffset,
152 MaybeHandle<Name>(), Type::Tagged(),
153 MachineType::AnyTagged()};
154 return access;
155}
156
157
158// static
159FieldAccess AccessBuilder::ForJSRegExpSource() {
160 FieldAccess access = {kTaggedBase, JSRegExp::kSourceOffset,
161 MaybeHandle<Name>(), Type::Tagged(),
162 MachineType::AnyTagged()};
163 return access;
164}
165
166
167// static
168FieldAccess AccessBuilder::ForFixedArrayLength() {
169 FieldAccess access = {
170 kTaggedBase, FixedArray::kLengthOffset, MaybeHandle<Name>(),
171 TypeCache::Get().kFixedArrayLengthType, MachineType::AnyTagged()};
172 return access;
173}
174
175
176// static
177FieldAccess AccessBuilder::ForDescriptorArrayEnumCache() {
178 FieldAccess access = {kTaggedBase, DescriptorArray::kEnumCacheOffset,
179 Handle<Name>(), Type::TaggedPointer(),
180 MachineType::AnyTagged()};
181 return access;
182}
183
184
185// static
186FieldAccess AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache() {
187 FieldAccess access = {
188 kTaggedBase, DescriptorArray::kEnumCacheBridgeCacheOffset, Handle<Name>(),
189 Type::TaggedPointer(), MachineType::AnyTagged()};
190 return access;
191}
192
193
194// static
195FieldAccess AccessBuilder::ForMapBitField() {
196 FieldAccess access = {kTaggedBase, Map::kBitFieldOffset, Handle<Name>(),
197 TypeCache::Get().kUint8, MachineType::Uint8()};
198 return access;
199}
200
201
202// static
203FieldAccess AccessBuilder::ForMapBitField3() {
204 FieldAccess access = {kTaggedBase, Map::kBitField3Offset, Handle<Name>(),
205 TypeCache::Get().kInt32, MachineType::Int32()};
206 return access;
207}
208
209
210// static
211FieldAccess AccessBuilder::ForMapDescriptors() {
212 FieldAccess access = {kTaggedBase, Map::kDescriptorsOffset, Handle<Name>(),
213 Type::TaggedPointer(), MachineType::AnyTagged()};
214 return access;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400215}
216
217
218// static
219FieldAccess AccessBuilder::ForMapInstanceType() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000220 FieldAccess access = {kTaggedBase, Map::kInstanceTypeOffset, Handle<Name>(),
221 TypeCache::Get().kUint8, MachineType::Uint8()};
222 return access;
223}
224
225
226// static
227FieldAccess AccessBuilder::ForMapPrototype() {
228 FieldAccess access = {kTaggedBase, Map::kPrototypeOffset, Handle<Name>(),
229 Type::TaggedPointer(), MachineType::AnyTagged()};
230 return access;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400231}
232
233
234// static
235FieldAccess AccessBuilder::ForStringLength() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000236 FieldAccess access = {kTaggedBase, String::kLengthOffset, Handle<Name>(),
237 TypeCache::Get().kStringLengthType,
238 MachineType::AnyTagged()};
239 return access;
240}
241
242
243// static
244FieldAccess AccessBuilder::ForJSGlobalObjectGlobalProxy() {
245 FieldAccess access = {kTaggedBase, JSGlobalObject::kGlobalProxyOffset,
246 Handle<Name>(), Type::Receiver(),
247 MachineType::AnyTagged()};
248 return access;
249}
250
251
252// static
253FieldAccess AccessBuilder::ForJSGlobalObjectNativeContext() {
254 FieldAccess access = {kTaggedBase, JSGlobalObject::kNativeContextOffset,
255 Handle<Name>(), Type::Internal(),
256 MachineType::AnyTagged()};
257 return access;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400258}
259
260
261// static
262FieldAccess AccessBuilder::ForValue() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000263 FieldAccess access = {kTaggedBase, JSValue::kValueOffset, Handle<Name>(),
264 Type::Any(), MachineType::AnyTagged()};
265 return access;
266}
267
268
269// static
270FieldAccess AccessBuilder::ForArgumentsLength() {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100271 FieldAccess access = {kTaggedBase, JSArgumentsObject::kLengthOffset,
272 Handle<Name>(), Type::Any(), MachineType::AnyTagged()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000273 return access;
274}
275
276
277// static
278FieldAccess AccessBuilder::ForArgumentsCallee() {
Ben Murdoch097c5b22016-05-18 11:27:45 +0100279 FieldAccess access = {kTaggedBase, JSSloppyArgumentsObject::kCalleeOffset,
280 Handle<Name>(), Type::Any(), MachineType::AnyTagged()};
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000281 return access;
282}
283
284
285// static
286FieldAccess AccessBuilder::ForFixedArraySlot(size_t index) {
287 int offset = FixedArray::OffsetOfElementAt(static_cast<int>(index));
288 FieldAccess access = {kTaggedBase, offset, Handle<Name>(), Type::Any(),
289 MachineType::AnyTagged()};
290 return access;
Emily Bernierd0a1eb72015-03-24 16:35:39 -0400291}
292
293
294// static
295FieldAccess AccessBuilder::ForContextSlot(size_t index) {
296 int offset = Context::kHeaderSize + static_cast<int>(index) * kPointerSize;
297 DCHECK_EQ(offset,
298 Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000299 FieldAccess access = {kTaggedBase, offset, Handle<Name>(), Type::Any(),
300 MachineType::AnyTagged()};
301 return access;
302}
303
304
305// static
306FieldAccess AccessBuilder::ForPropertyCellValue() {
307 return ForPropertyCellValue(Type::Tagged());
308}
309
310
311// static
312FieldAccess AccessBuilder::ForPropertyCellValue(Type* type) {
313 FieldAccess access = {kTaggedBase, PropertyCell::kValueOffset, Handle<Name>(),
314 type, MachineType::AnyTagged()};
315 return access;
316}
317
318
319// static
320FieldAccess AccessBuilder::ForSharedFunctionInfoTypeFeedbackVector() {
321 FieldAccess access = {kTaggedBase, SharedFunctionInfo::kFeedbackVectorOffset,
322 Handle<Name>(), Type::Any(), MachineType::AnyTagged()};
323 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000324}
325
326
327// static
328ElementAccess AccessBuilder::ForFixedArrayElement() {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000329 ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Tagged(),
330 MachineType::AnyTagged()};
331 return access;
332}
333
334
335// static
336ElementAccess AccessBuilder::ForFixedDoubleArrayElement() {
337 ElementAccess access = {kTaggedBase, FixedDoubleArray::kHeaderSize,
338 TypeCache::Get().kFloat64, MachineType::Float64()};
339 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000340}
341
342
343// static
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000344ElementAccess AccessBuilder::ForTypedArrayElement(ExternalArrayType type,
345 bool is_external) {
346 BaseTaggedness taggedness = is_external ? kUntaggedBase : kTaggedBase;
347 int header_size = is_external ? 0 : FixedTypedArrayBase::kDataOffset;
348 switch (type) {
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000349 case kExternalInt8Array: {
350 ElementAccess access = {taggedness, header_size, Type::Signed32(),
351 MachineType::Int8()};
352 return access;
353 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000354 case kExternalUint8Array:
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000355 case kExternalUint8ClampedArray: {
356 ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
357 MachineType::Uint8()};
358 return access;
359 }
360 case kExternalInt16Array: {
361 ElementAccess access = {taggedness, header_size, Type::Signed32(),
362 MachineType::Int16()};
363 return access;
364 }
365 case kExternalUint16Array: {
366 ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
367 MachineType::Uint16()};
368 return access;
369 }
370 case kExternalInt32Array: {
371 ElementAccess access = {taggedness, header_size, Type::Signed32(),
372 MachineType::Int32()};
373 return access;
374 }
375 case kExternalUint32Array: {
376 ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
377 MachineType::Uint32()};
378 return access;
379 }
380 case kExternalFloat32Array: {
381 ElementAccess access = {taggedness, header_size, Type::Number(),
382 MachineType::Float32()};
383 return access;
384 }
385 case kExternalFloat64Array: {
386 ElementAccess access = {taggedness, header_size, Type::Number(),
387 MachineType::Float64()};
388 return access;
389 }
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000390 }
391 UNREACHABLE();
Ben Murdoch4a90d5f2016-03-22 12:00:34 +0000392 ElementAccess access = {kUntaggedBase, 0, Type::None(), MachineType::None()};
393 return access;
394}
395
396
397// static
398FieldAccess AccessBuilder::ForStatsCounter() {
399 FieldAccess access = {kUntaggedBase, 0, MaybeHandle<Name>(),
400 TypeCache::Get().kInt32, MachineType::Int32()};
401 return access;
Ben Murdochb8a8cc12014-11-26 15:28:44 +0000402}
403
404} // namespace compiler
405} // namespace internal
406} // namespace v8