[Vm-dev] VM Maker: Cog-eem.444.mcz

commits at source.squeak.org commits at source.squeak.org
Sat Oct 16 01:02:10 UTC 2021


Eliot Miranda uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-eem.444.mcz

==================== Summary ====================

Name: Cog-eem.444
Author: eem
Time: 15 October 2021, 6:01:34.301286 pm
UUID: 6bba95a6-248c-429e-bacc-9912f1d0cc14
Ancestors: Cog-eem.443

Fix a slip in instruction decode in GdbARMv8Alien>>handleFailingLoadStore:at:in: which confused CASAL for a STLXR.

Make the inst vars of SpurImagePreener and SpurMtoNBitImageConverter line up (oldHeap=>sourceHeap,newHeap=>targetHeap). It may be worth adding a common superclass at some point.

=============== Diff against Cog-eem.443 ===============

Item was changed:
  ----- Method: GdbARMv8Alien>>handleFailingLoadStore:at:in: (in category 'error handling') -----
  handleFailingLoadStore: instruction at: pc in: memoryArray "<DoubleWordArray|ByteArray>"
  	"C4.1.4		Loads and Stores	C4-266
  	 This section describes the encoding of the Loads and Stores group. The encodings in this section are decoded from A64 instruction set encoding on page C4-252.
  
  		Table C4-5 Encoding table for the Loads and Stores group
    
  		op0 31:28 1 op1 26 0 op2 24:23 x op3 21:16 x op4 11:10
  
  		op0		op2		op3			op4
  		xx11	0x		0xxxxx		00	Load/store register (unscaled immediate) on page C4-283
  		xx11	0x		0xxxxx		01	Load/store register (immediate post-indexed) on page C4-284
  		xx11	0x		0xxxxx		10	Load/store register (unprivileged) on page C4-286
  		xx11	0x		0xxxxx		11	Load/store register (immediate pre-indexed) on page C4-286
  		xx11	0x		1xxxxx		00	Atomic memory operations on page C4-288
  		xx11	0x		1xxxxx		10	Load/store register (register offset) on page C4-295
  		xx11	0x		1xxxxx		x1	Load/store register (pac) on page C4-297
+ 		xx11	1x		1xxxxx		-	Load/store register (unsigned immediate) on page C4-297
- 		xx11	1x		1xxxxx		-	Load/store register (unsigned immediate) on page C4-297"
  
