Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

improving-permSpace #614

Merged
merged 6 commits into from
Jun 20, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion cmake/vmmaker.cmake
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ if(GENERATE_SOURCES)
message("Defining Windows VM to download for code generation")
set(VMMAKER_VM ${VMMAKER_DIR}/vm/PharoConsole.exe)
set(VM_URL https://files.pharo.org/vm/pharo-spur64-headless/Windows-x86_64/PharoVM-10.0.5-2757766f-Windows-x86_64-bin.zip)
set(VM_URL_HASH SHA256=e7430f753ae51fbec8b6a6105f9721cd503d13d0e4ad8069f74da0f6a32c8055)
set(VM_URL_HASH SHA256=917dbbef15b870ecf5ecf449bd6be39437985c6e3f056620e9acda60ea58e09e)
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux" AND (${CMAKE_SYSTEM_PROCESSOR} MATCHES "aarch64"))
message("Defining Linux AARCH64 VM to download for code generation")
set(VMMAKER_VM ${VMMAKER_DIR}/vm/pharo)
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/AbstractComposedImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ AbstractComposedImageAccess >> createImageDirectory: imageFileName [
self
cppIf: ((self defined: #_WIN32) or: [(self defined: #_WIN64)])
ifTrue: [ self mkdir: imageFileName ]
ifFalse: [ self mkdir: imageFileName _: 0777 ] ]
ifFalse: [ self mkdir: imageFileName _: 8r777 ] ]
inSmalltalk: [
imageFileName asFileReference ensureDeleteAll.
imageFileName asFileReference ensureCreateDirectory ]
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/CoInterpreter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -753,7 +753,7 @@ CoInterpreter >> assertValidStackedInstructionPointersIn: aStackPage line: ln [
theIP = cogit ceReturnToInterpreterPC ifTrue:
[theIP := self iframeSavedIP: theFP].
self assert: (theIP >= (methodObj + (objectMemory lastPointerOf: methodObj))
and: [theIP < (methodObj + (objectMemory numBytesOfBytes: methodObj) + objectMemory baseHeaderSize - 1)])
and: [theIP <= (methodObj + (objectMemory numBytesOfBytes: methodObj) + objectMemory baseHeaderSize - 1)])
l: ln.
prevFrameWasCogged := false].
theIP := (stackPages unsignedLongAt: theFP + FoxCallerSavedIP) asUnsignedInteger.
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/Spur32BitMMLESimulator.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Spur32BitMMLESimulator >> fetchFloatAt: floatBitsAddress into: aFloat [
aFloat at: 1 put: (self uint32AtPointer: floatBitsAddress+4)
]

{ #category : #'object access' }
{ #category : #'as yet unclassified' }
Spur32BitMMLESimulator >> fetchPointer: fieldIndex ofObject: objOop [
self assert: (self isForwarded: objOop) not.
self assert: (fieldIndex >= 0 and: [fieldIndex < (self numSlotsOfAny: objOop)
Expand Down
3 changes: 1 addition & 2 deletions smalltalksrc/VMMaker/Spur32BitMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -842,7 +842,6 @@ Spur32BitMemoryManager >> setIsImmutableOf: objOop to: aBoolean [
{ #category : #'header access' }
Spur32BitMemoryManager >> setIsMarkedOf: objOop to: aBoolean [
self assert: (self isFreeObject: objOop) not.
self assert: (memoryMap isPermanentObject: objOop) not.

self flag: #endianness.
self unsignedLongAt: objOop + 4
Expand Down Expand Up @@ -905,7 +904,7 @@ Spur32BitMemoryManager >> shorten: objOop toIndexableSize: indexableSize [
ofObject: copy
withValue: (self fetchPointer: i ofObject: objOop)].
(self isRemembered: objOop) ifTrue:
[fromOldSpaceRememberedSet doRemember: copy].
[fromOldSpaceRememberedSet remember: copy].
self forward: objOop to: copy.
^0].

Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/Spur64BitMMLESimulator.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ Spur64BitMMLESimulator >> fetchFloatAt: floatBitsAddress into: aFloat [
aFloat at: 1 put: (self uint32AtPointer: floatBitsAddress+4)
]

{ #category : #'object access' }
{ #category : #'as yet unclassified' }
Spur64BitMMLESimulator >> fetchPointer: fieldIndex ofObject: objOop [
self assert: (self isForwarded: objOop) not.
self assert: (fieldIndex >= 0 and: [fieldIndex < (self numSlotsOfAny: objOop)
Expand Down
3 changes: 1 addition & 2 deletions smalltalksrc/VMMaker/Spur64BitMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -973,7 +973,6 @@ Spur64BitMemoryManager >> setIsImmutableOf: objOop to: aBoolean [
{ #category : #'header access' }
Spur64BitMemoryManager >> setIsMarkedOf: objOop to: aBoolean [
self assert: (self isFreeObject: objOop) not.
self assert: (memoryMap isPermanentObject: objOop) not.

self unsignedLongAt: objOop
put: (aBoolean
Expand Down Expand Up @@ -1036,7 +1035,7 @@ Spur64BitMemoryManager >> shorten: objOop toIndexableSize: indexableSize [
ofObject: copy
withValue: (self fetchPointer: i ofObject: objOop)].
(self isRemembered: objOop) ifTrue:
[fromOldSpaceRememberedSet doRemember: copy].
[fromOldSpaceRememberedSet remember: copy].
self forward: objOop to: copy.
^0].

Expand Down
70 changes: 48 additions & 22 deletions smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ SpurGenerationScavenger >> copyToOldSpace: survivor bytes: bytesInObject format:
[:p| | field |
field := manager longAt: survivor + p.
(manager isReallyYoung: field) ifTrue:
[manager getFromOldSpaceRememberedSet doRemember: newOop.
[manager getFromOldSpaceRememberedSet remember: newOop.
^newOop]]].
^newOop
]
Expand Down Expand Up @@ -727,7 +727,7 @@ SpurGenerationScavenger >> logTenuringPolicy [
{ #category : #scavenger }
SpurGenerationScavenger >> mapOopsFromPermSpace [

| destIndex sourceIndex referrer |
| destIndex sourceIndex referrer result |

<inline: #never>

Expand All @@ -738,21 +738,31 @@ SpurGenerationScavenger >> mapOopsFromPermSpace [
It has to be in the remembered set if there are references to non permanent objects.
I will be compacting the rememberedSet while iterating it"

[sourceIndex < manager getFromPermSpaceRememberedSet rememberedSetSize] whileTrue:
[ referrer := manager getFromPermSpaceRememberedSet objectAt: sourceIndex.
[sourceIndex < manager getFromPermToNewSpaceRememberedSet rememberedSetSize] whileTrue:
[ referrer := manager getFromPermToNewSpaceRememberedSet objectAt: sourceIndex.

self deny: (manager isEphemeron: referrer).
self deny: (manager isWeakNonImm: referrer).

(self scavengeReferentsOfFromPermSpace: referrer)
result := self scavengeReferentsOfFromPermSpace: referrer.

result = 1
ifTrue:
[manager getFromPermSpaceRememberedSet save: referrer at: destIndex.
[
"Refers new space, we keep it"
manager getFromPermToNewSpaceRememberedSet save: referrer at: destIndex.
destIndex := destIndex + 1]
ifFalse:
[ manager setIsRememberedOf: referrer to: false].
[
"We clean the remembered set flag, it is only marking if it is maybe pointing to new objects"
manager setIsRememberedOf: referrer to: false.
"Refers to Old Space, if refers to perm space only, I do nothing. I remove it from the remembered set fromPermSpaceToNewSpace"
result = 2 ifTrue: [
manager getFromPermToOldSpaceRememberedSet rememberWithoutMarkingAsRemembered: referrer]
].
sourceIndex := sourceIndex + 1].

manager getFromPermSpaceRememberedSet setRememberedSetSize: destIndex.
manager getFromPermToNewSpaceRememberedSet setRememberedSetSize: destIndex.

"self assert: (manager isPermSpaceRememberedSetSane)."
]
Expand All @@ -779,7 +789,8 @@ SpurGenerationScavenger >> newSpaceStart: startAddress newSpaceBytes: totalBytes
eden start: futureSpace limit; limit: startAddress + totalBytes.

manager getFromOldSpaceRememberedSet fudge: self rememberedSetFudge.
manager getFromPermSpaceRememberedSet fudge: self rememberedSetFudge.
manager getFromPermToOldSpaceRememberedSet fudge: self rememberedSetFudge.
manager getFromPermToNewSpaceRememberedSet fudge: self rememberedSetFudge.

self assert: self futureSpace limit <= (startAddress + totalBytes).
self assert: self eden start \\ manager allocationUnit
Expand Down Expand Up @@ -865,13 +876,21 @@ SpurGenerationScavenger >> printRememberedSet [
space;
shortPrintOop: oop ].

coInterpreter print: 'From Permpace:'; cr.
coInterpreter print: 'From Permpace to OldSpace:'; cr.

manager getFromPermSpaceRememberedSet rememberedSetWithIndexDo: [ :oop :i |
manager getFromPermToOldSpaceRememberedSet rememberedSetWithIndexDo: [ :oop :i |
coInterpreter
printNum: i;
space;
shortPrintOop: oop ]
shortPrintOop: oop ].

coInterpreter print: 'From Permpace to NewSpace:'; cr.

manager getFromPermToNewSpaceRememberedSet rememberedSetWithIndexDo: [ :oop :i |
coInterpreter
printNum: i;
space;
shortPrintOop: oop ]
]

{ #category : #'debug support' }
Expand Down Expand Up @@ -985,7 +1004,7 @@ SpurGenerationScavenger >> processWeaklings [
((self processWeakSurvivor: weakObj) and: [
(manager getMemoryMap isOldObject: weakObj) and: [
(manager isRemembered: weakObj) not ] ]) ifTrue: [
manager getFromOldSpaceRememberedSet doRemember: weakObj ].
manager getFromOldSpaceRememberedSet remember: weakObj ].
weakCorpse := self nextCorpseOrNil: weakCorpse ].
weakList := nil ]
]
Expand Down Expand Up @@ -1114,7 +1133,7 @@ SpurGenerationScavenger >> scavengeLoop [
]

{ #category : #scavenger }
SpurGenerationScavenger >> scavengeReferentsOf: referrer additionalShouldKeepReferrerTestingBlock: shouldKeepReferrerTestingBlock [
SpurGenerationScavenger >> scavengeReferentsOf: referrer additionalTestingBlock: additionalTestingBlock [
"scavengeReferentsOf: referrer inspects all the pointers in referrer. If
any are new objects, it has them moved to FutureSurvivorSpace, and
answers truth. If there are no new referents, it answers falsity. To handle
Expand Down Expand Up @@ -1156,12 +1175,12 @@ SpurGenerationScavenger >> scavengeReferentsOf: referrer additionalShouldKeepRef
[newLocation := self copyAndForward: referent.
(manager isYoung: newLocation)
ifTrue: [foundNewReferentOrIsWeakling := true]
ifFalse: [(shouldKeepReferrerTestingBlock value: referrer value: newLocation) ifTrue: [ foundNewReferentOrIsWeakling := true ]]].
ifFalse: [additionalTestingBlock value: referrer value: newLocation]].
manager storePointerUnchecked: i ofMaybeForwardedObject: referrer withValue: newLocation]
ifFalse:
[
manager storePointerUnchecked: i ofMaybeForwardedObject: referrer withValue: referent.
(shouldKeepReferrerTestingBlock value: referrer value: referent) ifTrue: [ foundNewReferentOrIsWeakling := true ]]]].
additionalTestingBlock value: referrer value: referent]]].
^foundNewReferentOrIsWeakling
]

Expand All @@ -1170,23 +1189,30 @@ SpurGenerationScavenger >> scavengeReferentsOfFromOldSpace: referrer [

<inline: #never>

^ self scavengeReferentsOf: referrer additionalShouldKeepReferrerTestingBlock: [ :aReferrer :aReferent | false ].
^ self
scavengeReferentsOf: referrer
additionalTestingBlock: [ :aReferrer :aReferent | "Do nothing" ].
]

{ #category : #scavenger }
SpurGenerationScavenger >> scavengeReferentsOfFromPermSpace: referrer [

<inline: #never>

| returnValue |
| returnValue refersOldSpace |

refersOldSpace := false.

returnValue := self
scavengeReferentsOf: referrer
additionalShouldKeepReferrerTestingBlock: [ :aReferrer :referent |
(manager isPermanent: referent) not
and: [ (manager isFixedKnownObject: referent) not ] ].
additionalTestingBlock: [ :aReferrer :referent |
(refersOldSpace not and: [ (manager isFixedKnownObject: referent) not and: [ (manager isPermanent: referent) not ]])
ifTrue: [ refersOldSpace := true ]
].

^ returnValue.
returnValue ifTrue: [ ^ 1 "Refers NewSpace" ].
refersOldSpace ifTrue: [ ^ 2 "Refers OldSpace only" ].
^ 3 "Refers PermSpace only"
]

{ #category : #scavenger }
Expand Down
Loading