OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/compiler/access-builder.h" | 5 #include "src/compiler/access-builder.h" |
6 | 6 |
7 #include "src/contexts.h" | 7 #include "src/contexts.h" |
8 #include "src/frames.h" | 8 #include "src/frames.h" |
9 #include "src/handles-inl.h" | 9 #include "src/handles-inl.h" |
10 #include "src/heap/heap.h" | 10 #include "src/heap/heap.h" |
11 #include "src/type-cache.h" | 11 #include "src/type-cache.h" |
12 | 12 |
13 namespace v8 { | 13 namespace v8 { |
14 namespace internal { | 14 namespace internal { |
15 namespace compiler { | 15 namespace compiler { |
16 | 16 |
17 // static | 17 // static |
18 FieldAccess AccessBuilder::ForMap() { | 18 FieldAccess AccessBuilder::ForMap() { |
19 FieldAccess access = {kTaggedBase, HeapObject::kMapOffset, | 19 FieldAccess access = { |
20 MaybeHandle<Name>(), Type::Any(), | 20 kTaggedBase, HeapObject::kMapOffset, MaybeHandle<Name>(), |
21 MachineType::AnyTagged()}; | 21 Type::Any(), MachineType::AnyTagged(), kMapWriteBarrier}; |
22 return access; | 22 return access; |
23 } | 23 } |
24 | 24 |
25 | 25 |
26 // static | 26 // static |
27 FieldAccess AccessBuilder::ForHeapNumberValue() { | 27 FieldAccess AccessBuilder::ForHeapNumberValue() { |
28 FieldAccess access = {kTaggedBase, HeapNumber::kValueOffset, | 28 FieldAccess access = {kTaggedBase, |
29 MaybeHandle<Name>(), TypeCache::Get().kFloat64, | 29 HeapNumber::kValueOffset, |
30 MachineType::Float64()}; | 30 MaybeHandle<Name>(), |
| 31 TypeCache::Get().kFloat64, |
| 32 MachineType::Float64(), |
| 33 kNoWriteBarrier}; |
31 return access; | 34 return access; |
32 } | 35 } |
33 | 36 |
34 | 37 |
35 // static | 38 // static |
36 FieldAccess AccessBuilder::ForJSObjectProperties() { | 39 FieldAccess AccessBuilder::ForJSObjectProperties() { |
37 FieldAccess access = {kTaggedBase, JSObject::kPropertiesOffset, | 40 FieldAccess access = { |
38 MaybeHandle<Name>(), Type::Internal(), | 41 kTaggedBase, JSObject::kPropertiesOffset, MaybeHandle<Name>(), |
39 MachineType::AnyTagged()}; | 42 Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier}; |
40 return access; | 43 return access; |
41 } | 44 } |
42 | 45 |
43 | 46 |
44 // static | 47 // static |
45 FieldAccess AccessBuilder::ForJSObjectElements() { | 48 FieldAccess AccessBuilder::ForJSObjectElements() { |
46 FieldAccess access = {kTaggedBase, JSObject::kElementsOffset, | 49 FieldAccess access = { |
47 MaybeHandle<Name>(), Type::Internal(), | 50 kTaggedBase, JSObject::kElementsOffset, MaybeHandle<Name>(), |
48 MachineType::AnyTagged()}; | 51 Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier}; |
49 return access; | 52 return access; |
50 } | 53 } |
51 | 54 |
52 | 55 |
53 // static | 56 // static |
54 FieldAccess AccessBuilder::ForJSObjectInObjectProperty(Handle<Map> map, | 57 FieldAccess AccessBuilder::ForJSObjectInObjectProperty(Handle<Map> map, |
55 int index) { | 58 int index) { |
56 int const offset = map->GetInObjectPropertyOffset(index); | 59 int const offset = map->GetInObjectPropertyOffset(index); |
57 FieldAccess access = {kTaggedBase, offset, MaybeHandle<Name>(), | 60 FieldAccess access = {kTaggedBase, |
58 Type::Tagged(), MachineType::AnyTagged()}; | 61 offset, |
| 62 MaybeHandle<Name>(), |
| 63 Type::Tagged(), |
| 64 MachineType::AnyTagged(), |
| 65 kFullWriteBarrier}; |
59 return access; | 66 return access; |
60 } | 67 } |
61 | 68 |
62 | 69 |
63 // static | 70 // static |
64 FieldAccess AccessBuilder::ForJSFunctionPrototypeOrInitialMap() { | 71 FieldAccess AccessBuilder::ForJSFunctionPrototypeOrInitialMap() { |
65 FieldAccess access = {kTaggedBase, JSFunction::kPrototypeOrInitialMapOffset, | 72 FieldAccess access = {kTaggedBase, |
66 MaybeHandle<Name>(), Type::Any(), | 73 JSFunction::kPrototypeOrInitialMapOffset, |
67 MachineType::AnyTagged()}; | 74 MaybeHandle<Name>(), |
| 75 Type::Any(), |
| 76 MachineType::AnyTagged(), |
| 77 kFullWriteBarrier}; |
68 return access; | 78 return access; |
69 } | 79 } |
70 | 80 |
71 // static | 81 // static |
72 FieldAccess AccessBuilder::ForJSFunctionContext() { | 82 FieldAccess AccessBuilder::ForJSFunctionContext() { |
73 FieldAccess access = {kTaggedBase, JSFunction::kContextOffset, | 83 FieldAccess access = { |
74 MaybeHandle<Name>(), Type::Internal(), | 84 kTaggedBase, JSFunction::kContextOffset, MaybeHandle<Name>(), |
75 MachineType::AnyTagged()}; | 85 Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier}; |
76 return access; | 86 return access; |
77 } | 87 } |
78 | 88 |
79 | 89 |
80 // static | 90 // static |
81 FieldAccess AccessBuilder::ForJSFunctionSharedFunctionInfo() { | 91 FieldAccess AccessBuilder::ForJSFunctionSharedFunctionInfo() { |
82 FieldAccess access = {kTaggedBase, JSFunction::kSharedFunctionInfoOffset, | 92 FieldAccess access = {kTaggedBase, |
83 Handle<Name>(), Type::Any(), MachineType::AnyTagged()}; | 93 JSFunction::kSharedFunctionInfoOffset, |
| 94 Handle<Name>(), |
| 95 Type::Any(), |
| 96 MachineType::AnyTagged(), |
| 97 kPointerWriteBarrier}; |
84 return access; | 98 return access; |
85 } | 99 } |
86 | 100 |
87 | 101 |
88 // static | 102 // static |
89 FieldAccess AccessBuilder::ForJSFunctionLiterals() { | 103 FieldAccess AccessBuilder::ForJSFunctionLiterals() { |
90 FieldAccess access = {kTaggedBase, JSFunction::kLiteralsOffset, | 104 FieldAccess access = { |
91 Handle<Name>(), Type::Internal(), | 105 kTaggedBase, JSFunction::kLiteralsOffset, Handle<Name>(), |
92 MachineType::AnyTagged()}; | 106 Type::Internal(), MachineType::AnyTagged(), kPointerWriteBarrier}; |
93 return access; | 107 return access; |
94 } | 108 } |
95 | 109 |
96 // static | 110 // static |
97 FieldAccess AccessBuilder::ForJSFunctionCodeEntry() { | 111 FieldAccess AccessBuilder::ForJSFunctionCodeEntry() { |
98 FieldAccess access = {kTaggedBase, JSFunction::kCodeEntryOffset, | 112 FieldAccess access = {kTaggedBase, |
99 Handle<Name>(), Type::UntaggedPointer(), | 113 JSFunction::kCodeEntryOffset, |
100 MachineType::Pointer()}; | 114 Handle<Name>(), |
| 115 Type::UntaggedPointer(), |
| 116 MachineType::Pointer(), |
| 117 kNoWriteBarrier}; |
101 return access; | 118 return access; |
102 } | 119 } |
103 | 120 |
104 // static | 121 // static |
105 FieldAccess AccessBuilder::ForJSFunctionNextFunctionLink() { | 122 FieldAccess AccessBuilder::ForJSFunctionNextFunctionLink() { |
106 FieldAccess access = {kTaggedBase, JSFunction::kNextFunctionLinkOffset, | 123 FieldAccess access = {kTaggedBase, |
107 Handle<Name>(), Type::Any(), MachineType::AnyTagged()}; | 124 JSFunction::kNextFunctionLinkOffset, |
| 125 Handle<Name>(), |
| 126 Type::Any(), |
| 127 MachineType::AnyTagged(), |
| 128 kPointerWriteBarrier}; |
108 return access; | 129 return access; |
109 } | 130 } |
110 | 131 |
111 // static | 132 // static |
112 FieldAccess AccessBuilder::ForJSArrayLength(ElementsKind elements_kind) { | 133 FieldAccess AccessBuilder::ForJSArrayLength(ElementsKind elements_kind) { |
113 TypeCache const& type_cache = TypeCache::Get(); | 134 TypeCache const& type_cache = TypeCache::Get(); |
114 FieldAccess access = {kTaggedBase, JSArray::kLengthOffset, Handle<Name>(), | 135 FieldAccess access = {kTaggedBase, |
| 136 JSArray::kLengthOffset, |
| 137 Handle<Name>(), |
115 type_cache.kJSArrayLengthType, | 138 type_cache.kJSArrayLengthType, |
116 MachineType::AnyTagged()}; | 139 MachineType::AnyTagged(), |
| 140 kFullWriteBarrier}; |
117 if (IsFastDoubleElementsKind(elements_kind)) { | 141 if (IsFastDoubleElementsKind(elements_kind)) { |
118 access.type = type_cache.kFixedDoubleArrayLengthType; | 142 access.type = type_cache.kFixedDoubleArrayLengthType; |
| 143 access.write_barrier_kind = kNoWriteBarrier; |
119 } else if (IsFastElementsKind(elements_kind)) { | 144 } else if (IsFastElementsKind(elements_kind)) { |
120 access.type = type_cache.kFixedArrayLengthType; | 145 access.type = type_cache.kFixedArrayLengthType; |
| 146 access.write_barrier_kind = kNoWriteBarrier; |
121 } | 147 } |
122 return access; | 148 return access; |
123 } | 149 } |
124 | 150 |
125 | 151 |
126 // static | 152 // static |
127 FieldAccess AccessBuilder::ForJSArrayBufferBackingStore() { | 153 FieldAccess AccessBuilder::ForJSArrayBufferBackingStore() { |
128 FieldAccess access = {kTaggedBase, JSArrayBuffer::kBackingStoreOffset, | 154 FieldAccess access = {kTaggedBase, |
129 MaybeHandle<Name>(), Type::UntaggedPointer(), | 155 JSArrayBuffer::kBackingStoreOffset, |
130 MachineType::Pointer()}; | 156 MaybeHandle<Name>(), |
| 157 Type::UntaggedPointer(), |
| 158 MachineType::Pointer(), |
| 159 kNoWriteBarrier}; |
131 return access; | 160 return access; |
132 } | 161 } |
133 | 162 |
134 | 163 |
135 // static | 164 // static |
136 FieldAccess AccessBuilder::ForJSArrayBufferBitField() { | 165 FieldAccess AccessBuilder::ForJSArrayBufferBitField() { |
137 FieldAccess access = {kTaggedBase, JSArrayBuffer::kBitFieldOffset, | 166 FieldAccess access = {kTaggedBase, JSArrayBuffer::kBitFieldOffset, |
138 MaybeHandle<Name>(), TypeCache::Get().kInt8, | 167 MaybeHandle<Name>(), TypeCache::Get().kInt8, |
139 MachineType::Int8()}; | 168 MachineType::Int8(), kNoWriteBarrier}; |
140 return access; | 169 return access; |
141 } | 170 } |
142 | 171 |
143 | 172 |
144 // static | 173 // static |
145 FieldAccess AccessBuilder::ForJSArrayBufferViewBuffer() { | 174 FieldAccess AccessBuilder::ForJSArrayBufferViewBuffer() { |
146 FieldAccess access = {kTaggedBase, JSArrayBufferView::kBufferOffset, | 175 FieldAccess access = {kTaggedBase, |
147 MaybeHandle<Name>(), Type::TaggedPointer(), | 176 JSArrayBufferView::kBufferOffset, |
148 MachineType::AnyTagged()}; | 177 MaybeHandle<Name>(), |
| 178 Type::TaggedPointer(), |
| 179 MachineType::AnyTagged(), |
| 180 kPointerWriteBarrier}; |
149 return access; | 181 return access; |
150 } | 182 } |
151 | 183 |
152 | 184 |
153 // static | 185 // static |
154 FieldAccess AccessBuilder::ForJSDateField(JSDate::FieldIndex index) { | 186 FieldAccess AccessBuilder::ForJSDateField(JSDate::FieldIndex index) { |
155 FieldAccess access = { | 187 FieldAccess access = {kTaggedBase, |
156 kTaggedBase, JSDate::kValueOffset + index * kPointerSize, | 188 JSDate::kValueOffset + index * kPointerSize, |
157 MaybeHandle<Name>(), Type::Number(), MachineType::AnyTagged()}; | 189 MaybeHandle<Name>(), |
| 190 Type::Number(), |
| 191 MachineType::AnyTagged(), |
| 192 kFullWriteBarrier}; |
158 return access; | 193 return access; |
159 } | 194 } |
160 | 195 |
161 | 196 |
162 // static | 197 // static |
163 FieldAccess AccessBuilder::ForJSIteratorResultDone() { | 198 FieldAccess AccessBuilder::ForJSIteratorResultDone() { |
164 FieldAccess access = {kTaggedBase, JSIteratorResult::kDoneOffset, | 199 FieldAccess access = { |
165 MaybeHandle<Name>(), Type::Any(), | 200 kTaggedBase, JSIteratorResult::kDoneOffset, MaybeHandle<Name>(), |
166 MachineType::AnyTagged()}; | 201 Type::Any(), MachineType::AnyTagged(), kFullWriteBarrier}; |
167 return access; | 202 return access; |
168 } | 203 } |
169 | 204 |
170 | 205 |
171 // static | 206 // static |
172 FieldAccess AccessBuilder::ForJSIteratorResultValue() { | 207 FieldAccess AccessBuilder::ForJSIteratorResultValue() { |
173 FieldAccess access = {kTaggedBase, JSIteratorResult::kValueOffset, | 208 FieldAccess access = { |
174 MaybeHandle<Name>(), Type::Any(), | 209 kTaggedBase, JSIteratorResult::kValueOffset, MaybeHandle<Name>(), |
175 MachineType::AnyTagged()}; | 210 Type::Any(), MachineType::AnyTagged(), kFullWriteBarrier}; |
176 return access; | 211 return access; |
177 } | 212 } |
178 | 213 |
179 | 214 |
180 // static | 215 // static |
181 FieldAccess AccessBuilder::ForJSRegExpFlags() { | 216 FieldAccess AccessBuilder::ForJSRegExpFlags() { |
182 FieldAccess access = {kTaggedBase, JSRegExp::kFlagsOffset, | 217 FieldAccess access = { |
183 MaybeHandle<Name>(), Type::Tagged(), | 218 kTaggedBase, JSRegExp::kFlagsOffset, MaybeHandle<Name>(), |
184 MachineType::AnyTagged()}; | 219 Type::Tagged(), MachineType::AnyTagged(), kFullWriteBarrier}; |
185 return access; | 220 return access; |
186 } | 221 } |
187 | 222 |
188 | 223 |
189 // static | 224 // static |
190 FieldAccess AccessBuilder::ForJSRegExpSource() { | 225 FieldAccess AccessBuilder::ForJSRegExpSource() { |
191 FieldAccess access = {kTaggedBase, JSRegExp::kSourceOffset, | 226 FieldAccess access = { |
192 MaybeHandle<Name>(), Type::Tagged(), | 227 kTaggedBase, JSRegExp::kSourceOffset, MaybeHandle<Name>(), |
193 MachineType::AnyTagged()}; | 228 Type::Tagged(), MachineType::AnyTagged(), kFullWriteBarrier}; |
194 return access; | 229 return access; |
195 } | 230 } |
196 | 231 |
197 | 232 |
198 // static | 233 // static |
199 FieldAccess AccessBuilder::ForFixedArrayLength() { | 234 FieldAccess AccessBuilder::ForFixedArrayLength() { |
200 FieldAccess access = { | 235 FieldAccess access = {kTaggedBase, |
201 kTaggedBase, FixedArray::kLengthOffset, MaybeHandle<Name>(), | 236 FixedArray::kLengthOffset, |
202 TypeCache::Get().kFixedArrayLengthType, MachineType::AnyTagged()}; | 237 MaybeHandle<Name>(), |
| 238 TypeCache::Get().kFixedArrayLengthType, |
| 239 MachineType::AnyTagged(), |
| 240 kNoWriteBarrier}; |
203 return access; | 241 return access; |
204 } | 242 } |
205 | 243 |
206 | 244 |
207 // static | 245 // static |
208 FieldAccess AccessBuilder::ForDescriptorArrayEnumCache() { | 246 FieldAccess AccessBuilder::ForDescriptorArrayEnumCache() { |
209 FieldAccess access = {kTaggedBase, DescriptorArray::kEnumCacheOffset, | 247 FieldAccess access = {kTaggedBase, |
210 Handle<Name>(), Type::TaggedPointer(), | 248 DescriptorArray::kEnumCacheOffset, |
211 MachineType::AnyTagged()}; | 249 Handle<Name>(), |
| 250 Type::TaggedPointer(), |
| 251 MachineType::AnyTagged(), |
| 252 kPointerWriteBarrier}; |
212 return access; | 253 return access; |
213 } | 254 } |
214 | 255 |
215 | 256 |
216 // static | 257 // static |
217 FieldAccess AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache() { | 258 FieldAccess AccessBuilder::ForDescriptorArrayEnumCacheBridgeCache() { |
218 FieldAccess access = { | 259 FieldAccess access = {kTaggedBase, |
219 kTaggedBase, DescriptorArray::kEnumCacheBridgeCacheOffset, Handle<Name>(), | 260 DescriptorArray::kEnumCacheBridgeCacheOffset, |
220 Type::TaggedPointer(), MachineType::AnyTagged()}; | 261 Handle<Name>(), |
| 262 Type::TaggedPointer(), |
| 263 MachineType::AnyTagged(), |
| 264 kPointerWriteBarrier}; |
221 return access; | 265 return access; |
222 } | 266 } |
223 | 267 |
224 | 268 |
225 // static | 269 // static |
226 FieldAccess AccessBuilder::ForMapBitField() { | 270 FieldAccess AccessBuilder::ForMapBitField() { |
227 FieldAccess access = {kTaggedBase, Map::kBitFieldOffset, Handle<Name>(), | 271 FieldAccess access = {kTaggedBase, Map::kBitFieldOffset, |
228 TypeCache::Get().kUint8, MachineType::Uint8()}; | 272 Handle<Name>(), TypeCache::Get().kUint8, |
| 273 MachineType::Uint8(), kNoWriteBarrier}; |
229 return access; | 274 return access; |
230 } | 275 } |
231 | 276 |
232 | 277 |
233 // static | 278 // static |
234 FieldAccess AccessBuilder::ForMapBitField3() { | 279 FieldAccess AccessBuilder::ForMapBitField3() { |
235 FieldAccess access = {kTaggedBase, Map::kBitField3Offset, Handle<Name>(), | 280 FieldAccess access = {kTaggedBase, Map::kBitField3Offset, |
236 TypeCache::Get().kInt32, MachineType::Int32()}; | 281 Handle<Name>(), TypeCache::Get().kInt32, |
| 282 MachineType::Int32(), kNoWriteBarrier}; |
237 return access; | 283 return access; |
238 } | 284 } |
239 | 285 |
240 | 286 |
241 // static | 287 // static |
242 FieldAccess AccessBuilder::ForMapDescriptors() { | 288 FieldAccess AccessBuilder::ForMapDescriptors() { |
243 FieldAccess access = {kTaggedBase, Map::kDescriptorsOffset, Handle<Name>(), | 289 FieldAccess access = { |
244 Type::TaggedPointer(), MachineType::AnyTagged()}; | 290 kTaggedBase, Map::kDescriptorsOffset, Handle<Name>(), |
| 291 Type::TaggedPointer(), MachineType::AnyTagged(), kPointerWriteBarrier}; |
245 return access; | 292 return access; |
246 } | 293 } |
247 | 294 |
248 | 295 |
249 // static | 296 // static |
250 FieldAccess AccessBuilder::ForMapInstanceType() { | 297 FieldAccess AccessBuilder::ForMapInstanceType() { |
251 FieldAccess access = {kTaggedBase, Map::kInstanceTypeOffset, Handle<Name>(), | 298 FieldAccess access = {kTaggedBase, Map::kInstanceTypeOffset, |
252 TypeCache::Get().kUint8, MachineType::Uint8()}; | 299 Handle<Name>(), TypeCache::Get().kUint8, |
| 300 MachineType::Uint8(), kNoWriteBarrier}; |
253 return access; | 301 return access; |
254 } | 302 } |
255 | 303 |
256 | 304 |
257 // static | 305 // static |
258 FieldAccess AccessBuilder::ForMapPrototype() { | 306 FieldAccess AccessBuilder::ForMapPrototype() { |
259 FieldAccess access = {kTaggedBase, Map::kPrototypeOffset, Handle<Name>(), | 307 FieldAccess access = { |
260 Type::TaggedPointer(), MachineType::AnyTagged()}; | 308 kTaggedBase, Map::kPrototypeOffset, Handle<Name>(), |
| 309 Type::TaggedPointer(), MachineType::AnyTagged(), kPointerWriteBarrier}; |
261 return access; | 310 return access; |
262 } | 311 } |
263 | 312 |
264 | 313 |
265 // static | 314 // static |
266 FieldAccess AccessBuilder::ForStringLength() { | 315 FieldAccess AccessBuilder::ForStringLength() { |
267 FieldAccess access = {kTaggedBase, String::kLengthOffset, Handle<Name>(), | 316 FieldAccess access = {kTaggedBase, |
| 317 String::kLengthOffset, |
| 318 Handle<Name>(), |
268 TypeCache::Get().kStringLengthType, | 319 TypeCache::Get().kStringLengthType, |
269 MachineType::AnyTagged()}; | 320 MachineType::AnyTagged(), |
| 321 kNoWriteBarrier}; |
270 return access; | 322 return access; |
271 } | 323 } |
272 | 324 |
273 | 325 |
274 // static | 326 // static |
275 FieldAccess AccessBuilder::ForJSGlobalObjectGlobalProxy() { | 327 FieldAccess AccessBuilder::ForJSGlobalObjectGlobalProxy() { |
276 FieldAccess access = {kTaggedBase, JSGlobalObject::kGlobalProxyOffset, | 328 FieldAccess access = {kTaggedBase, |
277 Handle<Name>(), Type::Receiver(), | 329 JSGlobalObject::kGlobalProxyOffset, |
278 MachineType::AnyTagged()}; | 330 Handle<Name>(), |
| 331 Type::Receiver(), |
| 332 MachineType::AnyTagged(), |
| 333 kPointerWriteBarrier}; |
279 return access; | 334 return access; |
280 } | 335 } |
281 | 336 |
282 | 337 |
283 // static | 338 // static |
284 FieldAccess AccessBuilder::ForJSGlobalObjectNativeContext() { | 339 FieldAccess AccessBuilder::ForJSGlobalObjectNativeContext() { |
285 FieldAccess access = {kTaggedBase, JSGlobalObject::kNativeContextOffset, | 340 FieldAccess access = {kTaggedBase, |
286 Handle<Name>(), Type::Internal(), | 341 JSGlobalObject::kNativeContextOffset, |
287 MachineType::AnyTagged()}; | 342 Handle<Name>(), |
| 343 Type::Internal(), |
| 344 MachineType::AnyTagged(), |
| 345 kPointerWriteBarrier}; |
288 return access; | 346 return access; |
289 } | 347 } |
290 | 348 |
291 | 349 |
292 // static | 350 // static |
293 FieldAccess AccessBuilder::ForValue() { | 351 FieldAccess AccessBuilder::ForValue() { |
294 FieldAccess access = {kTaggedBase, JSValue::kValueOffset, Handle<Name>(), | 352 FieldAccess access = { |
295 Type::Any(), MachineType::AnyTagged()}; | 353 kTaggedBase, JSValue::kValueOffset, Handle<Name>(), |
| 354 Type::Any(), MachineType::AnyTagged(), kFullWriteBarrier}; |
296 return access; | 355 return access; |
297 } | 356 } |
298 | 357 |
299 | 358 |
300 // static | 359 // static |
301 FieldAccess AccessBuilder::ForArgumentsLength() { | 360 FieldAccess AccessBuilder::ForArgumentsLength() { |
302 FieldAccess access = {kTaggedBase, JSArgumentsObject::kLengthOffset, | 361 FieldAccess access = { |
303 Handle<Name>(), Type::Any(), MachineType::AnyTagged()}; | 362 kTaggedBase, JSArgumentsObject::kLengthOffset, Handle<Name>(), |
| 363 Type::Any(), MachineType::AnyTagged(), kFullWriteBarrier}; |
304 return access; | 364 return access; |
305 } | 365 } |
306 | 366 |
307 | 367 |
308 // static | 368 // static |
309 FieldAccess AccessBuilder::ForArgumentsCallee() { | 369 FieldAccess AccessBuilder::ForArgumentsCallee() { |
310 FieldAccess access = {kTaggedBase, JSSloppyArgumentsObject::kCalleeOffset, | 370 FieldAccess access = {kTaggedBase, |
311 Handle<Name>(), Type::Any(), MachineType::AnyTagged()}; | 371 JSSloppyArgumentsObject::kCalleeOffset, |
312 return access; | 372 Handle<Name>(), |
313 } | 373 Type::Any(), |
314 | 374 MachineType::AnyTagged(), |
| 375 kPointerWriteBarrier}; |
| 376 return access; |
| 377 } |
| 378 |
315 | 379 |
316 // static | 380 // static |
317 FieldAccess AccessBuilder::ForFixedArraySlot(size_t index) { | 381 FieldAccess AccessBuilder::ForFixedArraySlot(size_t index) { |
318 int offset = FixedArray::OffsetOfElementAt(static_cast<int>(index)); | 382 int offset = FixedArray::OffsetOfElementAt(static_cast<int>(index)); |
319 FieldAccess access = {kTaggedBase, offset, Handle<Name>(), Type::Any(), | 383 FieldAccess access = {kTaggedBase, |
320 MachineType::AnyTagged()}; | 384 offset, |
| 385 Handle<Name>(), |
| 386 Type::Any(), |
| 387 MachineType::AnyTagged(), |
| 388 kFullWriteBarrier}; |
321 return access; | 389 return access; |
322 } | 390 } |
323 | 391 |
324 | 392 |
325 // static | 393 // static |
326 FieldAccess AccessBuilder::ForContextSlot(size_t index) { | 394 FieldAccess AccessBuilder::ForContextSlot(size_t index) { |
327 int offset = Context::kHeaderSize + static_cast<int>(index) * kPointerSize; | 395 int offset = Context::kHeaderSize + static_cast<int>(index) * kPointerSize; |
328 DCHECK_EQ(offset, | 396 DCHECK_EQ(offset, |
329 Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag); | 397 Context::SlotOffset(static_cast<int>(index)) + kHeapObjectTag); |
330 FieldAccess access = {kTaggedBase, offset, Handle<Name>(), Type::Any(), | 398 FieldAccess access = {kTaggedBase, |
331 MachineType::AnyTagged()}; | 399 offset, |
| 400 Handle<Name>(), |
| 401 Type::Any(), |
| 402 MachineType::AnyTagged(), |
| 403 kFullWriteBarrier}; |
332 return access; | 404 return access; |
333 } | 405 } |
334 | 406 |
335 | 407 |
336 // static | 408 // static |
337 FieldAccess AccessBuilder::ForPropertyCellValue() { | 409 FieldAccess AccessBuilder::ForPropertyCellValue() { |
338 return ForPropertyCellValue(Type::Tagged()); | 410 return ForPropertyCellValue(Type::Tagged()); |
339 } | 411 } |
340 | 412 |
341 | 413 |
342 // static | 414 // static |
343 FieldAccess AccessBuilder::ForPropertyCellValue(Type* type) { | 415 FieldAccess AccessBuilder::ForPropertyCellValue(Type* type) { |
344 FieldAccess access = {kTaggedBase, PropertyCell::kValueOffset, Handle<Name>(), | 416 FieldAccess access = { |
345 type, MachineType::AnyTagged()}; | 417 kTaggedBase, PropertyCell::kValueOffset, Handle<Name>(), |
| 418 type, MachineType::AnyTagged(), kFullWriteBarrier}; |
346 return access; | 419 return access; |
347 } | 420 } |
348 | 421 |
349 | 422 |
350 // static | 423 // static |
351 FieldAccess AccessBuilder::ForSharedFunctionInfoTypeFeedbackVector() { | 424 FieldAccess AccessBuilder::ForSharedFunctionInfoTypeFeedbackVector() { |
352 FieldAccess access = {kTaggedBase, SharedFunctionInfo::kFeedbackVectorOffset, | 425 FieldAccess access = {kTaggedBase, |
353 Handle<Name>(), Type::Any(), MachineType::AnyTagged()}; | 426 SharedFunctionInfo::kFeedbackVectorOffset, |
| 427 Handle<Name>(), |
| 428 Type::Any(), |
| 429 MachineType::AnyTagged(), |
| 430 kPointerWriteBarrier}; |
354 return access; | 431 return access; |
355 } | 432 } |
356 | 433 |
357 | 434 |
358 // static | 435 // static |
359 ElementAccess AccessBuilder::ForFixedArrayElement() { | 436 ElementAccess AccessBuilder::ForFixedArrayElement() { |
360 ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Tagged(), | 437 ElementAccess access = {kTaggedBase, FixedArray::kHeaderSize, Type::Tagged(), |
361 MachineType::AnyTagged()}; | 438 MachineType::AnyTagged(), kFullWriteBarrier}; |
362 return access; | 439 return access; |
363 } | 440 } |
364 | 441 |
365 | 442 |
366 // static | 443 // static |
367 ElementAccess AccessBuilder::ForFixedDoubleArrayElement() { | 444 ElementAccess AccessBuilder::ForFixedDoubleArrayElement() { |
368 ElementAccess access = {kTaggedBase, FixedDoubleArray::kHeaderSize, | 445 ElementAccess access = {kTaggedBase, FixedDoubleArray::kHeaderSize, |
369 TypeCache::Get().kFloat64, MachineType::Float64()}; | 446 TypeCache::Get().kFloat64, MachineType::Float64(), |
| 447 kNoWriteBarrier}; |
370 return access; | 448 return access; |
371 } | 449 } |
372 | 450 |
373 | 451 |
374 // static | 452 // static |
375 ElementAccess AccessBuilder::ForTypedArrayElement(ExternalArrayType type, | 453 ElementAccess AccessBuilder::ForTypedArrayElement(ExternalArrayType type, |
376 bool is_external) { | 454 bool is_external) { |
377 BaseTaggedness taggedness = is_external ? kUntaggedBase : kTaggedBase; | 455 BaseTaggedness taggedness = is_external ? kUntaggedBase : kTaggedBase; |
378 int header_size = is_external ? 0 : FixedTypedArrayBase::kDataOffset; | 456 int header_size = is_external ? 0 : FixedTypedArrayBase::kDataOffset; |
379 switch (type) { | 457 switch (type) { |
380 case kExternalInt8Array: { | 458 case kExternalInt8Array: { |
381 ElementAccess access = {taggedness, header_size, Type::Signed32(), | 459 ElementAccess access = {taggedness, header_size, Type::Signed32(), |
382 MachineType::Int8()}; | 460 MachineType::Int8(), kNoWriteBarrier}; |
383 return access; | 461 return access; |
384 } | 462 } |
385 case kExternalUint8Array: | 463 case kExternalUint8Array: |
386 case kExternalUint8ClampedArray: { | 464 case kExternalUint8ClampedArray: { |
387 ElementAccess access = {taggedness, header_size, Type::Unsigned32(), | 465 ElementAccess access = {taggedness, header_size, Type::Unsigned32(), |
388 MachineType::Uint8()}; | 466 MachineType::Uint8(), kNoWriteBarrier}; |
389 return access; | 467 return access; |
390 } | 468 } |
391 case kExternalInt16Array: { | 469 case kExternalInt16Array: { |
392 ElementAccess access = {taggedness, header_size, Type::Signed32(), | 470 ElementAccess access = {taggedness, header_size, Type::Signed32(), |
393 MachineType::Int16()}; | 471 MachineType::Int16(), kNoWriteBarrier}; |
394 return access; | 472 return access; |
395 } | 473 } |
396 case kExternalUint16Array: { | 474 case kExternalUint16Array: { |
397 ElementAccess access = {taggedness, header_size, Type::Unsigned32(), | 475 ElementAccess access = {taggedness, header_size, Type::Unsigned32(), |
398 MachineType::Uint16()}; | 476 MachineType::Uint16(), kNoWriteBarrier}; |
399 return access; | 477 return access; |
400 } | 478 } |
401 case kExternalInt32Array: { | 479 case kExternalInt32Array: { |
402 ElementAccess access = {taggedness, header_size, Type::Signed32(), | 480 ElementAccess access = {taggedness, header_size, Type::Signed32(), |
403 MachineType::Int32()}; | 481 MachineType::Int32(), kNoWriteBarrier}; |
404 return access; | 482 return access; |
405 } | 483 } |
406 case kExternalUint32Array: { | 484 case kExternalUint32Array: { |
407 ElementAccess access = {taggedness, header_size, Type::Unsigned32(), | 485 ElementAccess access = {taggedness, header_size, Type::Unsigned32(), |
408 MachineType::Uint32()}; | 486 MachineType::Uint32(), kNoWriteBarrier}; |
409 return access; | 487 return access; |
410 } | 488 } |
411 case kExternalFloat32Array: { | 489 case kExternalFloat32Array: { |
412 ElementAccess access = {taggedness, header_size, Type::Number(), | 490 ElementAccess access = {taggedness, header_size, Type::Number(), |
413 MachineType::Float32()}; | 491 MachineType::Float32(), kNoWriteBarrier}; |
414 return access; | 492 return access; |
415 } | 493 } |
416 case kExternalFloat64Array: { | 494 case kExternalFloat64Array: { |
417 ElementAccess access = {taggedness, header_size, Type::Number(), | 495 ElementAccess access = {taggedness, header_size, Type::Number(), |
418 MachineType::Float64()}; | 496 MachineType::Float64(), kNoWriteBarrier}; |
419 return access; | 497 return access; |
420 } | 498 } |
421 } | 499 } |
422 UNREACHABLE(); | 500 UNREACHABLE(); |
423 ElementAccess access = {kUntaggedBase, 0, Type::None(), MachineType::None()}; | 501 ElementAccess access = {kUntaggedBase, 0, Type::None(), MachineType::None(), |
| 502 kNoWriteBarrier}; |
424 return access; | 503 return access; |
425 } | 504 } |
426 | 505 |
427 | |
428 // static | |
429 FieldAccess AccessBuilder::ForStatsCounter() { | |
430 FieldAccess access = {kUntaggedBase, 0, MaybeHandle<Name>(), | |
431 TypeCache::Get().kInt32, MachineType::Int32()}; | |
432 return access; | |
433 } | |
434 | |
435 } // namespace compiler | 506 } // namespace compiler |
436 } // namespace internal | 507 } // namespace internal |
437 } // namespace v8 | 508 } // namespace v8 |
OLD | NEW |