+ 		Load/store exclusive table starts on page C4-277 (. implies a bit)
+ 		|size..|0 0 1 0 0 0|o2.|L.|o1.|Rs.....|o0.|Rt2.....|Rn.....|Rt.....|
+ 		o2 = bit 23, L=bit 22, o1 = bit 21, o0 = bit 15"
+ 
  	| op0op2 size op4 rm rn rt opc v offsetFromImm addr shift |
  	"self disassembleInstructionAt: self pc In: memoryArray"
  	size := instruction bitShift: -30.
  	opc := (instruction bitShift: -22) bitAnd: 3.
  	op4 := (instruction bitShift: -10) bitAnd: 3.
  	rn := (instruction bitShift: -5) bitAnd: 31.
  	rt := instruction bitAnd: 31.
  	(rn = 31 and: [self sp anyMask: 15]) ifTrue:
  		[self reportStackAlignmentVolation].
  	"op0 = xx11 op2 = 0x"
  	(op0op2 := (instruction bitShift: -23) bitAnd: 2r1100010) = 2r1100000 ifFalse:
  		[offsetFromImm := ARMv8A64Opcodes extractOffsetFromLoadStore: instruction.
  		 (v := instruction >> 26 bitAnd: 1) = 0 ifFalse: [self halt].
  		 addr := (self perform: (self registerStateGetters at: rn + 1)) + offsetFromImm.
  		 op0op2 = 2r1100010 ifTrue: "Load/store register (unsigned immediate) on page C4-297"
  			[^(opc = 0
  				ifTrue:
  					[ProcessorSimulationTrap
  							pc: pc
  							nextpc: pc + 4
  							address: addr
  							type: #write
  							accessor: ((self registerStateGettersForSizes: size) at: rt + 1)]
  				ifFalse:
  					[ProcessorSimulationTrap
  							pc: pc
  							nextpc: pc + 4
  							address: addr
  							type: #read
  							accessor: ((self registerStateSettersForSizes: size) at: rt + 1)])
  					signal].
  		 op0op2 = 2r1000010 ifTrue: "Load/store register pair (signed immediate) on page C4-282"
  			[| rt2 |
  			 rt2 := (instruction bitShift: -10) bitAnd: 31.
  			 ^opc = 0
  				ifTrue:
  					[(ProcessorSimulationTrap
  							pc: pc
  							nextpc: pc + 4
  							address: addr
  							type: #write
  							accessor: ((self registerStateGettersForSizes: size + 1) at: rt + 1))
  						signal.
  					 (ProcessorSimulationTrap
  							pc: pc
  							nextpc: pc + 4
  							address: addr + 8
  							type: #write
  							accessor: ((self registerStateGettersForSizes: size + 1) at: rt2 + 1))
  						signal]
  				ifFalse:
  					[(ProcessorSimulationTrap
  							pc: pc
  							nextpc: pc + 4
  							address: addr
  							type: #read
  							accessor: ((self registerStateSettersForSizes: size + 1) at: rt + 1))
  						signal.
  					 (ProcessorSimulationTrap
  							pc: pc
  							nextpc: pc + 4
  							address: addr + 8
  							type: #read
  							accessor: ((self registerStateSettersForSizes: size + 1) at: rt2 + 1))
  						signal]].
+ 		
+ 		op0op2 = 0 ifTrue: "LDAXR/STLXR register on page C4-279"
- 		op0op2 = 0 ifTrue: "LDAXR/STRXR register on page C4-279"
  			[| result rs |
  			 self assert: size = 3.
  			 opc = 1 ifTrue:
  				[^(ProcessorSimulationTrap
  							pc: pc
  							nextpc: pc + 4
  							address: addr
  							type: #read
  							accessor: (self registerStateSetters at: rt + 1)) signal].
+ 			 opc = 0 ifTrue:
+ 				[result := (ProcessorSimulationTrap
+ 								pc: pc
+ 								nextpc: pc + 4
+ 								address: addr
+ 								type: #write
+ 								accessor: (self registerStateGetters at: rt + 1)) signal.
+ 				rs := instruction >> 16 bitAnd: 31.
+ 				"For now assume the write succeeded..."
+ 				self perform: ((self registerStateSettersForSizes: 2) at: rs + 1)
+ 					with: 0.
+ 				^result]]].
- 			result := (ProcessorSimulationTrap
- 							pc: pc
- 							nextpc: pc + 4
- 							address: addr
- 							type: #write
- 							accessor: (self registerStateGetters at: rt + 1)) signal.
- 			rs := instruction >> 16 bitAnd: 31.
- 			"For now assume the write succeeded..."
- 			self perform: ((self registerStateSettersForSizes: 2) at: rs + 1)
- 				with: 0.
- 			^result].
- 		 self halt: 'undecoded failing load/store'].
  
  	((instruction bitShift: -21) noMask: 1) ifTrue: "op3 = 0xxxxx"
  		[offsetFromImm := ((instruction bitShift: -12) bitAnd: 16r1FF) bitShift: size.
  		 opc = 0 ifTrue:"C4-286	opc = 0 => store"
  			[self assert: size = 3.
  			^(ProcessorSimulationTrap
  					pc: pc
  					nextpc: pc + 4
  					address: (self perform: (self registerStateGetters at: rn + 1)) + offsetFromImm
  					type: #write
  					accessor: (self registerStateGetters at: rt + 1))
  				signal].
  		 opc = 1 ifTrue:
  			 [^(ProcessorSimulationTrap
  					pc: pc
  					nextpc: pc + 4
  					address: (self perform: (self registerStateGetters at: rn + 1)) + offsetFromImm
  					type: #read
  					accessor: ((self registerStateSettersForSizes: size) at: rt + 1))
  				signal].
  		self halt: 'op3 = 0xxxxx opc > 1'].
  
  		"op0	op2		op3			op4
  		 xx11	0x		1xxxxx		10		Load/store register (register offset) on page C4-295 (296/297)"
  	
  	v := instruction >> 26 bitAnd: 1.
  	rm := instruction >> 16 bitAnd: 31.
  	shift := instruction anyMask: 1 << 12.
  	(size = 3 and: [v = 0]) ifTrue:
  		[addr := (self perform: (self registerStateGetters at: rn + 1))
  				+ (shift
  					ifTrue: [(self perform: (self registerStateGetters at: rm + 1)) << size]
  					ifFalse: [self perform: (self registerStateGetters at: rm + 1)]).
  		 opc = 0 ifTrue: "STR (register) - 64-bit variant on page C6-1242"
  			[^(ProcessorSimulationTrap
  					pc: pc
  					nextpc: pc + 4
  					address: addr
  					type: #write
  					accessor: (self registerStateGetters at: rt + 1))
  				signal].
  		 opc = 1 ifTrue: "LDR (register) - 64-bit variant on page C6-981"
  			 [^(ProcessorSimulationTrap
  					pc: pc
  					nextpc: pc + 4
  					address: addr
  					type: #read
  					accessor: (self registerStateSetters at: rt + 1))
  				signal].
  		 (opc = 3 and: [instruction >> 10 allMask: 63]) ifTrue: "CASAL C4-278/C6-829"
  			[^(CompareAndSwapSimulationTrap
  					pc: pc
  					nextpc: pc + 4
  					address: (self perform: (self registerStateGetters at: rn + 1))
  					type: #write
  					accessor: (self registerStateSetters at: rm + 1))
  				expectedValue: (self perform: (self registerStateGetters at: rm + 1));
  				storedValue: (self perform: (self registerStateGetters at: rt + 1));
  				signal].
  		self halt: 'op3 = 1xxxxx opc > 1'].
  	self halt: 'op3 = 1xxxxx size ~= 3'!

