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

Side by Side Diff: src/ic.h

Issue 8803013: Improve TraceIC logging (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: review feedback Created 9 years 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
« no previous file with comments | « src/frames.cc ('k') | src/ic.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 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
84 // The IC code is either invoked with no extra frames on the stack 84 // The IC code is either invoked with no extra frames on the stack
85 // or with a single extra frame for supporting calls. 85 // or with a single extra frame for supporting calls.
86 enum FrameDepth { 86 enum FrameDepth {
87 NO_EXTRA_FRAME = 0, 87 NO_EXTRA_FRAME = 0,
88 EXTRA_CALL_FRAME = 1 88 EXTRA_CALL_FRAME = 1
89 }; 89 };
90 90
91 // Construct the IC structure with the given number of extra 91 // Construct the IC structure with the given number of extra
92 // JavaScript frames on the stack. 92 // JavaScript frames on the stack.
93 IC(FrameDepth depth, Isolate* isolate); 93 IC(FrameDepth depth, Isolate* isolate);
94 virtual ~IC() {}
94 95
95 // Get the call-site target; used for determining the state. 96 // Get the call-site target; used for determining the state.
96 Code* target() { return GetTargetAtAddress(address()); } 97 Code* target() const { return GetTargetAtAddress(address()); }
97 inline Address address(); 98 inline Address address() const;
99
100 virtual bool IsGeneric() const { return false; }
98 101
99 // Compute the current IC state based on the target stub, receiver and name. 102 // Compute the current IC state based on the target stub, receiver and name.
100 static State StateFrom(Code* target, Object* receiver, Object* name); 103 static State StateFrom(Code* target, Object* receiver, Object* name);
101 104
102 // Clear the inline cache to initial state. 105 // Clear the inline cache to initial state.
103 static void Clear(Address address); 106 static void Clear(Address address);
104 107
105 // Computes the reloc info for this IC. This is a fairly expensive 108 // Computes the reloc info for this IC. This is a fairly expensive
106 // operation as it has to search through the heap to find the code 109 // operation as it has to search through the heap to find the code
107 // object that contains this IC site. 110 // object that contains this IC site.
(...skipping 24 matching lines...) Expand all
132 InlineCacheHolderFlag holder); 135 InlineCacheHolderFlag holder);
133 136
134 protected: 137 protected:
135 Address fp() const { return fp_; } 138 Address fp() const { return fp_; }
136 Address pc() const { return *pc_address_; } 139 Address pc() const { return *pc_address_; }
137 Isolate* isolate() const { return isolate_; } 140 Isolate* isolate() const { return isolate_; }
138 141
139 #ifdef ENABLE_DEBUGGER_SUPPORT 142 #ifdef ENABLE_DEBUGGER_SUPPORT
140 // Computes the address in the original code when the code running is 143 // Computes the address in the original code when the code running is
141 // containing break points (calls to DebugBreakXXX builtins). 144 // containing break points (calls to DebugBreakXXX builtins).
142 Address OriginalCodeAddress(); 145 Address OriginalCodeAddress() const;
143 #endif 146 #endif
144 147
145 // Set the call-site target. 148 // Set the call-site target.
146 void set_target(Code* code) { SetTargetAtAddress(address(), code); } 149 void set_target(Code* code) { SetTargetAtAddress(address(), code); }
147 150
148 #ifdef DEBUG 151 #ifdef DEBUG
152 char TransitionMarkFromState(IC::State state);
153
149 void TraceIC(const char* type, 154 void TraceIC(const char* type,
150 Handle<Object> name, 155 Handle<Object> name,
151 State old_state, 156 State old_state,
152 Code* new_target); 157 Code* new_target);
153 #endif 158 #endif
154 159
155 Failure* TypeError(const char* type, 160 Failure* TypeError(const char* type,
156 Handle<Object> object, 161 Handle<Object> object,
157 Handle<Object> key); 162 Handle<Object> key);
158 Failure* ReferenceError(const char* type, Handle<String> name); 163 Failure* ReferenceError(const char* type, Handle<String> name);
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after
445 // generic stub should go into slow case. 450 // generic stub should go into slow case.
446 // Access check is necessary explicitly since generic stub does not perform 451 // Access check is necessary explicitly since generic stub does not perform
447 // map checks. 452 // map checks.
448 static const int kSlowCaseBitFieldMask = 453 static const int kSlowCaseBitFieldMask =
449 (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor); 454 (1 << Map::kIsAccessCheckNeeded) | (1 << Map::kHasIndexedInterceptor);
450 455
451 virtual Handle<Code> GetElementStubWithoutMapCheck( 456 virtual Handle<Code> GetElementStubWithoutMapCheck(
452 bool is_js_array, 457 bool is_js_array,
453 ElementsKind elements_kind); 458 ElementsKind elements_kind);
454 459
460 virtual bool IsGeneric() const {
461 return target() == *generic_stub();
462 }
463
455 protected: 464 protected:
456 virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; } 465 virtual Code::Kind kind() const { return Code::KEYED_LOAD_IC; }
457 466
458 virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps, 467 virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps,
459 StrictModeFlag strict_mode); 468 StrictModeFlag strict_mode);
460 469
461 virtual Handle<Code> string_stub() { 470 virtual Handle<Code> string_stub() {
462 return isolate()->builtins()->KeyedLoadIC_String(); 471 return isolate()->builtins()->KeyedLoadIC_String();
463 } 472 }
464 473
465 private: 474 private:
466 // Update the inline cache. 475 // Update the inline cache.
467 void UpdateCaches(LookupResult* lookup, 476 void UpdateCaches(LookupResult* lookup,
468 State state, 477 State state,
469 Handle<Object> object, 478 Handle<Object> object,
470 Handle<String> name); 479 Handle<String> name);
471 480
472 // Stub accessors. 481 // Stub accessors.
473 static Code* initialize_stub() { 482 static Code* initialize_stub() {
474 return Isolate::Current()->builtins()->builtin( 483 return Isolate::Current()->builtins()->builtin(
475 Builtins::kKeyedLoadIC_Initialize); 484 Builtins::kKeyedLoadIC_Initialize);
476 } 485 }
477 Handle<Code> megamorphic_stub() { 486 Handle<Code> megamorphic_stub() {
478 return isolate()->builtins()->KeyedLoadIC_Generic(); 487 return isolate()->builtins()->KeyedLoadIC_Generic();
479 } 488 }
480 Handle<Code> generic_stub() { 489 Handle<Code> generic_stub() const {
481 return isolate()->builtins()->KeyedLoadIC_Generic(); 490 return isolate()->builtins()->KeyedLoadIC_Generic();
482 } 491 }
483 Handle<Code> pre_monomorphic_stub() { 492 Handle<Code> pre_monomorphic_stub() {
484 return isolate()->builtins()->KeyedLoadIC_PreMonomorphic(); 493 return isolate()->builtins()->KeyedLoadIC_PreMonomorphic();
485 } 494 }
486 Handle<Code> indexed_interceptor_stub() { 495 Handle<Code> indexed_interceptor_stub() {
487 return isolate()->builtins()->KeyedLoadIC_IndexedInterceptor(); 496 return isolate()->builtins()->KeyedLoadIC_IndexedInterceptor();
488 } 497 }
489 Handle<Code> non_strict_arguments_stub() { 498 Handle<Code> non_strict_arguments_stub() {
490 return isolate()->builtins()->KeyedLoadIC_NonStrictArguments(); 499 return isolate()->builtins()->KeyedLoadIC_NonStrictArguments();
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
588 StrictModeFlag strict_mode); 597 StrictModeFlag strict_mode);
589 static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode); 598 static void GenerateGeneric(MacroAssembler* masm, StrictModeFlag strict_mode);
590 static void GenerateNonStrictArguments(MacroAssembler* masm); 599 static void GenerateNonStrictArguments(MacroAssembler* masm);
591 static void GenerateTransitionElementsSmiToDouble(MacroAssembler* masm); 600 static void GenerateTransitionElementsSmiToDouble(MacroAssembler* masm);
592 static void GenerateTransitionElementsDoubleToObject(MacroAssembler* masm); 601 static void GenerateTransitionElementsDoubleToObject(MacroAssembler* masm);
593 602
594 virtual Handle<Code> GetElementStubWithoutMapCheck( 603 virtual Handle<Code> GetElementStubWithoutMapCheck(
595 bool is_js_array, 604 bool is_js_array,
596 ElementsKind elements_kind); 605 ElementsKind elements_kind);
597 606
607 virtual bool IsGeneric() const {
608 return target() == *generic_stub() ||
609 target() == *generic_stub_strict();
610 }
611
598 protected: 612 protected:
599 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; } 613 virtual Code::Kind kind() const { return Code::KEYED_STORE_IC; }
600 614
601 virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps, 615 virtual Handle<Code> ComputePolymorphicStub(MapHandleList* receiver_maps,
602 StrictModeFlag strict_mode); 616 StrictModeFlag strict_mode);
603 617
604 private: 618 private:
605 // Update the inline cache. 619 // Update the inline cache.
606 void UpdateCaches(LookupResult* lookup, 620 void UpdateCaches(LookupResult* lookup,
607 State state, 621 State state,
(...skipping 17 matching lines...) Expand all
625 static Code* initialize_stub_strict() { 639 static Code* initialize_stub_strict() {
626 return Isolate::Current()->builtins()->builtin( 640 return Isolate::Current()->builtins()->builtin(
627 Builtins::kKeyedStoreIC_Initialize_Strict); 641 Builtins::kKeyedStoreIC_Initialize_Strict);
628 } 642 }
629 Handle<Code> megamorphic_stub() { 643 Handle<Code> megamorphic_stub() {
630 return isolate()->builtins()->KeyedStoreIC_Generic(); 644 return isolate()->builtins()->KeyedStoreIC_Generic();
631 } 645 }
632 Handle<Code> megamorphic_stub_strict() { 646 Handle<Code> megamorphic_stub_strict() {
633 return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); 647 return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
634 } 648 }
635 Handle<Code> generic_stub() { 649 Handle<Code> generic_stub() const {
636 return isolate()->builtins()->KeyedStoreIC_Generic(); 650 return isolate()->builtins()->KeyedStoreIC_Generic();
637 } 651 }
638 Handle<Code> generic_stub_strict() { 652 Handle<Code> generic_stub_strict() const {
639 return isolate()->builtins()->KeyedStoreIC_Generic_Strict(); 653 return isolate()->builtins()->KeyedStoreIC_Generic_Strict();
640 } 654 }
641 Handle<Code> non_strict_arguments_stub() { 655 Handle<Code> non_strict_arguments_stub() {
642 return isolate()->builtins()->KeyedStoreIC_NonStrictArguments(); 656 return isolate()->builtins()->KeyedStoreIC_NonStrictArguments();
643 } 657 }
644 658
645 static void Clear(Address address, Code* target); 659 static void Clear(Address address, Code* target);
646 660
647 friend class IC; 661 friend class IC;
648 }; 662 };
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
749 void patch(Code* code); 763 void patch(Code* code);
750 }; 764 };
751 765
752 766
753 // Helper for BinaryOpIC and CompareIC. 767 // Helper for BinaryOpIC and CompareIC.
754 void PatchInlinedSmiCode(Address address); 768 void PatchInlinedSmiCode(Address address);
755 769
756 } } // namespace v8::internal 770 } } // namespace v8::internal
757 771
758 #endif // V8_IC_H_ 772 #endif // V8_IC_H_
OLDNEW
« no previous file with comments | « src/frames.cc ('k') | src/ic.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698