| OLD | NEW |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #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" |
| 11 #include "src/elements-kind.h" | 11 #include "src/elements-kind.h" |
| 12 #include "src/objects.h" | 12 #include "src/objects.h" |
| 13 #include "src/type-hints.h" |
| 13 #include "src/zone-containers.h" | 14 #include "src/zone-containers.h" |
| 14 | 15 |
| 15 namespace v8 { | 16 namespace v8 { |
| 16 namespace internal { | 17 namespace internal { |
| 17 | 18 |
| 18 enum class FeedbackVectorSlotKind { | 19 enum class FeedbackVectorSlotKind { |
| 19 // This kind means that the slot points to the middle of other slot | 20 // This kind means that the slot points to the middle of other slot |
| 20 // which occupies more than one feedback vector element. | 21 // which occupies more than one feedback vector element. |
| 21 // There must be no such slots in the system. | 22 // There must be no such slots in the system. |
| 22 INVALID, | 23 INVALID, |
| 23 | 24 |
| 24 CALL_IC, | 25 CALL_IC, |
| 25 LOAD_IC, | 26 LOAD_IC, |
| 26 LOAD_GLOBAL_IC, | 27 LOAD_GLOBAL_IC, |
| 27 KEYED_LOAD_IC, | 28 KEYED_LOAD_IC, |
| 28 STORE_IC, | 29 STORE_IC, |
| 29 KEYED_STORE_IC, | 30 KEYED_STORE_IC, |
| 31 INTERPRETER_BINARYOP_IC, |
| 32 INTERPRETER_COMPARE_IC, |
| 30 | 33 |
| 31 // This is a general purpose slot that occupies one feedback vector element. | 34 // This is a general purpose slot that occupies one feedback vector element. |
| 32 GENERAL, | 35 GENERAL, |
| 33 | 36 |
| 34 KINDS_NUMBER // Last value indicating number of kinds. | 37 KINDS_NUMBER // Last value indicating number of kinds. |
| 35 }; | 38 }; |
| 36 | 39 |
| 37 std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind); | 40 std::ostream& operator<<(std::ostream& os, FeedbackVectorSlotKind kind); |
| 38 | 41 |
| 39 | 42 |
| (...skipping 20 matching lines...) Expand all Loading... |
| 60 } | 63 } |
| 61 | 64 |
| 62 FeedbackVectorSlot AddStoreICSlot() { | 65 FeedbackVectorSlot AddStoreICSlot() { |
| 63 return AddSlot(FeedbackVectorSlotKind::STORE_IC); | 66 return AddSlot(FeedbackVectorSlotKind::STORE_IC); |
| 64 } | 67 } |
| 65 | 68 |
| 66 FeedbackVectorSlot AddKeyedStoreICSlot() { | 69 FeedbackVectorSlot AddKeyedStoreICSlot() { |
| 67 return AddSlot(FeedbackVectorSlotKind::KEYED_STORE_IC); | 70 return AddSlot(FeedbackVectorSlotKind::KEYED_STORE_IC); |
| 68 } | 71 } |
| 69 | 72 |
| 73 FeedbackVectorSlot AddInterpreterBinaryOpICSlot() { |
| 74 return AddSlot(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC); |
| 75 } |
| 76 |
| 77 FeedbackVectorSlot AddInterpreterCompareICSlot() { |
| 78 return AddSlot(FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC); |
| 79 } |
| 80 |
| 70 FeedbackVectorSlot AddGeneralSlot() { | 81 FeedbackVectorSlot AddGeneralSlot() { |
| 71 return AddSlot(FeedbackVectorSlotKind::GENERAL); | 82 return AddSlot(FeedbackVectorSlotKind::GENERAL); |
| 72 } | 83 } |
| 73 | 84 |
| 74 #ifdef OBJECT_PRINT | 85 #ifdef OBJECT_PRINT |
| 75 // For gdb debugging. | 86 // For gdb debugging. |
| 76 void Print(); | 87 void Print(); |
| 77 #endif // OBJECT_PRINT | 88 #endif // OBJECT_PRINT |
| 78 | 89 |
| 79 DECLARE_PRINTER(FeedbackVectorSpec) | 90 DECLARE_PRINTER(FeedbackVectorSpec) |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 #ifdef OBJECT_PRINT | 211 #ifdef OBJECT_PRINT |
| 201 // For gdb debugging. | 212 // For gdb debugging. |
| 202 void Print(); | 213 void Print(); |
| 203 #endif // OBJECT_PRINT | 214 #endif // OBJECT_PRINT |
| 204 | 215 |
| 205 DECLARE_PRINTER(TypeFeedbackMetadata) | 216 DECLARE_PRINTER(TypeFeedbackMetadata) |
| 206 | 217 |
| 207 static const char* Kind2String(FeedbackVectorSlotKind kind); | 218 static const char* Kind2String(FeedbackVectorSlotKind kind); |
| 208 | 219 |
| 209 private: | 220 private: |
| 210 static const int kFeedbackVectorSlotKindBits = 4; | 221 static const int kFeedbackVectorSlotKindBits = 5; |
| 211 STATIC_ASSERT(static_cast<int>(FeedbackVectorSlotKind::KINDS_NUMBER) < | 222 STATIC_ASSERT(static_cast<int>(FeedbackVectorSlotKind::KINDS_NUMBER) < |
| 212 (1 << kFeedbackVectorSlotKindBits)); | 223 (1 << kFeedbackVectorSlotKindBits)); |
| 213 | 224 |
| 214 void SetKind(FeedbackVectorSlot slot, FeedbackVectorSlotKind kind); | 225 void SetKind(FeedbackVectorSlot slot, FeedbackVectorSlotKind kind); |
| 215 | 226 |
| 216 typedef BitSetComputer<FeedbackVectorSlotKind, kFeedbackVectorSlotKindBits, | 227 typedef BitSetComputer<FeedbackVectorSlotKind, kFeedbackVectorSlotKindBits, |
| 217 kSmiValueSize, uint32_t> VectorICComputer; | 228 kSmiValueSize, uint32_t> VectorICComputer; |
| 218 | 229 |
| 219 DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackMetadata); | 230 DISALLOW_IMPLICIT_CONSTRUCTORS(TypeFeedbackMetadata); |
| 220 }; | 231 }; |
| 221 | 232 |
| 222 | 233 |
| 223 // The shape of the TypeFeedbackVector is an array with: | 234 // The shape of the TypeFeedbackVector is an array with: |
| 224 // 0: feedback metadata | 235 // 0: feedback metadata |
| 225 // 1: invocation count | 236 // 1: invocation count |
| 226 // 2: feedback slot #0 | 237 // 2: feedback slot #0 |
| 227 // ... | 238 // ... |
| 228 // 2 + slot_count - 1: feedback slot #(slot_count-1) | 239 // 2 + slot_count - 1: feedback slot #(slot_count-1) |
| 229 // | 240 // |
| 230 class TypeFeedbackVector : public FixedArray { | 241 class TypeFeedbackVector : public FixedArray { |
| 231 public: | 242 public: |
| 232 // Casting. | 243 // Casting. |
| 233 static inline TypeFeedbackVector* cast(Object* obj); | 244 static inline TypeFeedbackVector* cast(Object* obj); |
| 234 | 245 |
| 235 static const int kMetadataIndex = 0; | 246 static const int kMetadataIndex = 0; |
| 236 static const int kInvocationCountIndex = 1; | 247 static const int kInvocationCountIndex = 1; |
| 237 static const int kReservedIndexCount = 2; | 248 static const int kReservedIndexCount = 2; |
| 238 | 249 |
| 239 inline void ComputeCounts(int* with_type_info, int* generic); | 250 inline void ComputeCounts(int* with_type_info, int* generic, |
| 251 bool code_is_interpreted); |
| 240 | 252 |
| 241 inline bool is_empty() const; | 253 inline bool is_empty() const; |
| 242 | 254 |
| 243 // Returns number of slots in the vector. | 255 // Returns number of slots in the vector. |
| 244 inline int slot_count() const; | 256 inline int slot_count() const; |
| 245 | 257 |
| 246 inline TypeFeedbackMetadata* metadata() const; | 258 inline TypeFeedbackMetadata* metadata() const; |
| 247 inline int invocation_count() const; | 259 inline int invocation_count() const; |
| 248 | 260 |
| 249 // Conversion from a slot to an integer index to the underlying array. | 261 // Conversion from a slot to an integer index to the underlying array. |
| (...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 629 MapHandleList* transitioned_maps, | 641 MapHandleList* transitioned_maps, |
| 630 CodeHandleList* handlers); | 642 CodeHandleList* handlers); |
| 631 void ConfigureMegamorphicKeyed(IcCheckType property_type); | 643 void ConfigureMegamorphicKeyed(IcCheckType property_type); |
| 632 | 644 |
| 633 KeyedAccessStoreMode GetKeyedAccessStoreMode() const; | 645 KeyedAccessStoreMode GetKeyedAccessStoreMode() const; |
| 634 IcCheckType GetKeyType() const; | 646 IcCheckType GetKeyType() const; |
| 635 | 647 |
| 636 InlineCacheState StateFromFeedback() const override; | 648 InlineCacheState StateFromFeedback() const override; |
| 637 Name* FindFirstName() const override; | 649 Name* FindFirstName() const override; |
| 638 }; | 650 }; |
| 651 |
| 652 class BinaryOpICNexus final : public FeedbackNexus { |
| 653 public: |
| 654 BinaryOpICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) |
| 655 : FeedbackNexus(vector, slot) { |
| 656 DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC, |
| 657 vector->GetKind(slot)); |
| 658 } |
| 659 BinaryOpICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot) |
| 660 : FeedbackNexus(vector, slot) { |
| 661 DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_BINARYOP_IC, |
| 662 vector->GetKind(slot)); |
| 663 } |
| 664 |
| 665 void Clear(Code* host); |
| 666 |
| 667 InlineCacheState StateFromFeedback() const final; |
| 668 BinaryOperationHint GetBinaryOperationFeedback() const; |
| 669 |
| 670 int ExtractMaps(MapHandleList* maps) const final { |
| 671 // BinaryOpICs don't record map feedback. |
| 672 return 0; |
| 673 } |
| 674 MaybeHandle<Object> FindHandlerForMap(Handle<Map> map) const final { |
| 675 return MaybeHandle<Code>(); |
| 676 } |
| 677 bool FindHandlers(List<Handle<Object>>* code_list, |
| 678 int length = -1) const final { |
| 679 return length == 0; |
| 680 } |
| 681 }; |
| 682 |
| 683 class CompareICNexus final : public FeedbackNexus { |
| 684 public: |
| 685 CompareICNexus(Handle<TypeFeedbackVector> vector, FeedbackVectorSlot slot) |
| 686 : FeedbackNexus(vector, slot) { |
| 687 DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC, |
| 688 vector->GetKind(slot)); |
| 689 } |
| 690 CompareICNexus(TypeFeedbackVector* vector, FeedbackVectorSlot slot) |
| 691 : FeedbackNexus(vector, slot) { |
| 692 DCHECK_EQ(FeedbackVectorSlotKind::INTERPRETER_COMPARE_IC, |
| 693 vector->GetKind(slot)); |
| 694 } |
| 695 |
| 696 void Clear(Code* host); |
| 697 |
| 698 InlineCacheState StateFromFeedback() const final; |
| 699 CompareOperationHint GetCompareOperationFeedback() const; |
| 700 |
| 701 int ExtractMaps(MapHandleList* maps) const final { |
| 702 // BinaryOpICs don't record map feedback. |
| 703 return 0; |
| 704 } |
| 705 MaybeHandle<Object> FindHandlerForMap(Handle<Map> map) const final { |
| 706 return MaybeHandle<Code>(); |
| 707 } |
| 708 bool FindHandlers(List<Handle<Object>>* code_list, |
| 709 int length = -1) const final { |
| 710 return length == 0; |
| 711 } |
| 712 }; |
| 713 |
| 714 inline BinaryOperationHint BinaryOperationHintFromFeedback(int type_feedback); |
| 715 inline CompareOperationHint CompareOperationHintFromFeedback(int type_feedback); |
| 716 |
| 639 } // namespace internal | 717 } // namespace internal |
| 640 } // namespace v8 | 718 } // namespace v8 |
| 641 | 719 |
| 642 #endif // V8_TRANSITIONS_H_ | 720 #endif // V8_TRANSITIONS_H_ |
| OLD | NEW |