OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 17 matching lines...) Expand all Loading... |
28 #include "v8.h" | 28 #include "v8.h" |
29 | 29 |
30 #include "api.h" | 30 #include "api.h" |
31 #include "arguments.h" | 31 #include "arguments.h" |
32 #include "ast.h" | 32 #include "ast.h" |
33 #include "code-stubs.h" | 33 #include "code-stubs.h" |
34 #include "gdb-jit.h" | 34 #include "gdb-jit.h" |
35 #include "ic-inl.h" | 35 #include "ic-inl.h" |
36 #include "stub-cache.h" | 36 #include "stub-cache.h" |
37 #include "vm-state-inl.h" | 37 #include "vm-state-inl.h" |
| 38 #include "third_party/vtune/vtune-jit.h" |
38 | 39 |
39 namespace v8 { | 40 namespace v8 { |
40 namespace internal { | 41 namespace internal { |
41 | 42 |
42 // ----------------------------------------------------------------------- | 43 // ----------------------------------------------------------------------- |
43 // StubCache implementation. | 44 // StubCache implementation. |
44 | 45 |
45 | 46 |
46 StubCache::StubCache(Isolate* isolate, Zone* zone) | 47 StubCache::StubCache(Isolate* isolate, Zone* zone) |
47 : isolate_(isolate) { | 48 : isolate_(isolate) { |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
89 int secondary_offset = SecondaryOffset(primary->key, old_flags, seed); | 90 int secondary_offset = SecondaryOffset(primary->key, old_flags, seed); |
90 Entry* secondary = entry(secondary_, secondary_offset); | 91 Entry* secondary = entry(secondary_, secondary_offset); |
91 *secondary = *primary; | 92 *secondary = *primary; |
92 } | 93 } |
93 | 94 |
94 // Update primary cache. | 95 // Update primary cache. |
95 primary->key = name; | 96 primary->key = name; |
96 primary->value = code; | 97 primary->value = code; |
97 primary->map = map; | 98 primary->map = map; |
98 isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); | 99 isolate()->counters()->megamorphic_stub_cache_updates()->Increment(); |
| 100 VTUNEJIT(AddCode(name, code)); |
99 return code; | 101 return code; |
100 } | 102 } |
101 | 103 |
102 | 104 |
103 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, | 105 Handle<Code> StubCache::ComputeLoadNonexistent(Handle<String> name, |
104 Handle<JSObject> receiver) { | 106 Handle<JSObject> receiver) { |
105 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); | 107 ASSERT(receiver->IsGlobalObject() || receiver->HasFastProperties()); |
106 // If no global objects are present in the prototype chain, the load | 108 // If no global objects are present in the prototype chain, the load |
107 // nonexistent IC stub can be shared for all names for a given map | 109 // nonexistent IC stub can be shared for all names for a given map |
108 // and we use the empty string for the map cache in that case. If | 110 // and we use the empty string for the map cache in that case. If |
(...skipping 12 matching lines...) Expand all Loading... |
121 Code::Flags flags = | 123 Code::Flags flags = |
122 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT); | 124 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NONEXISTENT); |
123 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); | 125 Handle<Object> probe(receiver->map()->FindInCodeCache(*cache_name, flags)); |
124 if (probe->IsCode()) return Handle<Code>::cast(probe); | 126 if (probe->IsCode()) return Handle<Code>::cast(probe); |
125 | 127 |
126 LoadStubCompiler compiler(isolate_); | 128 LoadStubCompiler compiler(isolate_); |
127 Handle<Code> code = | 129 Handle<Code> code = |
128 compiler.CompileLoadNonexistent(cache_name, receiver, last); | 130 compiler.CompileLoadNonexistent(cache_name, receiver, last); |
129 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); | 131 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *cache_name)); |
130 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); | 132 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *cache_name, *code)); |
| 133 VTUNEJIT(AddCode(cache_name, code)); |
131 JSObject::UpdateMapCodeCache(receiver, cache_name, code); | 134 JSObject::UpdateMapCodeCache(receiver, cache_name, code); |
132 return code; | 135 return code; |
133 } | 136 } |
134 | 137 |
135 | 138 |
136 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, | 139 Handle<Code> StubCache::ComputeLoadField(Handle<String> name, |
137 Handle<JSObject> receiver, | 140 Handle<JSObject> receiver, |
138 Handle<JSObject> holder, | 141 Handle<JSObject> holder, |
139 int field_index) { | 142 int field_index) { |
140 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 143 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
141 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); | 144 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::FIELD); |
142 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 145 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
143 if (probe->IsCode()) return Handle<Code>::cast(probe); | 146 if (probe->IsCode()) return Handle<Code>::cast(probe); |
144 | 147 |
145 LoadStubCompiler compiler(isolate_); | 148 LoadStubCompiler compiler(isolate_); |
146 Handle<Code> code = | 149 Handle<Code> code = |
147 compiler.CompileLoadField(receiver, holder, field_index, name); | 150 compiler.CompileLoadField(receiver, holder, field_index, name); |
148 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 151 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
149 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 152 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 153 VTUNEJIT(AddCode(name, code)); |
150 JSObject::UpdateMapCodeCache(receiver, name, code); | 154 JSObject::UpdateMapCodeCache(receiver, name, code); |
151 return code; | 155 return code; |
152 } | 156 } |
153 | 157 |
154 | 158 |
155 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, | 159 Handle<Code> StubCache::ComputeLoadCallback(Handle<String> name, |
156 Handle<JSObject> receiver, | 160 Handle<JSObject> receiver, |
157 Handle<JSObject> holder, | 161 Handle<JSObject> holder, |
158 Handle<AccessorInfo> callback) { | 162 Handle<AccessorInfo> callback) { |
159 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); | 163 ASSERT(v8::ToCData<Address>(callback->getter()) != 0); |
160 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 164 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
161 Code::Flags flags = | 165 Code::Flags flags = |
162 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); | 166 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CALLBACKS); |
163 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 167 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
164 if (probe->IsCode()) return Handle<Code>::cast(probe); | 168 if (probe->IsCode()) return Handle<Code>::cast(probe); |
165 | 169 |
166 LoadStubCompiler compiler(isolate_); | 170 LoadStubCompiler compiler(isolate_); |
167 Handle<Code> code = | 171 Handle<Code> code = |
168 compiler.CompileLoadCallback(name, receiver, holder, callback); | 172 compiler.CompileLoadCallback(name, receiver, holder, callback); |
169 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 173 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
170 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 174 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 175 VTUNEJIT(AddCode(name, code)); |
171 JSObject::UpdateMapCodeCache(receiver, name, code); | 176 JSObject::UpdateMapCodeCache(receiver, name, code); |
172 return code; | 177 return code; |
173 } | 178 } |
174 | 179 |
175 | 180 |
176 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, | 181 Handle<Code> StubCache::ComputeLoadViaGetter(Handle<String> name, |
177 Handle<JSObject> receiver, | 182 Handle<JSObject> receiver, |
178 Handle<JSObject> holder, | 183 Handle<JSObject> holder, |
179 Handle<JSFunction> getter) { | 184 Handle<JSFunction> getter) { |
180 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 185 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
(...skipping 20 matching lines...) Expand all Loading... |
201 Code::Flags flags = | 206 Code::Flags flags = |
202 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); | 207 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::CONSTANT_FUNCTION); |
203 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 208 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
204 if (probe->IsCode()) return Handle<Code>::cast(probe); | 209 if (probe->IsCode()) return Handle<Code>::cast(probe); |
205 | 210 |
206 LoadStubCompiler compiler(isolate_); | 211 LoadStubCompiler compiler(isolate_); |
207 Handle<Code> code = | 212 Handle<Code> code = |
208 compiler.CompileLoadConstant(receiver, holder, value, name); | 213 compiler.CompileLoadConstant(receiver, holder, value, name); |
209 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 214 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
210 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 215 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 216 VTUNEJIT(AddCode(name, code)); |
211 JSObject::UpdateMapCodeCache(receiver, name, code); | 217 JSObject::UpdateMapCodeCache(receiver, name, code); |
212 return code; | 218 return code; |
213 } | 219 } |
214 | 220 |
215 | 221 |
216 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, | 222 Handle<Code> StubCache::ComputeLoadInterceptor(Handle<String> name, |
217 Handle<JSObject> receiver, | 223 Handle<JSObject> receiver, |
218 Handle<JSObject> holder) { | 224 Handle<JSObject> holder) { |
219 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 225 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
220 Code::Flags flags = | 226 Code::Flags flags = |
221 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); | 227 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::INTERCEPTOR); |
222 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 228 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
223 if (probe->IsCode()) return Handle<Code>::cast(probe); | 229 if (probe->IsCode()) return Handle<Code>::cast(probe); |
224 | 230 |
225 LoadStubCompiler compiler(isolate_); | 231 LoadStubCompiler compiler(isolate_); |
226 Handle<Code> code = | 232 Handle<Code> code = |
227 compiler.CompileLoadInterceptor(receiver, holder, name); | 233 compiler.CompileLoadInterceptor(receiver, holder, name); |
228 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 234 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
229 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 235 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 236 VTUNEJIT(AddCode(name, code)); |
230 JSObject::UpdateMapCodeCache(receiver, name, code); | 237 JSObject::UpdateMapCodeCache(receiver, name, code); |
231 return code; | 238 return code; |
232 } | 239 } |
233 | 240 |
234 | 241 |
235 Handle<Code> StubCache::ComputeLoadNormal() { | 242 Handle<Code> StubCache::ComputeLoadNormal() { |
236 return isolate_->builtins()->LoadIC_Normal(); | 243 return isolate_->builtins()->LoadIC_Normal(); |
237 } | 244 } |
238 | 245 |
239 | 246 |
240 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, | 247 Handle<Code> StubCache::ComputeLoadGlobal(Handle<String> name, |
241 Handle<JSObject> receiver, | 248 Handle<JSObject> receiver, |
242 Handle<GlobalObject> holder, | 249 Handle<GlobalObject> holder, |
243 Handle<JSGlobalPropertyCell> cell, | 250 Handle<JSGlobalPropertyCell> cell, |
244 bool is_dont_delete) { | 251 bool is_dont_delete) { |
245 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 252 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
246 Code::Flags flags = | 253 Code::Flags flags = |
247 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); | 254 Code::ComputeMonomorphicFlags(Code::LOAD_IC, Code::NORMAL); |
248 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 255 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
249 if (probe->IsCode()) return Handle<Code>::cast(probe); | 256 if (probe->IsCode()) return Handle<Code>::cast(probe); |
250 | 257 |
251 LoadStubCompiler compiler(isolate_); | 258 LoadStubCompiler compiler(isolate_); |
252 Handle<Code> code = | 259 Handle<Code> code = |
253 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); | 260 compiler.CompileLoadGlobal(receiver, holder, cell, name, is_dont_delete); |
254 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 261 PROFILE(isolate_, CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
255 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 262 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 263 VTUNEJIT(AddCode(name, code)); |
256 JSObject::UpdateMapCodeCache(receiver, name, code); | 264 JSObject::UpdateMapCodeCache(receiver, name, code); |
257 return code; | 265 return code; |
258 } | 266 } |
259 | 267 |
260 | 268 |
261 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, | 269 Handle<Code> StubCache::ComputeKeyedLoadField(Handle<String> name, |
262 Handle<JSObject> receiver, | 270 Handle<JSObject> receiver, |
263 Handle<JSObject> holder, | 271 Handle<JSObject> holder, |
264 int field_index) { | 272 int field_index) { |
265 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 273 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
266 Code::Flags flags = | 274 Code::Flags flags = |
267 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); | 275 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::FIELD); |
268 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 276 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
269 if (probe->IsCode()) return Handle<Code>::cast(probe); | 277 if (probe->IsCode()) return Handle<Code>::cast(probe); |
270 | 278 |
271 KeyedLoadStubCompiler compiler(isolate_); | 279 KeyedLoadStubCompiler compiler(isolate_); |
272 Handle<Code> code = | 280 Handle<Code> code = |
273 compiler.CompileLoadField(name, receiver, holder, field_index); | 281 compiler.CompileLoadField(name, receiver, holder, field_index); |
274 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 282 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
275 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 283 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 284 VTUNEJIT(AddCode(name, code)); |
276 JSObject::UpdateMapCodeCache(receiver, name, code); | 285 JSObject::UpdateMapCodeCache(receiver, name, code); |
277 return code; | 286 return code; |
278 } | 287 } |
279 | 288 |
280 | 289 |
281 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, | 290 Handle<Code> StubCache::ComputeKeyedLoadConstant(Handle<String> name, |
282 Handle<JSObject> receiver, | 291 Handle<JSObject> receiver, |
283 Handle<JSObject> holder, | 292 Handle<JSObject> holder, |
284 Handle<JSFunction> value) { | 293 Handle<JSFunction> value) { |
285 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 294 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
286 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, | 295 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, |
287 Code::CONSTANT_FUNCTION); | 296 Code::CONSTANT_FUNCTION); |
288 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 297 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
289 if (probe->IsCode()) return Handle<Code>::cast(probe); | 298 if (probe->IsCode()) return Handle<Code>::cast(probe); |
290 | 299 |
291 KeyedLoadStubCompiler compiler(isolate_); | 300 KeyedLoadStubCompiler compiler(isolate_); |
292 Handle<Code> code = | 301 Handle<Code> code = |
293 compiler.CompileLoadConstant(name, receiver, holder, value); | 302 compiler.CompileLoadConstant(name, receiver, holder, value); |
294 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 303 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
295 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 304 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 305 VTUNEJIT(AddCode(name, code)); |
296 JSObject::UpdateMapCodeCache(receiver, name, code); | 306 JSObject::UpdateMapCodeCache(receiver, name, code); |
297 return code; | 307 return code; |
298 } | 308 } |
299 | 309 |
300 | 310 |
301 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, | 311 Handle<Code> StubCache::ComputeKeyedLoadInterceptor(Handle<String> name, |
302 Handle<JSObject> receiver, | 312 Handle<JSObject> receiver, |
303 Handle<JSObject> holder) { | 313 Handle<JSObject> holder) { |
304 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 314 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
305 Code::Flags flags = | 315 Code::Flags flags = |
306 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); | 316 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::INTERCEPTOR); |
307 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 317 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
308 if (probe->IsCode()) return Handle<Code>::cast(probe); | 318 if (probe->IsCode()) return Handle<Code>::cast(probe); |
309 | 319 |
310 KeyedLoadStubCompiler compiler(isolate_); | 320 KeyedLoadStubCompiler compiler(isolate_); |
311 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); | 321 Handle<Code> code = compiler.CompileLoadInterceptor(receiver, holder, name); |
312 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 322 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
313 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 323 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 324 VTUNEJIT(AddCode(name, code)); |
314 JSObject::UpdateMapCodeCache(receiver, name, code); | 325 JSObject::UpdateMapCodeCache(receiver, name, code); |
315 return code; | 326 return code; |
316 } | 327 } |
317 | 328 |
318 | 329 |
319 Handle<Code> StubCache::ComputeKeyedLoadCallback( | 330 Handle<Code> StubCache::ComputeKeyedLoadCallback( |
320 Handle<String> name, | 331 Handle<String> name, |
321 Handle<JSObject> receiver, | 332 Handle<JSObject> receiver, |
322 Handle<JSObject> holder, | 333 Handle<JSObject> holder, |
323 Handle<AccessorInfo> callback) { | 334 Handle<AccessorInfo> callback) { |
324 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); | 335 ASSERT(IC::GetCodeCacheForObject(*receiver, *holder) == OWN_MAP); |
325 Code::Flags flags = | 336 Code::Flags flags = |
326 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 337 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
327 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 338 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
328 if (probe->IsCode()) return Handle<Code>::cast(probe); | 339 if (probe->IsCode()) return Handle<Code>::cast(probe); |
329 | 340 |
330 KeyedLoadStubCompiler compiler(isolate_); | 341 KeyedLoadStubCompiler compiler(isolate_); |
331 Handle<Code> code = | 342 Handle<Code> code = |
332 compiler.CompileLoadCallback(name, receiver, holder, callback); | 343 compiler.CompileLoadCallback(name, receiver, holder, callback); |
333 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 344 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
334 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 345 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 346 VTUNEJIT(AddCode(name, code)); |
335 JSObject::UpdateMapCodeCache(receiver, name, code); | 347 JSObject::UpdateMapCodeCache(receiver, name, code); |
336 return code; | 348 return code; |
337 } | 349 } |
338 | 350 |
339 | 351 |
340 Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, | 352 Handle<Code> StubCache::ComputeKeyedLoadArrayLength(Handle<String> name, |
341 Handle<JSArray> receiver) { | 353 Handle<JSArray> receiver) { |
342 Code::Flags flags = | 354 Code::Flags flags = |
343 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 355 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
344 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 356 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
345 if (probe->IsCode()) return Handle<Code>::cast(probe); | 357 if (probe->IsCode()) return Handle<Code>::cast(probe); |
346 | 358 |
347 KeyedLoadStubCompiler compiler(isolate_); | 359 KeyedLoadStubCompiler compiler(isolate_); |
348 Handle<Code> code = compiler.CompileLoadArrayLength(name); | 360 Handle<Code> code = compiler.CompileLoadArrayLength(name); |
349 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 361 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
350 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 362 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 363 VTUNEJIT(AddCode(name, code)); |
351 JSObject::UpdateMapCodeCache(receiver, name, code); | 364 JSObject::UpdateMapCodeCache(receiver, name, code); |
352 return code; | 365 return code; |
353 } | 366 } |
354 | 367 |
355 | 368 |
356 Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, | 369 Handle<Code> StubCache::ComputeKeyedLoadStringLength(Handle<String> name, |
357 Handle<String> receiver) { | 370 Handle<String> receiver) { |
358 Code::Flags flags = | 371 Code::Flags flags = |
359 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 372 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
360 Handle<Map> map(receiver->map()); | 373 Handle<Map> map(receiver->map()); |
361 Handle<Object> probe(map->FindInCodeCache(*name, flags)); | 374 Handle<Object> probe(map->FindInCodeCache(*name, flags)); |
362 if (probe->IsCode()) return Handle<Code>::cast(probe); | 375 if (probe->IsCode()) return Handle<Code>::cast(probe); |
363 | 376 |
364 KeyedLoadStubCompiler compiler(isolate_); | 377 KeyedLoadStubCompiler compiler(isolate_); |
365 Handle<Code> code = compiler.CompileLoadStringLength(name); | 378 Handle<Code> code = compiler.CompileLoadStringLength(name); |
366 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 379 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
367 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 380 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 381 VTUNEJIT(AddCode(name, code)); |
368 Map::UpdateCodeCache(map, name, code); | 382 Map::UpdateCodeCache(map, name, code); |
369 return code; | 383 return code; |
370 } | 384 } |
371 | 385 |
372 | 386 |
373 Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( | 387 Handle<Code> StubCache::ComputeKeyedLoadFunctionPrototype( |
374 Handle<String> name, | 388 Handle<String> name, |
375 Handle<JSFunction> receiver) { | 389 Handle<JSFunction> receiver) { |
376 Code::Flags flags = | 390 Code::Flags flags = |
377 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); | 391 Code::ComputeMonomorphicFlags(Code::KEYED_LOAD_IC, Code::CALLBACKS); |
378 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 392 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
379 if (probe->IsCode()) return Handle<Code>::cast(probe); | 393 if (probe->IsCode()) return Handle<Code>::cast(probe); |
380 | 394 |
381 KeyedLoadStubCompiler compiler(isolate_); | 395 KeyedLoadStubCompiler compiler(isolate_); |
382 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); | 396 Handle<Code> code = compiler.CompileLoadFunctionPrototype(name); |
383 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 397 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
384 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); | 398 GDBJIT(AddCode(GDBJITInterface::KEYED_LOAD_IC, *name, *code)); |
| 399 VTUNEJIT(AddCode(name, code)); |
385 JSObject::UpdateMapCodeCache(receiver, name, code); | 400 JSObject::UpdateMapCodeCache(receiver, name, code); |
386 return code; | 401 return code; |
387 } | 402 } |
388 | 403 |
389 | 404 |
390 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, | 405 Handle<Code> StubCache::ComputeStoreField(Handle<String> name, |
391 Handle<JSObject> receiver, | 406 Handle<JSObject> receiver, |
392 int field_index, | 407 int field_index, |
393 Handle<Map> transition, | 408 Handle<Map> transition, |
394 StrictModeFlag strict_mode) { | 409 StrictModeFlag strict_mode) { |
395 Code::StubType type = | 410 Code::StubType type = |
396 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; | 411 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
397 Code::Flags flags = Code::ComputeMonomorphicFlags( | 412 Code::Flags flags = Code::ComputeMonomorphicFlags( |
398 Code::STORE_IC, type, strict_mode); | 413 Code::STORE_IC, type, strict_mode); |
399 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 414 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
400 if (probe->IsCode()) return Handle<Code>::cast(probe); | 415 if (probe->IsCode()) return Handle<Code>::cast(probe); |
401 | 416 |
402 StoreStubCompiler compiler(isolate_, strict_mode); | 417 StoreStubCompiler compiler(isolate_, strict_mode); |
403 Handle<Code> code = | 418 Handle<Code> code = |
404 compiler.CompileStoreField(receiver, field_index, transition, name); | 419 compiler.CompileStoreField(receiver, field_index, transition, name); |
405 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 420 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
406 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 421 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 422 VTUNEJIT(AddCode(name, code)); |
407 JSObject::UpdateMapCodeCache(receiver, name, code); | 423 JSObject::UpdateMapCodeCache(receiver, name, code); |
408 return code; | 424 return code; |
409 } | 425 } |
410 | 426 |
411 | 427 |
412 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( | 428 Handle<Code> StubCache::ComputeKeyedLoadOrStoreElement( |
413 Handle<Map> receiver_map, | 429 Handle<Map> receiver_map, |
414 KeyedIC::StubKind stub_kind, | 430 KeyedIC::StubKind stub_kind, |
415 StrictModeFlag strict_mode) { | 431 StrictModeFlag strict_mode) { |
416 KeyedAccessGrowMode grow_mode = | 432 KeyedAccessGrowMode grow_mode = |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
465 break; | 481 break; |
466 } | 482 } |
467 | 483 |
468 ASSERT(!code.is_null()); | 484 ASSERT(!code.is_null()); |
469 | 485 |
470 if (stub_kind == KeyedIC::LOAD) { | 486 if (stub_kind == KeyedIC::LOAD) { |
471 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); | 487 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, 0)); |
472 } else { | 488 } else { |
473 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, 0)); | 489 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, 0)); |
474 } | 490 } |
| 491 VTUNEJIT(AddCode("Keyed_STR/LD_IC", code)); |
475 Map::UpdateCodeCache(receiver_map, name, code); | 492 Map::UpdateCodeCache(receiver_map, name, code); |
476 return code; | 493 return code; |
477 } | 494 } |
478 | 495 |
479 | 496 |
480 Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { | 497 Handle<Code> StubCache::ComputeStoreNormal(StrictModeFlag strict_mode) { |
481 return (strict_mode == kStrictMode) | 498 return (strict_mode == kStrictMode) |
482 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() | 499 ? isolate_->builtins()->Builtins::StoreIC_Normal_Strict() |
483 : isolate_->builtins()->Builtins::StoreIC_Normal(); | 500 : isolate_->builtins()->Builtins::StoreIC_Normal(); |
484 } | 501 } |
485 | 502 |
486 | 503 |
487 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, | 504 Handle<Code> StubCache::ComputeStoreGlobal(Handle<String> name, |
488 Handle<GlobalObject> receiver, | 505 Handle<GlobalObject> receiver, |
489 Handle<JSGlobalPropertyCell> cell, | 506 Handle<JSGlobalPropertyCell> cell, |
490 StrictModeFlag strict_mode) { | 507 StrictModeFlag strict_mode) { |
491 Code::Flags flags = Code::ComputeMonomorphicFlags( | 508 Code::Flags flags = Code::ComputeMonomorphicFlags( |
492 Code::STORE_IC, Code::NORMAL, strict_mode); | 509 Code::STORE_IC, Code::NORMAL, strict_mode); |
493 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 510 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
494 if (probe->IsCode()) return Handle<Code>::cast(probe); | 511 if (probe->IsCode()) return Handle<Code>::cast(probe); |
495 | 512 |
496 StoreStubCompiler compiler(isolate_, strict_mode); | 513 StoreStubCompiler compiler(isolate_, strict_mode); |
497 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); | 514 Handle<Code> code = compiler.CompileStoreGlobal(receiver, cell, name); |
498 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 515 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
499 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 516 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 517 VTUNEJIT(AddCode(name, code)); |
500 JSObject::UpdateMapCodeCache(receiver, name, code); | 518 JSObject::UpdateMapCodeCache(receiver, name, code); |
501 return code; | 519 return code; |
502 } | 520 } |
503 | 521 |
504 | 522 |
505 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, | 523 Handle<Code> StubCache::ComputeStoreCallback(Handle<String> name, |
506 Handle<JSObject> receiver, | 524 Handle<JSObject> receiver, |
507 Handle<AccessorInfo> callback, | 525 Handle<AccessorInfo> callback, |
508 StrictModeFlag strict_mode) { | 526 StrictModeFlag strict_mode) { |
509 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); | 527 ASSERT(v8::ToCData<Address>(callback->setter()) != 0); |
510 Code::Flags flags = Code::ComputeMonomorphicFlags( | 528 Code::Flags flags = Code::ComputeMonomorphicFlags( |
511 Code::STORE_IC, Code::CALLBACKS, strict_mode); | 529 Code::STORE_IC, Code::CALLBACKS, strict_mode); |
512 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 530 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
513 if (probe->IsCode()) return Handle<Code>::cast(probe); | 531 if (probe->IsCode()) return Handle<Code>::cast(probe); |
514 | 532 |
515 StoreStubCompiler compiler(isolate_, strict_mode); | 533 StoreStubCompiler compiler(isolate_, strict_mode); |
516 Handle<Code> code = compiler.CompileStoreCallback(receiver, callback, name); | 534 Handle<Code> code = compiler.CompileStoreCallback(receiver, callback, name); |
517 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 535 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
518 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 536 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 537 VTUNEJIT(AddCode(name, code)); |
519 JSObject::UpdateMapCodeCache(receiver, name, code); | 538 JSObject::UpdateMapCodeCache(receiver, name, code); |
520 return code; | 539 return code; |
521 } | 540 } |
522 | 541 |
523 | 542 |
524 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, | 543 Handle<Code> StubCache::ComputeStoreViaSetter(Handle<String> name, |
525 Handle<JSObject> receiver, | 544 Handle<JSObject> receiver, |
526 Handle<JSObject> holder, | 545 Handle<JSObject> holder, |
527 Handle<JSFunction> setter, | 546 Handle<JSFunction> setter, |
528 StrictModeFlag strict_mode) { | 547 StrictModeFlag strict_mode) { |
(...skipping 17 matching lines...) Expand all Loading... |
546 StrictModeFlag strict_mode) { | 565 StrictModeFlag strict_mode) { |
547 Code::Flags flags = Code::ComputeMonomorphicFlags( | 566 Code::Flags flags = Code::ComputeMonomorphicFlags( |
548 Code::STORE_IC, Code::INTERCEPTOR, strict_mode); | 567 Code::STORE_IC, Code::INTERCEPTOR, strict_mode); |
549 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 568 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
550 if (probe->IsCode()) return Handle<Code>::cast(probe); | 569 if (probe->IsCode()) return Handle<Code>::cast(probe); |
551 | 570 |
552 StoreStubCompiler compiler(isolate_, strict_mode); | 571 StoreStubCompiler compiler(isolate_, strict_mode); |
553 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); | 572 Handle<Code> code = compiler.CompileStoreInterceptor(receiver, name); |
554 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 573 PROFILE(isolate_, CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
555 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 574 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 575 VTUNEJIT(AddCode(name, code)); |
556 JSObject::UpdateMapCodeCache(receiver, name, code); | 576 JSObject::UpdateMapCodeCache(receiver, name, code); |
557 return code; | 577 return code; |
558 } | 578 } |
559 | 579 |
560 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, | 580 Handle<Code> StubCache::ComputeKeyedStoreField(Handle<String> name, |
561 Handle<JSObject> receiver, | 581 Handle<JSObject> receiver, |
562 int field_index, | 582 int field_index, |
563 Handle<Map> transition, | 583 Handle<Map> transition, |
564 StrictModeFlag strict_mode) { | 584 StrictModeFlag strict_mode) { |
565 Code::StubType type = | 585 Code::StubType type = |
566 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; | 586 (transition.is_null()) ? Code::FIELD : Code::MAP_TRANSITION; |
567 Code::Flags flags = Code::ComputeMonomorphicFlags( | 587 Code::Flags flags = Code::ComputeMonomorphicFlags( |
568 Code::KEYED_STORE_IC, type, strict_mode); | 588 Code::KEYED_STORE_IC, type, strict_mode); |
569 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); | 589 Handle<Object> probe(receiver->map()->FindInCodeCache(*name, flags)); |
570 if (probe->IsCode()) return Handle<Code>::cast(probe); | 590 if (probe->IsCode()) return Handle<Code>::cast(probe); |
571 | 591 |
572 KeyedStoreStubCompiler compiler(isolate(), strict_mode, | 592 KeyedStoreStubCompiler compiler(isolate(), strict_mode, |
573 DO_NOT_ALLOW_JSARRAY_GROWTH); | 593 DO_NOT_ALLOW_JSARRAY_GROWTH); |
574 Handle<Code> code = | 594 Handle<Code> code = |
575 compiler.CompileStoreField(receiver, field_index, transition, name); | 595 compiler.CompileStoreField(receiver, field_index, transition, name); |
576 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); | 596 PROFILE(isolate_, CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
577 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); | 597 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
| 598 VTUNEJIT(AddCode(name, code)); |
578 JSObject::UpdateMapCodeCache(receiver, name, code); | 599 JSObject::UpdateMapCodeCache(receiver, name, code); |
579 return code; | 600 return code; |
580 } | 601 } |
581 | 602 |
582 | 603 |
583 #define CALL_LOGGER_TAG(kind, type) \ | 604 #define CALL_LOGGER_TAG(kind, type) \ |
584 (kind == Code::CALL_IC ? Logger::type : Logger::KEYED_##type) | 605 (kind == Code::CALL_IC ? Logger::type : Logger::KEYED_##type) |
585 | 606 |
586 Handle<Code> StubCache::ComputeCallConstant(int argc, | 607 Handle<Code> StubCache::ComputeCallConstant(int argc, |
587 Code::Kind kind, | 608 Code::Kind kind, |
(...skipping 24 matching lines...) Expand all Loading... |
612 if (probe->IsCode()) return Handle<Code>::cast(probe); | 633 if (probe->IsCode()) return Handle<Code>::cast(probe); |
613 | 634 |
614 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 635 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
615 Handle<Code> code = | 636 Handle<Code> code = |
616 compiler.CompileCallConstant(object, holder, function, name, check); | 637 compiler.CompileCallConstant(object, holder, function, name, check); |
617 code->set_check_type(check); | 638 code->set_check_type(check); |
618 ASSERT_EQ(flags, code->flags()); | 639 ASSERT_EQ(flags, code->flags()); |
619 PROFILE(isolate_, | 640 PROFILE(isolate_, |
620 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 641 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
621 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 642 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 643 VTUNEJIT(AddCode(name, code)); |
622 JSObject::UpdateMapCodeCache(map_holder, name, code); | 644 JSObject::UpdateMapCodeCache(map_holder, name, code); |
623 return code; | 645 return code; |
624 } | 646 } |
625 | 647 |
626 | 648 |
627 Handle<Code> StubCache::ComputeCallField(int argc, | 649 Handle<Code> StubCache::ComputeCallField(int argc, |
628 Code::Kind kind, | 650 Code::Kind kind, |
629 Code::ExtraICState extra_state, | 651 Code::ExtraICState extra_state, |
630 Handle<String> name, | 652 Handle<String> name, |
631 Handle<Object> object, | 653 Handle<Object> object, |
(...skipping 18 matching lines...) Expand all Loading... |
650 if (probe->IsCode()) return Handle<Code>::cast(probe); | 672 if (probe->IsCode()) return Handle<Code>::cast(probe); |
651 | 673 |
652 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); | 674 CallStubCompiler compiler(isolate_, argc, kind, extra_state, cache_holder); |
653 Handle<Code> code = | 675 Handle<Code> code = |
654 compiler.CompileCallField(Handle<JSObject>::cast(object), | 676 compiler.CompileCallField(Handle<JSObject>::cast(object), |
655 holder, index, name); | 677 holder, index, name); |
656 ASSERT_EQ(flags, code->flags()); | 678 ASSERT_EQ(flags, code->flags()); |
657 PROFILE(isolate_, | 679 PROFILE(isolate_, |
658 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 680 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
659 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 681 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 682 VTUNEJIT(AddCode(name, code)); |
660 JSObject::UpdateMapCodeCache(map_holder, name, code); | 683 JSObject::UpdateMapCodeCache(map_holder, name, code); |
661 return code; | 684 return code; |
662 } | 685 } |
663 | 686 |
664 | 687 |
665 Handle<Code> StubCache::ComputeCallInterceptor(int argc, | 688 Handle<Code> StubCache::ComputeCallInterceptor(int argc, |
666 Code::Kind kind, | 689 Code::Kind kind, |
667 Code::ExtraICState extra_state, | 690 Code::ExtraICState extra_state, |
668 Handle<String> name, | 691 Handle<String> name, |
669 Handle<Object> object, | 692 Handle<Object> object, |
(...skipping 17 matching lines...) Expand all Loading... |
687 if (probe->IsCode()) return Handle<Code>::cast(probe); | 710 if (probe->IsCode()) return Handle<Code>::cast(probe); |
688 | 711 |
689 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 712 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
690 Handle<Code> code = | 713 Handle<Code> code = |
691 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), | 714 compiler.CompileCallInterceptor(Handle<JSObject>::cast(object), |
692 holder, name); | 715 holder, name); |
693 ASSERT_EQ(flags, code->flags()); | 716 ASSERT_EQ(flags, code->flags()); |
694 PROFILE(isolate(), | 717 PROFILE(isolate(), |
695 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 718 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
696 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 719 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 720 VTUNEJIT(AddCode(name, code)); |
697 JSObject::UpdateMapCodeCache(map_holder, name, code); | 721 JSObject::UpdateMapCodeCache(map_holder, name, code); |
698 return code; | 722 return code; |
699 } | 723 } |
700 | 724 |
701 | 725 |
702 Handle<Code> StubCache::ComputeCallGlobal(int argc, | 726 Handle<Code> StubCache::ComputeCallGlobal(int argc, |
703 Code::Kind kind, | 727 Code::Kind kind, |
704 Code::ExtraICState extra_state, | 728 Code::ExtraICState extra_state, |
705 Handle<String> name, | 729 Handle<String> name, |
706 Handle<JSObject> receiver, | 730 Handle<JSObject> receiver, |
707 Handle<GlobalObject> holder, | 731 Handle<GlobalObject> holder, |
708 Handle<JSGlobalPropertyCell> cell, | 732 Handle<JSGlobalPropertyCell> cell, |
709 Handle<JSFunction> function) { | 733 Handle<JSFunction> function) { |
710 InlineCacheHolderFlag cache_holder = | 734 InlineCacheHolderFlag cache_holder = |
711 IC::GetCodeCacheForObject(*receiver, *holder); | 735 IC::GetCodeCacheForObject(*receiver, *holder); |
712 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); | 736 Handle<JSObject> map_holder(IC::GetCodeCacheHolder(*receiver, cache_holder)); |
713 Code::Flags flags = | 737 Code::Flags flags = |
714 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, | 738 Code::ComputeMonomorphicFlags(kind, Code::NORMAL, extra_state, |
715 cache_holder, argc); | 739 cache_holder, argc); |
716 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); | 740 Handle<Object> probe(map_holder->map()->FindInCodeCache(*name, flags)); |
717 if (probe->IsCode()) return Handle<Code>::cast(probe); | 741 if (probe->IsCode()) return Handle<Code>::cast(probe); |
718 | 742 |
719 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); | 743 CallStubCompiler compiler(isolate(), argc, kind, extra_state, cache_holder); |
720 Handle<Code> code = | 744 Handle<Code> code = |
721 compiler.CompileCallGlobal(receiver, holder, cell, function, name); | 745 compiler.CompileCallGlobal(receiver, holder, cell, function, name); |
722 ASSERT_EQ(flags, code->flags()); | 746 ASSERT_EQ(flags, code->flags()); |
723 PROFILE(isolate(), | 747 PROFILE(isolate(), |
724 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); | 748 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_IC_TAG), *code, *name)); |
725 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); | 749 GDBJIT(AddCode(GDBJITInterface::CALL_IC, *name, *code)); |
| 750 VTUNEJIT(AddCode(name, code)); |
726 JSObject::UpdateMapCodeCache(map_holder, name, code); | 751 JSObject::UpdateMapCodeCache(map_holder, name, code); |
727 return code; | 752 return code; |
728 } | 753 } |
729 | 754 |
730 | 755 |
731 static void FillCache(Isolate* isolate, Handle<Code> code) { | 756 static void FillCache(Isolate* isolate, Handle<Code> code) { |
732 Handle<UnseededNumberDictionary> dictionary = | 757 Handle<UnseededNumberDictionary> dictionary = |
733 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), | 758 UnseededNumberDictionary::Set(isolate->factory()->non_monomorphic_cache(), |
734 code->flags(), | 759 code->flags(), |
735 code); | 760 code); |
(...skipping 460 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1196 CallIC::GenerateInitialize(masm(), argc, extra_state); | 1221 CallIC::GenerateInitialize(masm(), argc, extra_state); |
1197 } else { | 1222 } else { |
1198 KeyedCallIC::GenerateInitialize(masm(), argc); | 1223 KeyedCallIC::GenerateInitialize(masm(), argc); |
1199 } | 1224 } |
1200 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallInitialize"); | 1225 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallInitialize"); |
1201 isolate()->counters()->call_initialize_stubs()->Increment(); | 1226 isolate()->counters()->call_initialize_stubs()->Increment(); |
1202 PROFILE(isolate(), | 1227 PROFILE(isolate(), |
1203 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), | 1228 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_INITIALIZE_TAG), |
1204 *code, code->arguments_count())); | 1229 *code, code->arguments_count())); |
1205 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, *code)); | 1230 GDBJIT(AddCode(GDBJITInterface::CALL_INITIALIZE, *code)); |
| 1231 VTUNEJIT(AddCode("CALL_INITIALIZE", code)); |
1206 return code; | 1232 return code; |
1207 } | 1233 } |
1208 | 1234 |
1209 | 1235 |
1210 Handle<Code> StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { | 1236 Handle<Code> StubCompiler::CompileCallPreMonomorphic(Code::Flags flags) { |
1211 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1237 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1212 // The code of the PreMonomorphic stub is the same as the code | 1238 // The code of the PreMonomorphic stub is the same as the code |
1213 // of the Initialized stub. They just differ on the code object flags. | 1239 // of the Initialized stub. They just differ on the code object flags. |
1214 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1240 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1215 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); | 1241 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); |
1216 if (kind == Code::CALL_IC) { | 1242 if (kind == Code::CALL_IC) { |
1217 CallIC::GenerateInitialize(masm(), argc, extra_state); | 1243 CallIC::GenerateInitialize(masm(), argc, extra_state); |
1218 } else { | 1244 } else { |
1219 KeyedCallIC::GenerateInitialize(masm(), argc); | 1245 KeyedCallIC::GenerateInitialize(masm(), argc); |
1220 } | 1246 } |
1221 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); | 1247 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallPreMonomorphic"); |
1222 isolate()->counters()->call_premonomorphic_stubs()->Increment(); | 1248 isolate()->counters()->call_premonomorphic_stubs()->Increment(); |
1223 PROFILE(isolate(), | 1249 PROFILE(isolate(), |
1224 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), | 1250 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_PRE_MONOMORPHIC_TAG), |
1225 *code, code->arguments_count())); | 1251 *code, code->arguments_count())); |
1226 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, *code)); | 1252 GDBJIT(AddCode(GDBJITInterface::CALL_PRE_MONOMORPHIC, *code)); |
| 1253 VTUNEJIT(AddCode("CALL_PRE_MONOMORPHIC", code)); |
1227 return code; | 1254 return code; |
1228 } | 1255 } |
1229 | 1256 |
1230 | 1257 |
1231 Handle<Code> StubCompiler::CompileCallNormal(Code::Flags flags) { | 1258 Handle<Code> StubCompiler::CompileCallNormal(Code::Flags flags) { |
1232 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1259 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1233 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1260 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1234 if (kind == Code::CALL_IC) { | 1261 if (kind == Code::CALL_IC) { |
1235 // Call normal is always with a explict receiver. | 1262 // Call normal is always with a explict receiver. |
1236 ASSERT(!CallIC::Contextual::decode( | 1263 ASSERT(!CallIC::Contextual::decode( |
1237 Code::ExtractExtraICStateFromFlags(flags))); | 1264 Code::ExtractExtraICStateFromFlags(flags))); |
1238 CallIC::GenerateNormal(masm(), argc); | 1265 CallIC::GenerateNormal(masm(), argc); |
1239 } else { | 1266 } else { |
1240 KeyedCallIC::GenerateNormal(masm(), argc); | 1267 KeyedCallIC::GenerateNormal(masm(), argc); |
1241 } | 1268 } |
1242 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallNormal"); | 1269 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallNormal"); |
1243 isolate()->counters()->call_normal_stubs()->Increment(); | 1270 isolate()->counters()->call_normal_stubs()->Increment(); |
1244 PROFILE(isolate(), | 1271 PROFILE(isolate(), |
1245 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), | 1272 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_NORMAL_TAG), |
1246 *code, code->arguments_count())); | 1273 *code, code->arguments_count())); |
1247 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, *code)); | 1274 GDBJIT(AddCode(GDBJITInterface::CALL_NORMAL, *code)); |
| 1275 VTUNEJIT(AddCode("CALL_NORMAL", code)); |
1248 return code; | 1276 return code; |
1249 } | 1277 } |
1250 | 1278 |
1251 | 1279 |
1252 Handle<Code> StubCompiler::CompileCallMegamorphic(Code::Flags flags) { | 1280 Handle<Code> StubCompiler::CompileCallMegamorphic(Code::Flags flags) { |
1253 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1281 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1254 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1282 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1255 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); | 1283 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); |
1256 if (kind == Code::CALL_IC) { | 1284 if (kind == Code::CALL_IC) { |
1257 CallIC::GenerateMegamorphic(masm(), argc, extra_state); | 1285 CallIC::GenerateMegamorphic(masm(), argc, extra_state); |
1258 } else { | 1286 } else { |
1259 KeyedCallIC::GenerateMegamorphic(masm(), argc); | 1287 KeyedCallIC::GenerateMegamorphic(masm(), argc); |
1260 } | 1288 } |
1261 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMegamorphic"); | 1289 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMegamorphic"); |
1262 isolate()->counters()->call_megamorphic_stubs()->Increment(); | 1290 isolate()->counters()->call_megamorphic_stubs()->Increment(); |
1263 PROFILE(isolate(), | 1291 PROFILE(isolate(), |
1264 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), | 1292 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MEGAMORPHIC_TAG), |
1265 *code, code->arguments_count())); | 1293 *code, code->arguments_count())); |
1266 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); | 1294 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); |
| 1295 VTUNEJIT(AddCode("CALL_MEGAMORPHIC", code)); |
1267 return code; | 1296 return code; |
1268 } | 1297 } |
1269 | 1298 |
1270 | 1299 |
1271 Handle<Code> StubCompiler::CompileCallArguments(Code::Flags flags) { | 1300 Handle<Code> StubCompiler::CompileCallArguments(Code::Flags flags) { |
1272 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1301 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1273 KeyedCallIC::GenerateNonStrictArguments(masm(), argc); | 1302 KeyedCallIC::GenerateNonStrictArguments(masm(), argc); |
1274 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallArguments"); | 1303 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallArguments"); |
1275 PROFILE(isolate(), | 1304 PROFILE(isolate(), |
1276 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), | 1305 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), |
1277 CALL_MEGAMORPHIC_TAG), | 1306 CALL_MEGAMORPHIC_TAG), |
1278 *code, code->arguments_count())); | 1307 *code, code->arguments_count())); |
1279 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); | 1308 GDBJIT(AddCode(GDBJITInterface::CALL_MEGAMORPHIC, *code)); |
| 1309 VTUNEJIT(AddCode("CALL_MEGAMORPHIC", code)); |
1280 return code; | 1310 return code; |
1281 } | 1311 } |
1282 | 1312 |
1283 | 1313 |
1284 Handle<Code> StubCompiler::CompileCallMiss(Code::Flags flags) { | 1314 Handle<Code> StubCompiler::CompileCallMiss(Code::Flags flags) { |
1285 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1315 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1286 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1316 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1287 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); | 1317 Code::ExtraICState extra_state = Code::ExtractExtraICStateFromFlags(flags); |
1288 if (kind == Code::CALL_IC) { | 1318 if (kind == Code::CALL_IC) { |
1289 CallIC::GenerateMiss(masm(), argc, extra_state); | 1319 CallIC::GenerateMiss(masm(), argc, extra_state); |
1290 } else { | 1320 } else { |
1291 KeyedCallIC::GenerateMiss(masm(), argc); | 1321 KeyedCallIC::GenerateMiss(masm(), argc); |
1292 } | 1322 } |
1293 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMiss"); | 1323 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallMiss"); |
1294 isolate()->counters()->call_megamorphic_stubs()->Increment(); | 1324 isolate()->counters()->call_megamorphic_stubs()->Increment(); |
1295 PROFILE(isolate(), | 1325 PROFILE(isolate(), |
1296 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), | 1326 CodeCreateEvent(CALL_LOGGER_TAG(kind, CALL_MISS_TAG), |
1297 *code, code->arguments_count())); | 1327 *code, code->arguments_count())); |
1298 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, *code)); | 1328 GDBJIT(AddCode(GDBJITInterface::CALL_MISS, *code)); |
| 1329 VTUNEJIT(AddCode("CALL_MISS", code)); |
1299 return code; | 1330 return code; |
1300 } | 1331 } |
1301 | 1332 |
1302 | 1333 |
1303 #ifdef ENABLE_DEBUGGER_SUPPORT | 1334 #ifdef ENABLE_DEBUGGER_SUPPORT |
1304 Handle<Code> StubCompiler::CompileCallDebugBreak(Code::Flags flags) { | 1335 Handle<Code> StubCompiler::CompileCallDebugBreak(Code::Flags flags) { |
1305 Debug::GenerateCallICDebugBreak(masm()); | 1336 Debug::GenerateCallICDebugBreak(masm()); |
1306 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugBreak"); | 1337 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugBreak"); |
1307 PROFILE(isolate(), | 1338 PROFILE(isolate(), |
1308 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), | 1339 CodeCreateEvent(CALL_LOGGER_TAG(Code::ExtractKindFromFlags(flags), |
1309 CALL_DEBUG_BREAK_TAG), | 1340 CALL_DEBUG_BREAK_TAG), |
1310 *code, code->arguments_count())); | 1341 *code, code->arguments_count())); |
| 1342 VTUNEJIT(AddCode("call_debug_prepare", code)); |
1311 return code; | 1343 return code; |
1312 } | 1344 } |
1313 | 1345 |
1314 | 1346 |
1315 Handle<Code> StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { | 1347 Handle<Code> StubCompiler::CompileCallDebugPrepareStepIn(Code::Flags flags) { |
1316 // Use the same code for the the step in preparations as we do for the | 1348 // Use the same code for the the step in preparations as we do for the |
1317 // miss case. | 1349 // miss case. |
1318 int argc = Code::ExtractArgumentsCountFromFlags(flags); | 1350 int argc = Code::ExtractArgumentsCountFromFlags(flags); |
1319 Code::Kind kind = Code::ExtractKindFromFlags(flags); | 1351 Code::Kind kind = Code::ExtractKindFromFlags(flags); |
1320 if (kind == Code::CALL_IC) { | 1352 if (kind == Code::CALL_IC) { |
1321 // For the debugger extra ic state is irrelevant. | 1353 // For the debugger extra ic state is irrelevant. |
1322 CallIC::GenerateMiss(masm(), argc, Code::kNoExtraICState); | 1354 CallIC::GenerateMiss(masm(), argc, Code::kNoExtraICState); |
1323 } else { | 1355 } else { |
1324 KeyedCallIC::GenerateMiss(masm(), argc); | 1356 KeyedCallIC::GenerateMiss(masm(), argc); |
1325 } | 1357 } |
1326 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); | 1358 Handle<Code> code = GetCodeWithFlags(flags, "CompileCallDebugPrepareStepIn"); |
1327 PROFILE(isolate(), | 1359 PROFILE(isolate(), |
1328 CodeCreateEvent( | 1360 CodeCreateEvent( |
1329 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), | 1361 CALL_LOGGER_TAG(kind, CALL_DEBUG_PREPARE_STEP_IN_TAG), |
1330 *code, | 1362 *code, |
1331 code->arguments_count())); | 1363 code->arguments_count())); |
| 1364 VTUNEJIT(AddCode("call_debug_prepare", code)); |
1332 return code; | 1365 return code; |
1333 } | 1366 } |
1334 #endif // ENABLE_DEBUGGER_SUPPORT | 1367 #endif // ENABLE_DEBUGGER_SUPPORT |
1335 | 1368 |
1336 #undef CALL_LOGGER_TAG | 1369 #undef CALL_LOGGER_TAG |
1337 | 1370 |
1338 | 1371 |
1339 Handle<Code> StubCompiler::GetCodeWithFlags(Code::Flags flags, | 1372 Handle<Code> StubCompiler::GetCodeWithFlags(Code::Flags flags, |
1340 const char* name) { | 1373 const char* name) { |
1341 // Create code object in the heap. | 1374 // Create code object in the heap. |
(...skipping 24 matching lines...) Expand all Loading... |
1366 holder->GetPrototype()->Lookup(*name, lookup); | 1399 holder->GetPrototype()->Lookup(*name, lookup); |
1367 } | 1400 } |
1368 | 1401 |
1369 | 1402 |
1370 Handle<Code> LoadStubCompiler::GetCode(Code::StubType type, | 1403 Handle<Code> LoadStubCompiler::GetCode(Code::StubType type, |
1371 Handle<String> name) { | 1404 Handle<String> name) { |
1372 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); | 1405 Code::Flags flags = Code::ComputeMonomorphicFlags(Code::LOAD_IC, type); |
1373 Handle<Code> code = GetCodeWithFlags(flags, name); | 1406 Handle<Code> code = GetCodeWithFlags(flags, name); |
1374 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); | 1407 PROFILE(isolate(), CodeCreateEvent(Logger::LOAD_IC_TAG, *code, *name)); |
1375 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1408 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 1409 VTUNEJIT(AddCode(name, code)); |
1376 return code; | 1410 return code; |
1377 } | 1411 } |
1378 | 1412 |
1379 | 1413 |
1380 Handle<Code> KeyedLoadStubCompiler::GetCode(Code::StubType type, | 1414 Handle<Code> KeyedLoadStubCompiler::GetCode(Code::StubType type, |
1381 Handle<String> name, | 1415 Handle<String> name, |
1382 InlineCacheState state) { | 1416 InlineCacheState state) { |
1383 Code::Flags flags = Code::ComputeFlags( | 1417 Code::Flags flags = Code::ComputeFlags( |
1384 Code::KEYED_LOAD_IC, state, Code::kNoExtraICState, type); | 1418 Code::KEYED_LOAD_IC, state, Code::kNoExtraICState, type); |
1385 Handle<Code> code = GetCodeWithFlags(flags, name); | 1419 Handle<Code> code = GetCodeWithFlags(flags, name); |
1386 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); | 1420 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_LOAD_IC_TAG, *code, *name)); |
1387 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); | 1421 GDBJIT(AddCode(GDBJITInterface::LOAD_IC, *name, *code)); |
| 1422 VTUNEJIT(AddCode(name, code)); |
1388 return code; | 1423 return code; |
1389 } | 1424 } |
1390 | 1425 |
1391 | 1426 |
1392 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type, | 1427 Handle<Code> StoreStubCompiler::GetCode(Code::StubType type, |
1393 Handle<String> name) { | 1428 Handle<String> name) { |
1394 Code::Flags flags = | 1429 Code::Flags flags = |
1395 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); | 1430 Code::ComputeMonomorphicFlags(Code::STORE_IC, type, strict_mode_); |
1396 Handle<Code> code = GetCodeWithFlags(flags, name); | 1431 Handle<Code> code = GetCodeWithFlags(flags, name); |
1397 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); | 1432 PROFILE(isolate(), CodeCreateEvent(Logger::STORE_IC_TAG, *code, *name)); |
1398 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); | 1433 GDBJIT(AddCode(GDBJITInterface::STORE_IC, *name, *code)); |
| 1434 VTUNEJIT(AddCode(name, code)); |
1399 return code; | 1435 return code; |
1400 } | 1436 } |
1401 | 1437 |
1402 | 1438 |
1403 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type, | 1439 Handle<Code> KeyedStoreStubCompiler::GetCode(Code::StubType type, |
1404 Handle<String> name, | 1440 Handle<String> name, |
1405 InlineCacheState state) { | 1441 InlineCacheState state) { |
1406 Code::ExtraICState extra_state = | 1442 Code::ExtraICState extra_state = |
1407 Code::ComputeExtraICState(grow_mode_, strict_mode_); | 1443 Code::ComputeExtraICState(grow_mode_, strict_mode_); |
1408 Code::Flags flags = | 1444 Code::Flags flags = |
1409 Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type); | 1445 Code::ComputeFlags(Code::KEYED_STORE_IC, state, extra_state, type); |
1410 Handle<Code> code = GetCodeWithFlags(flags, name); | 1446 Handle<Code> code = GetCodeWithFlags(flags, name); |
1411 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); | 1447 PROFILE(isolate(), CodeCreateEvent(Logger::KEYED_STORE_IC_TAG, *code, *name)); |
1412 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); | 1448 GDBJIT(AddCode(GDBJITInterface::KEYED_STORE_IC, *name, *code)); |
| 1449 VTUNEJIT(AddCode(name, code)); |
1413 return code; | 1450 return code; |
1414 } | 1451 } |
1415 | 1452 |
1416 | 1453 |
1417 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( | 1454 void KeyedStoreStubCompiler::GenerateStoreDictionaryElement( |
1418 MacroAssembler* masm) { | 1455 MacroAssembler* masm) { |
1419 KeyedStoreIC::GenerateSlow(masm); | 1456 KeyedStoreIC::GenerateSlow(masm); |
1420 } | 1457 } |
1421 | 1458 |
1422 | 1459 |
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 } | 1534 } |
1498 return GetCode(Code::CONSTANT_FUNCTION, function_name); | 1535 return GetCode(Code::CONSTANT_FUNCTION, function_name); |
1499 } | 1536 } |
1500 | 1537 |
1501 | 1538 |
1502 Handle<Code> ConstructStubCompiler::GetCode() { | 1539 Handle<Code> ConstructStubCompiler::GetCode() { |
1503 Code::Flags flags = Code::ComputeFlags(Code::STUB); | 1540 Code::Flags flags = Code::ComputeFlags(Code::STUB); |
1504 Handle<Code> code = GetCodeWithFlags(flags, "ConstructStub"); | 1541 Handle<Code> code = GetCodeWithFlags(flags, "ConstructStub"); |
1505 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, "ConstructStub")); | 1542 PROFILE(isolate(), CodeCreateEvent(Logger::STUB_TAG, *code, "ConstructStub")); |
1506 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", *code)); | 1543 GDBJIT(AddCode(GDBJITInterface::STUB, "ConstructStub", *code)); |
| 1544 VTUNEJIT(AddCode("ConstructStub", code)); |
1507 return code; | 1545 return code; |
1508 } | 1546 } |
1509 | 1547 |
1510 | 1548 |
1511 CallOptimization::CallOptimization(LookupResult* lookup) { | 1549 CallOptimization::CallOptimization(LookupResult* lookup) { |
1512 if (lookup->IsFound() && | 1550 if (lookup->IsFound() && |
1513 lookup->IsCacheable() && | 1551 lookup->IsCacheable() && |
1514 lookup->type() == CONSTANT_FUNCTION) { | 1552 lookup->type() == CONSTANT_FUNCTION) { |
1515 // We only optimize constant function calls. | 1553 // We only optimize constant function calls. |
1516 Initialize(Handle<JSFunction>(lookup->GetConstantFunction())); | 1554 Initialize(Handle<JSFunction>(lookup->GetConstantFunction())); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1573 Handle<FunctionTemplateInfo>( | 1611 Handle<FunctionTemplateInfo>( |
1574 FunctionTemplateInfo::cast(signature->receiver())); | 1612 FunctionTemplateInfo::cast(signature->receiver())); |
1575 } | 1613 } |
1576 } | 1614 } |
1577 | 1615 |
1578 is_simple_api_call_ = true; | 1616 is_simple_api_call_ = true; |
1579 } | 1617 } |
1580 | 1618 |
1581 | 1619 |
1582 } } // namespace v8::internal | 1620 } } // namespace v8::internal |
OLD | NEW |