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

Side by Side Diff: src/frames.h

Issue 2801073006: Decouple root visitors from object visitors. (Closed)
Patch Set: rebase Created 3 years, 8 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
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 12 matching lines...) Expand all
23 23
24 void SetUpJSCallerSavedCodeData(); 24 void SetUpJSCallerSavedCodeData();
25 25
26 // Return the code of the n-th saved register available to JavaScript. 26 // Return the code of the n-th saved register available to JavaScript.
27 int JSCallerSavedCode(int n); 27 int JSCallerSavedCode(int n);
28 28
29 29
30 // Forward declarations. 30 // Forward declarations.
31 class ExternalCallbackScope; 31 class ExternalCallbackScope;
32 class Isolate; 32 class Isolate;
33 class RootVisitor;
33 class StackFrameIteratorBase; 34 class StackFrameIteratorBase;
34 class ThreadLocalTop; 35 class ThreadLocalTop;
35 class WasmInstanceObject; 36 class WasmInstanceObject;
36 37
37 class InnerPointerToCodeCache { 38 class InnerPointerToCodeCache {
38 public: 39 public:
39 struct InnerPointerToCodeCacheEntry { 40 struct InnerPointerToCodeCacheEntry {
40 Address inner_pointer; 41 Address inner_pointer;
41 Code* code; 42 Code* code;
42 SafepointEntry safepoint_entry; 43 SafepointEntry safepoint_entry;
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after
582 static inline Code* GetContainingCode(Isolate* isolate, Address pc); 583 static inline Code* GetContainingCode(Isolate* isolate, Address pc);
583 584
584 // Get the code object containing the given pc and fill in the 585 // Get the code object containing the given pc and fill in the
585 // safepoint entry and the number of stack slots. The pc must be at 586 // safepoint entry and the number of stack slots. The pc must be at
586 // a safepoint. 587 // a safepoint.
587 static Code* GetSafepointData(Isolate* isolate, 588 static Code* GetSafepointData(Isolate* isolate,
588 Address pc, 589 Address pc,
589 SafepointEntry* safepoint_entry, 590 SafepointEntry* safepoint_entry,
590 unsigned* stack_slots); 591 unsigned* stack_slots);
591 592
592 virtual void Iterate(ObjectVisitor* v) const = 0; 593 virtual void Iterate(RootVisitor* v) const = 0;
593 static void IteratePc(ObjectVisitor* v, Address* pc_address, 594 static void IteratePc(RootVisitor* v, Address* pc_address,
594 Address* constant_pool_address, Code* holder); 595 Address* constant_pool_address, Code* holder);
595 596
596 // Sets a callback function for return-address rewriting profilers 597 // Sets a callback function for return-address rewriting profilers
597 // to resolve the location of a return address to the location of the 598 // to resolve the location of a return address to the location of the
598 // profiler's stashed return address. 599 // profiler's stashed return address.
599 static void SetReturnAddressLocationResolver( 600 static void SetReturnAddressLocationResolver(
600 ReturnAddressLocationResolver resolver); 601 ReturnAddressLocationResolver resolver);
601 602
602 // Resolves pc_address through the resolution address function if one is set. 603 // Resolves pc_address through the resolution address function if one is set.
603 static inline Address* ResolveReturnAddressLocation(Address* pc_address); 604 static inline Address* ResolveReturnAddressLocation(Address* pc_address);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
654 655
655 656
656 // Entry frames are used to enter JavaScript execution from C. 657 // Entry frames are used to enter JavaScript execution from C.
657 class EntryFrame: public StackFrame { 658 class EntryFrame: public StackFrame {
658 public: 659 public:
659 Type type() const override { return ENTRY; } 660 Type type() const override { return ENTRY; }
660 661
661 Code* unchecked_code() const override; 662 Code* unchecked_code() const override;
662 663
663 // Garbage collection support. 664 // Garbage collection support.
664 void Iterate(ObjectVisitor* v) const override; 665 void Iterate(RootVisitor* v) const override;
665 666
666 static EntryFrame* cast(StackFrame* frame) { 667 static EntryFrame* cast(StackFrame* frame) {
667 DCHECK(frame->is_entry()); 668 DCHECK(frame->is_entry());
668 return static_cast<EntryFrame*>(frame); 669 return static_cast<EntryFrame*>(frame);
669 } 670 }
670 void SetCallerFp(Address caller_fp) override; 671 void SetCallerFp(Address caller_fp) override;
671 672
672 protected: 673 protected:
673 inline explicit EntryFrame(StackFrameIteratorBase* iterator); 674 inline explicit EntryFrame(StackFrameIteratorBase* iterator);
674 675
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
707 // Exit frames are used to exit JavaScript execution and go to C. 708 // Exit frames are used to exit JavaScript execution and go to C.
708 class ExitFrame: public StackFrame { 709 class ExitFrame: public StackFrame {
709 public: 710 public:
710 Type type() const override { return EXIT; } 711 Type type() const override { return EXIT; }
711 712
712 Code* unchecked_code() const override; 713 Code* unchecked_code() const override;
713 714
714 Object*& code_slot() const; 715 Object*& code_slot() const;
715 716
716 // Garbage collection support. 717 // Garbage collection support.
717 void Iterate(ObjectVisitor* v) const override; 718 void Iterate(RootVisitor* v) const override;
718 719
719 void SetCallerFp(Address caller_fp) override; 720 void SetCallerFp(Address caller_fp) override;
720 721
721 static ExitFrame* cast(StackFrame* frame) { 722 static ExitFrame* cast(StackFrame* frame) {
722 DCHECK(frame->is_exit()); 723 DCHECK(frame->is_exit());
723 return static_cast<ExitFrame*>(frame); 724 return static_cast<ExitFrame*>(frame);
724 } 725 }
725 726
726 // Compute the state and type of an exit frame given a frame 727 // Compute the state and type of an exit frame given a frame
727 // pointer. Used when constructing the first stack frame seen by an 728 // pointer. Used when constructing the first stack frame seen by an
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after
986 // Computes the address of the PC field in the standard frame given 987 // Computes the address of the PC field in the standard frame given
987 // by the provided frame pointer. 988 // by the provided frame pointer.
988 static inline Address ComputePCAddress(Address fp); 989 static inline Address ComputePCAddress(Address fp);
989 990
990 // Computes the address of the constant pool field in the standard 991 // Computes the address of the constant pool field in the standard
991 // frame given by the provided frame pointer. 992 // frame given by the provided frame pointer.
992 static inline Address ComputeConstantPoolAddress(Address fp); 993 static inline Address ComputeConstantPoolAddress(Address fp);
993 994
994 // Iterate over expression stack including stack handlers, locals, 995 // Iterate over expression stack including stack handlers, locals,
995 // and parts of the fixed part including context and code fields. 996 // and parts of the fixed part including context and code fields.
996 void IterateExpressions(ObjectVisitor* v) const; 997 void IterateExpressions(RootVisitor* v) const;
997 998
998 // Returns the address of the n'th expression stack element. 999 // Returns the address of the n'th expression stack element.
999 virtual Address GetExpressionAddress(int n) const; 1000 virtual Address GetExpressionAddress(int n) const;
1000 1001
1001 // Determines if the standard frame for the given frame pointer is 1002 // Determines if the standard frame for the given frame pointer is
1002 // an arguments adaptor frame. 1003 // an arguments adaptor frame.
1003 static inline bool IsArgumentsAdaptorFrame(Address fp); 1004 static inline bool IsArgumentsAdaptorFrame(Address fp);
1004 1005
1005 // Determines if the standard frame for the given frame pointer is a 1006 // Determines if the standard frame for the given frame pointer is a
1006 // construct frame. 1007 // construct frame.
1007 static inline bool IsConstructFrame(Address fp); 1008 static inline bool IsConstructFrame(Address fp);
1008 1009
1009 // Used by OptimizedFrames and StubFrames. 1010 // Used by OptimizedFrames and StubFrames.
1010 void IterateCompiledFrame(ObjectVisitor* v) const; 1011 void IterateCompiledFrame(RootVisitor* v) const;
1011 1012
1012 private: 1013 private:
1013 friend class StackFrame; 1014 friend class StackFrame;
1014 friend class SafeStackFrameIterator; 1015 friend class SafeStackFrameIterator;
1015 }; 1016 };
1016 1017
1017 class JavaScriptFrame : public StandardFrame { 1018 class JavaScriptFrame : public StandardFrame {
1018 public: 1019 public:
1019 Type type() const override { return JAVA_SCRIPT; } 1020 Type type() const override { return JAVA_SCRIPT; }
1020 1021
(...skipping 29 matching lines...) Expand all
1050 // about the inlined frames use {GetFunctions} and {Summarize}. 1051 // about the inlined frames use {GetFunctions} and {Summarize}.
1051 bool HasInlinedFrames() const; 1052 bool HasInlinedFrames() const;
1052 1053
1053 // Check if this frame has "adapted" arguments in the sense that the 1054 // Check if this frame has "adapted" arguments in the sense that the
1054 // actual passed arguments are available in an arguments adaptor 1055 // actual passed arguments are available in an arguments adaptor
1055 // frame below it on the stack. 1056 // frame below it on the stack.
1056 inline bool has_adapted_arguments() const; 1057 inline bool has_adapted_arguments() const;
1057 int GetArgumentsLength() const; 1058 int GetArgumentsLength() const;
1058 1059
1059 // Garbage collection support. 1060 // Garbage collection support.
1060 void Iterate(ObjectVisitor* v) const override; 1061 void Iterate(RootVisitor* v) const override;
1061 1062
1062 // Printing support. 1063 // Printing support.
1063 void Print(StringStream* accumulator, PrintMode mode, 1064 void Print(StringStream* accumulator, PrintMode mode,
1064 int index) const override; 1065 int index) const override;
1065 1066
1066 // Determine the code for the frame. 1067 // Determine the code for the frame.
1067 Code* unchecked_code() const override; 1068 Code* unchecked_code() const override;
1068 1069
1069 // Return a list with {SharedFunctionInfo} objects of this frame. 1070 // Return a list with {SharedFunctionInfo} objects of this frame.
1070 virtual void GetFunctions(List<SharedFunctionInfo*>* functions) const; 1071 virtual void GetFunctions(List<SharedFunctionInfo*>* functions) const;
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
1102 1103
1103 protected: 1104 protected:
1104 inline explicit JavaScriptFrame(StackFrameIteratorBase* iterator); 1105 inline explicit JavaScriptFrame(StackFrameIteratorBase* iterator);
1105 1106
1106 Address GetCallerStackPointer() const override; 1107 Address GetCallerStackPointer() const override;
1107 1108
1108 virtual int GetNumberOfIncomingArguments() const; 1109 virtual int GetNumberOfIncomingArguments() const;
1109 1110
1110 // Garbage collection support. Iterates over incoming arguments, 1111 // Garbage collection support. Iterates over incoming arguments,
1111 // receiver, and any callee-saved registers. 1112 // receiver, and any callee-saved registers.
1112 void IterateArguments(ObjectVisitor* v) const; 1113 void IterateArguments(RootVisitor* v) const;
1113 1114
1114 virtual void PrintFrameKind(StringStream* accumulator) const {} 1115 virtual void PrintFrameKind(StringStream* accumulator) const {}
1115 1116
1116 private: 1117 private:
1117 inline Object* function_slot_object() const; 1118 inline Object* function_slot_object() const;
1118 1119
1119 friend class StackFrameIteratorBase; 1120 friend class StackFrameIteratorBase;
1120 }; 1121 };
1121 1122
1122 1123
1123 class StubFrame : public StandardFrame { 1124 class StubFrame : public StandardFrame {
1124 public: 1125 public:
1125 Type type() const override { return STUB; } 1126 Type type() const override { return STUB; }
1126 1127
1127 // GC support. 1128 // GC support.
1128 void Iterate(ObjectVisitor* v) const override; 1129 void Iterate(RootVisitor* v) const override;
1129 1130
1130 // Determine the code for the frame. 1131 // Determine the code for the frame.
1131 Code* unchecked_code() const override; 1132 Code* unchecked_code() const override;
1132 1133
1133 // Lookup exception handler for current {pc}, returns -1 if none found. Only 1134 // Lookup exception handler for current {pc}, returns -1 if none found. Only
1134 // TurboFan stub frames are supported. Also returns data associated with the 1135 // TurboFan stub frames are supported. Also returns data associated with the
1135 // handler site: 1136 // handler site:
1136 // - TurboFan stub: Data is the stack slot count of the entire frame. 1137 // - TurboFan stub: Data is the stack slot count of the entire frame.
1137 int LookupExceptionHandlerInTable(int* data); 1138 int LookupExceptionHandlerInTable(int* data);
1138 1139
1139 protected: 1140 protected:
1140 inline explicit StubFrame(StackFrameIteratorBase* iterator); 1141 inline explicit StubFrame(StackFrameIteratorBase* iterator);
1141 1142
1142 Address GetCallerStackPointer() const override; 1143 Address GetCallerStackPointer() const override;
1143 1144
1144 virtual int GetNumberOfIncomingArguments() const; 1145 virtual int GetNumberOfIncomingArguments() const;
1145 1146
1146 friend class StackFrameIteratorBase; 1147 friend class StackFrameIteratorBase;
1147 }; 1148 };
1148 1149
1149 1150
1150 class OptimizedFrame : public JavaScriptFrame { 1151 class OptimizedFrame : public JavaScriptFrame {
1151 public: 1152 public:
1152 Type type() const override { return OPTIMIZED; } 1153 Type type() const override { return OPTIMIZED; }
1153 1154
1154 // GC support. 1155 // GC support.
1155 void Iterate(ObjectVisitor* v) const override; 1156 void Iterate(RootVisitor* v) const override;
1156 1157
1157 // Return a list with {SharedFunctionInfo} objects of this frame. 1158 // Return a list with {SharedFunctionInfo} objects of this frame.
1158 // The functions are ordered bottom-to-top (i.e. functions.last() 1159 // The functions are ordered bottom-to-top (i.e. functions.last()
1159 // is the top-most activation) 1160 // is the top-most activation)
1160 void GetFunctions(List<SharedFunctionInfo*>* functions) const override; 1161 void GetFunctions(List<SharedFunctionInfo*>* functions) const override;
1161 1162
1162 void Summarize( 1163 void Summarize(
1163 List<FrameSummary>* frames, 1164 List<FrameSummary>* frames,
1164 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; 1165 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override;
1165 1166
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
1278 1279
1279 private: 1280 private:
1280 friend class StackFrameIteratorBase; 1281 friend class StackFrameIteratorBase;
1281 }; 1282 };
1282 1283
1283 class WasmCompiledFrame final : public StandardFrame { 1284 class WasmCompiledFrame final : public StandardFrame {
1284 public: 1285 public:
1285 Type type() const override { return WASM_COMPILED; } 1286 Type type() const override { return WASM_COMPILED; }
1286 1287
1287 // GC support. 1288 // GC support.
1288 void Iterate(ObjectVisitor* v) const override; 1289 void Iterate(RootVisitor* v) const override;
1289 1290
1290 // Printing support. 1291 // Printing support.
1291 void Print(StringStream* accumulator, PrintMode mode, 1292 void Print(StringStream* accumulator, PrintMode mode,
1292 int index) const override; 1293 int index) const override;
1293 1294
1294 // Lookup exception handler for current {pc}, returns -1 if none found. Also 1295 // Lookup exception handler for current {pc}, returns -1 if none found. Also
1295 // returns the stack slot count of the entire frame. 1296 // returns the stack slot count of the entire frame.
1296 int LookupExceptionHandlerInTable(int* data); 1297 int LookupExceptionHandlerInTable(int* data);
1297 1298
1298 // Determine the code for the frame. 1299 // Determine the code for the frame.
(...skipping 21 matching lines...) Expand all
1320 1321
1321 private: 1322 private:
1322 friend class StackFrameIteratorBase; 1323 friend class StackFrameIteratorBase;
1323 }; 1324 };
1324 1325
1325 class WasmInterpreterEntryFrame final : public StandardFrame { 1326 class WasmInterpreterEntryFrame final : public StandardFrame {
1326 public: 1327 public:
1327 Type type() const override { return WASM_INTERPRETER_ENTRY; } 1328 Type type() const override { return WASM_INTERPRETER_ENTRY; }
1328 1329
1329 // GC support. 1330 // GC support.
1330 void Iterate(ObjectVisitor* v) const override; 1331 void Iterate(RootVisitor* v) const override;
1331 1332
1332 // Printing support. 1333 // Printing support.
1333 void Print(StringStream* accumulator, PrintMode mode, 1334 void Print(StringStream* accumulator, PrintMode mode,
1334 int index) const override; 1335 int index) const override;
1335 1336
1336 void Summarize( 1337 void Summarize(
1337 List<FrameSummary>* frames, 1338 List<FrameSummary>* frames,
1338 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override; 1339 FrameSummary::Mode mode = FrameSummary::kExactSummary) const override;
1339 1340
1340 // Determine the code for the frame. 1341 // Determine the code for the frame.
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1379 1380
1380 private: 1381 private:
1381 friend class StackFrameIteratorBase; 1382 friend class StackFrameIteratorBase;
1382 }; 1383 };
1383 1384
1384 class InternalFrame: public StandardFrame { 1385 class InternalFrame: public StandardFrame {
1385 public: 1386 public:
1386 Type type() const override { return INTERNAL; } 1387 Type type() const override { return INTERNAL; }
1387 1388
1388 // Garbage collection support. 1389 // Garbage collection support.
1389 void Iterate(ObjectVisitor* v) const override; 1390 void Iterate(RootVisitor* v) const override;
1390 1391
1391 // Determine the code for the frame. 1392 // Determine the code for the frame.
1392 Code* unchecked_code() const override; 1393 Code* unchecked_code() const override;
1393 1394
1394 static InternalFrame* cast(StackFrame* frame) { 1395 static InternalFrame* cast(StackFrame* frame) {
1395 DCHECK(frame->is_internal()); 1396 DCHECK(frame->is_internal());
1396 return static_cast<InternalFrame*>(frame); 1397 return static_cast<InternalFrame*>(frame);
1397 } 1398 }
1398 1399
1399 protected: 1400 protected:
1400 inline explicit InternalFrame(StackFrameIteratorBase* iterator); 1401 inline explicit InternalFrame(StackFrameIteratorBase* iterator);
1401 1402
1402 Address GetCallerStackPointer() const override; 1403 Address GetCallerStackPointer() const override;
1403 1404
1404 private: 1405 private:
1405 friend class StackFrameIteratorBase; 1406 friend class StackFrameIteratorBase;
1406 }; 1407 };
1407 1408
1408 1409
1409 class StubFailureTrampolineFrame: public StandardFrame { 1410 class StubFailureTrampolineFrame: public StandardFrame {
1410 public: 1411 public:
1411 Type type() const override { return STUB_FAILURE_TRAMPOLINE; } 1412 Type type() const override { return STUB_FAILURE_TRAMPOLINE; }
1412 1413
1413 // Get the code associated with this frame. 1414 // Get the code associated with this frame.
1414 // This method could be called during marking phase of GC. 1415 // This method could be called during marking phase of GC.
1415 Code* unchecked_code() const override; 1416 Code* unchecked_code() const override;
1416 1417
1417 void Iterate(ObjectVisitor* v) const override; 1418 void Iterate(RootVisitor* v) const override;
1418 1419
1419 // Architecture-specific register description. 1420 // Architecture-specific register description.
1420 static Register fp_register(); 1421 static Register fp_register();
1421 static Register context_register(); 1422 static Register context_register();
1422 static Register constant_pool_pointer_register(); 1423 static Register constant_pool_pointer_register();
1423 1424
1424 protected: 1425 protected:
1425 inline explicit StubFailureTrampolineFrame( 1426 inline explicit StubFailureTrampolineFrame(
1426 StackFrameIteratorBase* iterator); 1427 StackFrameIteratorBase* iterator);
1427 1428
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
1596 1597
1597 1598
1598 // Reads all frames on the current stack and copies them into the current 1599 // Reads all frames on the current stack and copies them into the current
1599 // zone memory. 1600 // zone memory.
1600 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone); 1601 Vector<StackFrame*> CreateStackMap(Isolate* isolate, Zone* zone);
1601 1602
1602 } // namespace internal 1603 } // namespace internal
1603 } // namespace v8 1604 } // namespace v8
1604 1605
1605 #endif // V8_FRAMES_H_ 1606 #endif // V8_FRAMES_H_
OLDNEW
« no previous file with comments | « src/debug/debug.cc ('k') | src/frames.cc » ('j') | src/heap/mark-compact.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698