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

Side by Side Diff: src/deoptimizer.h

Issue 23444029: Add OptimizedCodeList and DeoptimizedCodeList to native contexts. Both lists are weak. This makes i… (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed final comments. Created 7 years, 3 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
« no previous file with comments | « src/contexts.cc ('k') | src/deoptimizer.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 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 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 } c; 51 } c;
52 c.u[0] = *reinterpret_cast<uint32_t*>(p); 52 c.u[0] = *reinterpret_cast<uint32_t*>(p);
53 c.u[1] = *reinterpret_cast<uint32_t*>(p + 4); 53 c.u[1] = *reinterpret_cast<uint32_t*>(p + 4);
54 return c.d; 54 return c.d;
55 #endif // V8_HOST_CAN_READ_UNALIGNED 55 #endif // V8_HOST_CAN_READ_UNALIGNED
56 } 56 }
57 57
58 58
59 class FrameDescription; 59 class FrameDescription;
60 class TranslationIterator; 60 class TranslationIterator;
61 class DeoptimizingCodeListNode;
62 class DeoptimizedFrameInfo; 61 class DeoptimizedFrameInfo;
63 62
64 class HeapNumberMaterializationDescriptor BASE_EMBEDDED { 63 class HeapNumberMaterializationDescriptor BASE_EMBEDDED {
65 public: 64 public:
66 HeapNumberMaterializationDescriptor(Address slot_address, double val) 65 HeapNumberMaterializationDescriptor(Address slot_address, double val)
67 : slot_address_(slot_address), val_(val) { } 66 : slot_address_(slot_address), val_(val) { }
68 67
69 Address slot_address() const { return slot_address_; } 68 Address slot_address() const { return slot_address_; }
70 double value() const { return val_; } 69 double value() const { return val_; }
71 70
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
114 virtual void EnterContext(Context* context) = 0; 113 virtual void EnterContext(Context* context) = 0;
115 114
116 virtual void VisitFunction(JSFunction* function) = 0; 115 virtual void VisitFunction(JSFunction* function) = 0;
117 116
118 // Function which is called after iteration of all optimized functions 117 // Function which is called after iteration of all optimized functions
119 // from given native context. 118 // from given native context.
120 virtual void LeaveContext(Context* context) = 0; 119 virtual void LeaveContext(Context* context) = 0;
121 }; 120 };
122 121
123 122
124 class OptimizedFunctionFilter BASE_EMBEDDED {
125 public:
126 virtual ~OptimizedFunctionFilter() {}
127
128 virtual bool TakeFunction(JSFunction* function) = 0;
129 };
130
131
132 class Deoptimizer;
133
134
135 class Deoptimizer : public Malloced { 123 class Deoptimizer : public Malloced {
136 public: 124 public:
137 enum BailoutType { 125 enum BailoutType {
138 EAGER, 126 EAGER,
139 LAZY, 127 LAZY,
140 SOFT, 128 SOFT,
141 OSR, 129 OSR,
142 // This last bailout type is not really a bailout, but used by the 130 // This last bailout type is not really a bailout, but used by the
143 // debugger to deoptimize stack frames to allow inspection. 131 // debugger to deoptimize stack frames to allow inspection.
144 DEBUGGER 132 DEBUGGER
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
201 // patching. If there is not enough room a new relocation 189 // patching. If there is not enough room a new relocation
202 // information object is allocated and comments are added until it 190 // information object is allocated and comments are added until it
203 // is big enough. 191 // is big enough.
204 static void EnsureRelocSpaceForLazyDeoptimization(Handle<Code> code); 192 static void EnsureRelocSpaceForLazyDeoptimization(Handle<Code> code);
205 193
206 // Deoptimize the function now. Its current optimized code will never be run 194 // Deoptimize the function now. Its current optimized code will never be run
207 // again and any activations of the optimized code will get deoptimized when 195 // again and any activations of the optimized code will get deoptimized when
208 // execution returns. 196 // execution returns.
209 static void DeoptimizeFunction(JSFunction* function); 197 static void DeoptimizeFunction(JSFunction* function);
210 198
211 // Iterate over all the functions which share the same code object 199 // Deoptimize all code in the given isolate.
212 // and make them use unoptimized version.
213 static void ReplaceCodeForRelatedFunctions(JSFunction* function, Code* code);
214
215 // Deoptimize all functions in the heap.
216 static void DeoptimizeAll(Isolate* isolate); 200 static void DeoptimizeAll(Isolate* isolate);
217 201
202 // Deoptimize code associated with the given global object.
218 static void DeoptimizeGlobalObject(JSObject* object); 203 static void DeoptimizeGlobalObject(JSObject* object);
219 204
220 static void DeoptimizeAllFunctionsWith(Isolate* isolate, 205 // Deoptimizes all optimized code that has been previously marked
221 OptimizedFunctionFilter* filter); 206 // (via code->set_marked_for_deoptimization) and unlinks all functions that
207 // refer to that code.
208 static void DeoptimizeMarkedCode(Isolate* isolate);
222 209
223 static void DeoptimizeCodeList(Isolate* isolate, ZoneList<Code*>* codes); 210 // Visit all the known optimized functions in a given isolate.
224 211 static void VisitAllOptimizedFunctions(
225 static void DeoptimizeAllFunctionsForContext( 212 Isolate* isolate, OptimizedFunctionVisitor* visitor);
226 Context* context, OptimizedFunctionFilter* filter);
227
228 static void VisitAllOptimizedFunctionsForContext(
229 Context* context, OptimizedFunctionVisitor* visitor);
230
231 static void VisitAllOptimizedFunctions(Isolate* isolate,
232 OptimizedFunctionVisitor* visitor);
233 213
234 // The size in bytes of the code required at a lazy deopt patch site. 214 // The size in bytes of the code required at a lazy deopt patch site.
235 static int patch_size(); 215 static int patch_size();
236 216
237 // Patch all interrupts with allowed loop depth in the unoptimized code to 217 // Patch all interrupts with allowed loop depth in the unoptimized code to
238 // unconditionally call replacement_code. 218 // unconditionally call replacement_code.
239 static void PatchInterruptCode(Isolate* isolate, 219 static void PatchInterruptCode(Isolate* isolate,
240 Code* unoptimized_code); 220 Code* unoptimized_code);
241 221
242 // Patch the interrupt at the instruction before pc_after in 222 // Patch the interrupt at the instruction before pc_after in
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after
435 return jsframe_functions_[reverse_jsframe_index]; 415 return jsframe_functions_[reverse_jsframe_index];
436 } 416 }
437 417
438 // Helper function for heap object materialization. 418 // Helper function for heap object materialization.
439 Handle<Object> MaterializeNextHeapObject(); 419 Handle<Object> MaterializeNextHeapObject();
440 Handle<Object> MaterializeNextValue(); 420 Handle<Object> MaterializeNextValue();
441 421
442 static void GenerateDeoptimizationEntries( 422 static void GenerateDeoptimizationEntries(
443 MacroAssembler* masm, int count, BailoutType type); 423 MacroAssembler* masm, int count, BailoutType type);
444 424
445 // Weak handle callback for deoptimizing code objects. 425 // Marks all the code in the given context for deoptimization.
446 static void HandleWeakDeoptimizedCode(v8::Isolate* isolate, 426 static void MarkAllCodeForContext(Context* native_context);
447 v8::Persistent<v8::Value>* obj,
448 void* data);
449 427
450 // Deoptimize the given code and add to appropriate deoptimization lists. 428 // Visit all the known optimized functions in a given context.
451 static void DeoptimizeCode(Isolate* isolate, Code* code); 429 static void VisitAllOptimizedFunctionsForContext(
430 Context* context, OptimizedFunctionVisitor* visitor);
431
432 // Deoptimizes all code marked in the given context.
433 static void DeoptimizeMarkedCodeForContext(Context* native_context);
452 434
453 // Patch the given code so that it will deoptimize itself. 435 // Patch the given code so that it will deoptimize itself.
454 static void PatchCodeForDeoptimization(Isolate* isolate, Code* code); 436 static void PatchCodeForDeoptimization(Isolate* isolate, Code* code);
455 437
438 // Searches the list of known deoptimizing code for a Code object
439 // containing the given address (which is supposedly faster than
440 // searching all code objects).
441 Code* FindDeoptimizingCode(Address addr);
442
456 // Fill the input from from a JavaScript frame. This is used when 443 // Fill the input from from a JavaScript frame. This is used when
457 // the debugger needs to inspect an optimized frame. For normal 444 // the debugger needs to inspect an optimized frame. For normal
458 // deoptimizations the input frame is filled in generated code. 445 // deoptimizations the input frame is filled in generated code.
459 void FillInputFrame(Address tos, JavaScriptFrame* frame); 446 void FillInputFrame(Address tos, JavaScriptFrame* frame);
460 447
461 // Fill the given output frame's registers to contain the failure handler 448 // Fill the given output frame's registers to contain the failure handler
462 // address and the number of parameters for a stub failure trampoline. 449 // address and the number of parameters for a stub failure trampoline.
463 void SetPlatformCompiledStubRegisters(FrameDescription* output_frame, 450 void SetPlatformCompiledStubRegisters(FrameDescription* output_frame,
464 CodeStubInterfaceDescriptor* desc); 451 CodeStubInterfaceDescriptor* desc);
465 452
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 494
508 #ifdef DEBUG 495 #ifdef DEBUG
509 DisallowHeapAllocation* disallow_heap_allocation_; 496 DisallowHeapAllocation* disallow_heap_allocation_;
510 #endif // DEBUG 497 #endif // DEBUG
511 498
512 bool trace_; 499 bool trace_;
513 500
514 static const int table_entry_size_; 501 static const int table_entry_size_;
515 502
516 friend class FrameDescription; 503 friend class FrameDescription;
517 friend class DeoptimizingCodeListNode;
518 friend class DeoptimizedFrameInfo; 504 friend class DeoptimizedFrameInfo;
519 }; 505 };
520 506
521 507
522 class FrameDescription { 508 class FrameDescription {
523 public: 509 public:
524 FrameDescription(uint32_t frame_size, 510 FrameDescription(uint32_t frame_size,
525 JSFunction* function); 511 JSFunction* function);
526 512
527 void* operator new(size_t size, uint32_t frame_size) { 513 void* operator new(size_t size, uint32_t frame_size) {
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
681 667
682 class DeoptimizerData { 668 class DeoptimizerData {
683 public: 669 public:
684 explicit DeoptimizerData(MemoryAllocator* allocator); 670 explicit DeoptimizerData(MemoryAllocator* allocator);
685 ~DeoptimizerData(); 671 ~DeoptimizerData();
686 672
687 #ifdef ENABLE_DEBUGGER_SUPPORT 673 #ifdef ENABLE_DEBUGGER_SUPPORT
688 void Iterate(ObjectVisitor* v); 674 void Iterate(ObjectVisitor* v);
689 #endif 675 #endif
690 676
691 Code* FindDeoptimizingCode(Address addr);
692 void RemoveDeoptimizingCode(Code* code);
693
694 private: 677 private:
695 MemoryAllocator* allocator_; 678 MemoryAllocator* allocator_;
696 int deopt_entry_code_entries_[Deoptimizer::kBailoutTypesWithCodeEntry]; 679 int deopt_entry_code_entries_[Deoptimizer::kBailoutTypesWithCodeEntry];
697 MemoryChunk* deopt_entry_code_[Deoptimizer::kBailoutTypesWithCodeEntry]; 680 MemoryChunk* deopt_entry_code_[Deoptimizer::kBailoutTypesWithCodeEntry];
698 Deoptimizer* current_;
699 681
700 #ifdef ENABLE_DEBUGGER_SUPPORT 682 #ifdef ENABLE_DEBUGGER_SUPPORT
701 DeoptimizedFrameInfo* deoptimized_frame_info_; 683 DeoptimizedFrameInfo* deoptimized_frame_info_;
702 #endif 684 #endif
703 685
704 // List of deoptimized code which still have references from active stack 686 Deoptimizer* current_;
705 // frames. These code objects are needed by the deoptimizer when deoptimizing
706 // a frame for which the code object for the function function has been
707 // changed from the code present when deoptimizing was done.
708 DeoptimizingCodeListNode* deoptimizing_code_list_;
709 687
710 friend class Deoptimizer; 688 friend class Deoptimizer;
711 689
712 DISALLOW_COPY_AND_ASSIGN(DeoptimizerData); 690 DISALLOW_COPY_AND_ASSIGN(DeoptimizerData);
713 }; 691 };
714 692
715 693
716 class TranslationBuffer BASE_EMBEDDED { 694 class TranslationBuffer BASE_EMBEDDED {
717 public: 695 public:
718 explicit TranslationBuffer(Zone* zone) : contents_(256, zone) { } 696 explicit TranslationBuffer(Zone* zone) : contents_(256, zone) { }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
816 // A literal id which refers to the JSFunction itself. 794 // A literal id which refers to the JSFunction itself.
817 static const int kSelfLiteralId = -239; 795 static const int kSelfLiteralId = -239;
818 796
819 private: 797 private:
820 TranslationBuffer* buffer_; 798 TranslationBuffer* buffer_;
821 int index_; 799 int index_;
822 Zone* zone_; 800 Zone* zone_;
823 }; 801 };
824 802
825 803
826 // Linked list holding deoptimizing code objects. The deoptimizing code objects
827 // are kept as weak handles until they are no longer activated on the stack.
828 class DeoptimizingCodeListNode : public Malloced {
829 public:
830 explicit DeoptimizingCodeListNode(Code* code);
831 ~DeoptimizingCodeListNode();
832
833 DeoptimizingCodeListNode* next() const { return next_; }
834 void set_next(DeoptimizingCodeListNode* next) { next_ = next; }
835 Handle<Code> code() const { return code_; }
836
837 private:
838 // Global (weak) handle to the deoptimizing code object.
839 Handle<Code> code_;
840
841 // Next pointer for linked list.
842 DeoptimizingCodeListNode* next_;
843 };
844
845
846 class SlotRef BASE_EMBEDDED { 804 class SlotRef BASE_EMBEDDED {
847 public: 805 public:
848 enum SlotRepresentation { 806 enum SlotRepresentation {
849 UNKNOWN, 807 UNKNOWN,
850 TAGGED, 808 TAGGED,
851 INT32, 809 INT32,
852 UINT32, 810 UINT32,
853 DOUBLE, 811 DOUBLE,
854 LITERAL 812 LITERAL
855 }; 813 };
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
1004 Object** expression_stack_; 962 Object** expression_stack_;
1005 int source_position_; 963 int source_position_;
1006 964
1007 friend class Deoptimizer; 965 friend class Deoptimizer;
1008 }; 966 };
1009 #endif 967 #endif
1010 968
1011 } } // namespace v8::internal 969 } } // namespace v8::internal
1012 970
1013 #endif // V8_DEOPTIMIZER_H_ 971 #endif // V8_DEOPTIMIZER_H_
OLDNEW
« no previous file with comments | « src/contexts.cc ('k') | src/deoptimizer.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698