OLD | NEW |
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/flags.h" | 9 #include "src/flags.h" |
10 #include "src/handles.h" | 10 #include "src/handles.h" |
(...skipping 18 matching lines...) Expand all Loading... |
29 | 29 |
30 void SetUpJSCallerSavedCodeData(); | 30 void SetUpJSCallerSavedCodeData(); |
31 | 31 |
32 // Return the code of the n-th saved register available to JavaScript. | 32 // Return the code of the n-th saved register available to JavaScript. |
33 int JSCallerSavedCode(int n); | 33 int JSCallerSavedCode(int n); |
34 | 34 |
35 | 35 |
36 // Forward declarations. | 36 // Forward declarations. |
37 class ExternalCallbackScope; | 37 class ExternalCallbackScope; |
38 class Isolate; | 38 class Isolate; |
| 39 class RootVisitor; |
39 class StackFrameIteratorBase; | 40 class StackFrameIteratorBase; |
40 class ThreadLocalTop; | 41 class ThreadLocalTop; |
41 class WasmInstanceObject; | 42 class WasmInstanceObject; |
42 | 43 |
43 class InnerPointerToCodeCache { | 44 class InnerPointerToCodeCache { |
44 public: | 45 public: |
45 struct InnerPointerToCodeCacheEntry { | 46 struct InnerPointerToCodeCacheEntry { |
46 Address inner_pointer; | 47 Address inner_pointer; |
47 Code* code; | 48 Code* code; |
48 SafepointEntry safepoint_entry; | 49 SafepointEntry safepoint_entry; |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
588 static inline Code* GetContainingCode(Isolate* isolate, Address pc); | 589 static inline Code* GetContainingCode(Isolate* isolate, Address pc); |
589 | 590 |
590 // Get the code object containing the given pc and fill in the | 591 // Get the code object containing the given pc and fill in the |
591 // safepoint entry and the number of stack slots. The pc must be at | 592 // safepoint entry and the number of stack slots. The pc must be at |
592 // a safepoint. | 593 // a safepoint. |
593 static Code* GetSafepointData(Isolate* isolate, | 594 static Code* GetSafepointData(Isolate* isolate, |
594 Address pc, | 595 Address pc, |
595 SafepointEntry* safepoint_entry, | 596 SafepointEntry* safepoint_entry, |
596 unsigned* stack_slots); | 597 unsigned* stack_slots); |
597 | 598 |
598 virtual void Iterate(ObjectVisitor* v) const = 0; | 599 virtual void Iterate(RootVisitor* v) const = 0; |
599 static void IteratePc(ObjectVisitor* v, Address* pc_address, | 600 static void IteratePc(RootVisitor* v, Address* pc_address, |
600 Address* constant_pool_address, Code* holder); | 601 Address* constant_pool_address, Code* holder); |
601 | 602 |
602 // Sets a callback function for return-address rewriting profilers | 603 // Sets a callback function for return-address rewriting profilers |
603 // to resolve the location of a return address to the location of the | 604 // to resolve the location of a return address to the location of the |
604 // profiler's stashed return address. | 605 // profiler's stashed return address. |
605 static void SetReturnAddressLocationResolver( | 606 static void SetReturnAddressLocationResolver( |
606 ReturnAddressLocationResolver resolver); | 607 ReturnAddressLocationResolver resolver); |
607 | 608 |
608 // Resolves pc_address through the resolution address function if one is set. | 609 // Resolves pc_address through the resolution address function if one is set. |
609 static inline Address* ResolveReturnAddressLocation(Address* pc_address); | 610 static inline Address* ResolveReturnAddressLocation(Address* pc_address); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
660 | 661 |
661 | 662 |
662 // Entry frames are used to enter JavaScript execution from C. | 663 // Entry frames are used to enter JavaScript execution from C. |
663 class EntryFrame: public StackFrame { | 664 class EntryFrame: public StackFrame { |
664 public: | 665 public: |
665 Type type() const override { return ENTRY; } | 666 Type type() const override { return ENTRY; } |
666 | 667 |
667 Code* unchecked_code() const override; | 668 Code* unchecked_code() const override; |
668 | 669 |
669 // Garbage collection support. | 670 // Garbage collection support. |
670 void Iterate(ObjectVisitor* v) const override; | 671 void Iterate(RootVisitor* v) const override; |
671 | 672 |
672 static EntryFrame* cast(StackFrame* frame) { | 673 static EntryFrame* cast(StackFrame* frame) { |
673 DCHECK(frame->is_entry()); | 674 DCHECK(frame->is_entry()); |
674 return static_cast<EntryFrame*>(frame); | 675 return static_cast<EntryFrame*>(frame); |
675 } | 676 } |
676 void SetCallerFp(Address caller_fp) override; | 677 void SetCallerFp(Address caller_fp) override; |
677 | 678 |
678 protected: | 679 protected: |
679 inline explicit EntryFrame(StackFrameIteratorBase* iterator); | 680 inline explicit EntryFrame(StackFrameIteratorBase* iterator); |
680 | 681 |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
713 // Exit frames are used to exit JavaScript execution and go to C. | 714 // Exit frames are used to exit JavaScript execution and go to C. |
714 class ExitFrame: public StackFrame { | 715 class ExitFrame: public StackFrame { |
715 public: | 716 public: |
716 Type type() const override { return EXIT; } | 717 Type type() const override { return EXIT; } |
717 | 718 |
718 Code* unchecked_code() const override; | 719 Code* unchecked_code() const override; |
719 | 720 |
720 Object*& code_slot() const; | 721 Object*& code_slot() const; |
721 | 722 |
722 // Garbage collection support. | 723 // Garbage collection support. |
723 void Iterate(ObjectVisitor* v) const override; | 724 void Iterate(RootVisitor* v) const override; |
724 | 725 |
725 void SetCallerFp(Address caller_fp) override; | 726 void SetCallerFp(Address caller_fp) override; |
726 | 727 |
727 static ExitFrame* cast(StackFrame* frame) { | 728 static ExitFrame* cast(StackFrame* frame) { |
728 DCHECK(frame->is_exit()); | 729 DCHECK(frame->is_exit()); |
729 return static_cast<ExitFrame*>(frame); | 730 return static_cast<ExitFrame*>(frame); |
730 } | 731 } |
731 | 732 |
732 // Compute the state and type of an exit frame given a frame | 733 // Compute the state and type of an exit frame given a frame |
733 // pointer. Used when constructing the first stack frame seen by an | 734 // pointer. Used when constructing the first stack frame seen by an |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
992 // Computes the address of the PC field in the standard frame given | 993 // Computes the address of the PC field in the standard frame given |
993 // by the provided frame pointer. | 994 // by the provided frame pointer. |
994 static inline Address ComputePCAddress(Address fp); | 995 static inline Address ComputePCAddress(Address fp); |
995 | 996 |
996 // Computes the address of the constant pool field in the standard | 997 // Computes the address of the constant pool field in the standard |
997 // frame given by the provided frame pointer. | 998 // frame given by the provided frame pointer. |
998 static inline Address ComputeConstantPoolAddress(Address fp); | 999 static inline Address ComputeConstantPoolAddress(Address fp); |
999 | 1000 |
1000 // Iterate over expression stack including stack handlers, locals, | 1001 // Iterate over expression stack including stack handlers, locals, |
1001 // and parts of the fixed part including context and code fields. | 1002 // and parts of the fixed part including context and code fields. |
1002 void IterateExpressions(ObjectVisitor* v) const; | 1003 void IterateExpressions(RootVisitor* v) const; |
1003 | 1004 |
1004 // Returns the address of the n'th expression stack element. | 1005 // Returns the address of the n'th expression stack element. |
1005 virtual Address GetExpressionAddress(int n) const; | 1006 virtual Address GetExpressionAddress(int n) const; |
1006 | 1007 |
1007 // Determines if the standard frame for the given frame pointer is | 1008 // Determines if the standard frame for the given frame pointer is |
1008 // an arguments adaptor frame. | 1009 // an arguments adaptor frame. |
1009 static inline bool IsArgumentsAdaptorFrame(Address fp); | 1010 static inline bool IsArgumentsAdaptorFrame(Address fp); |
1010 | 1011 |
1011 // Determines if the standard frame for the given frame pointer is a | 1012 // Determines if the standard frame for the given frame pointer is a |
1012 // construct frame. | 1013 // construct frame. |
1013 static inline bool IsConstructFrame(Address fp); | 1014 static inline bool IsConstructFrame(Address fp); |
1014 | 1015 |
1015 // Used by OptimizedFrames and StubFrames. | 1016 // Used by OptimizedFrames and StubFrames. |
1016 void IterateCompiledFrame(ObjectVisitor* v) const; | 1017 void IterateCompiledFrame(RootVisitor* v) const; |
1017 | 1018 |
1018 private: | 1019 private: |
1019 friend class StackFrame; | 1020 friend class StackFrame; |
1020 friend class SafeStackFrameIterator; | 1021 friend class SafeStackFrameIterator; |
1021 }; | 1022 }; |
1022 | 1023 |
1023 class JavaScriptFrame : public StandardFrame { | 1024 class JavaScriptFrame : public StandardFrame { |
1024 public: | 1025 public: |
1025 Type type() const override { return JAVA_SCRIPT; } | 1026 Type type() const override { return JAVA_SCRIPT; } |
1026 | 1027 |
(...skipping 29 matching lines...) Expand all Loading... |
1056 // about the inlined frames use {GetFunctions} and {Summarize}. | 1057 // about the inlined frames use {GetFunctions} and {Summarize}. |
1057 bool HasInlinedFrames() const; | 1058 bool HasInlinedFrames() const; |
1058 | 1059 |
1059 // Check if this frame has "adapted" arguments in the sense that the | 1060 // Check if this frame has "adapted" arguments in the sense that the |
1060 // actual passed arguments are available in an arguments adaptor | 1061 // actual passed arguments are available in an arguments adaptor |
1061 // frame below it on the stack. | 1062 // frame below it on the stack. |
1062 inline bool has_adapted_arguments() const; | 1063 inline bool has_adapted_arguments() const; |
1063 int GetArgumentsLength() const; | 1064 int GetArgumentsLength() const; |
1064 | 1065 |
1065 // Garbage collection support. | 1066 // Garbage collection support. |
1066 void Iterate(ObjectVisitor* v) const override; | 1067 void Iterate(RootVisitor* v) const override; |
1067 | 1068 |
1068 // Printing support. | 1069 // Printing support. |
1069 void Print(StringStream* accumulator, PrintMode mode, | 1070 void Print(StringStream* accumulator, PrintMode mode, |
1070 int index) const override; | 1071 int index) const override; |
1071 | 1072 |
1072 // Determine the code for the frame. | 1073 // Determine the code for the frame. |
1073 Code* unchecked_code() const override; | 1074 Code* unchecked_code() const override; |
1074 | 1075 |
1075 // Return a list with {SharedFunctionInfo} objects of this frame. | 1076 // Return a list with {SharedFunctionInfo} objects of this frame. |
1076 virtual void GetFunctions(List<SharedFunctionInfo*>* functions) const; | 1077 virtual void GetFunctions(List<SharedFunctionInfo*>* functions) const; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1108 | 1109 |
1109 protected: | 1110 protected: |
1110 inline explicit JavaScriptFrame(StackFrameIteratorBase* iterator); | 1111 inline explicit JavaScriptFrame(StackFrameIteratorBase* iterator); |
1111 | 1112 |
1112 Address GetCallerStackPointer() const override; | 1113 Address GetCallerStackPointer() const override; |
1113 | 1114 |
1114 virtual int GetNumberOfIncomingArguments() const; | 1115 virtual int GetNumberOfIncomingArguments() const; |
1115 | 1116 |
1116 // Garbage collection support. Iterates over incoming arguments, | 1117 // Garbage collection support. Iterates over incoming arguments, |
1117 // receiver, and any callee-saved registers. | 1118 // receiver, and any callee-saved registers. |
1118 void IterateArguments(ObjectVisitor* v) const; | 1119 void IterateArguments(RootVisitor* v) const; |
1119 | 1120 |
1120 virtual void PrintFrameKind(StringStream* accumulator) const {} | 1121 virtual void PrintFrameKind(StringStream* accumulator) const {} |
1121 | 1122 |
1122 private: | 1123 private: |
1123 inline Object* function_slot_object() const; | 1124 inline Object* function_slot_object() const; |
1124 | 1125 |
1125 friend class StackFrameIteratorBase; | 1126 friend class StackFrameIteratorBase; |
1126 }; | 1127 }; |
1127 | 1128 |
1128 | 1129 |
1129 class StubFrame : public StandardFrame { | 1130 class StubFrame : public StandardFrame { |
1130 public: | 1131 public: |
1131 Type type() const override { return STUB; } | 1132 Type type() const override { return STUB; } |
1132 | 1133 |
1133 // GC support. | 1134 // GC support. |
1134 void Iterate(ObjectVisitor* v) const override; | 1135 void Iterate(RootVisitor* v) const override; |
1135 | 1136 |
1136 // Determine the code for the frame. | 1137 // Determine the code for the frame. |
1137 Code* unchecked_code() const override; | 1138 Code* unchecked_code() const override; |
1138 | 1139 |
1139 // Lookup exception handler for current {pc}, returns -1 if none found. Only | 1140 // Lookup exception handler for current {pc}, returns -1 if none found. Only |
1140 // TurboFan stub frames are supported. Also returns data associated with the | 1141 // TurboFan stub frames are supported. Also returns data associated with the |
1141 // handler site: | 1142 // handler site: |
1142 // - TurboFan stub: Data is the stack slot count of the entire frame. | 1143 // - TurboFan stub: Data is the stack slot count of the entire frame. |
1143 int LookupExceptionHandlerInTable(int* data); | 1144 int LookupExceptionHandlerInTable(int* data); |
1144 | 1145 |
1145 protected: | 1146 protected: |
1146 inline explicit StubFrame(StackFrameIteratorBase* iterator); | 1147 inline explicit StubFrame(StackFrameIteratorBase* iterator); |
1147 | 1148 |
1148 Address GetCallerStackPointer() const override; | 1149 Address GetCallerStackPointer() const override; |
1149 | 1150 |
1150 virtual int GetNumberOfIncomingArguments() const; | 1151 virtual int GetNumberOfIncomingArguments() const; |
1151 | 1152 |
1152 friend class StackFrameIteratorBase; | 1153 friend class StackFrameIteratorBase; |
1153 }; | 1154 }; |
1154 | 1155 |
1155 | 1156 |
1156 class OptimizedFrame : public JavaScriptFrame { | 1157 class OptimizedFrame : public JavaScriptFrame { |
1157 public: | 1158 public: |
1158 Type type() const override { return OPTIMIZED; } | 1159 Type type() const override { return OPTIMIZED; } |
1159 | 1160 |
1160 // GC support. | 1161 // GC support. |
1161 void Iterate(ObjectVisitor* v) const override; | 1162 void Iterate(RootVisitor* v) const override; |
1162 | 1163 |
1163 // Return a list with {SharedFunctionInfo} objects of this frame. | 1164 // Return a list with {SharedFunctionInfo} objects of this frame. |
1164 // The functions are ordered bottom-to-top (i.e. functions.last() | 1165 // The functions are ordered bottom-to-top (i.e. functions.last() |
1165 // is the top-most activation) | 1166 // is the top-most activation) |
1166 void GetFunctions(List<SharedFunctionInfo*>* functions) const override; | 1167 void GetFunctions(List<SharedFunctionInfo*>* functions) const override; |
1167 | 1168 |
1168 void Summarize( | 1169 void Summarize( |
1169 List<FrameSummary>* frames, | 1170 List<FrameSummary>* frames, |
1170 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; | 1171 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; |
1171 | 1172 |
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1284 | 1285 |
1285 private: | 1286 private: |
1286 friend class StackFrameIteratorBase; | 1287 friend class StackFrameIteratorBase; |
1287 }; | 1288 }; |
1288 | 1289 |
1289 class WasmCompiledFrame final : public StandardFrame { | 1290 class WasmCompiledFrame final : public StandardFrame { |
1290 public: | 1291 public: |
1291 Type type() const override { return WASM_COMPILED; } | 1292 Type type() const override { return WASM_COMPILED; } |
1292 | 1293 |
1293 // GC support. | 1294 // GC support. |
1294 void Iterate(ObjectVisitor* v) const override; | 1295 void Iterate(RootVisitor* v) const override; |
1295 | 1296 |
1296 // Printing support. | 1297 // Printing support. |
1297 void Print(StringStream* accumulator, PrintMode mode, | 1298 void Print(StringStream* accumulator, PrintMode mode, |
1298 int index) const override; | 1299 int index) const override; |
1299 | 1300 |
1300 // Lookup exception handler for current {pc}, returns -1 if none found. Also | 1301 // Lookup exception handler for current {pc}, returns -1 if none found. Also |
1301 // returns the stack slot count of the entire frame. | 1302 // returns the stack slot count of the entire frame. |
1302 int LookupExceptionHandlerInTable(int* data); | 1303 int LookupExceptionHandlerInTable(int* data); |
1303 | 1304 |
1304 // Determine the code for the frame. | 1305 // Determine the code for the frame. |
(...skipping 21 matching lines...) Expand all Loading... |
1326 | 1327 |
1327 private: | 1328 private: |
1328 friend class StackFrameIteratorBase; | 1329 friend class StackFrameIteratorBase; |
1329 }; | 1330 }; |
1330 | 1331 |
1331 class WasmInterpreterEntryFrame final : public StandardFrame { | 1332 class WasmInterpreterEntryFrame final : public StandardFrame { |
1332 public: | 1333 public: |
1333 Type type() const override { return WASM_INTERPRETER_ENTRY; } | 1334 Type type() const override { return WASM_INTERPRETER_ENTRY; } |
1334 | 1335 |
1335 // GC support. | 1336 // GC support. |
1336 void Iterate(ObjectVisitor* v) const override; | 1337 void Iterate(RootVisitor* v) const override; |
1337 | 1338 |
1338 // Printing support. | 1339 // Printing support. |
1339 void Print(StringStream* accumulator, PrintMode mode, | 1340 void Print(StringStream* accumulator, PrintMode mode, |
1340 int index) const override; | 1341 int index) const override; |
1341 | 1342 |
1342 void Summarize( | 1343 void Summarize( |
1343 List<FrameSummary>* frames, | 1344 List<FrameSummary>* frames, |
1344 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; | 1345 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; |
1345 | 1346 |
1346 // Determine the code for the frame. | 1347 // Determine the code for the frame. |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1386 | 1387 |
1387 private: | 1388 private: |
1388 friend class StackFrameIteratorBase; | 1389 friend class StackFrameIteratorBase; |
1389 }; | 1390 }; |
1390 | 1391 |
1391 class InternalFrame: public StandardFrame { | 1392 class InternalFrame: public StandardFrame { |
1392 public: | 1393 public: |
1393 Type type() const override { return INTERNAL; } | 1394 Type type() const override { return INTERNAL; } |
1394 | 1395 |
1395 // Garbage collection support. | 1396 // Garbage collection support. |
1396 void Iterate(ObjectVisitor* v) const override; | 1397 void Iterate(RootVisitor* v) const override; |
1397 | 1398 |
1398 // Determine the code for the frame. | 1399 // Determine the code for the frame. |
1399 Code* unchecked_code() const override; | 1400 Code* unchecked_code() const override; |
1400 | 1401 |
1401 static InternalFrame* cast(StackFrame* frame) { | 1402 static InternalFrame* cast(StackFrame* frame) { |
1402 DCHECK(frame->is_internal()); | 1403 DCHECK(frame->is_internal()); |
1403 return static_cast<InternalFrame*>(frame); | 1404 return static_cast<InternalFrame*>(frame); |
1404 } | 1405 } |
1405 | 1406 |
1406 protected: | 1407 protected: |
1407 inline explicit InternalFrame(StackFrameIteratorBase* iterator); | 1408 inline explicit InternalFrame(StackFrameIteratorBase* iterator); |
1408 | 1409 |
1409 Address GetCallerStackPointer() const override; | 1410 Address GetCallerStackPointer() const override; |
1410 | 1411 |
1411 private: | 1412 private: |
1412 friend class StackFrameIteratorBase; | 1413 friend class StackFrameIteratorBase; |
1413 }; | 1414 }; |
1414 | 1415 |
1415 | 1416 |
1416 class StubFailureTrampolineFrame: public StandardFrame { | 1417 class StubFailureTrampolineFrame: public StandardFrame { |
1417 public: | 1418 public: |
1418 Type type() const override { return STUB_FAILURE_TRAMPOLINE; } | 1419 Type type() const override { return STUB_FAILURE_TRAMPOLINE; } |
1419 | 1420 |
1420 // Get the code associated with this frame. | 1421 // Get the code associated with this frame. |
1421 // This method could be called during marking phase of GC. | 1422 // This method could be called during marking phase of GC. |
1422 Code* unchecked_code() const override; | 1423 Code* unchecked_code() const override; |
1423 | 1424 |
1424 void Iterate(ObjectVisitor* v) const override; | 1425 void Iterate(RootVisitor* v) const override; |
1425 | 1426 |
1426 // Architecture-specific register description. | 1427 // Architecture-specific register description. |
1427 static Register fp_register(); | 1428 static Register fp_register(); |
1428 static Register context_register(); | 1429 static Register context_register(); |
1429 static Register constant_pool_pointer_register(); | 1430 static Register constant_pool_pointer_register(); |
1430 | 1431 |
1431 protected: | 1432 protected: |
1432 inline explicit StubFailureTrampolineFrame( | 1433 inline explicit StubFailureTrampolineFrame( |
1433 StackFrameIteratorBase* iterator); | 1434 StackFrameIteratorBase* iterator); |
1434 | 1435 |
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1602 | 1603 |
1603 | 1604 |
1604 // Reads all frames on the current stack and copies them into the current | 1605 // Reads all frames on the current stack and copies them into the current |
1605 // zone memory. | 1606 // zone memory. |
1606 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); | 1607 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); |
1607 | 1608 |
1608 } // namespace internal | 1609 } // namespace internal |
1609 } // namespace v8 | 1610 } // namespace v8 |
1610 | 1611 |
1611 #endif // V8_FRAMES_H_ | 1612 #endif // V8_FRAMES_H_ |
OLD | NEW |