[Vm-dev] VM Maker: Cog-eem.128.mcz
commits at source.squeak.org
commits at source.squeak.org
Mon Jan 13 21:11:21 UTC 2014
Eliot Miranda uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-eem.128.mcz
==================== Summary ====================
Name: Cog-eem.128
Author: eem
Time: 13 January 2014, 1:10:54.717 pm
UUID: c941142d-2ead-413e-b128-c9c5a2777b4a
Ancestors: Cog-eem.127
Spur bootstrap:
Rescue the launchSaved short-cut by hacking newSpace
initialization.
Add report of average object size to the image bootstrap code.
Provide a bigger eden so that the launchSaved route can accomodate
the interpreter reserve.
=============== Diff against Cog-eem.127 ===============
Item was changed:
Object subclass: #SpurBootstrap
+ instanceVariableNames: 'oldHeap newHeap oldHeapSize newHeapSize oldHeapNumObjs newHeapNumObjs map reverseMap classToIndex oldInterpreter lastClassTablePage literalMap methodClasses installedPrototypes sizeSym rehashSym classMetaclass'
- instanceVariableNames: 'oldHeap newHeap oldHeapSize newHeapSize map reverseMap classToIndex oldInterpreter lastClassTablePage literalMap methodClasses installedPrototypes sizeSym rehashSym classMetaclass'
classVariableNames: 'ImageHeaderFlags ImageName ImageScreenSize TransformedImage'
poolDictionaries: 'VMObjectIndices'
category: 'Cog-Bootstrapping'!
!SpurBootstrap commentStamp: 'eem 9/11/2013 05:45' prior: 0!
SpurBootstrap bootstraps an image in SpurMemoryManager format from a Squeak V3 + closures format.
e.g.
(SpurBootstrap32 new on: '/Users/eliot/Cog/startreader.image')
transform;
launch
Bootstrap issues:
- should it implement a deterministic Symbol identityHash? This means set a Symbol's identityHash at instance creation time
based on its string hash so that e.g. MethodDIctionary instances have a deterministic order and don't need to be rehashed on load.
- should it collapse ContextPart and MethodContext down onto Context (and perhaps eliminate BlockContext)?
Instance Variables
classToIndex: <Dictionary>
lastClassTablePage: <Integer>
map: <Dictionary>
methodClasses: <Set>
newHeap: <SpurMemoryManager>
oldHeap: <NewObjectMemory>
oldInterpreter: <StackInterpreterSimulator>
reverseMap: <Dictionary>
symbolMap: <Dictionary>
classToIndex
- oldClass to new classIndex map
lastClassTablePage
- oop in newHeap of last classTable page. U<sed in validation to filter-out class table.
methodClasses
- cache of methodClassAssociations for classes in which modified methods are installed
map
- oldObject to newObject map
newHeap
- the output, bootstrapped image
oldHeap
- the input, image
oldInterpreter
- the interpreter associated with oldHeap, needed for a hack to grab WeakArray
reverseMap
- newObject to oldObject map
symbolMap
- symbol toi symbol oop in oldHeap, used to map prototype methdos to methods in oldHeap!
Item was changed:
----- Method: SpurBootstrap>>bootstrapImage (in category 'bootstrap image') -----
bootstrapImage
oldHeap fullGC.
+ self measureOldHeapPostGC.
- oldHeapSize := oldHeap freeStart.
self initMaps.
self findRequiredGlobals.
Transcript cr; nextPutAll: 'transforming image...'; flush.
self cloneNilTrueAndFalse.
self allocateFreeLists.
self buildClassMap.
self allocateClassTable.
self cloneObjects.
self fillInObjects.
self fillInClassTable.
newHeapSize := newHeap freeStart.
+ newHeap initializePostBootstrap.
+ self measureNewHeapPostInitPostBootstrap!
- newHeap initializePostBootstrap!
Item was changed:
----- Method: SpurBootstrap>>launch:simulatorClass:headerFlags: (in category 'testing') -----
launch: heap simulatorClass: simulatorClass headerFlags: headerFlags
| sim methodCacheSize |
sim := simulatorClass onObjectMemory: heap.
heap coInterpreter: sim.
(sim class allInstVarNames includes: 'cogCodeSize')
ifTrue:
[sim initializeInterpreter: 0.
methodCacheSize := sim methodCache size * heap wordSize.
sim instVarNamed: 'heapBase' put: heap startOfMemory;
instVarNamed: 'numStackPages' put: 8;
instVarNamed: 'cogCodeSize' put: 1024*1024;
moveMethodCacheToMemoryAt: sim cogCodeSize + sim computeStackZoneSize;
movePrimTraceLogToMemoryAt: sim cogCodeSize + sim computeStackZoneSize + methodCacheSize;
"sendTrace: 1+ 2 + 8 + 16;"
initializeCodeGenerator]
ifFalse:
[sim initializeInterpreter: 0].
+ heap
+ initializeNewSpaceVariables;
+ bootstrapping: false;
+ assimilateNewSegment: (heap segmentManager segments at: 0).
sim
setImageHeaderFlagsFrom: headerFlags;
imageName: ImageName;
flushExternalPrimitives;
openAsMorph;
transcript: Transcript. "deep copy copies this"
"sim
instVarNamed: 'printSends' put: true;
instVarNamed: 'printReturns' put: true;
instVarNamed: 'methodDictLinearSearchLimit' put: SmallInteger maxVal." "for now"
heap
setCheckForLeaks: 0;
runLeakCheckerForFullGC: true.
sim halt; run!
Item was added:
+ ----- Method: SpurBootstrap>>measureNewHeapPostInitPostBootstrap (in category 'stats') -----
+ measureNewHeapPostInitPostBootstrap
+ | savedEndOfMemory |
+ "need to hack around the fact that newHeap isn't all there yet.
+ In particular, it has no freeList so can't free space from
+ freeOldSpaceStart to endOfMemory to make oldSpace enumerable."
+ newHeapNumObjs := 0.
+ savedEndOfMemory := newHeap endOfMemory.
+ newHeap setEndOfMemory: newHeap freeOldSpaceStart.
+ newHeap allObjectsDo: [:o| newHeapNumObjs := newHeapNumObjs + 1].
+ newHeap setEndOfMemory: savedEndOfMemory!
Item was added:
+ ----- Method: SpurBootstrap>>measureOldHeapPostGC (in category 'stats') -----
+ measureOldHeapPostGC
+ oldHeapSize := oldHeap freeStart.
+ oldHeapNumObjs := 0.
+ oldHeap allObjectsDo: [:o| oldHeapNumObjs := oldHeapNumObjs + 1]!
Item was changed:
----- Method: SpurBootstrap>>on: (in category 'initialize-release') -----
on: imageName
StackInterpreter initializeWithOptions: Dictionary new.
oldInterpreter := StackInterpreterSimulator new.
oldInterpreter openOn: imageName extraMemory: 0.
oldHeap := oldInterpreter objectMemory.
newHeap := Spur32BitMMLESimulator new.
newHeap
allocateMemoryOfSize: (oldHeap youngStart * 3 / 2 roundUpTo: 1024 * 1024)
+ newSpaceSize: 2 * 1024 * 1024
- newSpaceSize: 1024 * 1024
stackSize: 1024 * 1024
codeSize: 0.
newHeap setCheckForLeaks: 15 - 6. "don't check become; or newSpace; soooo many rehashes in bootstrap"
newHeap bootstrapping: true.
self initMaps!
Item was added:
+ ----- Method: SpurBootstrap>>reportSizes (in category 'bootstrap image') -----
+ reportSizes
+ | change oldAvgBytes newAvgBytes |
+ change := newHeapSize - oldHeapSize / oldHeapSize.
+ oldAvgBytes := oldHeapSize asFloat / oldHeapNumObjs.
+ Transcript
+ nextPutAll: 'done.'; cr;
+ nextPutAll: 'old heap size: '; print: oldHeapSize; tab;
+ nextPutAll: ' (avg obj bytes '; print: (oldAvgBytes roundTo: 0.01); nextPutAll: ' words '; print: (oldAvgBytes / self wordSize roundTo: 0.01); nextPut: $); cr;
+ nextPutAll: 'initial new heap size: '; print: newHeapSize; cr;
+ nextPutAll: 'change: '; print: (change * 100.0 roundTo: 0.01); nextPut: $%; cr;
+ flush.
+ newHeapSize := newHeap endOfMemory
+ - newHeap scavenger eden limit
+ - newHeap totalFreeListBytes.
+ change := newHeapSize - oldHeapSize / oldHeapSize.
+ newAvgBytes := newHeapSize asFloat / newHeapNumObjs.
+ Transcript
+ nextPutAll: 'final new heap size: '; print: newHeapSize; tab;
+ nextPutAll: ' (avg obj bytes '; print: (newAvgBytes roundTo: 0.01); nextPutAll: ' words '; print: (newAvgBytes / self wordSize roundTo: 0.01); nextPut: $); cr;
+ nextPutAll: 'change: '; print: (change * 100.0 roundTo: 0.01); nextPut: $%; cr;
+ flush!
Item was changed:
----- Method: SpurBootstrap>>transform (in category 'bootstrap image') -----
transform
- | change |
self rememberRehashSymbol.
self findRequiredGlobals.
self installModifiedMethods.
self bootstrapImage.
self validate.
self rememberRehashSymbol.
self rehashImage.
self followForwardingPointers.
self scavengeImage.
self freeForwarders.
self compactImage.
+ self reportSizes!
- change := newHeapSize - oldHeapSize / oldHeapSize.
- Transcript
- nextPutAll: 'done.'; cr;
- nextPutAll: 'old heap size: '; print: oldHeapSize; cr;
- nextPutAll: 'initial new heap size: '; print: newHeapSize; cr;
- nextPutAll: 'change: '; print: (change * 100.0 roundTo: 0.01); nextPut: $%; cr;
- flush.
- newHeapSize := newHeap endOfMemory
- - newHeap scavenger eden limit
- - newHeap totalFreeListBytes.
- change := newHeapSize - oldHeapSize / oldHeapSize.
- Transcript
- nextPutAll: 'final new heap size: '; print: newHeapSize; cr;
- nextPutAll: 'change: '; print: (change * 100.0 roundTo: 0.01); nextPut: $%; cr;
- flush.!
More information about the Vm-dev
mailing list