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

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: Nits 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
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 4308 matching lines...) Expand 10 before | Expand all | Expand 10 after
4515 inline void CodePrint() { 4527 inline void CodePrint() {
4516 CodePrint(stdout); 4528 CodePrint(stdout);
4517 } 4529 }
4518 void CodePrint(FILE* out); 4530 void CodePrint(FILE* out);
4519 #endif 4531 #endif
4520 DECLARE_VERIFIER(Code) 4532 DECLARE_VERIFIER(Code)
4521 4533
4522 void ClearInlineCaches(); 4534 void ClearInlineCaches();
4523 void ClearTypeFeedbackCells(Heap* heap); 4535 void ClearTypeFeedbackCells(Heap* heap);
4524 4536
4537 #define DECLARE_CODE_AGE_ENUM(X) k##X##CodeAge,
4538 enum Age {
4539 kNoAge = 0,
4540 CODE_AGE_LIST(DECLARE_CODE_AGE_ENUM)
4541 kAfterLastCodeAge,
4542 kLastCodeAge = kAfterLastCodeAge - 1,
4543 kCodeAgeCount = kAfterLastCodeAge - 1
4544 };
4545 #undef DECLARE_CODE_AGE_ENUM
4546
4547 // Code aging
4548 static void MakeCodeAgeSequenceYoung(byte* sequence);
4549 void MakeYoung();
4550 void MakeOlder(MarkingParity);
4551 static bool IsYoungSequence(byte* sequence);
4552 bool IsOld();
4553
4525 // Max loop nesting marker used to postpose OSR. We don't take loop 4554 // Max loop nesting marker used to postpose OSR. We don't take loop
4526 // nesting that is deeper than 5 levels into account. 4555 // nesting that is deeper than 5 levels into account.
4527 static const int kMaxLoopNestingMarker = 6; 4556 static const int kMaxLoopNestingMarker = 6;
4528 4557
4529 // Layout description. 4558 // Layout description.
4530 static const int kInstructionSizeOffset = HeapObject::kHeaderSize; 4559 static const int kInstructionSizeOffset = HeapObject::kHeaderSize;
4531 static const int kRelocationInfoOffset = kInstructionSizeOffset + kIntSize; 4560 static const int kRelocationInfoOffset = kInstructionSizeOffset + kIntSize;
4532 static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize; 4561 static const int kHandlerTableOffset = kRelocationInfoOffset + kPointerSize;
4533 static const int kDeoptimizationDataOffset = 4562 static const int kDeoptimizationDataOffset =
4534 kHandlerTableOffset + kPointerSize; 4563 kHandlerTableOffset + kPointerSize;
(...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after
4643 4672
4644 // Signed field cannot be encoded using the BitField class. 4673 // Signed field cannot be encoded using the BitField class.
4645 static const int kArgumentsCountShift = 14; 4674 static const int kArgumentsCountShift = 14;
4646 static const int kArgumentsCountMask = ~((1 << kArgumentsCountShift) - 1); 4675 static const int kArgumentsCountMask = ~((1 << kArgumentsCountShift) - 1);
4647 4676
4648 // This constant should be encodable in an ARM instruction. 4677 // This constant should be encodable in an ARM instruction.
4649 static const int kFlagsNotUsedInLookup = 4678 static const int kFlagsNotUsedInLookup =
4650 TypeField::kMask | CacheHolderField::kMask; 4679 TypeField::kMask | CacheHolderField::kMask;
4651 4680
4652 private: 4681 private:
4682 friend class RelocIterator;
4683
4684 // Code aging
4685 byte* FindCodeAgeSequence();
4686 static void GetCodeAgeAndParity(Code* code, Age* age,
4687 MarkingParity* parity);
4688 static void GetCodeAgeAndParity(byte* sequence, Age* age,
4689 MarkingParity* parity);
4690 static Code* GetCodeAgeStub(Age age, MarkingParity parity);
4691
4692 // Code aging -- platform-specific
4693 byte* FindPlatformCodeAgeSequence();
4694 static void PatchPlatformCodeAge(byte* sequence, Age age,
4695 MarkingParity parity);
4696
4653 DISALLOW_IMPLICIT_CONSTRUCTORS(Code); 4697 DISALLOW_IMPLICIT_CONSTRUCTORS(Code);
4654 }; 4698 };
4655 4699
4656 4700
4657 // All heap objects have a Map that describes their structure. 4701 // All heap objects have a Map that describes their structure.
4658 // A Map contains information about: 4702 // A Map contains information about:
4659 // - Size information about the object 4703 // - Size information about the object
4660 // - How to iterate over an object (for garbage collection) 4704 // - How to iterate over an object (for garbage collection)
4661 class Map: public HeapObject { 4705 class Map: public HeapObject {
4662 public: 4706 public:
(...skipping 4227 matching lines...) Expand 10 before | Expand all | Expand 10 after
8890 8934
8891 // Visits the resource of an ASCII or two-byte string. 8935 // Visits the resource of an ASCII or two-byte string.
8892 virtual void VisitExternalAsciiString( 8936 virtual void VisitExternalAsciiString(
8893 v8::String::ExternalAsciiStringResource** resource) {} 8937 v8::String::ExternalAsciiStringResource** resource) {}
8894 virtual void VisitExternalTwoByteString( 8938 virtual void VisitExternalTwoByteString(
8895 v8::String::ExternalStringResource** resource) {} 8939 v8::String::ExternalStringResource** resource) {}
8896 8940
8897 // Visits a debug call target in the instruction stream. 8941 // Visits a debug call target in the instruction stream.
8898 virtual void VisitDebugTarget(RelocInfo* rinfo); 8942 virtual void VisitDebugTarget(RelocInfo* rinfo);
8899 8943
8944 // Visits the byte sequence in a function's prologue that contains information
8945 // about the code's age.
8946 virtual void VisitCodeAgeSequence(RelocInfo* rinfo);
8947
8900 // Handy shorthand for visiting a single pointer. 8948 // Handy shorthand for visiting a single pointer.
8901 virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); } 8949 virtual void VisitPointer(Object** p) { VisitPointers(p, p + 1); }
8902 8950
8903 // Visit pointer embedded into a code object. 8951 // Visit pointer embedded into a code object.
8904 virtual void VisitEmbeddedPointer(RelocInfo* rinfo); 8952 virtual void VisitEmbeddedPointer(RelocInfo* rinfo);
8905 8953
8906 // Visits a contiguous arrays of external references (references to the C++ 8954 // Visits a contiguous arrays of external references (references to the C++
8907 // heap) in the half-open range [start, end). Any or all of the values 8955 // heap) in the half-open range [start, end). Any or all of the values
8908 // may be modified on return. 8956 // may be modified on return.
8909 virtual void VisitExternalReferences(Address* start, Address* end) {} 8957 virtual void VisitExternalReferences(Address* start, Address* end) {}
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
8955 } else { 9003 } else {
8956 value &= ~(1 << bit_position); 9004 value &= ~(1 << bit_position);
8957 } 9005 }
8958 return value; 9006 return value;
8959 } 9007 }
8960 }; 9008 };
8961 9009
8962 } } // namespace v8::internal 9010 } } // namespace v8::internal
8963 9011
8964 #endif // V8_OBJECTS_H_ 9012 #endif // V8_OBJECTS_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698