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

Side by Side Diff: src/frames.h

Issue 1712003003: Add WasmFrame, backtraces reflect wasm's presence (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 10 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 | « no previous file | src/frames.cc » ('j') | src/isolate.cc » ('J')
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 // 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_FRAMES_H_ 5 #ifndef V8_FRAMES_H_
6 #define V8_FRAMES_H_ 6 #define V8_FRAMES_H_
7 7
8 #include "src/allocation.h" 8 #include "src/allocation.h"
9 #include "src/handles.h" 9 #include "src/handles.h"
10 #include "src/safepoint-table.h" 10 #include "src/safepoint-table.h"
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
90 // Get the next stack handler in the chain. 90 // Get the next stack handler in the chain.
91 inline StackHandler* next() const; 91 inline StackHandler* next() const;
92 92
93 // Conversion support. 93 // Conversion support.
94 static inline StackHandler* FromAddress(Address address); 94 static inline StackHandler* FromAddress(Address address);
95 95
96 private: 96 private:
97 DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler); 97 DISALLOW_IMPLICIT_CONSTRUCTORS(StackHandler);
98 }; 98 };
99 99
100
101 #define STACK_FRAME_TYPE_LIST(V) \ 100 #define STACK_FRAME_TYPE_LIST(V) \
102 V(ENTRY, EntryFrame) \ 101 V(ENTRY, EntryFrame) \
103 V(ENTRY_CONSTRUCT, EntryConstructFrame) \ 102 V(ENTRY_CONSTRUCT, EntryConstructFrame) \
104 V(EXIT, ExitFrame) \ 103 V(EXIT, ExitFrame) \
105 V(JAVA_SCRIPT, JavaScriptFrame) \ 104 V(JAVA_SCRIPT, JavaScriptFrame) \
106 V(OPTIMIZED, OptimizedFrame) \ 105 V(OPTIMIZED, OptimizedFrame) \
106 V(WASM, WasmFrame) \
107 V(INTERPRETED, InterpretedFrame) \ 107 V(INTERPRETED, InterpretedFrame) \
108 V(STUB, StubFrame) \ 108 V(STUB, StubFrame) \
109 V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \ 109 V(STUB_FAILURE_TRAMPOLINE, StubFailureTrampolineFrame) \
110 V(INTERNAL, InternalFrame) \ 110 V(INTERNAL, InternalFrame) \
111 V(CONSTRUCT, ConstructFrame) \ 111 V(CONSTRUCT, ConstructFrame) \
112 V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame) 112 V(ARGUMENTS_ADAPTOR, ArgumentsAdaptorFrame)
113 113
114 // Every pointer in a frame has a slot id. On 32-bit platforms, doubles consume 114 // Every pointer in a frame has a slot id. On 32-bit platforms, doubles consume
115 // two slots. 115 // two slots.
116 // 116 //
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
303 this->iterator_ = NULL; 303 this->iterator_ = NULL;
304 this->isolate_ = original.isolate_; 304 this->isolate_ = original.isolate_;
305 } 305 }
306 306
307 // Type testers. 307 // Type testers.
308 bool is_entry() const { return type() == ENTRY; } 308 bool is_entry() const { return type() == ENTRY; }
309 bool is_entry_construct() const { return type() == ENTRY_CONSTRUCT; } 309 bool is_entry_construct() const { return type() == ENTRY_CONSTRUCT; }
310 bool is_exit() const { return type() == EXIT; } 310 bool is_exit() const { return type() == EXIT; }
311 bool is_optimized() const { return type() == OPTIMIZED; } 311 bool is_optimized() const { return type() == OPTIMIZED; }
312 bool is_interpreted() const { return type() == INTERPRETED; } 312 bool is_interpreted() const { return type() == INTERPRETED; }
313 bool is_wasm() const { return type() == WASM; }
313 bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; } 314 bool is_arguments_adaptor() const { return type() == ARGUMENTS_ADAPTOR; }
314 bool is_internal() const { return type() == INTERNAL; } 315 bool is_internal() const { return type() == INTERNAL; }
315 bool is_stub_failure_trampoline() const { 316 bool is_stub_failure_trampoline() const {
316 return type() == STUB_FAILURE_TRAMPOLINE; 317 return type() == STUB_FAILURE_TRAMPOLINE;
317 } 318 }
318 bool is_construct() const { return type() == CONSTRUCT; } 319 bool is_construct() const { return type() == CONSTRUCT; }
319 virtual bool is_standard() const { return false; } 320 virtual bool is_standard() const { return false; }
320 321
321 bool is_java_script() const { 322 bool is_java_script() const {
322 Type type = this->type(); 323 Type type = this->type();
323 return (type == JAVA_SCRIPT) || (type == OPTIMIZED) || 324 return (type == JAVA_SCRIPT) || (type == OPTIMIZED) ||
324 (type == INTERPRETED); 325 (type == INTERPRETED);
325 } 326 }
326 327
328 bool is_visible() const {
329 Type type = this->type();
330 return is_java_script() || (type == WASM);
331 }
332
327 // Accessors. 333 // Accessors.
328 Address sp() const { return state_.sp; } 334 Address sp() const { return state_.sp; }
329 Address fp() const { return state_.fp; } 335 Address fp() const { return state_.fp; }
330 Address caller_sp() const { return GetCallerStackPointer(); } 336 Address caller_sp() const { return GetCallerStackPointer(); }
331 337
332 // If this frame is optimized and was dynamically aligned return its old 338 // If this frame is optimized and was dynamically aligned return its old
333 // unaligned frame pointer. When the frame is deoptimized its FP will shift 339 // unaligned frame pointer. When the frame is deoptimized its FP will shift
334 // up one word and become unaligned. 340 // up one word and become unaligned.
335 Address UnpaddedFP() const; 341 Address UnpaddedFP() const;
336 342
(...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after
610 void Print(); 616 void Print();
611 617
612 private: 618 private:
613 Handle<Object> receiver_; 619 Handle<Object> receiver_;
614 Handle<JSFunction> function_; 620 Handle<JSFunction> function_;
615 Handle<AbstractCode> abstract_code_; 621 Handle<AbstractCode> abstract_code_;
616 int code_offset_; 622 int code_offset_;
617 bool is_constructor_; 623 bool is_constructor_;
618 }; 624 };
619 625
626 class VisibleFrame : public StandardFrame {
627 public:
628 // Build a list with summaries for this frame including all inlined frames.
629 virtual void Summarize(List<FrameSummary>* frames) = 0;
620 630
621 class JavaScriptFrame: public StandardFrame { 631 static VisibleFrame* cast(StackFrame* frame) {
632 DCHECK(frame->is_visible());
633 return static_cast<VisibleFrame*>(frame);
634 }
635
636 protected:
637 inline explicit VisibleFrame(StackFrameIteratorBase* iterator);
638
639 private:
640 friend class StackFrameIteratorBase;
641 };
642
643 class JavaScriptFrame : public VisibleFrame {
622 public: 644 public:
623 Type type() const override { return JAVA_SCRIPT; } 645 Type type() const override { return JAVA_SCRIPT; }
624 646
625 // Accessors. 647 // Accessors.
626 inline JSFunction* function() const; 648 inline JSFunction* function() const;
627 inline Object* receiver() const; 649 inline Object* receiver() const;
628 inline void set_receiver(Object* value); 650 inline void set_receiver(Object* value);
629 651
630 // Access the parameters. 652 // Access the parameters.
631 inline Address GetParameterSlot(int index) const; 653 inline Address GetParameterSlot(int index) const;
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
666 void Print(StringStream* accumulator, PrintMode mode, 688 void Print(StringStream* accumulator, PrintMode mode,
667 int index) const override; 689 int index) const override;
668 690
669 // Determine the code for the frame. 691 // Determine the code for the frame.
670 Code* unchecked_code() const override; 692 Code* unchecked_code() const override;
671 693
672 // Return a list with JSFunctions of this frame. 694 // Return a list with JSFunctions of this frame.
673 virtual void GetFunctions(List<JSFunction*>* functions) const; 695 virtual void GetFunctions(List<JSFunction*>* functions) const;
674 696
675 // Build a list with summaries for this frame including all inlined frames. 697 // Build a list with summaries for this frame including all inlined frames.
676 virtual void Summarize(List<FrameSummary>* frames); 698 void Summarize(List<FrameSummary>* frames) override;
677 699
678 // Lookup exception handler for current {pc}, returns -1 if none found. Also 700 // Lookup exception handler for current {pc}, returns -1 if none found. Also
679 // returns data associated with the handler site specific to the frame type: 701 // returns data associated with the handler site specific to the frame type:
680 // - JavaScriptFrame : Data is the stack depth at entry of the try-block. 702 // - JavaScriptFrame : Data is the stack depth at entry of the try-block.
681 // - OptimizedFrame : Data is the stack slot count of the entire frame. 703 // - OptimizedFrame : Data is the stack slot count of the entire frame.
682 // - InterpretedFrame: Data is the register index holding the context. 704 // - InterpretedFrame: Data is the register index holding the context.
683 virtual int LookupExceptionHandlerInTable( 705 virtual int LookupExceptionHandlerInTable(
684 int* data, HandlerTable::CatchPrediction* prediction); 706 int* data, HandlerTable::CatchPrediction* prediction);
685 707
686 // Architecture-specific register description. 708 // Architecture-specific register description.
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
834 inline explicit ArgumentsAdaptorFrame(StackFrameIteratorBase* iterator); 856 inline explicit ArgumentsAdaptorFrame(StackFrameIteratorBase* iterator);
835 857
836 int GetNumberOfIncomingArguments() const override; 858 int GetNumberOfIncomingArguments() const override;
837 859
838 Address GetCallerStackPointer() const override; 860 Address GetCallerStackPointer() const override;
839 861
840 private: 862 private:
841 friend class StackFrameIteratorBase; 863 friend class StackFrameIteratorBase;
842 }; 864 };
843 865
866 class WasmFrame : public VisibleFrame {
867 public:
868 Type type() const override { return WASM; }
869
870 // GC support.
871 void Iterate(ObjectVisitor* v) const override;
872
873 // Printing support.
874 void Print(StringStream* accumulator, PrintMode mode,
875 int index) const override;
876
877 // Determine the code for the frame.
878 Code* unchecked_code() const override;
879
880 void Summarize(List<FrameSummary>* frames) override;
881
882 protected:
883 inline explicit WasmFrame(StackFrameIteratorBase* iterator);
884
885 Address GetCallerStackPointer() const override;
886
887 private:
888 friend class StackFrameIteratorBase;
889 };
844 890
845 class InternalFrame: public StandardFrame { 891 class InternalFrame: public StandardFrame {
846 public: 892 public:
847 Type type() const override { return INTERNAL; } 893 Type type() const override { return INTERNAL; }
848 894
849 // Garbage collection support. 895 // Garbage collection support.
850 void Iterate(ObjectVisitor* v) const override; 896 void Iterate(ObjectVisitor* v) const override;
851 897
852 // Determine the code for the frame. 898 // Determine the code for the frame.
853 Code* unchecked_code() const override; 899 Code* unchecked_code() const override;
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
967 } 1013 }
968 void Advance(); 1014 void Advance();
969 1015
970 private: 1016 private:
971 // Go back to the first frame. 1017 // Go back to the first frame.
972 void Reset(ThreadLocalTop* top); 1018 void Reset(ThreadLocalTop* top);
973 1019
974 DISALLOW_COPY_AND_ASSIGN(StackFrameIterator); 1020 DISALLOW_COPY_AND_ASSIGN(StackFrameIterator);
975 }; 1021 };
976 1022
1023 // Iterator that supports iterating through all Visible frames.
1024 class VisibleFrameIterator BASE_EMBEDDED {
1025 public:
1026 inline explicit VisibleFrameIterator(Isolate* isolate);
1027
1028 inline VisibleFrame* frame() const;
1029
1030 bool done() const { return iterator_.done(); }
1031 void Advance();
1032
1033 protected:
1034 struct NoAdvance {}; // Sentinel: construct iterator_, but don't advance it.
1035 inline VisibleFrameIterator(Isolate* isolate, NoAdvance);
1036 inline VisibleFrameIterator(Isolate* isolate, ThreadLocalTop* top, NoAdvance);
1037 StackFrameIterator iterator_;
1038 };
977 1039
978 // Iterator that supports iterating through all JavaScript frames. 1040 // Iterator that supports iterating through all JavaScript frames.
979 class JavaScriptFrameIterator BASE_EMBEDDED { 1041 class JavaScriptFrameIterator : public VisibleFrameIterator {
980 public: 1042 public:
981 inline explicit JavaScriptFrameIterator(Isolate* isolate); 1043 inline explicit JavaScriptFrameIterator(Isolate* isolate);
982 inline JavaScriptFrameIterator(Isolate* isolate, ThreadLocalTop* top); 1044 inline JavaScriptFrameIterator(Isolate* isolate, ThreadLocalTop* top);
983 // Skip frames until the frame with the given id is reached. 1045 // Skip frames until the frame with the given id is reached.
984 JavaScriptFrameIterator(Isolate* isolate, StackFrame::Id id); 1046 JavaScriptFrameIterator(Isolate* isolate, StackFrame::Id id);
985 1047
986 inline JavaScriptFrame* frame() const; 1048 inline JavaScriptFrame* frame() const;
987 1049
988 bool done() const { return iterator_.done(); }
989 void Advance(); 1050 void Advance();
990 1051
991 // Advance to the frame holding the arguments for the current 1052 // Advance to the frame holding the arguments for the current
992 // frame. This only affects the current frame if it has adapted 1053 // frame. This only affects the current frame if it has adapted
993 // arguments. 1054 // arguments.
994 void AdvanceToArgumentsFrame(); 1055 void AdvanceToArgumentsFrame();
995
996 private:
997 StackFrameIterator iterator_;
998 }; 1056 };
999 1057
1000 1058
1001 // NOTE: The stack trace frame iterator is an iterator that only 1059 // NOTE: The stack trace frame iterator is an iterator that only
1002 // traverse proper JavaScript frames; that is JavaScript frames that 1060 // traverse proper JavaScript frames; that is JavaScript frames that
1003 // have proper JavaScript functions. This excludes the problematic 1061 // have proper JavaScript functions. This excludes the problematic
1004 // functions in runtime.js. 1062 // functions in runtime.js.
1005 class StackTraceFrameIterator: public JavaScriptFrameIterator { 1063 class StackTraceFrameIterator: public JavaScriptFrameIterator {
1006 public: 1064 public:
1007 explicit StackTraceFrameIterator(Isolate* isolate); 1065 explicit StackTraceFrameIterator(Isolate* isolate);
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
1055 1113
1056 1114
1057 // Reads all frames on the current stack and copies them into the current 1115 // Reads all frames on the current stack and copies them into the current
1058 // zone memory. 1116 // zone memory.
1059 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); 1117 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone);
1060 1118
1061 } // namespace internal 1119 } // namespace internal
1062 } // namespace v8 1120 } // namespace v8
1063 1121
1064 #endif // V8_FRAMES_H_ 1122 #endif // V8_FRAMES_H_
OLDNEW
« no previous file with comments | « no previous file | src/frames.cc » ('j') | src/isolate.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698