Item was changed:
  SimulatorHarness subclass: #SpurImagePreener
+ 	instanceVariableNames: 'map reverseMap sourceHeap targetHeap sourceInterpreter targetInterpreter imageHeaderFlags savedWindowSize writeDefaultHeader wordSize'
- 	instanceVariableNames: 'oldHeap newHeap map reverseMap oldInterpreter newInterpreter imageHeaderFlags savedWindowSize writeDefaultHeader wordSize'
  	classVariableNames: ''
  	poolDictionaries: 'VMObjectIndices'
  	category: 'Cog-Bootstrapping'!
  
+ !SpurImagePreener commentStamp: 'eem 10/12/2021 17:42' prior: 0!
- !SpurImagePreener commentStamp: 'eem 10/12/2021 16:58' prior: 0!
  A SpurImagePreener is a simple image rewriter for Spur images that eliminates free space and hence shrinks the preened image.  Use via e.g.
+ 	SpurImagePreener new preenImage: 'trunk'
+ which will produce trunk-preen.image and trunk-preen.changes from trunk.image and trunk.changes.
- 	SpurImagePreener new preenImage: 'spur'
- which will produce spur-preen.image and spur-preen.changes from spur.image and spur.changes, etc.
  
  Instance Variables
  	imageHeaderFlags:		<Integer>
  	map:					<Dictionary>
- 	newHeap:				<Spur[32|64]BitMMLESimulator>
- 	newInterpreter:			<StackInterpreterSimulatorLSB>
- 	oldHeap:				<Spur[32|64]BitMMLESimulator>
- 	oldInterpreter:			<StackInterpreterSimulatorLSB>
  	reverseMap:			<Dictionary>
  	savedWindowSize:		<Integer>
+ 	sourceHeap:			<Spur[32|64]BitMMLESimulator>
+ 	sourceInterpreter:		<StackInterpreterSimulatorLSB>
+ 	targetHeap:			<Spur[32|64]BitMMLESimulator>
+ 	targetInterpreter:		<StackInterpreterSimulatorLSB>
  
  imageHeaderFlags
  	- flags word in image header
  
  map
+ 	- map from oops in target image to oops in source image
- 	- map from oops in old image to oops in new image
  
+ sourceHeap
+ 	- the unpreened heap
- newHeap
- 	- the preened heap
  
+ sourceInterpreter
+ 	- the interpreter wrapping the unpreened heap
- newInterpreter
- 	- the interpreter wrapping the preened heap
  
+ targetHeap
- oldHeap
  	- the heap to be preened
  
+ targetInterpreter
- oldInterpreter
  	- the interpreter wrapping the heap to be preened
  
  reverseMap
+ 	- map from oops in source image to oops in target image
- 	- map from oops in new image to oops in old image
  
  savedWindowSize
  	- screen size word in mage header
  !

Item was changed:
  ----- Method: SpurImagePreener>>cloneFreeLists: (in category 'bootstrap image') -----
  cloneFreeLists: oldObj
  	| newObj |
