[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