Tom Braun uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog.seperateMarking-WoC.3330.mcz
==================== Summary ====================
Name: VMMaker.oscog.seperateMarking-WoC.3330 Author: WoC Time: 12 June 2023, 11:45:56.975399 am UUID: 6bdce5bc-136b-4541-a100-dd0364c4b0b7 Ancestors: VMMaker.oscog.seperateMarking-WoC.3329
activate TempVectReadBarrier because of (at least for me) missing method (followReceiverAndTemporaryForwardingPointersInStackZone)
=============== Diff against VMMaker.oscog.seperateMarking-WoC.3328 ===============
Item was changed: ----- Method: SpurMemoryManager>>attemptToShrink (in category 'growing/shrinking memory') ----- attemptToShrink "Attempt to shrink memory after successfully reclaiming lots of memory. If there's enough memory to shrink then be sure to attempt to shrink by at least growHeadroom because segments are typically of that size." + | start | + start := coInterpreter ioUTCMicrosecondsNow. (totalFreeOldSpace > shrinkThreshold and: [totalFreeOldSpace > growHeadroom and: [segmentManager shrinkObjectMemory: (totalFreeOldSpace - growHeadroom max: growHeadroom)]]) ifTrue: + [coInterpreter cr; print: 'shrink time: '; printNum: coInterpreter ioUTCMicrosecondsNow - start; tab; flush. + statShrinkMemory := statShrinkMemory + 1]! - [statShrinkMemory := statShrinkMemory + 1]!
Item was changed: ----- Method: SpurSegmentManager>>addSegmentOfSize: (in category 'growing/shrinking memory') ----- addSegmentOfSize: ammount <returnTypeC: #'SpurSegmentInfo *'> <inline: false> | allocatedSize | <var: #newSeg type: #'SpurSegmentInfo *'> <var: #segAddress type: #'void *'> <var: #allocatedSize type: #'usqInt'> self cCode: [] inSmalltalk: [segments ifNil: [^nil]]. "bootstrap" (manager "sent to the manager so that the simulator can increase memory to simulate a new segment" sqAllocateMemorySegmentOfSize: ammount Above: (self firstGapOfSizeAtLeast: ammount) AllocatedSizeInto: (self cCode: [self addressOf: allocatedSize] inSmalltalk: [[:sz| allocatedSize := sz]])) ifNotNil: [:segAddress| | newSegIndex newSeg | newSegIndex := self insertSegmentFor: segAddress asUnsignedIntegerPtr. "Simulation insertion code duplicates entries if newSegIndex ~= numSegments - 1" self cCode: '' inSmalltalk: [segments at: newSegIndex put: SpurSegmentInfo new]. newSeg := self addressOf: (segments at: newSegIndex). newSeg segStart: segAddress asUnsignedIntegerPtr; segSize: allocatedSize; swizzle: 0. "Required in the C version only" self assert: self segmentOverlap not. "self printSegmentAddresses." self bridgeFrom: (self addressOf: (segments at: newSegIndex - 1)) to: newSeg. self bridgeFrom: newSeg to: (newSegIndex = (numSegments - 1) ifFalse: [self addressOf: (segments at: newSegIndex + 1)]). totalHeapSizeIncludingBridges := totalHeapSizeIncludingBridges + allocatedSize. + manager coInterpreter cr; print: '-> '; printNum: totalHeapSizeIncludingBridges ;tab; flush. "test isInMemory:" 0 to: numSegments - 1 do: [:i| self assert: (self isInSegments: (segments at: i) segStart). self assert: (self isInSegments: (segments at: i) segLimit - manager wordSize). self assert: ((self isInSegments: (segments at: i) segLimit) not or: [i < (numSegments - 1) and: [(segments at: i) segLimit = (segments at: i + 1) segStart]]). self assert: ((self isInSegments: (segments at: i) segStart - manager wordSize) not or: [i > 0 and: [(segments at: i - 1) segLimit = (segments at: i) segStart]])]. ^newSeg]. ^nil!
Item was changed: ----- Method: SpurSegmentManager>>removeSegment: (in category 'growing/shrinking memory') ----- removeSegment: emptySeg <var: #emptySeg type: #'SpurSegmentInfo *'> | i | i := self indexOfSegment: emptySeg. self assert: i > 0.
totalHeapSizeIncludingBridges := totalHeapSizeIncludingBridges - emptySeg segSize. + manager coInterpreter cr; print: '-> '; printNum: totalHeapSizeIncludingBridges ;tab; flush. manager sqDeallocateMemorySegmentAt: emptySeg segStart asVoidPointer OfSize: emptySeg segSize. manager coInterpreter cr; print: 'remove segment '; tab; flush. i to: numSegments - 2 do: [:j| manager gc canReactToShiftSegment: (self addressOf: (segments at: j + 1)) to: j. segments at: j put: (segments at: j + 1)]. self cCode: [] inSmalltalk: [segments at: numSegments - 1 put: SpurSegmentInfo new]. numSegments := numSegments - 1.
self bridgeFrom: (self addressOf: (segments at: i - 1)) to: (i <= (numSegments - 1) ifTrue: [self addressOf: (segments at: i)]).
manager setLastSegment: (self addressOf: (segments at: numSegments - 1))!
Item was changed: ----- Method: StackInterpreter class>>initializePrimitiveTable (in category 'initialization') ----- (excessive size, no diff calculated)
Item was changed: ----- Method: StackInterpreter>>whiteOrBogusGreyObjectsOnStackPage: (in category 'debug support') ----- whiteOrBogusGreyObjectsOnStackPage: thePage "Answer if the page refers directly to any white objects." <var: #thePage type: #'StackPage *'> | theSP theFP frameRcvrOffset callerFP oop | theSP := thePage headSP. theFP := thePage headFP. "Skip the instruction pointer on top of stack of inactive pages." thePage = stackPage ifFalse: [theSP := theSP + objectMemory wordSize]. [frameRcvrOffset := self frameReceiverLocation: theFP. [theSP <= frameRcvrOffset] whileTrue: [oop := stackPages longAt: theSP. ((objectMemory isNonImmediate: oop) and: [(objectMemory isOldObject: oop) and: [objectMemory isWhiteOrBogusGrey: oop]]) ifTrue: + [objectMemory debugger. + ^true]. - [^true]. theSP := theSP + objectMemory wordSize]. (self frameHasContext: theFP) ifTrue: [self assert: (objectMemory isContext: (oop := self frameContext: theFP)). ((objectMemory isOldObject: oop) and: [objectMemory isWhiteOrBogusGrey: oop]) ifTrue: + [objectMemory debugger. + ^true]]. - [^true]]. ((objectMemory isOldObject: (oop := self frameMethodObject: theFP)) and: [objectMemory isWhiteOrBogusGrey: oop]) ifTrue: + [objectMemory debugger. + ^true]. - [^true]. (callerFP := self frameCallerFP: theFP) ~= 0] whileTrue: [theSP := theFP + FoxCallerSavedIP + objectMemory wordSize. theFP := callerFP]. theSP := self isCog ifTrue: [theFP + FoxCallerSavedIP + objectMemory wordSize] "caller ip is ceBaseReturnPC" ifFalse: [theFP + FoxCallerSavedIP]. "caller ip is frameCallerContext in a base frame" [theSP <= thePage baseAddress] whileTrue: [oop := stackPages longAt: theSP. ((objectMemory isNonImmediate: oop) and: [(objectMemory isOldObject: oop) and: [objectMemory isWhiteOrBogusGrey: oop]]) ifTrue: + [objectMemory debugger. + ^true]. - [^true]. theSP := theSP + objectMemory wordSize]. ^false!
Item was added: + ----- Method: StackInterpreterPrimitives>>primitiveGCCounters (in category 'system control primitives') ----- + primitiveGCCounters + <staticallyResolveReceiver: 'objectMemory gc' to: #SpurIncrementalGarbageCollector> + + | result | + argumentCount >0 ifTrue: + [^self primitiveFailFor: PrimErrBadNumArgs]. + + result := objectMemory instantiateClass: objectMemory classArray indexableSize: 6. + objectMemory gc gcCounters: result. + self methodReturnValue: result!
Item was changed: ----- Method: VMMaker class>>generateSqueakSpurIncrementalStack64VM (in category 'configurations') ----- generateSqueakSpurIncrementalStack64VM "No primitives since we can use those from the Cog VM" ^VMMaker generate: StackInterpreter with: #(ObjectMemory Spur64BitMemoryManager FailImbalancedPrimitives false MULTIPLEBYTECODESETS true + TempVectReadBarrier true - "TempVectReadBarrier true" gcClass SpurIncrementalGarbageCollector bytecodeTableInitializer initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid) to: self sourceTree, '/src/spur64.stack' platformDir: self sourceTree, '/platforms' including: #()!
vm-dev@lists.squeakfoundation.org