+ 	newObj := targetHeap
+ 				allocateSlots: targetHeap numFreeLists
+ 				format: targetHeap wordIndexableFormat
+ 				classIndex: targetHeap wordSizeClassIndexPun.
- 	newObj := newHeap
- 				allocateSlots: newHeap numFreeLists
- 				format: newHeap wordIndexableFormat
- 				classIndex: newHeap wordSizeClassIndexPun.
  	reverseMap at: newObj put: oldObj.
  	^map at: oldObj put: newObj!

Item was changed:
  ----- Method: SpurImagePreener>>cloneObject: (in category 'bootstrap image') -----
  cloneObject: oldObj
  	| newObj hash |
+ 	newObj := targetHeap
+ 				allocateSlots: (sourceHeap numSlotsOf: oldObj)
+ 				format: (sourceHeap formatOf: oldObj)
+ 				classIndex: (sourceHeap classIndexOf: oldObj).
+ 	(hash := sourceHeap rawHashBitsOf: oldObj) ~= 0 ifTrue:
+ 		[targetHeap setHashBitsOf: newObj to: hash].
+ 	(sourceHeap isImmutable: oldObj) ifTrue:
+ 		[targetHeap setIsImmutableOf: newObj to: true].
+ 	(sourceHeap isPinned: oldObj) ifTrue:
+ 		[targetHeap setIsPinnedOf: newObj to: true].
+ 	self deny: (sourceHeap isRemembered: oldObj).
+ 	self deny: (sourceHeap isMarked: oldObj).
+ 	self deny: (sourceHeap isGrey: oldObj).
- 	newObj := newHeap
- 				allocateSlots: (oldHeap numSlotsOf: oldObj)
- 				format: (oldHeap formatOf: oldObj)
- 				classIndex: (oldHeap classIndexOf: oldObj).
- 	(hash := oldHeap rawHashBitsOf: oldObj) ~= 0 ifTrue:
- 		[newHeap setHashBitsOf: newObj to: hash].
- 	(oldHeap isImmutable: oldObj) ifTrue:
- 		[newHeap setIsImmutableOf: newObj to: true].
- 	(oldHeap isPinned: oldObj) ifTrue:
- 		[newHeap setIsPinnedOf: newObj to: true].
- 	self deny: (oldHeap isRemembered: oldObj).
- 	self deny: (oldHeap isMarked: oldObj).
- 	self deny: (oldHeap isGrey: oldObj).
  	reverseMap at: newObj put: oldObj.
  	^map at: oldObj put: newObj!

Item was changed:
  ----- Method: SpurImagePreener>>cloneObjects (in category 'bootstrap image') -----
  cloneObjects
  	"Clone all normal objects.  Of hidden objects only clone the freeLists object and
  	 the classTableRoot and class table pages. In particular, dont clone objStacks.
  	 The refs to the objStacks are nilled out in fillInHeap."
  	| i freeListsObject |
  	i := 0.
+ 	freeListsObject := sourceHeap freeListsObject.
+ 	sourceHeap allOldSpaceObjectsDo:
- 	freeListsObject := oldHeap freeListsObject.
- 	oldHeap allOldSpaceObjectsDo:
  		[:obj|
  		(i := i + 1) >= 100000 ifTrue:
  			[Transcript nextPut: $:; flush. i := 0].
  		 obj = freeListsObject
  			ifTrue:
  				[self cloneFreeLists: obj]
  			ifFalse:
  				[(self shouldClone: obj) ifTrue:
  					[self cloneObject: obj]]]!

Item was changed:
  ----- Method: SpurImagePreener>>fillInBitsObject:from: (in category 'bootstrap image') -----
  fillInBitsObject: newObj from: oldObj
+ 	0 to: (sourceHeap numSlotsOf: oldObj) - 1 do:
- 	0 to: (oldHeap numSlotsOf: oldObj) - 1 do:
  		[:i|
+ 		targetHeap
- 		newHeap
  			storePointerUnchecked: i
  			ofObject: newObj
+ 			withValue: (sourceHeap fetchPointer: i ofObject: oldObj)]!
- 			withValue: (oldHeap fetchPointer: i ofObject: oldObj)]!

Item was changed:
  ----- Method: SpurImagePreener>>fillInClassTable (in category 'bootstrap image') -----
  fillInClassTable
