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

Side by Side Diff: src/objects.h

Issue 10837037: Age code to allow reclaiming old unexecuted functions (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 8 years, 1 month 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/mark-compact.cc ('k') | src/objects.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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 }; 187 };
188 188
189 189
190 // Indicates whether we are only interested in the descriptors of a particular 190 // Indicates whether we are only interested in the descriptors of a particular
191 // map, or in all descriptors in the descriptor array. 191 // map, or in all descriptors in the descriptor array.
192 enum DescriptorFlag { 192 enum DescriptorFlag {
193 ALL_DESCRIPTORS, 193 ALL_DESCRIPTORS,
194 OWN_DESCRIPTORS 194 OWN_DESCRIPTORS
195 }; 195 };
196 196
197 // The GC maintains a bit of information, the MarkingParity, which toggles
198 // from odd to even and back every time marking is completed. Incremental
199 // marking can visit an object twice during a marking phase, so algorithms that
200 // that piggy-back on marking can use the parity to ensure that they only
201 // perform an operation on an object once per marking phase: they record the
202 // MarkingParity when they visit an object, and only re-visit the object when it
203 // is marked again and the MarkingParity changes.
204 enum MarkingParity {
205 NO_MARKING_PARITY,
206 ODD_MARKING_PARITY,
207 EVEN_MARKING_PARITY
208 };
197 209
198 // Instance size sentinel for objects of variable size. 210 // Instance size sentinel for objects of variable size.
199 const int kVariableSizeSentinel = 0; 211 const int kVariableSizeSentinel = 0;
200 212
201 const int kStubMajorKeyBits = 6; 213 const int kStubMajorKeyBits = 6;
202 const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits; 214 const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits;
203 215
204 // All Maps have a field instance_type containing a InstanceType. 216 // All Maps have a field instance_type containing a InstanceType.
205 // It describes the type of the instances. 217 // It describes the type of the instances.
206 // 218 //
(...skipping 4326 matching lines...) Expand 10 before | Expand all | Expand 10 after
4533 inline void CodePrint() { 4545 inline void CodePrint() {
4534 CodePrint(stdout); 4546 CodePrint(stdout);
4535 } 4547 }
4536 void CodePrint(FILE* out); 4548 void CodePrint(FILE* out);
4537 #endif 4549 #endif
4538 DECLARE_VERIFIER(Code) 4550 DECLARE_VERIFIER(Code)
4539 4551
4540 void ClearInlineCaches(); 4552 void ClearInlineCaches();
4541 void ClearTypeFeedbackCells(Heap* heap); 4553 void ClearTypeFeedbackCells(Heap* heap);
4542 4554
4555 #define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge,
4556 enum Age {
4557 kNoAge = 0,
4558 CODE_AGE_LIST(DECLARE_CODE_AGE_ENUM)
4559 kAfterLastCodeAge,
4560 kLastCodeAge = kAfterLastCodeAge - 1,
4561 kCodeAgeCount = kAfterLastCodeAge - 1
4562 };
4563 #undef DECLARE_CODE_AGE_ENUM
4564
4565 // Code aging
4566 static void MakeCodeAgeSequenceYoung(byte* sequence);
4567 void MakeYoung();
4568 void MakeOlder(MarkingParity);
4569 static bool IsYoungSequence(byte* sequence);
4570 bool IsOld();
4571
4543 // Max loop nesting marker used to postpose OSR. We don't take loop 4572 // Max loop nesting marker used to postpose OSR. We don't take loop
4544 // nesting that is deeper than 5 levels into account. 4573 // nesting that is deeper than 5 levels into account.
4545 static const int kMaxLoopNestingMarker = 6; 4574 static const int kMaxLoopNestingMarker = 6;
4546 4575
4547 // Layout description. 4576 // Layout description.
4548 static const int kInstructionSizeOffset = HeapObject::kHeaderSize; 4577 static const int kInstructionSizeOffset = HeapObject::kHeaderSize;
4549 static const int kRelocationInfoOffset = kInstructionSizeOffset + kIntSize; 4578 static const int kRelocationInfoOffset = kInstructionSizeOffset + kIntSize;
4550 static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize; 4579 static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize;
4551 static const int kDeoptimizationDataOffset = 4580 static const int kDeoptimizationDataOffset =
4552 kHandlerTableOffset + kPointerSize; 4581 kHandlerTableOffset + kPointerSize;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
4661 4690
4662 // Signed field cannot be encoded using the BitField class. 4691 // Signed field cannot be encoded using the BitField class.
4663 static const int kArgumentsCountShift = 14; 4692 static const int kArgumentsCountShift = 14;
4664 static const int kArgumentsCountMask = ~((1 << kArgumentsCountShift) - 1); 4693 static const int kArgumentsCountMask = ~((1 << kArgumentsCountShift) - 1);
4665 4694
4666 // This constant should be encodable in an ARM instruction. 4695 // This constant should be encodable in an ARM instruction.
4667 static const int kFlagsNotUsedInLookup = 4696 static const int kFlagsNotUsedInLookup =
4668 TypeField::kMask | CacheHolderField::kMask; 4697 TypeField::kMask | CacheHolderField::kMask;
4669 4698
4670 private: 4699 private:
4700 friend class RelocIterator;
4701
4702 // Code aging
4703 byte* FindCodeAgeSequence();
4704 static void GetCodeAgeAndParity(Code* code, Age* age,
4705 MarkingParity* parity);
4706 static void GetCodeAgeAndParity(byte* sequence, Age* age,
4707 MarkingParity* parity);
4708 static Code* GetCodeAgeStub(Age age, MarkingParity parity);
4709
4710 // Code aging -- platform-specific
4711 byte* FindPlatformCodeAgeSequence();
4712 static void PatchPlatformCodeAge(byte* sequence, Age age,
4713 MarkingParity parity);
4714
4671 DISALLOW_IMPLICIT_CONSTRUCTORS(Code); 4715 DISALLOW_IMPLICIT_CONSTRUCTORS(Code);
4672 }; 4716 };
4673 4717
4674 4718
4675 // All heap objects have a Map that describes their structure. 4719 // All heap objects have a Map that describes their structure.
4676 // A Map contains information about: 4720 // A Map contains information about:
4677 // - Size information about the object 4721 // - Size information about the object
4678 // - How to iterate over an object (for garbage collection) 4722 // - How to iterate over an object (for garbage collection)
4679 class Map: public HeapObject { 4723 class Map: public HeapObject {
4680 public: 4724 public:
(...skipping 4230 matching lines...) Expand 10 before | Expand all | Expand 10 after
8911 8955
8912 // Visits the resource of an ASCII or two-byte string. 8956 // Visits the resource of an ASCII or two-byte string.
8913 virtual void VisitExternalAsciiString( 8957 virtual void VisitExternalAsciiString(
8914 v8::String::ExternalAsciiStringResource** resource) {} 8958 v8::String::ExternalAsciiStringResource** resource) {}
8915 virtual void VisitExternalTwoByteString( 8959 virtual void VisitExternalTwoByteString(
8916 v8::String::ExternalStringResource** resource) {} 8960 v8::String::ExternalStringResource** resource) {}
8917 8961
8918 // Visits a debug call target in the instruction stream. 8962 // Visits a debug call target in the instruction stream.
8919 virtual void VisitDebugTarget(RelocInfo* rinfo); 8963 virtual void VisitDebugTarget(RelocInfo* rinfo);
8920 8964
8965 // Visits the byte sequence in a function's prologue that contains information
8966 // about the code's age.
8967 virtual void VisitCodeAgeSequence(RelocInfo* rinfo);
8968
8921 // Handy shorthand for visiting a single pointer. 8969 // Handy shorthand for visiting a single pointer.
8922 virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); } 8970 virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); }
8923 8971
8924 // Visit pointer embedded into a code object. 8972 // Visit pointer embedded into a code object.
8925 virtual void VisitEmbeddedPointer(RelocInfo* rinfo); 8973 virtual void VisitEmbeddedPointer(RelocInfo* rinfo);
8926 8974
8927 // Visits a contiguous arrays of external references (references to the C++ 8975 // Visits a contiguous arrays of external references (references to the C++
8928 // heap) in the half-open range [start, end). Any or all of the values 8976 // heap) in the half-open range [start, end). Any or all of the values
8929 // may be modified on return. 8977 // may be modified on return.
8930 virtual void VisitExternalReferences(Address* start, Address* end) {} 8978 virtual void VisitExternalReferences(Address* start, Address* end) {}
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
8976 } else { 9024 } else {
8977 value &= ~(1 << bit_position); 9025 value &= ~(1 << bit_position);
8978 } 9026 }
8979 return value; 9027 return value;
8980 } 9028 }
8981 }; 9029 };
8982 9030
8983 } } // namespace v8::internal 9031 } } // namespace v8::internal
8984 9032
8985 #endif // V8_OBJECTS_H_ 9033 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/mark-compact.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698