diff options
author | Trevor Norris <trev.norris@gmail.com> | 2013-03-18 13:49:34 -0700 |
---|---|---|
committer | Ben Noordhuis <info@bnoordhuis.nl> | 2013-03-20 01:11:01 +0100 |
commit | 83261e789eb903da39f279cb5a161611482e7df5 (patch) | |
tree | 4133b5ca9f53bed4365e1a94544a227d68a0cf12 /deps/v8/src/deoptimizer.h | |
parent | a05f973f82d2be8527aad4c371d40d3c7e4c564e (diff) | |
download | android-node-v8-83261e789eb903da39f279cb5a161611482e7df5.tar.gz android-node-v8-83261e789eb903da39f279cb5a161611482e7df5.tar.bz2 android-node-v8-83261e789eb903da39f279cb5a161611482e7df5.zip |
deps: update v8 to 3.17.13
Diffstat (limited to 'deps/v8/src/deoptimizer.h')
-rw-r--r-- | deps/v8/src/deoptimizer.h | 124 |
1 files changed, 93 insertions, 31 deletions
diff --git a/deps/v8/src/deoptimizer.h b/deps/v8/src/deoptimizer.h index f67f986ba1..db0cc0bdeb 100644 --- a/deps/v8/src/deoptimizer.h +++ b/deps/v8/src/deoptimizer.h @@ -87,19 +87,33 @@ class OptimizedFunctionVisitor BASE_EMBEDDED { }; +class OptimizedFunctionFilter BASE_EMBEDDED { + public: + virtual ~OptimizedFunctionFilter() {} + + virtual bool TakeFunction(JSFunction* function) = 0; +}; + + class Deoptimizer; class DeoptimizerData { public: - DeoptimizerData(); + explicit DeoptimizerData(MemoryAllocator* allocator); ~DeoptimizerData(); #ifdef ENABLE_DEBUGGER_SUPPORT void Iterate(ObjectVisitor* v); #endif + Code* FindDeoptimizingCode(Address addr); + void RemoveDeoptimizingCode(Code* code); + private: + MemoryAllocator* allocator_; + int eager_deoptimization_entry_code_entries_; + int lazy_deoptimization_entry_code_entries_; MemoryChunk* eager_deoptimization_entry_code_; MemoryChunk* lazy_deoptimization_entry_code_; Deoptimizer* current_; @@ -131,8 +145,14 @@ class Deoptimizer : public Malloced { DEBUGGER }; + static bool TraceEnabledFor(BailoutType deopt_type, + StackFrame::Type frame_type); + static const char* MessageFor(BailoutType type); + int output_count() const { return output_count_; } + Code::Kind compiled_code_kind() const { return compiled_code_->kind(); } + // Number of created JS frames. Not all created frames are necessarily JS. int jsframe_count() const { return jsframe_count_; } @@ -171,17 +191,21 @@ class Deoptimizer : public Malloced { static void ReplaceCodeForRelatedFunctions(JSFunction* function, Code* code); // Deoptimize all functions in the heap. - static void DeoptimizeAll(); + static void DeoptimizeAll(Isolate* isolate); static void DeoptimizeGlobalObject(JSObject* object); + static void DeoptimizeAllFunctionsWith(Isolate* isolate, + OptimizedFunctionFilter* filter); + + static void DeoptimizeAllFunctionsForContext( + Context* context, OptimizedFunctionFilter* filter); + static void VisitAllOptimizedFunctionsForContext( Context* context, OptimizedFunctionVisitor* visitor); - static void VisitAllOptimizedFunctionsForGlobalObject( - JSObject* object, OptimizedFunctionVisitor* visitor); - - static void VisitAllOptimizedFunctions(OptimizedFunctionVisitor* visitor); + static void VisitAllOptimizedFunctions(Isolate* isolate, + OptimizedFunctionVisitor* visitor); // The size in bytes of the code required at a lazy deopt patch site. static int patch_size(); @@ -226,8 +250,21 @@ class Deoptimizer : public Malloced { static void ComputeOutputFrames(Deoptimizer* deoptimizer); - static Address GetDeoptimizationEntry(int id, BailoutType type); - static int GetDeoptimizationId(Address addr, BailoutType type); + + enum GetEntryMode { + CALCULATE_ENTRY_ADDRESS, + ENSURE_ENTRY_CODE + }; + + + static Address GetDeoptimizationEntry( + Isolate* isolate, + int id, + BailoutType type, + GetEntryMode mode = ENSURE_ENTRY_CODE); + static int GetDeoptimizationId(Isolate* isolate, + Address addr, + BailoutType type); static int GetOutputInfo(DeoptimizationOutputData* data, BailoutId node_id, SharedFunctionInfo* shared); @@ -283,8 +320,17 @@ class Deoptimizer : public Malloced { int ConvertJSFrameIndexToFrameIndex(int jsframe_index); + static size_t GetMaxDeoptTableSize(); + + static void EnsureCodeForDeoptimizationEntry(Isolate* isolate, + BailoutType type, + int max_entry_id); + + Isolate* isolate() const { return isolate_; } + private: - static const int kNumberOfEntries = 16384; + static const int kMinNumberOfEntries = 64; + static const int kMaxNumberOfEntries = 16384; Deoptimizer(Isolate* isolate, JSFunction* function, @@ -293,6 +339,9 @@ class Deoptimizer : public Malloced { Address from, int fp_to_sp_delta, Code* optimized_code); + Code* FindOptimizedCode(JSFunction* function, Code* optimized_code); + void Trace(); + void PrintFunctionName(); void DeleteFrameDescriptions(); void DoComputeOutputFrames(); @@ -305,6 +354,8 @@ class Deoptimizer : public Malloced { void DoComputeAccessorStubFrame(TranslationIterator* iterator, int frame_index, bool is_setter_stub_frame); + void DoComputeCompiledStubFrame(TranslationIterator* iterator, + int frame_index); void DoTranslateCommand(TranslationIterator* iterator, int frame_index, unsigned output_offset); @@ -327,24 +378,35 @@ class Deoptimizer : public Malloced { void AddArgumentsObjectValue(intptr_t value); void AddDoubleValue(intptr_t slot_address, double value); - static MemoryChunk* CreateCode(BailoutType type); static void GenerateDeoptimizationEntries( MacroAssembler* masm, int count, BailoutType type); // Weak handle callback for deoptimizing code objects. - static void HandleWeakDeoptimizedCode( - v8::Persistent<v8::Value> obj, void* data); - static Code* FindDeoptimizingCodeFromAddress(Address addr); - static void RemoveDeoptimizingCode(Code* code); + static void HandleWeakDeoptimizedCode(v8::Isolate* isolate, + v8::Persistent<v8::Value> obj, + void* data); + + // Deoptimize function assuming that function->next_function_link() points + // to a list that contains all functions that share the same optimized code. + static void DeoptimizeFunctionWithPreparedFunctionList(JSFunction* function); // Fill the input from from a JavaScript frame. This is used when // the debugger needs to inspect an optimized frame. For normal // deoptimizations the input frame is filled in generated code. void FillInputFrame(Address tos, JavaScriptFrame* frame); + // Fill the given output frame's registers to contain the failure handler + // address and the number of parameters for a stub failure trampoline. + void SetPlatformCompiledStubRegisters(FrameDescription* output_frame, + CodeStubInterfaceDescriptor* desc); + + // Fill the given output frame's double registers with the original values + // from the input frame's double registers. + void CopyDoubleRegisters(FrameDescription* output_frame); + Isolate* isolate_; JSFunction* function_; - Code* optimized_code_; + Code* compiled_code_; unsigned bailout_id_; BailoutType bailout_type_; Address from_; @@ -364,6 +426,8 @@ class Deoptimizer : public Malloced { List<ArgumentsObjectMaterializationDescriptor> deferred_arguments_objects_; List<HeapNumberMaterializationDescriptor> deferred_heap_numbers_; + bool trace_; + static const int table_entry_size_; friend class FrameDescription; @@ -514,16 +578,13 @@ class FrameDescription { uintptr_t frame_size_; // Number of bytes. JSFunction* function_; intptr_t registers_[Register::kNumRegisters]; - double double_registers_[DoubleRegister::kNumAllocatableRegisters]; + double double_registers_[DoubleRegister::kMaxNumRegisters]; intptr_t top_; intptr_t pc_; intptr_t fp_; intptr_t context_; StackFrame::Type type_; Smi* state_; -#ifdef DEBUG - Code::Kind kind_; -#endif // Continuation is the PC where the execution continues after // deoptimizing. @@ -550,7 +611,7 @@ class TranslationBuffer BASE_EMBEDDED { int CurrentIndex() const { return contents_.length(); } void Add(int32_t value, Zone* zone); - Handle<ByteArray> CreateByteArray(); + Handle<ByteArray> CreateByteArray(Factory* factory); private: ZoneList<uint8_t> contents_; @@ -587,6 +648,7 @@ class Translation BASE_EMBEDDED { GETTER_STUB_FRAME, SETTER_STUB_FRAME, ARGUMENTS_ADAPTOR_FRAME, + COMPILED_STUB_FRAME, REGISTER, INT32_REGISTER, UINT32_REGISTER, @@ -617,6 +679,7 @@ class Translation BASE_EMBEDDED { // Commands. void BeginJSFrame(BailoutId node_id, int literal_id, unsigned height); + void BeginCompiledStubFrame(); void BeginArgumentsAdaptorFrame(int literal_id, unsigned height); void BeginConstructStubFrame(int literal_id, unsigned height); void BeginGetterStubFrame(int literal_id); @@ -630,7 +693,7 @@ class Translation BASE_EMBEDDED { void StoreUint32StackSlot(int index); void StoreDoubleStackSlot(int index); void StoreLiteral(int literal_id); - void StoreArgumentsObject(int args_index, int args_length); + void StoreArgumentsObject(bool args_known, int args_index, int args_length); void MarkDuplicate(); Zone* zone() const { return zone_; } @@ -688,36 +751,35 @@ class SlotRef BASE_EMBEDDED { SlotRef(Address addr, SlotRepresentation representation) : addr_(addr), representation_(representation) { } - explicit SlotRef(Object* literal) - : literal_(literal), representation_(LITERAL) { } + SlotRef(Isolate* isolate, Object* literal) + : literal_(literal, isolate), representation_(LITERAL) { } - Handle<Object> GetValue() { + Handle<Object> GetValue(Isolate* isolate) { switch (representation_) { case TAGGED: - return Handle<Object>(Memory::Object_at(addr_)); + return Handle<Object>(Memory::Object_at(addr_), isolate); case INT32: { int value = Memory::int32_at(addr_); if (Smi::IsValid(value)) { - return Handle<Object>(Smi::FromInt(value)); + return Handle<Object>(Smi::FromInt(value), isolate); } else { - return Isolate::Current()->factory()->NewNumberFromInt(value); + return isolate->factory()->NewNumberFromInt(value); } } case UINT32: { uint32_t value = Memory::uint32_at(addr_); if (value <= static_cast<uint32_t>(Smi::kMaxValue)) { - return Handle<Object>(Smi::FromInt(static_cast<int>(value))); + return Handle<Object>(Smi::FromInt(static_cast<int>(value)), isolate); } else { - return Isolate::Current()->factory()->NewNumber( - static_cast<double>(value)); + return isolate->factory()->NewNumber(static_cast<double>(value)); } } case DOUBLE: { double value = Memory::double_at(addr_); - return Isolate::Current()->factory()->NewNumber(value); + return isolate->factory()->NewNumber(value); } case LITERAL: |