+ 	self fillInPointerObject: (map at: sourceHeap classTableRootObj) from: sourceHeap classTableRootObj!
- 	self fillInPointerObject: (map at: oldHeap classTableRootObj) from: oldHeap classTableRootObj!

Item was changed:
  ----- Method: SpurImagePreener>>fillInCompiledMethod:from: (in category 'bootstrap image') -----
  fillInCompiledMethod: newObj from: oldObj
  	"oldInterpreter printOop: oldObj"
  	"newInterpreter printOop: newObj"
+ 	0 to: (sourceHeap numPointerSlotsOf: oldObj) - 1 do:
- 	0 to: (oldHeap numPointerSlotsOf: oldObj) - 1 do:
  		[:i| | oldOop newOop |
+ 		 oldOop := sourceHeap fetchPointer: i ofObject: oldObj.
- 		 oldOop := oldHeap fetchPointer: i ofObject: oldObj.
  		 newOop := self mapOop: oldOop.
+ 		 targetHeap
- 		 newHeap
  			storePointerUnchecked: i
  			ofObject: newObj
  			withValue: newOop].
+ 	(sourceInterpreter startPCOfMethod: oldObj)
+ 		to: (sourceHeap numBytesOf: oldObj) - 1
- 	(oldInterpreter startPCOfMethod: oldObj)
- 		to: (oldHeap numBytesOf: oldObj) - 1
  		do: [:j|
+ 			targetHeap
- 			newHeap
  				storeByte: j 
  				ofObject: newObj
+ 				withValue: (sourceHeap fetchByte: j ofObject: oldObj)]!
- 				withValue: (oldHeap fetchByte: j ofObject: oldObj)]!

Item was changed:
  ----- Method: SpurImagePreener>>fillInHeap (in category 'bootstrap image') -----
  fillInHeap
  	| heapEnd freeListsObj |
+ 	heapEnd := targetHeap freeStart.
+ 	targetHeap
+ 		nilObject: (map at: sourceHeap nilObject);
+ 		falseObject: (map at: sourceHeap falseObject);
+ 		trueObject: (map at: sourceHeap trueObject);
+ 		specialObjectsOop: (map at: sourceHeap specialObjectsOop);
+ 		lastHash: sourceHeap lastHash;
+ 		setHiddenRootsObj: (map at: sourceHeap classTableRootObj).
+ 	targetHeap segmentManager
+ 		initSegmentForInImageCompilationFrom: targetHeap nilObject
+ 		to: heapEnd + targetHeap bridgeSize.
+ 	freeListsObj := targetHeap objectAfter: targetHeap trueObject.
- 	heapEnd := newHeap freeStart.
- 	newHeap
- 		nilObject: (map at: oldHeap nilObject);
- 		falseObject: (map at: oldHeap falseObject);
- 		trueObject: (map at: oldHeap trueObject);
- 		specialObjectsOop: (map at: oldHeap specialObjectsOop);
- 		lastHash: oldHeap lastHash;
- 		setHiddenRootsObj: (map at: oldHeap classTableRootObj).
- 	newHeap segmentManager
- 		initSegmentForInImageCompilationFrom: newHeap nilObject
- 		to: heapEnd + newHeap bridgeSize.
- 	freeListsObj := newHeap objectAfter: newHeap trueObject.
  	"Nil-out the free lists."
+ 	targetHeap
+ 		fillObj: freeListsObj numSlots: (targetHeap numSlotsOf: freeListsObj) with: 0;
- 	newHeap
- 		fillObj: freeListsObj numSlots: (newHeap numSlotsOf: freeListsObj) with: 0;
  		initializeFreeSpacePostLoad: freeListsObj;
  		initializePostBootstrap;
+ 		setEndOfMemory: (targetHeap segmentManager bridgeAt: 0) + targetHeap baseHeaderSize!
- 		setEndOfMemory: (newHeap segmentManager bridgeAt: 0) + newHeap baseHeaderSize!

Item was changed:
  ----- Method: SpurImagePreener>>fillInObjects (in category 'bootstrap image') -----
  fillInObjects
  	"oldInterpreter printOop: oldObj"
  	| i |
