[Vm-dev] VM Maker: VMMaker.oscog-eem.384.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Sep 17 06:25:34 UTC 2013
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.384.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.384
Author: eem
Time: 16 September 2013, 11:20:50.955 pm
UUID: f038e5ef-a20a-41e7-9ac6-7881b5fd4ad8
Ancestors: VMMaker.oscog-eem.383
Fix store check in inPlaceBecome:and:copyHashFlag:. Bootstrap now
gets as far as wanting to tenure obejcts during scavenge, 2801
rehashes in.
Fix lastPointerOf: enumeration and checking for remembering in
SMM>>checkHeapIntegrity.
Refactor possibleRootStoreInto:[value:] to lose unused param.
Make fetchClassofNonImm: more lenient so class table pages can
be printed.
=============== Diff against VMMaker.oscog-eem.383 ===============
Item was changed:
----- Method: Spur32BitMemoryManager>>checkHeapIntegrity (in category 'debug support') -----
checkHeapIntegrity
"Perform an integrity/leak check using the heapMap. Assume
clearLeakMapAndMapAccessibleObjects has set a bit at each
object's header. Scan all objects in the heap checking that every
pointer points to a header. Scan the rootTable, remapBuffer and
extraRootTable checking that every entry is a pointer to a header.
Check that the number of roots is correct and that all rootTable
entries have their rootBit set. Answer if all checks pass."
| ok numRememberedRootsInHeap |
<inline: false>
ok := true.
numRememberedRootsInHeap := 0.
self allObjectsDo:
+ [:obj| | containsYoung fieldOop classIndex classOop |
- [:obj| | fieldOop classIndex classOop |
(self isFreeObject: obj) ifFalse:
+ [containsYoung := false.
+ (self isRemembered: obj) ifTrue:
+ [numRememberedRootsInHeap := numRememberedRootsInHeap + 1.
+ (scavenger isInRememberedTable: obj) ifFalse:
+ [coInterpreter print: 'remembered object '; printHex: obj; print: ' is not in remembered table'; cr.
+ self eek.
+ ok := false]].
- [(self isRemembered: obj) ifTrue:
- [numRememberedRootsInHeap := numRememberedRootsInHeap + 1].
(self isForwarded: obj)
ifTrue:
[fieldOop := self fetchPointer: 0 ofForwardedOrFreeObject: obj.
(heapMap heapMapAtWord: (self pointerForOop: fieldOop)) = 0 ifTrue:
[coInterpreter print: 'object leak in forwarder '; printHex: obj; print: ' to unmapped '; printHex: fieldOop; cr.
self eek.
+ ok := false].
+ (self isYoung: fieldOop) ifTrue:
+ [containsYoung := true]]
- ok := false]]
ifFalse:
[classOop := self classAtIndex: (classIndex := self classIndexOf: obj).
(classOop isNil or: [classOop = nilObj]) ifTrue:
[coInterpreter print: 'object leak in '; printHex: obj; print: ' invalid class index '; printHex: classIndex; print: ' -> '; printHex: classOop; cr.
self eek.
ok := false].
+ self baseHeaderSize to: (self lastPointerOf: obj) by: BytesPerOop do:
- 0 to: (self lastPointerOf: obj) by: BytesPerOop do:
[:ptr|
+ fieldOop := self longAt: obj + ptr.
- fieldOop := self longAt: ptr.
(self isNonImmediate: fieldOop) ifTrue:
[| fi |
+ fi := ptr - self baseHeaderSize / self wordSize.
- fi := ptr - (obj + self baseHeaderSize).
(fieldOop bitAnd: self wordSize - 1) ~= 0
ifTrue:
[coInterpreter print: 'misaligned oop in '; printHex: obj; print: ' @ '; printNum: fi; print: ' = '; printHex: fieldOop; cr.
self eek.
ok := false]
ifFalse:
[(heapMap heapMapAtWord: (self pointerForOop: fieldOop)) = 0 ifTrue:
[coInterpreter print: 'object leak in '; printHex: obj; print: ' @ '; printNum: fi; print: ' = '; printHex: fieldOop; cr.
self eek.
+ ok := false].
+ (self isYoung: fieldOop) ifTrue:
+ [containsYoung := true]]]]].
+ (containsYoung and: [(self isYoung: obj) not]) ifTrue:
+ [(self isRemembered: obj) ifFalse:
+ [coInterpreter print: 'unremembered object '; printHex: obj; print: ' contains young oop(s)'; cr.
+ self eek.
+ ok := false]]]].
- ok := false]]]]]]].
numRememberedRootsInHeap ~= scavenger rememberedSetSize ifTrue:
[coInterpreter
print: 'root count mismatch. #heap roots ';
printNum: numRememberedRootsInHeap;
print: '; #roots ';
printNum: scavenger rememberedSetSize;
cr.
"But the system copes with overflow..."
self flag: 'no support for remembered set overflow yet'.
"ok := rootTableOverflowed and: [needGCFlag]"].
scavenger rememberedSetWithIndexDo:
[:obj :i|
(obj bitAnd: self wordSize - 1) ~= 0
ifTrue:
[coInterpreter print: 'misaligned oop in rootTable @ '; printNum: i; print: ' = '; printHex: obj; cr.
self eek.
ok := false]
ifFalse:
[(heapMap heapMapAtWord: (self pointerForOop: obj)) = 0
ifTrue:
[coInterpreter print: 'object leak in rootTable @ '; printNum: i; print: ' = '; printHex: obj; cr.
self eek.
ok := false]
ifFalse:
[(self isYoung: obj) ifTrue:
[coInterpreter print: 'non-root in rootTable @ '; printNum: i; print: ' = '; printHex: obj; cr.
self eek.
ok := false]]]].
self flag: 'no support for remap buffer yet'.
"1 to: remapBufferCount do:
[:ri|
obj := remapBuffer at: ri.
(obj bitAnd: self wordSize - 1) ~= 0
ifTrue:
[coInterpreter print: 'misaligned remapRoot @ '; printNum: ri; print: ' = '; printHex: obj; cr.
self eek.
ok := false]
ifFalse:
[(heapMap heapMapAtWord: (self pointerForOop: obj)) = 0
ifTrue:
[coInterpreter print: 'object leak in remapRoots @ '; printNum: ri; print: ' = '; printHex: obj; cr.
self eek.
ok := false]]]."
self flag: 'no support for extraRoots yet'.
"1 to: extraRootCount do:
[:ri|
obj := (extraRoots at: ri) at: 0.
(obj bitAnd: self wordSize - 1) ~= 0
ifTrue:
[coInterpreter print: 'misaligned extraRoot @ '; printNum: ri; print: ' => '; printHex: obj; cr.
self eek.
ok := false]
ifFalse:
[(heapMap heapMapAtWord: (self pointerForOop: obj)) = 0
ifTrue:
[coInterpreter print: 'object leak in extraRoots @ '; printNum: ri; print: ' => '; printHex: obj; cr.
self eek.
ok := false]]]."
^ok!
Item was changed:
----- Method: Spur32BitMemoryManager>>storePointer:ofForwardedOrFreeObject:withValue: (in category 'heap management') -----
storePointer: fieldIndex ofForwardedOrFreeObject: objOop withValue: valuePointer
(self isForwarded: objOop) ifTrue:
[(self isYoung: objOop) ifFalse: "most stores into young objects"
[((self isNonImmediate: valuePointer) and: [self isYoung: valuePointer]) ifTrue:
+ [self possibleRootStoreInto: objOop]]].
- [self possibleRootStoreInto: objOop value: valuePointer]]].
^self
longAt: objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
put: valuePointer!
Item was changed:
----- Method: Spur32BitMemoryManager>>storePointer:ofObject:withValue: (in category 'object access') -----
storePointer: fieldIndex ofObject: objOop withValue: valuePointer
"Note must check here for stores of young objects into old ones."
self assert: (self isForwarded: objOop) not.
(self isYoung: objOop) ifFalse: "most stores into young objects"
[(self isImmediate: valuePointer) ifFalse:
[(self isYoung: valuePointer) ifTrue:
+ [self possibleRootStoreInto: objOop]]].
- [self possibleRootStoreInto: objOop value: valuePointer]]].
^self
longAt: objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
put: valuePointer!
Item was changed:
----- Method: Spur64BitMemoryManager>>storePointer:ofObject:withValue: (in category 'object access') -----
storePointer: fieldIndex ofObject: objOop withValue: valuePointer
"Note must check here for stores of young objects into old ones."
self assert: (self isForwarded: objOop) not.
(self isYoung: objOop) ifFalse: "most stores into young objects"
[(self isImmediate: valuePointer) ifFalse:
[(self isYoung: valuePointer) ifTrue:
+ [self possibleRootStoreInto: objOop]]].
- [self possibleRootStoreInto: objOop value: valuePointer]]].
^self
longLongAt: objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
put: valuePointer!
Item was added:
+ ----- Method: SpurGenerationScavenger>>isInRememberedTable: (in category 'store check') -----
+ isInRememberedTable: objOop
+ 0 to: rememberedSetSize - 1 do:
+ [:i|
+ (rememberedSet at: i) = objOop ifTrue:
+ [^true]].
+ ^false!
Item was changed:
----- Method: SpurMemoryManager>>fetchClassOfNonImm: (in category 'object access') -----
fetchClassOfNonImm: objOop
| classIndex |
classIndex := self classIndexOf: objOop.
classIndex = self classIsItselfClassIndexPun ifTrue:
[^objOop].
+ self assert: classIndex >= self arrayClassIndexPun.
- self assert: classIndex >= FirstValidClassIndex.
^self classAtIndex: classIndex!
Item was changed:
----- Method: SpurMemoryManager>>inPlaceBecome:and:copyHashFlag: (in category 'become implementation') -----
inPlaceBecome: obj1 and: obj2 copyHashFlag: copyHashFlag
+ "Do become in place by swapping object contents."
+ | headerTemp temp1 temp2 o1HasYoung o2HasYoung |
- | headerTemp temp |
<var: 'headerTemp' type: #usqLong>
self assert: (self numSlotsOf: obj1) = (self numSlotsOf: obj2).
+ "swap headers, but swapping headers swaps remembered bits;
+ these need to be unswapped."
+ temp1 := self isRemembered: obj1.
+ temp2 := self isRemembered: obj2.
- (self isRemembered: obj1)
- ifTrue:
- [(self isRemembered: obj1) ifFalse:
- [scavenger
- replace: obj1
- inRememberedTableWith: obj2]]
- ifFalse:
- [(self isRemembered: obj2) ifTrue:
- [scavenger
- replace: obj2
- inRememberedTableWith: obj1]].
headerTemp := self longLongAt: obj1.
self longLongAt: obj1 put: (self longLongAt: obj2).
self longLongAt: obj2 put: headerTemp.
+ self setIsRememberedOf: obj1 to: temp1.
+ self setIsRememberedOf: obj2 to: temp2.
+ "swapping headers swaps hash; if !!copyHashFlagundo hash copy"
+ copyHashFlag ifFalse:
+ [temp1 := self rawHashBitsOf: obj1.
- copyHashFlag ifFalse: "undo hash copy"
- [temp := self rawHashBitsOf: obj1.
self setHashBitsOf: obj1 to: (self rawHashBitsOf: obj2).
+ self setHashBitsOf: obj2 to: temp1].
+ o1HasYoung := o2HasYoung := false.
- self setHashBitsOf: obj2 to: temp].
0 to: (self numSlotsOf: obj1) - 1 do:
[:i|
+ temp1 := self fetchPointer: i ofObject: obj1.
+ temp2 := self fetchPointer: i ofObject: obj2.
- temp := self fetchPointer: i ofObject: obj1.
self storePointerUnchecked: i
ofObject: obj1
+ withValue: temp2.
- withValue: (self fetchPointer: i ofObject: obj2).
self storePointerUnchecked: i
ofObject: obj2
+ withValue: temp1.
+ ((self isNonImmediate: temp2) and: [self isYoung: temp2]) ifTrue:
+ [o1HasYoung := true].
+ ((self isNonImmediate: temp1) and: [self isYoung: temp1]) ifTrue:
+ [o2HasYoung := true]].
+ (self isYoung: obj1) ifFalse:
+ [o1HasYoung ifTrue:
+ [self possibleRootStoreInto: obj1]].
+ (self isYoung: obj2) ifFalse:
+ [o2HasYoung ifTrue:
+ [self possibleRootStoreInto: obj2]]!
- withValue: temp]!
Item was added:
+ ----- Method: SpurMemoryManager>>possibleRootStoreInto: (in category 'store check') -----
+ possibleRootStoreInto: destObj
+ (#( storePointer:ofObject:withValue:
+ storePointer:ofForwardedOrFreeObject:withValue:
+ inPlaceBecome:and:copyHashFlag:) includes: thisContext sender method selector) ifFalse:
+ [self halt].
+ (self isRemembered: destObj) ifFalse:
+ [scavenger remember: destObj.
+ self setIsRememberedOf: destObj to: true]!
Item was removed:
- ----- Method: SpurMemoryManager>>possibleRootStoreInto:value: (in category 'store check') -----
- possibleRootStoreInto: destObj value: valueOop
- (#( storePointer:ofObject:withValue:
- storePointer:ofForwardedOrFreeObject:withValue:) includes: thisContext sender method selector) ifFalse:
- [self halt].
- (self isRemembered: destObj) ifFalse:
- [scavenger remember: destObj.
- self setIsRememberedOf: destObj to: true]!
Item was changed:
----- Method: StackInterpreter>>findClassContainingMethod:startingAt: (in category 'debug support') -----
findClassContainingMethod: meth startingAt: classObj
| currClass classDict classDictSize methodArray i |
currClass := classObj.
+ [self assert: (objectMemory isForwarded: currClass) not.
+ classDict := objectMemory fetchPointer: MethodDictionaryIndex ofObject: currClass.
+ self assert: (objectMemory isForwarded: classDict) not.
- [classDict := objectMemory fetchPointer: MethodDictionaryIndex ofObject: currClass.
classDictSize := objectMemory fetchWordLengthOf: classDict.
methodArray := objectMemory fetchPointer: MethodArrayIndex ofObject: classDict.
+ self assert: (objectMemory isForwarded: methodArray) not.
i := 0.
[i < (classDictSize - SelectorStart)] whileTrue:
[meth = (objectMemory fetchPointer: i ofObject: methodArray) ifTrue:
[^currClass].
i := i + 1].
currClass := self superclassOf: currClass.
currClass = objectMemory nilObject] whileFalse.
^currClass "method not found in superclass chain"!
More information about the Vm-dev
mailing list