Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(826)

Side by Side Diff: src/stub-cache.cc

Issue 10824032: Enables V8 integration with the Intel VTune performance analysis tool. This allows the VTune profi… (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 8 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698