+ 	{sourceHeap markStack. sourceHeap weaklingStack. sourceHeap mournQueue} do:
- 	{oldHeap markStack. oldHeap weaklingStack. oldHeap mournQueue} do:
  		[:obj|
+ 		obj ~= sourceHeap nilObject ifTrue:
+ 			[map at: obj put: (map at: sourceHeap nilObject)]].
- 		obj ~= oldHeap nilObject ifTrue:
- 			[map at: obj put: (map at: oldHeap nilObject)]].
  	i := 0.
+ 	sourceHeap allObjectsDo:
- 	oldHeap allObjectsDo:
  		[:oldObj|
  		(i := i + 1) >= 10000 ifTrue:
  			[Transcript nextPut: $.; flush. i := 0].
  		(map at: oldObj ifAbsent: nil)
  			ifNotNil:
  				[:newObj| | format |
+ 				(targetHeap numSlotsOf: newObj) > 0 ifTrue: "filter-out filtered objStack pages"
+ 					[format := sourceHeap formatOf: oldObj.
+ 					 (targetHeap isPointersFormat: format)
- 				(newHeap numSlotsOf: newObj) > 0 ifTrue: "filter-out filtered objStack pages"
- 					[format := oldHeap formatOf: oldObj.
- 					 (newHeap isPointersFormat: format)
  						ifTrue:
  							[self fillInPointerObject: newObj from: oldObj]
  						ifFalse:
+ 							[(targetHeap isCompiledMethodFormat: format)
- 							[(newHeap isCompiledMethodFormat: format)
  								ifTrue: [self fillInCompiledMethod: newObj from: oldObj]
  								ifFalse: [self fillInBitsObject: newObj from: oldObj]]]]
  			ifNil: [self assert: (self isUnmappedObject: oldObj)]]!

Item was changed:
  ----- Method: SpurImagePreener>>fillInPointerObject:from: (in category 'bootstrap image') -----
  fillInPointerObject: newObj from: oldObj 
+ 	0 to: (sourceHeap numSlotsOf: oldObj) - 1 do:
- 	0 to: (oldHeap numSlotsOf: oldObj) - 1 do:
  		[:i|
+ 		 targetHeap
- 		 newHeap
  			storePointerUnchecked: i
  			ofObject: newObj
+ 			withValue: (self mapOop: (sourceHeap fetchPointer: i ofObject: oldObj))]!
- 			withValue: (self mapOop: (oldHeap fetchPointer: i ofObject: oldObj))]!

Item was changed:
  ----- Method: SpurImagePreener>>initMaps (in category 'initialize-release') -----
  initMaps
+ 	map := Dictionary new: sourceHeap memory size // 32.
+ 	reverseMap := Dictionary new: sourceHeap memory size // 32!
- 	map := Dictionary new: oldHeap memory size // 32.
- 	reverseMap := Dictionary new: oldHeap memory size // 32!

Item was changed:
  ----- Method: SpurImagePreener>>isUnmappedObject: (in category 'bootstrap image') -----
  isUnmappedObject: obj
  	"Answer if obj is an object that is not cloned by the bootstrap."
+ 	^obj = sourceHeap freeListsObject
+ 	  or: [(sourceHeap isValidObjStackPage: obj)]!
- 	^obj = oldHeap freeListsObject
- 	  or: [(oldHeap isValidObjStackPage: obj)]!

Item was changed:
  ----- Method: SpurImagePreener>>mapOop: (in category 'bootstrap image') -----
  mapOop: obj
  	"oldInterpreter printOop: obj"
  	^map
  		at: obj
  		ifAbsent:
+ 			[(sourceHeap isImmediate: obj)
- 			[(oldHeap isImmediate: obj)
  				ifTrue: [obj]
  				ifFalse: [self error: 'cannot map']]!

Item was changed:
  ----- Method: SpurImagePreener>>on: (in category 'public access') -----
  on: imageName
  	wordSize ifNil: [wordSize := self determineWordSizeFrom: imageName].
+ 	(sourceInterpreter := self newInterpreter) openOn: imageName extraMemory: 0.
+ 	sourceHeap := sourceInterpreter objectMemory.
+ 	imageHeaderFlags := sourceInterpreter getImageHeaderFlags.
+ 	savedWindowSize ifNil: [savedWindowSize := sourceInterpreter savedWindowSize].
+ 	targetInterpreter := self newInterpreter.
+ 	targetHeap := targetInterpreter objectMemory.
+ 	targetHeap
+ 		allocateMemoryOfSize: sourceHeap oldSpaceSize
- 	(oldInterpreter := self newInterpreter) openOn: imageName extraMemory: 0.
- 	oldHeap := oldInterpreter objectMemory.
- 	imageHeaderFlags := oldInterpreter getImageHeaderFlags.
- 	savedWindowSize ifNil: [savedWindowSize := oldInterpreter savedWindowSize].
- 	newInterpreter := self newInterpreter.
- 	newHeap := newInterpreter objectMemory.
- 	newHeap
- 		allocateMemoryOfSize: oldHeap oldSpaceSize
  		newSpaceSize: self newSpaceSize
  		stackSize: 16 * 1024
  		codeSize: 0.
+ 	targetHeap bootstrapping: true.
- 	newHeap bootstrapping: true.
  	self initMaps!

Item was changed:
  ----- Method: SpurImagePreener>>reportSizes (in category 'bootstrap image') -----
  reportSizes
  	| change oldHeapSize newHeapSize |
+ 	oldHeapSize := sourceHeap oldSpaceSize.
+ 	targetHeap segmentManager computeTotalHeapSizeIncludingBridges. "To avoid assert fail"
+ 	newHeapSize := targetHeap oldSpaceSize.
- 	oldHeapSize := oldHeap oldSpaceSize.
- 	newHeap segmentManager computeTotalHeapSizeIncludingBridges. "To avoid assert fail"
- 	newHeapSize := newHeap oldSpaceSize.
  	change := newHeapSize - oldHeapSize / oldHeapSize.
  	Transcript
  		nextPutAll: 'done.'; cr;
  		nextPutAll: 'old heap size: '; nextPutAll: oldHeapSize asStringWithCommas; tab;
  		nextPutAll: 'initial new heap size: '; nextPutAll: newHeapSize asStringWithCommas; cr;
  		nextPutAll: 'change: '; print: change * 100.0 maxDecimalPlaces: 2; nextPut: $%; cr;
  		flush.
+ 	newHeapSize := targetHeap endOfMemory
+ 					- targetHeap scavenger eden limit
+ 					- targetHeap totalFreeListBytes.
- 	newHeapSize := newHeap endOfMemory
- 					- newHeap scavenger eden limit
- 					- newHeap totalFreeListBytes.
  	change := newHeapSize - oldHeapSize / oldHeapSize.
  	Transcript
  		nextPutAll: 'final new heap size: '; nextPutAll: newHeapSize asStringWithCommas; tab;
  		nextPutAll: 'change: '; print: change * 100.0 maxDecimalPlaces: 2; nextPut: $%; cr;
  		flush!

Item was changed:
  ----- Method: SpurImagePreener>>shouldClone: (in category 'bootstrap image') -----
  shouldClone: obj
+ 	^(sourceHeap isValidObjStackPage: obj) not!
- 	^(oldHeap isValidObjStackPage: obj) not!

Item was changed:
  ----- Method: SpurImagePreener>>writeSnapshot:headerFlags:screenSize: (in category 'snapshot') -----
  writeSnapshot: imageFileName headerFlags: headerFlags screenSize: screenSizeInteger
+ 	targetHeap
- 	newHeap
  		checkFreeSpace;
  		runLeakCheckerForFullGC.
  	writeDefaultHeader == true ifTrue:
+ 		[targetInterpreter
- 		[newInterpreter
  			desiredEdenBytes: 0;
  			desiredNumStackPages: 0;
  			setDesiredCogCodeSize: 0;
  			setMaxExtSemSizeTo: 0].
+ 	targetInterpreter
- 	newInterpreter
  		setImageHeaderFlagsFrom: headerFlags;
  		setDisplayForm: nil;
  		setSavedWindowSize: savedWindowSize;
  		imageName: imageFileName;
  		writeImageFileIO.
  	Transcript cr; show: 'Done!!'!

Item was changed:
  SimulatorHarness subclass: #SpurMtoNBitImageConverter
+ 	instanceVariableNames: 'map reverseMap sourceHeap targetHeap sourceInterpreter targetInterpreter imageHeaderFlags savedWindowSize literalMap'
- 	instanceVariableNames: 'sourceHeap targetHeap map reverseMap sourceInterpreter targetInterpreter imageHeaderFlags savedWindowSize literalMap'
  	classVariableNames: ''
  	poolDictionaries: 'VMObjectIndices VMSqueakClassIndices'
  	category: 'Cog-Bootstrapping'!



More information about the Vm-dev mailing list