[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