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

Side by Side Diff: src/type-feedback-vector.h

Issue 2133233002: [LoadIC] Handle simple field loads in the dispatcher (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix release builds for realz Created 4 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
« no previous file with comments | « src/ic/ic.cc ('k') | src/type-feedback-vector.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #ifndef V8_TYPE_FEEDBACK_VECTOR_H_ 5 #ifndef V8_TYPE_FEEDBACK_VECTOR_H_
6 #define V8_TYPE_FEEDBACK_VECTOR_H_ 6 #define V8_TYPE_FEEDBACK_VECTOR_H_
7 7
8 #include <vector> 8 #include <vector>
9 9
10 #include "src/base/logging.h" 10 #include "src/base/logging.h"
(...skipping 394 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 ExtractMaps(&maps); 405 ExtractMaps(&maps);
406 if (maps.length() > 0) return *maps.at(0); 406 if (maps.length() > 0) return *maps.at(0);
407 return NULL; 407 return NULL;
408 } 408 }
409 409
410 // TODO(mvstanton): remove FindAllMaps, it didn't survive a code review. 410 // TODO(mvstanton): remove FindAllMaps, it didn't survive a code review.
411 void FindAllMaps(MapHandleList* maps) const { ExtractMaps(maps); } 411 void FindAllMaps(MapHandleList* maps) const { ExtractMaps(maps); }
412 412
413 virtual InlineCacheState StateFromFeedback() const = 0; 413 virtual InlineCacheState StateFromFeedback() const = 0;
414 virtual int ExtractMaps(MapHandleList* maps) const; 414 virtual int ExtractMaps(MapHandleList* maps) const;
415 virtual MaybeHandle<Code> FindHandlerForMap(Handle<Map> map) const; 415 virtual MaybeHandle<Object> FindHandlerForMap(Handle<Map> map) const;
416 virtual bool FindHandlers(CodeHandleList* code_list, int length = -1) const; 416 virtual bool FindHandlers(List<Handle<Object>>* code_list,
417 int length = -1) const;
417 virtual Name* FindFirstName() const { return NULL; } 418 virtual Name* FindFirstName() const { return NULL; }
418 419
419 virtual void ConfigureUninitialized(); 420 virtual void ConfigureUninitialized();
420 virtual void ConfigurePremonomorphic(); 421 virtual void ConfigurePremonomorphic();
421 virtual void ConfigureMegamorphic(); 422 virtual void ConfigureMegamorphic();
422 423
423 inline Object* GetFeedback() const; 424 inline Object* GetFeedback() const;
424 inline Object* GetFeedbackExtra() const; 425 inline Object* GetFeedbackExtra() const;
425 426
426 inline Isolate* GetIsolate() const; 427 inline Isolate* GetIsolate() const;
427 428
428 protected: 429 protected:
429 inline void SetFeedback(Object* feedback, 430 inline void SetFeedback(Object* feedback,
430 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 431 WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
431 inline void SetFeedbackExtra(Object* feedback_extra, 432 inline void SetFeedbackExtra(Object* feedback_extra,
432 WriteBarrierMode mode = UPDATE_WRITE_BARRIER); 433 WriteBarrierMode mode = UPDATE_WRITE_BARRIER);
433 434
434 Handle<FixedArray> EnsureArrayOfSize(int length); 435 Handle<FixedArray> EnsureArrayOfSize(int length);
435 Handle<FixedArray> EnsureExtraArrayOfSize(int length); 436 Handle<FixedArray> EnsureExtraArrayOfSize(int length);
436 void InstallHandlers(Handle<FixedArray> array, MapHandleList* maps, 437 void InstallHandlers(Handle<FixedArray> array, MapHandleList* maps,
437 CodeHandleList* handlers); 438 List<Handle<Object>>* handlers);
438 439
439 private: 440 private:
440 // The reason for having a vector handle and a raw pointer is that we can and 441 // The reason for having a vector handle and a raw pointer is that we can and
441 // should use handles during IC miss, but not during GC when we clear ICs. If 442 // should use handles during IC miss, but not during GC when we clear ICs. If
442 // you have a handle to the vector that is better because more operations can 443 // you have a handle to the vector that is better because more operations can
443 // be done, like allocation. 444 // be done, like allocation.
444 Handle<TypeFeedbackVector> vector_handle_; 445 Handle<TypeFeedbackVector> vector_handle_;
445 TypeFeedbackVector* vector_; 446 TypeFeedbackVector* vector_;
446 FeedbackVectorSlot slot_; 447 FeedbackVectorSlot slot_;
447 }; 448 };
(...skipping 16 matching lines...) Expand all
464 void ConfigureMonomorphic(Handle<JSFunction> function); 465 void ConfigureMonomorphic(Handle<JSFunction> function);
465 void ConfigureMegamorphic() final; 466 void ConfigureMegamorphic() final;
466 void ConfigureMegamorphic(int call_count); 467 void ConfigureMegamorphic(int call_count);
467 468
468 InlineCacheState StateFromFeedback() const final; 469 InlineCacheState StateFromFeedback() const final;
469 470
470 int ExtractMaps(MapHandleList* maps) const final { 471 int ExtractMaps(MapHandleList* maps) const final {
471 // CallICs don't record map feedback. 472 // CallICs don't record map feedback.
472 return 0; 473 return 0;
473 } 474 }
474 MaybeHandle<Code> FindHandlerForMap(Handle<Map> map) const final { 475 MaybeHandle<Object> FindHandlerForMap(Handle<Map> map) const final {
475 return MaybeHandle<Code>(); 476 return MaybeHandle<Code>();
476 } 477 }
477 bool FindHandlers(CodeHandleList* code_list, int length = -1) const final { 478 bool FindHandlers(List<Handle<Object>>* code_list,
479 int length = -1) const final {
478 return length == 0; 480 return length == 0;
479 } 481 }
480 482
481 int ExtractCallCount(); 483 int ExtractCallCount();
482 }; 484 };
483 485
484 486
485 class LoadICNexus : public FeedbackNexus { 487 class LoadICNexus : public FeedbackNexus {
486 public: 488 public:
487 LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) 489 LoadICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
488 : FeedbackNexus(vector, slot) { 490 : FeedbackNexus(vector, slot) {
489 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot)); 491 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot));
490 } 492 }
491 explicit LoadICNexus(Isolate* isolate) 493 explicit LoadICNexus(Isolate* isolate)
492 : FeedbackNexus( 494 : FeedbackNexus(
493 TypeFeedbackVector::DummyVector(isolate), 495 TypeFeedbackVector::DummyVector(isolate),
494 FeedbackVectorSlot(TypeFeedbackVector::kDummyLoadICSlot)) {} 496 FeedbackVectorSlot(TypeFeedbackVector::kDummyLoadICSlot)) {}
495 LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot) 497 LoadICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
496 : FeedbackNexus(vector, slot) { 498 : FeedbackNexus(vector, slot) {
497 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot)); 499 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_IC, vector->GetKind(slot));
498 } 500 }
499 501
500 void Clear(Code* host); 502 void Clear(Code* host);
501 503
502 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); 504 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Object> handler);
503 505
504 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); 506 void ConfigurePolymorphic(MapHandleList* maps,
507 List<Handle<Object>>* handlers);
505 508
506 InlineCacheState StateFromFeedback() const override; 509 InlineCacheState StateFromFeedback() const override;
507 }; 510 };
508 511
509 class LoadGlobalICNexus : public FeedbackNexus { 512 class LoadGlobalICNexus : public FeedbackNexus {
510 public: 513 public:
511 LoadGlobalICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) 514 LoadGlobalICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
512 : FeedbackNexus(vector, slot) { 515 : FeedbackNexus(vector, slot) {
513 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC, vector->GetKind(slot)); 516 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC, vector->GetKind(slot));
514 } 517 }
515 LoadGlobalICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot) 518 LoadGlobalICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
516 : FeedbackNexus(vector, slot) { 519 : FeedbackNexus(vector, slot) {
517 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC, vector->GetKind(slot)); 520 DCHECK_EQ(FeedbackVectorSlotKind::LOAD_GLOBAL_IC, vector->GetKind(slot));
518 } 521 }
519 522
520 int ExtractMaps(MapHandleList* maps) const final { 523 int ExtractMaps(MapHandleList* maps) const final {
521 // LoadGlobalICs don't record map feedback. 524 // LoadGlobalICs don't record map feedback.
522 return 0; 525 return 0;
523 } 526 }
524 MaybeHandle<Code> FindHandlerForMap(Handle<Map> map) const final { 527 MaybeHandle<Object> FindHandlerForMap(Handle<Map> map) const final {
525 return MaybeHandle<Code>(); 528 return MaybeHandle<Code>();
526 } 529 }
527 bool FindHandlers(CodeHandleList* code_list, int length = -1) const final { 530 bool FindHandlers(List<Handle<Object>>* code_list,
531 int length = -1) const final {
528 return length == 0; 532 return length == 0;
529 } 533 }
530 534
531 void ConfigureMegamorphic() override { UNREACHABLE(); } 535 void ConfigureMegamorphic() override { UNREACHABLE(); }
532 void Clear(Code* host); 536 void Clear(Code* host);
533 537
534 void ConfigureUninitialized() override; 538 void ConfigureUninitialized() override;
535 void ConfigurePropertyCellMode(Handle<PropertyCell> cell); 539 void ConfigurePropertyCellMode(Handle<PropertyCell> cell);
536 void ConfigureHandlerMode(Handle<Code> handler); 540 void ConfigureHandlerMode(Handle<Code> handler);
537 541
(...skipping 11 matching lines...) Expand all
549 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot)); 553 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_LOAD_IC, vector->GetKind(slot));
550 } 554 }
551 555
552 void Clear(Code* host); 556 void Clear(Code* host);
553 557
554 // name can be a null handle for element loads. 558 // name can be a null handle for element loads.
555 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map, 559 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map,
556 Handle<Code> handler); 560 Handle<Code> handler);
557 // name can be null. 561 // name can be null.
558 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, 562 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps,
559 CodeHandleList* handlers); 563 List<Handle<Object>>* handlers);
560 564
561 void ConfigureMegamorphicKeyed(IcCheckType property_type); 565 void ConfigureMegamorphicKeyed(IcCheckType property_type);
562 566
563 IcCheckType GetKeyType() const; 567 IcCheckType GetKeyType() const;
564 InlineCacheState StateFromFeedback() const override; 568 InlineCacheState StateFromFeedback() const override;
565 Name* FindFirstName() const override; 569 Name* FindFirstName() const override;
566 }; 570 };
567 571
568 572
569 class StoreICNexus : public FeedbackNexus { 573 class StoreICNexus : public FeedbackNexus {
570 public: 574 public:
571 StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) 575 StoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
572 : FeedbackNexus(vector, slot) { 576 : FeedbackNexus(vector, slot) {
573 DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot)); 577 DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot));
574 } 578 }
575 explicit StoreICNexus(Isolate* isolate) 579 explicit StoreICNexus(Isolate* isolate)
576 : FeedbackNexus( 580 : FeedbackNexus(
577 TypeFeedbackVector::DummyVector(isolate), 581 TypeFeedbackVector::DummyVector(isolate),
578 FeedbackVectorSlot(TypeFeedbackVector::kDummyStoreICSlot)) {} 582 FeedbackVectorSlot(TypeFeedbackVector::kDummyStoreICSlot)) {}
579 StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot) 583 StoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
580 : FeedbackNexus(vector, slot) { 584 : FeedbackNexus(vector, slot) {
581 DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot)); 585 DCHECK_EQ(FeedbackVectorSlotKind::STORE_IC, vector->GetKind(slot));
582 } 586 }
583 587
584 void Clear(Code* host); 588 void Clear(Code* host);
585 589
586 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler); 590 void ConfigureMonomorphic(Handle<Map> receiver_map, Handle<Code> handler);
587 591
588 void ConfigurePolymorphic(MapHandleList* maps, CodeHandleList* handlers); 592 void ConfigurePolymorphic(MapHandleList* maps,
593 List<Handle<Object>>* handlers);
589 594
590 InlineCacheState StateFromFeedback() const override; 595 InlineCacheState StateFromFeedback() const override;
591 }; 596 };
592 597
593 598
594 class KeyedStoreICNexus : public FeedbackNexus { 599 class KeyedStoreICNexus : public FeedbackNexus {
595 public: 600 public:
596 KeyedStoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) 601 KeyedStoreICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot)
597 : FeedbackNexus(vector, slot) { 602 : FeedbackNexus(vector, slot) {
598 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot)); 603 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot));
599 } 604 }
600 explicit KeyedStoreICNexus(Isolate* isolate) 605 explicit KeyedStoreICNexus(Isolate* isolate)
601 : FeedbackNexus( 606 : FeedbackNexus(
602 TypeFeedbackVector::DummyVector(isolate), 607 TypeFeedbackVector::DummyVector(isolate),
603 FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)) {} 608 FeedbackVectorSlot(TypeFeedbackVector::kDummyKeyedStoreICSlot)) {}
604 KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot) 609 KeyedStoreICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot)
605 : FeedbackNexus(vector, slot) { 610 : FeedbackNexus(vector, slot) {
606 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot)); 611 DCHECK_EQ(FeedbackVectorSlotKind::KEYED_STORE_IC, vector->GetKind(slot));
607 } 612 }
608 613
609 void Clear(Code* host); 614 void Clear(Code* host);
610 615
611 // name can be a null handle for element loads. 616 // name can be a null handle for element loads.
612 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map, 617 void ConfigureMonomorphic(Handle<Name> name, Handle<Map> receiver_map,
613 Handle<Code> handler); 618 Handle<Code> handler);
614 // name can be null. 619 // name can be null.
615 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps, 620 void ConfigurePolymorphic(Handle<Name> name, MapHandleList* maps,
616 CodeHandleList* handlers); 621 List<Handle<Object>>* handlers);
617 void ConfigurePolymorphic(MapHandleList* maps, 622 void ConfigurePolymorphic(MapHandleList* maps,
618 MapHandleList* transitioned_maps, 623 MapHandleList* transitioned_maps,
619 CodeHandleList* handlers); 624 CodeHandleList* handlers);
620 void ConfigureMegamorphicKeyed(IcCheckType property_type); 625 void ConfigureMegamorphicKeyed(IcCheckType property_type);
621 626
622 KeyedAccessStoreMode GetKeyedAccessStoreMode() const; 627 KeyedAccessStoreMode GetKeyedAccessStoreMode() const;
623 IcCheckType GetKeyType() const; 628 IcCheckType GetKeyType() const;
624 629
625 InlineCacheState StateFromFeedback() const override; 630 InlineCacheState StateFromFeedback() const override;
626 Name* FindFirstName() const override; 631 Name* FindFirstName() const override;
627 }; 632 };
628 } // namespace internal 633 } // namespace internal
629 } // namespace v8 634 } // namespace v8
630 635
631 #endif // V8_TRANSITIONS_H_ 636 #endif // V8_TRANSITIONS_H_
OLDNEW
« no previous file with comments | « src/ic/ic.cc ('k') | src/type-feedback-vector.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698