Reland of "Remove ExternalArray, derived types, and element kinds"
[platform/upstream/v8.git] / src / compiler / access-builder.cc
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 #include "src/types-inl.h"
7
8 namespace v8 {
9 namespace internal {
10 namespace compiler {
11
12 // static
13 FieldAccess AccessBuilder::ForMap() {
14   FieldAccess access = {kTaggedBase, HeapObject::kMapOffset,
15                         MaybeHandle<Name>(), Type::Any(), kMachAnyTagged};
16   return access;
17 }
18
19
20 // static
21 FieldAccess AccessBuilder::ForJSObjectProperties() {
22   FieldAccess access = {kTaggedBase, JSObject::kPropertiesOffset,
23                         MaybeHandle<Name>(), Type::Any(), kMachAnyTagged};
24   return access;
25 }
26
27
28 // static
29 FieldAccess AccessBuilder::ForJSObjectElements() {
30   FieldAccess access = {kTaggedBase, JSObject::kElementsOffset,
31                         MaybeHandle<Name>(), Type::Internal(), kMachAnyTagged};
32   return access;
33 }
34
35
36 // static
37 FieldAccess AccessBuilder::ForJSFunctionContext() {
38   FieldAccess access = {kTaggedBase, JSFunction::kContextOffset,
39                         MaybeHandle<Name>(), Type::Internal(), kMachAnyTagged};
40   return access;
41 }
42
43
44 // static
45 FieldAccess AccessBuilder::ForJSFunctionSharedFunctionInfo() {
46   FieldAccess access = {kTaggedBase, JSFunction::kSharedFunctionInfoOffset,
47                         Handle<Name>(), Type::Any(), kMachAnyTagged};
48   return access;
49 }
50
51
52 // static
53 FieldAccess AccessBuilder::ForJSArrayBufferBackingStore() {
54   FieldAccess access = {kTaggedBase, JSArrayBuffer::kBackingStoreOffset,
55                         MaybeHandle<Name>(), Type::UntaggedPointer(), kMachPtr};
56   return access;
57 }
58
59
60 // static
61 FieldAccess AccessBuilder::ForJSDateField(JSDate::FieldIndex index) {
62   FieldAccess access = {kTaggedBase,
63                         JSDate::kValueOffset + index * kPointerSize,
64                         MaybeHandle<Name>(), Type::Number(), kMachAnyTagged};
65   return access;
66 }
67
68
69 // static
70 FieldAccess AccessBuilder::ForFixedArrayLength() {
71   // TODO(turbofan): 2^30 is a valid upper limit for the FixedArray::length
72   // field, although it's not the best. If we had a Zone we could create an
73   // appropriate range type instead.
74   STATIC_ASSERT(FixedArray::kMaxLength <= 1 << 30);
75   FieldAccess access = {
76       kTaggedBase, FixedArray::kLengthOffset, MaybeHandle<Name>(),
77       Type::Intersect(Type::Unsigned30(), Type::TaggedSigned()),
78       kMachAnyTagged};
79   return access;
80 }
81
82
83 // static
84 FieldAccess AccessBuilder::ForDescriptorArrayEnumCache() {
85   FieldAccess access = {kTaggedBase, DescriptorArray::kEnumCacheOffset,
86                         Handle<Name>(), Type::TaggedPointer(), kMachAnyTagged};
87   return access;
88 }
89
90
91 // static
92 FieldAccess AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache() {
93   FieldAccess access = {kTaggedBase,
94                         DescriptorArray::kEnumCacheBridgeCacheOffset,
95                         Handle<Name>(), Type::TaggedPointer(), kMachAnyTagged};
96   return access;
97 }
98
99
100 // static
101 FieldAccess AccessBuilder::ForMapBitField3() {
102   FieldAccess access = {kTaggedBase, Map::kBitField3Offset, Handle<Name>(),
103                         Type::UntaggedUnsigned32(), kMachUint32};
104   return access;
105 }
106
107
108 // static
109 FieldAccess AccessBuilder::ForMapDescriptors() {
110   FieldAccess access = {kTaggedBase, Map::kDescriptorsOffset, Handle<Name>(),
111                         Type::TaggedPointer(), kMachAnyTagged};
112   return access;
113 }
114
115
116 // static
117 FieldAccess AccessBuilder::ForMapInstanceType() {
118   FieldAccess access = {kTaggedBase, Map::kInstanceTypeOffset, Handle<Name>(),
119                         Type::UntaggedUnsigned8(), kMachUint8};
120   return access;
121 }
122
123
124 // static
125 FieldAccess AccessBuilder::ForStringLength(Zone* zone) {
126   FieldAccess access = {
127       kTaggedBase, String::kLengthOffset, Handle<Name>(),
128       Type::Intersect(Type::Range(0, String::kMaxLength, zone),
129                       Type::TaggedSigned(), zone),
130       kMachAnyTagged};
131   return access;
132 }
133
134
135 // static
136 FieldAccess AccessBuilder::ForValue() {
137   FieldAccess access = {kTaggedBase, JSValue::kValueOffset, Handle<Name>(),
138                         Type::Any(), kMachAnyTagged};
139   return access;
140 }
141
142
143 // static
144 FieldAccess AccessBuilder::ForContextSlot(size_t index) {
145   int offset = Context::kHeaderSize + static_cast<int>(index) * kPointerSize;
146   DCHECK_EQ(offset,
147             Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag);
148   FieldAccess access = {kTaggedBase, offset, Handle<Name>(), Type::Any(),
149                         kMachAnyTagged};
150   return access;
151 }
152
153
154 // static
155 FieldAccess AccessBuilder::ForPropertyCellValue() {
156   FieldAccess access = {kTaggedBase, PropertyCell::kValueOffset, Handle<Name>(),
157                         Type::Any(), kMachAnyTagged};
158   return access;
159 }
160
161
162 // static
163 FieldAccess AccessBuilder::ForSharedFunctionInfoTypeFeedbackVector() {
164   FieldAccess access = {kTaggedBase, SharedFunctionInfo::kFeedbackVectorOffset,
165                         Handle<Name>(), Type::Any(), kMachAnyTagged};
166   return access;
167 }
168
169
170 // static
171 ElementAccess AccessBuilder::ForFixedArrayElement() {
172   ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Any(),
173                           kMachAnyTagged};
174   return access;
175 }
176
177
178 // static
179 ElementAccess AccessBuilder::ForTypedArrayElement(ExternalArrayType type,
180                                                   bool is_external) {
181   BaseTaggedness taggedness = is_external ? kUntaggedBase : kTaggedBase;
182   int header_size = is_external ? 0 : FixedTypedArrayBase::kDataOffset;
183   switch (type) {
184     case kExternalInt8Array: {
185       ElementAccess access = {taggedness, header_size, Type::Signed32(),
186                               kMachInt8};
187       return access;
188     }
189     case kExternalUint8Array:
190     case kExternalUint8ClampedArray: {
191       ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
192                               kMachUint8};
193       return access;
194     }
195     case kExternalInt16Array: {
196       ElementAccess access = {taggedness, header_size, Type::Signed32(),
197                               kMachInt16};
198       return access;
199     }
200     case kExternalUint16Array: {
201       ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
202                               kMachUint16};
203       return access;
204     }
205     case kExternalInt32Array: {
206       ElementAccess access = {taggedness, header_size, Type::Signed32(),
207                               kMachInt32};
208       return access;
209     }
210     case kExternalUint32Array: {
211       ElementAccess access = {taggedness, header_size, Type::Unsigned32(),
212                               kMachUint32};
213       return access;
214     }
215     case kExternalFloat32Array: {
216       ElementAccess access = {taggedness, header_size, Type::Number(),
217                               kMachFloat32};
218       return access;
219     }
220     case kExternalFloat64Array: {
221       ElementAccess access = {taggedness, header_size, Type::Number(),
222                               kMachFloat64};
223       return access;
224     }
225   }
226   UNREACHABLE();
227   ElementAccess access = {kUntaggedBase, 0, Type::None(), kMachNone};
228   return access;
229 }
230
231
232 // static
233 ElementAccess AccessBuilder::ForSeqStringChar(String::Encoding encoding) {
234   switch (encoding) {
235     case String::ONE_BYTE_ENCODING: {
236       ElementAccess access = {kTaggedBase, SeqString::kHeaderSize,
237                               Type::Unsigned32(), kMachUint8};
238       return access;
239     }
240     case String::TWO_BYTE_ENCODING: {
241       ElementAccess access = {kTaggedBase, SeqString::kHeaderSize,
242                               Type::Unsigned32(), kMachUint16};
243       return access;
244     }
245   }
246   UNREACHABLE();
247   ElementAccess access = {kUntaggedBase, 0, Type::None(), kMachNone};
248   return access;
249 }
250
251
252 // static
253 FieldAccess AccessBuilder::ForStatsCounter() {
254   FieldAccess access = {kUntaggedBase, 0, MaybeHandle<Name>(), Type::Signed32(),
255                         kMachInt32};
256   return access;
257 }
258
259
260 // static
261 FieldAccess AccessBuilder::ForFrameCallerFramePtr() {
262   FieldAccess access = {kUntaggedBase, StandardFrameConstants::kCallerFPOffset,
263                         MaybeHandle<Name>(), Type::Internal(), kMachPtr};
264   return access;
265 }
266
267
268 // static
269 FieldAccess AccessBuilder::ForFrameMarker() {
270   FieldAccess access = {kUntaggedBase, StandardFrameConstants::kMarkerOffset,
271                         MaybeHandle<Name>(), Type::Tagged(), kMachAnyTagged};
272   return access;
273 }
274
275 }  // namespace compiler
276 }  // namespace internal
277 }  // namespace v8