Skip to content

Commit

Permalink
- Fixing issues
Browse files Browse the repository at this point in the history
- Writting tests
- Improving the checking for the GC of the method zone
  • Loading branch information
tesonep committed Jun 24, 2022
1 parent 4796869 commit aaa96ca
Show file tree
Hide file tree
Showing 6 changed files with 338 additions and 50 deletions.
26 changes: 13 additions & 13 deletions smalltalksrc/VMMaker/Cogit.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -4583,15 +4583,15 @@ Cogit >> closedPICRefersToUnmarkedObject: cPIC [
<var: #cPIC type: #'CogMethod *'>
| pc object |
((objectMemory isImmediate: cPIC selector)
or: [objectMemory isMarked: cPIC selector]) ifFalse:
or: [objectMemory isMarkedOrPermanent: cPIC selector]) ifFalse:
[^true].
"First jump is unconditional; subsequent ones are conditional."
"Check the potential method oop for the first case only.
Inline cache tags for the 1st case are at the send site."
pc := self addressOfEndOfCase: 1 inCPIC: cPIC.
(objectRepresentation couldBeObject: (object := backEnd literalBeforeFollowingAddress: pc - backEnd jumpLongByteSize)) ifTrue:
[(objectMemory isMarked: object) ifFalse:
[(objectMemory isMarkedOrPermanent: object) ifFalse:
[^true]].
"Check the first target"
Expand All @@ -4604,11 +4604,11 @@ Cogit >> closedPICRefersToUnmarkedObject: cPIC [
(self inlineCacheTagsAreIndexes not
and: [objectRepresentation inlineCacheTagsMayBeObjects
and: [objectRepresentation couldBeObject: (object := backEnd literal32BeforeFollowingAddress: pc - backEnd jumpLongConditionalByteSize)]]) ifTrue:
[(objectMemory isMarked: object) ifFalse:
[(objectMemory isMarkedOrPermanent: object) ifFalse:
[^true]].
"Check the potential method oop for subsequent cases."
(objectRepresentation couldBeObject: (object := backEnd literalBeforeFollowingAddress: pc - backEnd jumpLongConditionalByteSize - backEnd cmpC32RTempByteSize)) ifTrue:
[(objectMemory isMarked: object) ifFalse:
[(objectMemory isMarkedOrPermanent: object) ifFalse:
[^true]].
"Check subsequent targets"
(self markAndTraceOrFreePICTarget: (backEnd jumpLongConditionalTargetBeforeFollowingAddress: pc) in: cPIC) ifTrue:
Expand Down Expand Up @@ -6943,12 +6943,12 @@ Cogit >> freeUnmarkedMachineCode [
self enableCodeZoneWriteDuring: [
[cogMethod < methodZone limitZony] whileTrue:
[(cogMethod cmType = CMMethod
and: [(objectMemory isMarked: cogMethod methodObject) not]) ifTrue:
and: [(objectMemory isMarkedOrPermanent: cogMethod methodObject) not]) ifTrue:
[freedMethod := true.
methodZone freeMethod: cogMethod].
(cogMethod cmType = CMOpenPIC
and: [(objectMemory isImmediate: cogMethod selector) not
and: [(objectMemory isMarked: cogMethod selector) not]]) ifTrue:
and: [(objectMemory isMarkedOrPermanent: cogMethod selector) not]]) ifTrue:
[freedMethod := true.
methodZone freeMethod: cogMethod].
(cogMethod cmType = CMClosedPIC
Expand Down Expand Up @@ -9627,10 +9627,10 @@ Cogit >> markAndTraceLiteralsIn: cogMethod [
<var: #cogMethod type: #'CogMethod *'>
<inline: true>
self assert: ((cogMethod cmType = CMMethod
and: [objectMemory isMarked: cogMethod methodObject])
and: [objectMemory isMarkedOrPermanent: cogMethod methodObject])
or: [cogMethod cmType = CMOpenPIC
and: [(objectMemory isImmediate: cogMethod selector)
or: [objectMemory isMarked: cogMethod selector]]]).
or: [objectMemory isMarkedOrPermanent: cogMethod selector]]]).
objectRepresentation
markAndTraceLiteral: cogMethod selector
in: cogMethod
Expand Down Expand Up @@ -9690,11 +9690,11 @@ Cogit >> markAndTraceMachineCodeOfMarkedMethods [
cogMethod := self cCoerceSimple: methodZoneBase to: #'CogMethod *'.
[cogMethod < methodZone limitZony] whileTrue:
[(cogMethod cmType = CMMethod
and: [objectMemory isMarked: cogMethod methodObject]) ifTrue:
and: [objectMemory isMarkedOrPermanent: cogMethod methodObject]) ifTrue:
[self markAndTraceLiteralsIn: cogMethod].
(cogMethod cmType = CMOpenPIC
and: [(objectMemory isImmediate: cogMethod selector)
or: [objectMemory isMarked: cogMethod selector]]) ifTrue:
or: [objectMemory isMarkedOrPermanent: cogMethod selector]]) ifTrue:
[self markAndTraceLiteralsIn: cogMethod].
cogMethod := methodZone methodAfter: cogMethod].
objectMemory leakCheckFullGC ifTrue:
Expand Down Expand Up @@ -9737,7 +9737,7 @@ Cogit >> markAndTraceOrFreeCogMethod: cogMethod firstVisit: firstVisit [
[^true].
self assert: (self cogMethodDoesntLookKosher: cogMethod) = 0.
cogMethod cmType = CMMethod ifTrue:
[(objectMemory isMarked: cogMethod methodObject) ifFalse:
[(objectMemory isMarkedOrPermanent: cogMethod methodObject) ifFalse:
[methodZone freeMethod: cogMethod.
^true].
firstVisit ifTrue:
Expand All @@ -9749,7 +9749,7 @@ Cogit >> markAndTraceOrFreeCogMethod: cogMethod firstVisit: firstVisit [
methodZone freeMethod: cogMethod.
^true].
cogMethod cmType = CMOpenPIC ifTrue:
[(objectMemory isMarked: cogMethod selector) ifTrue:
[(objectMemory isMarkedOrPermanent: cogMethod selector) ifTrue:
[^false].
methodZone freeMethod: cogMethod.
^true].
Expand Down Expand Up @@ -9876,7 +9876,7 @@ Cogit >> markLiteralsAndUnlinkUnmarkedSendsIn: cogMethod [
<var: #cogMethod type: #'CogMethod *'>
<inline: true>
self assert: cogMethod cmType = CMMethod.
self assert: (objectMemory isMarked: cogMethod methodObject).
self assert: (objectMemory isMarkedOrPermanent: cogMethod methodObject).
objectRepresentation
markAndTraceLiteral: cogMethod selector
in: cogMethod
Expand Down
8 changes: 7 additions & 1 deletion smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -283,7 +283,9 @@ SpurGenerationScavenger >> copyAndForward: survivor [
It leaves a forwarding pointer behind. If the object is weak
then corpse is threaded onto the weakList for later treatment."
<inline: false>

| bytesInObj format tenure newLocation |

self assert: ((manager isInEden: survivor) "cog methods should be excluded."
or: [manager isInPastSpace: survivor]).
bytesInObj := manager bytesInObject: survivor.
Expand Down Expand Up @@ -636,6 +638,10 @@ SpurGenerationScavenger >> isMaybeOldScavengeSurvivor: oop [
(manager isImmediate: oop) ifTrue:
[^true]]
ifFalse: [target := oop].

(manager getMemoryMap isPermanentObject: target)
ifTrue: [ ^ true ].

^(manager getMemoryMap isOldObject: target)
ifTrue:
[tenureCriterion ~= MarkOnTenure
Expand Down Expand Up @@ -1158,7 +1164,7 @@ SpurGenerationScavenger >> scavengeReferentsOfFromPermSpace: referrer [

<inline: #never>

^ self scavengeReferentsOf: referrer additionalShouldKeepReferrerTestingBlock: [:aReferrer :referent | (manager isPermanent: referent) not].
^ self scavengeReferentsOf: referrer additionalShouldKeepReferrerTestingBlock: [:aReferrer :referent | (manager isPermanent: referent) not or:[ manager isFixedKnownObject: referent ]].
]

{ #category : #scavenger }
Expand Down
73 changes: 46 additions & 27 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -1223,7 +1223,7 @@ SpurMemoryManager >> activeAndDeferredScan: anEphemeron [
<inline: #never>
self assert: (self isEphemeron: anEphemeron).
((self isImmediate: (key := self keyOfEphemeron: anEphemeron))
or: [self isMarked: key]) ifTrue:
or: [self isMarkedOrPermanent: key ]) ifTrue:
[^false].
^self pushOnUnscannedEphemeronsStack: anEphemeron
]
Expand Down Expand Up @@ -1886,7 +1886,7 @@ SpurMemoryManager >> allStrongSlotsOfWeaklingAreMarked: aWeakling [
[:i| | referent |
referent := self fetchPointer: i ofObject: aWeakling.
(self isNonImmediate: referent) ifTrue:
[(self isMarked: referent) ifFalse:
[(self isMarkedOrPermanent: referent) ifFalse:
[^false]]].
^true
]
Expand All @@ -1896,7 +1896,7 @@ SpurMemoryManager >> allUnscannedEphemeronsAreActive [
unscannedEphemerons start to: unscannedEphemerons top - self bytesPerOop by: self bytesPerOop do:
[:p| | key |
key := self keyOfMaybeFiredEphemeron: (self longAt: p).
((self isImmediate: key) or: [self isMarked: key]) ifTrue:
((self isImmediate: key) or: [self isMarkedOrPermanent: key]) ifTrue:
[^false]].
^true
]
Expand Down Expand Up @@ -6216,7 +6216,7 @@ SpurMemoryManager >> inactiveOrFailedToDeferScan: anEphemeron [
| key |
self assert: (self isEphemeron: anEphemeron).
((self isImmediate: (key := self keyOfEphemeron: anEphemeron))
or: [self isMarked: key]) ifTrue:
or: [self isMarkedOrPermanent: key]) ifTrue:
[^true].
^(self pushOnUnscannedEphemeronsStack: anEphemeron) not
]
Expand Down Expand Up @@ -7054,6 +7054,15 @@ SpurMemoryManager >> isEphemeronFormat: format [
^format = self ephemeronFormat
]
{ #category : #'object testing' }
SpurMemoryManager >> isFixedKnownObject: valueObj [
"nil, false and true are in the beginning of the memory and they are always in that positions.
We can test if the valueObj is one of these three"
^ (valueObj >= self nilObject) and: [valueObj <= self trueObject]
]
{ #category : #'header format' }
SpurMemoryManager >> isFixedSizePointerFormat: format [
<api>
Expand Down Expand Up @@ -7324,6 +7333,14 @@ SpurMemoryManager >> isMarked: objOop [
self subclassResponsibility
]
{ #category : #'object testing' }
SpurMemoryManager >> isMarkedOrPermanent: anOop [
<api>
^ (self isMarked: anOop) or: [self isPermanent: anOop]
]
{ #category : #'object testing' }
SpurMemoryManager >> isMaybeFiredEphemeron: objOop [
^self isMaybeFiredEphemeronFormat: (self formatOf: objOop)
Expand Down Expand Up @@ -7572,13 +7589,6 @@ SpurMemoryManager >> isUnambiguouslyForwarder: objOop [
^(self classIndexOf: objOop) = self isForwardedObjectClassIndexPun
]
{ #category : #'header access' }
SpurMemoryManager >> isUnmarked: objOop [
"For debugging using printOopsSuchThat:"
<api>
^(self isMarked: objOop) not
]
{ #category : #'class table' }
SpurMemoryManager >> isValidClassIndex: classIndex [
| classTablePage |
Expand Down Expand Up @@ -8256,7 +8266,7 @@ SpurMemoryManager >> markAndTraceClassOf: objOop [
(classIndex ~= realClassIndex
and: [classIndex > self lastClassIndexPun]) ifTrue:
[self setClassIndexOf: objOop to: realClassIndex].
(self isMarked: classObj) ifFalse:
(self isMarkedOrPermanent: classObj) ifFalse:
[self setIsMarkedOf: classObj to: true.
self markAndTraceClassOf: classObj.
self push: classObj onObjStack: markStack]
Expand Down Expand Up @@ -8364,7 +8374,7 @@ SpurMemoryManager >> markAndTraceWeaklingsFrom: startIndex [
0 to: (self numStrongSlotsOfWeakling: weakling) - 1 do:
[:i| | field |
field := self followOopField: i ofObject: weakling.
((self isImmediate: field) or: [self isMarked: field]) ifFalse:
((self isImmediate: field) or: [self isMarkedOrPermanent: field]) ifFalse:
[self markAndTrace: field]]]
]
Expand All @@ -8381,7 +8391,7 @@ SpurMemoryManager >> markInactiveEphemerons [
[ptr < unscannedEphemerons top] whileTrue:
[| ephemeron key |
key := self followedKeyOfEphemeron: (ephemeron := self longAt: ptr).
((self isImmediate: key) or: [self isMarked: key])
((self isImmediate: key) or: [self isMarkedOrPermanent: key])
ifTrue:
[foundInactive := true.
"Now remove the inactive ephemeron from the set, and scan-mark it.
Expand Down Expand Up @@ -8782,7 +8792,10 @@ SpurMemoryManager >> moveToPermSpace: objOop [
0 to: numSlots - 1 do: [ :i | | referenced |
referenced := self fetchPointer: i ofObject: objOop.
(self isInOldSpace: referenced) ifTrue: [ shouldBeRememberedInOldSpace := true ].
(((memoryMap isOldObject: referenced) or: [memoryMap isYoungObject: referenced]) and: [ (self isFixedKnownObject: referenced) not ])
ifTrue: [ shouldBeRememberedInOldSpace := true ].
self
storePointerUnchecked: i
ofObject: newObj
Expand Down Expand Up @@ -9040,7 +9053,7 @@ SpurMemoryManager >> nilUnmarkedWeaklingSlotsIn: aWeakling [
(self isNonImmediate: referent) ifTrue:
[(self isUnambiguouslyForwarder: referent) ifTrue:
[referent := self fixFollowedField: i ofObject: aWeakling withInitialValue: referent].
((self isImmediate: referent) or: [self isMarked: referent]) ifFalse:
((self isImmediate: referent) or: [self isMarkedOrPermanent: referent]) ifFalse:
[self storePointerUnchecked: i ofObject: aWeakling withValue: nilObj.
anyUnmarked := true]]].
^anyUnmarked
Expand Down Expand Up @@ -9327,7 +9340,7 @@ SpurMemoryManager >> numStrongSlotsOfInephemeral: objOop [
<inline: true>
| fmt numSlots contextSize numLiterals header |
fmt := self formatOf: objOop.
self assert: (fmt ~= self ephemeronFormat or: [self isMarked: (self keyOfEphemeron: objOop)]).
self assert: (fmt ~= self ephemeronFormat or: [self isMarkedOrPermanent: (self keyOfEphemeron: objOop)]).
fmt <= self lastPointerFormat ifTrue:
[numSlots := self numSlotsOf: objOop.
fmt <= self arrayFormat ifTrue:
Expand Down Expand Up @@ -9840,11 +9853,17 @@ SpurMemoryManager >> possibleOldObjectStoreInto: destObj [
]
{ #category : #'store check' }
SpurMemoryManager >> possiblePermObjectStoreInto: destObj [
SpurMemoryManager >> possiblePermObjectStoreInto: destObj value: valueObj [
<inline: true>
(self isRemembered: destObj) ifFalse: [
fromPermSpaceRememberedSet doRemember: destObj ]
(self isFixedKnownObject: valueObj)
ifTrue: [ ^ self ].
(self isPermanent: destObj) ifTrue: [
(self isPermanent: valueObj) ifFalse: [
(self isRemembered: destObj) ifFalse: [
fromPermSpaceRememberedSet doRemember: destObj ] ] ]
]
{ #category : #'become implementation' }
Expand Down Expand Up @@ -10495,6 +10514,7 @@ SpurMemoryManager >> push: oop [
{ #category : #'obj stacks' }
SpurMemoryManager >> push: objOop onObjStack: objStack [
<inline: true>
self assert: (self addressCouldBeOop: objOop).
(self isImmediate: objOop)
ifTrue:
Expand Down Expand Up @@ -10797,6 +10817,8 @@ SpurMemoryManager >> rememberObjInCorrectRememberedSet: objOop [
(self isPermanent: objOop) ifTrue: [
^ fromPermSpaceRememberedSet doRemember: objOop ].
^ objOop
]
Expand Down Expand Up @@ -11897,9 +11919,7 @@ SpurMemoryManager >> storePointer: fieldIndex ofForwarder: objOop withValue: val
[(self isYoung: valuePointer) ifTrue:
[self possibleOldObjectStoreInto: objOop]].
(self isPermanent: objOop) ifTrue: [
(self isPermanent: valuePointer) ifFalse: [
self possiblePermObjectStoreInto: objOop ] ].
self possiblePermObjectStoreInto: objOop value: valuePointer.
^self
longAt: objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
Expand Down Expand Up @@ -11959,10 +11979,8 @@ SpurMemoryManager >> storePointer: fieldIndex ofObject: objOop withValue: valueP
(self isYoung: valuePointer) ifTrue: [
self possibleOldObjectStoreInto: objOop ] ].
(self isPermanent: objOop) ifTrue: [
(self isPermanent: valuePointer) ifFalse: [
self possiblePermObjectStoreInto: objOop ] ].
self possiblePermObjectStoreInto: objOop value: valuePointer.
^ self
longAt:
objOop + self baseHeaderSize + (fieldIndex << self shiftForWord)
Expand Down Expand Up @@ -12883,6 +12901,7 @@ SpurMemoryManager >> whereIsMaybeHeapThing: anOop [
[(segmentManager segmentContainingObj: anOop) ifNotNil:
[^' is in old space'].
^' is between old space segments'].
(self isInPermSpace: anOop) ifTrue: [ ^ ' is in permanent space' ].
^nil
]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,22 @@ Class {
#category : #'VMMaker-PermSpace'
}

{ #category : #'as yet unclassified' }
{ #category : #migrate }
VMSpurImageToComposedImageMigrationProcess >> copyChangesFileFromImage: originalImageString to: newImageString [

| originalImageFileReference originalChangesFileReference newImageFileReference newChangesFileReference |

originalImageFileReference := originalImageString asFileReference.
originalChangesFileReference := originalImageFileReference withExtension: 'changes'.

originalChangesFileReference ifExists: [
newImageFileReference := newImageString asFileReference.
newChangesFileReference := newImageFileReference withExtension: 'changes'.
newChangesFileReference ensureDelete.
originalChangesFileReference copyTo: newChangesFileReference ].
]

{ #category : #migrate }
VMSpurImageToComposedImageMigrationProcess >> createSimulator [

| environmentBuilder memoryClass |
Expand All @@ -33,29 +48,27 @@ VMSpurImageToComposedImageMigrationProcess >> createSimulator [
memory := environmentBuilder objectMemory.
]

{ #category : #'as yet unclassified' }
{ #category : #migrate }
VMSpurImageToComposedImageMigrationProcess >> loadImage: originalImage [

interpreter openOn: originalImage extraMemory: 0.


]

{ #category : #'as yet unclassified' }
{ #category : #migrate }
VMSpurImageToComposedImageMigrationProcess >> migrate: originalImage to: newImage [

self createSimulator.
self loadImage: originalImage.
self saveImage: newImage.


self copyChangesFileFromImage: originalImage to: newImage
]

{ #category : #'as yet unclassified' }
{ #category : #migrate }
VMSpurImageToComposedImageMigrationProcess >> saveImage: newImage [

interpreter imageName: newImage.
interpreter writeImageFileIO.


interpreter writeImageFileIO
]

0 comments on commit aaa96ca

Please sign in to comment.