Skip to content

Commit

Permalink
Making it export
Browse files Browse the repository at this point in the history
  • Loading branch information
tesonep committed Jun 17, 2022
1 parent 30a2533 commit 2228c3d
Show file tree
Hide file tree
Showing 11 changed files with 151 additions and 52 deletions.
11 changes: 11 additions & 0 deletions smalltalksrc/Slang/SlangClass.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,17 @@ SlangClass >> objectMemoryClass [
self subclassResponsibility
]

{ #category : #'translation support' }
SlangClass >> simulationOnly: aBlock [

"Evaluate piece of code only during simulation.
This should get translated as a NOP"
<inline: #always>
self
cCode: [ ]
inSmalltalk: aBlock
]

{ #category : #'translation support' }
SlangClass >> sizeof: objectSymbolOrClass [
<doNotGenerate>
Expand Down
4 changes: 2 additions & 2 deletions smalltalksrc/VMMaker/CogObjectRepresentation.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -139,10 +139,10 @@ CogObjectRepresentation >> genCheckObjectPosition: destReg scratchReg: scratchRe
cogit CmpCq: objectMemory getMemoryMap fixedPermSpaceStart R: destReg.
recvIsPerm := cogit JumpAboveOrEqual: 0.

cogit CmpCq: objectMemory getMemoryMap oldSpaceStart R: destReg.
cogit CmpCq: objectMemory getMemoryMap getOldSpaceStart R: destReg.
isDestYoung := cogit JumpBelow: 0.

cogit CmpCq: objectMemory getMemoryMap oldSpaceStart R: valueReg.
cogit CmpCq: objectMemory getMemoryMap getOldSpaceStart R: valueReg.
isOldAndOld := cogit JumpAboveOrEqual: 0.
exit := cogit Jump: 0.

Expand Down
1 change: 1 addition & 0 deletions smalltalksrc/VMMaker/Cogit.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,7 @@ Cogit class >> declareCVarsIn: aCCodeGenerator [

aCCodeGenerator
addHeaderFile:'"vmMemoryMap.h"';
addHeaderFile:'"vmRememberedSet.h"';
addHeaderFile:'"cointerp.h"';
addHeaderFile:'"cogit.h"';
addHeaderFile:'<stdint.h>'.
Expand Down
14 changes: 1 addition & 13 deletions smalltalksrc/VMMaker/SpurGenerationScavenger.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -982,18 +982,6 @@ SpurGenerationScavenger >> rememberedSetFudge [
^ eden limit - eden start / manager wordSize // 1024.
]

{ #category : #accessing }
SpurGenerationScavenger >> rememberedSetLimit [

^ manager getFromOldSpaceRememberedSet rememberedSetLimit
]

{ #category : #accessing }
SpurGenerationScavenger >> rememberedSetSize [

^ manager getFromOldSpaceRememberedSet rememberedSetSize
]

{ #category : #scavenger }
SpurGenerationScavenger >> scavenge: tenuringCriterion [
"The main routine, scavenge, scavenges young objects reachable from the roots (the stack zone
Expand Down Expand Up @@ -1103,7 +1091,7 @@ SpurGenerationScavenger >> scavengeReferentsOf: referrer additionalShouldKeepRef
weak arrays, if the referrer is weak only scavenge strong slots and answer
true so that it won't be removed from the remembered set until later."

<inline:true>
<inline:#always>

| fmt foundNewReferentOrIsWeakling numSlots |

Expand Down
48 changes: 36 additions & 12 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -658,7 +658,8 @@ Class {
SpurMemoryManager class >> ancilliaryClasses [
"Answer any extra classes to be included in the translation."
^{ SpurGenerationScavenger. SpurScavengeLogRecord. SpurSegmentManager. SpurSegmentInfo. VMMemoryMap.
VMMemoryMapConfiguration. VMMemoryMapConfiguration forWordsize: self objectMemoryClass wordSize },
VMMemoryMapConfiguration. VMMemoryMapConfiguration forWordsize: self objectMemoryClass wordSize.
VMRememberedSet },
self compactorClass classesForTranslation,
SpurNewSpaceSpace withAllSubclasses

Expand Down Expand Up @@ -739,7 +740,9 @@ SpurMemoryManager class >> declareCVarsIn: aCCodeGenerator [
declareC: 'sqInt *extraRoots[ExtraRootsSize + 1 /* ', (ExtraRootsSize + 1) printString, ' */]'.

aCCodeGenerator
var: #memoryMap type: #'VMMemoryMap *'
var: #memoryMap type: #'VMMemoryMap *';
var: #fromOldSpaceRememberedSet type: #'VMRememberedSet *';
var: #fromPermSpaceRememberedSet type: #'VMRememberedSet *'
]

{ #category : #'api characterization' }
Expand Down Expand Up @@ -3330,12 +3333,12 @@ SpurMemoryManager >> checkHeapIntegrity: excludeUnmarkedObjs classIndicesShouldB
[coInterpreter print: 'unremembered object '; printHex: obj; print: ' contains young oop(s)'; cr.
self eek.
ok := false]]]]].
numRememberedObjectsInHeap ~= scavenger rememberedSetSize ifTrue:
numRememberedObjectsInHeap ~= fromOldSpaceRememberedSet rememberedSetSize ifTrue:
[coInterpreter
print: 'root count mismatch. #heap roots ';
printNum: numRememberedObjectsInHeap;
print: '; #roots ';
printNum: scavenger rememberedSetSize;
printNum: fromOldSpaceRememberedSet rememberedSetSize;
cr.
self eek.
"But the system copes with overflow..."
Expand Down Expand Up @@ -5135,7 +5138,7 @@ SpurMemoryManager >> flushNewSpace [
scavenger setRawTenuringThreshold: memoryMap newSpaceEnd.
self scavengingGCTenuringIf: TenureByAge.
scavenger setRawTenuringThreshold: savedTenuringThreshold.
self assert: scavenger rememberedSetSize = 0.
self assert: fromOldSpaceRememberedSet rememberedSetSize = 0.
self assert: pastSpaceStart = scavenger pastSpace start.
self assert: freeStart = scavenger eden start
]
Expand Down Expand Up @@ -5713,13 +5716,19 @@ SpurMemoryManager >> gcStartUsecs [
{ #category : #accessing }
SpurMemoryManager >> getFromOldSpaceRememberedSet [
<api>
<returnTypeC: #'VMRememberedSet *'>
^ fromOldSpaceRememberedSet
]
{ #category : #accessing }
SpurMemoryManager >> getFromPermSpaceRememberedSet [
<api>
<returnTypeC: #'VMRememberedSet *'>
^ fromPermSpaceRememberedSet
]
Expand Down Expand Up @@ -6527,6 +6536,20 @@ SpurMemoryManager >> initializeObjectMemory: bytesToShift [
self initializeOldSpaceFirstFree: freeOldSpaceStart. "initializes endOfMemory, freeStart, free space"
self initializeNewSpaceVariables.
self
cCode: [
fromOldSpaceRememberedSet := self
cCoerce: (self malloc: (self sizeof: VMRememberedSet))
to: #'VMRememberedSet *'.
fromOldSpaceRememberedSet rootIndex: OldRememberedSetRootIndex.
fromPermSpaceRememberedSet := self
cCoerce: (self malloc: (self sizeof: VMRememberedSet))
to: #'VMRememberedSet *'.
fromOldSpaceRememberedSet rootIndex: PermRememberedSetRootIndex].
fromOldSpaceRememberedSet initializeRememberedSet.
fromPermSpaceRememberedSet initializeRememberedSet.
Expand Down Expand Up @@ -8745,7 +8768,8 @@ SpurMemoryManager >> moveToPermSpace: objOop [
(self isRemembered: objOop) ifTrue: [
fromOldSpaceRememberedSet forgetObject: objOop.
fromPermSpaceRememberedSet doRemember: newObj ].
fromPermSpaceRememberedSet doRemember: newObj ]
ifFalse: [ shouldBeRememberedInOldSpace ifTrue: [ fromPermSpaceRememberedSet doRemember: newObj ]].
(hash := self rawHashBitsOf: objOop) ~= 0 ifTrue: [
self setHashBitsOf: newObj to: hash ].
Expand Down Expand Up @@ -10836,14 +10860,14 @@ SpurMemoryManager >> reverseBytesInMemory [
{ #category : #scavenger }
SpurMemoryManager >> rootTableCapacity [
<cmacro: '() GIV(rememberedSetLimit)'>
^scavenger rememberedSetLimit
^ fromOldSpaceRememberedSet rememberedSetLimit
]
{ #category : #accessing }
SpurMemoryManager >> rootTableCount [
<cmacro: '() GIV(rememberedSetSize)'>
^scavenger rememberedSetSize
^fromOldSpaceRememberedSet rememberedSetSize
]
{ #category : #allocation }
Expand Down Expand Up @@ -10981,7 +11005,7 @@ SpurMemoryManager >> scavengingGCTenuringIf: tenuringCriterion [
statGCEndUsecs := coInterpreter ioUTCMicrosecondsNow.
statSGCDeltaUsecs := statGCEndUsecs - gcStartUsecs.
statScavengeGCUsecs := statScavengeGCUsecs + statSGCDeltaUsecs.
statRootTableCount := scavenger rememberedSetSize.
statRootTableCount := fromOldSpaceRememberedSet rememberedSetSize.
scavenger logScavenge.
Expand Down Expand Up @@ -12785,7 +12809,7 @@ SpurMemoryManager >> vanillaShouldRemapObj: objOop [
scavenge, followed by a scan-mark-free, and final compaction passes may result in
scavenged fields being visited twice."
^(self isForwarded: objOop)
or: [(memoryMap isReallyYoungObject: objOop)
or: [(self isReallyYoungObject: objOop)
and: [(self isInFutureSpace: objOop) not]]
]
Expand Down
29 changes: 23 additions & 6 deletions smalltalksrc/VMMaker/SpurPlanningCompactor.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,8 @@ Class {
'mobileStart',
'objectAfterLastMobileObject',
'savedFirstFieldsSpace',
'savedFirstFieldsSpaceNotInOldSpace'
'savedFirstFieldsSpaceNotInOldSpace',
'firstFieldOfPermRememberedSet'
],
#pools : [
'VMBytecodeConstants'
Expand Down Expand Up @@ -668,10 +669,15 @@ SpurPlanningCompactor >> remapObj: objOop [
{ #category : #private }
SpurPlanningCompactor >> repinRememberedSet [
<inline: true>
scavenger rememberedSetSize > 0 ifTrue:
manager getFromOldSpaceRememberedSet rememberedSetSize > 0 ifTrue:
[manager storePointerUnchecked: 0 ofObject: manager oldRememberedSetObj withValue: firstFieldOfRememberedSet].
manager setIsPinnedOf: manager oldRememberedSetObj to: true.
manager getFromOldSpaceRememberedSet relocateRememberedSet
manager getFromOldSpaceRememberedSet relocateRememberedSet.
manager getFromPermSpaceRememberedSet rememberedSetSize > 0 ifTrue:
[manager storePointerUnchecked: 0 ofObject: manager permRememberedSetObj withValue: firstFieldOfPermRememberedSet].
manager setIsPinnedOf: manager permRememberedSetObj to: true.
manager getFromPermSpaceRememberedSet relocateRememberedSet
]
{ #category : #'space management' }
Expand Down Expand Up @@ -807,7 +813,10 @@ SpurPlanningCompactor >> unmarkPinned: pinnedObj [
SpurPlanningCompactor >> unpinRememberedSet [
<inline: true>
firstFieldOfRememberedSet := manager fetchPointer: 0 ofObject: manager oldRememberedSetObj.
manager setIsPinnedOf: manager oldRememberedSetObj to: false
manager setIsPinnedOf: manager oldRememberedSetObj to: false.
firstFieldOfPermRememberedSet := manager fetchPointer: 0 ofObject: manager permRememberedSetObj.
manager setIsPinnedOf: manager permRememberedSetObj to: false
]
{ #category : #compaction }
Expand Down Expand Up @@ -892,11 +901,19 @@ SpurPlanningCompactor >> updatePointersInInitialImmobileObjects [
SpurPlanningCompactor >> updatePointersInManagerHeapEntities [
"The special non-pointer objects containing pointers, which are the objStacks and the rememberedSet,
must be updated manually since they will not be recognized as containing pointers in the normal sweep."
manager relocateObjStacksForPlanningCompactor.
(scavenger rememberedSetSize > 0
(manager getFromOldSpaceRememberedSet rememberedSetSize > 0
and: [self isMobile: firstFieldOfRememberedSet]) ifTrue:
[firstFieldOfRememberedSet := manager fetchPointer: 0 ofObject: firstFieldOfRememberedSet].
self relocateObjectsInHeapEntity: manager oldRememberedSetObj from: 1 to: scavenger rememberedSetSize - 1
self relocateObjectsInHeapEntity: manager oldRememberedSetObj from: 1 to: manager getFromOldSpaceRememberedSet rememberedSetSize - 1.
(manager getFromPermSpaceRememberedSet rememberedSetSize > 0
and: [self isMobile: firstFieldOfPermRememberedSet]) ifTrue:
[firstFieldOfPermRememberedSet := manager fetchPointer: 0 ofObject: firstFieldOfPermRememberedSet].
self relocateObjectsInHeapEntity: manager permRememberedSetObj from: 1 to: manager getFromPermSpaceRememberedSet rememberedSetSize - 1
"Note that we /must not/ set the rememberedSetObj here since it is a slot in the hiddenRootsObj
and will be updated normally in updatePointersInInitialImmobileObjects. So do not do
(self isMobile: manager rememberedSetObj) ifTrue:
Expand Down
6 changes: 4 additions & 2 deletions smalltalksrc/VMMaker/StackInterpreter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -482,7 +482,8 @@ StackInterpreter class >> additionalHeadersDo: aBinaryBlock [
value: 'vmCallback.h'
value: self vmCallbackHeader.

VMMemoryMap generateHeader: aBinaryBlock
VMMemoryMap generateHeader: aBinaryBlock.
VMRememberedSet generateHeader: aBinaryBlock.
]

{ #category : #translation }
Expand Down Expand Up @@ -526,7 +527,8 @@ StackInterpreter class >> declareCVarsIn: aCCodeGenerator [
addHeaderFile:'"vmCallback.h"';
addHeaderFile:'"sqMemoryFence.h"';
addHeaderFile:'"dispdbg.h"';
addHeaderFile:'"vmMemoryMap.h"';
addHeaderFile:'"vmMemoryMap.h"';
addHeaderFile:'"vmRememberedSet.h"';

"This cannot be properly expressed in slang.
If ffi is put as a separate header, slang will sort the header and put it outside the #ifdef"
Expand Down
9 changes: 9 additions & 0 deletions smalltalksrc/VMMaker/VMMemoryMap.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -333,9 +333,18 @@ VMMemoryMap >> extendPermObjectsSpaceBy: aSize [
{ #category : #'as yet unclassified' }
VMMemoryMap >> fixedPermSpaceStart [

<api>
^ memoryMapConfiguration permSpaceInitialAddress
]

{ #category : #accessing }
VMMemoryMap >> getOldSpaceStart [

<api>

^ self oldSpaceStart
]

{ #category : #simulation }
VMMemoryMap >> getpagesize [

Expand Down

0 comments on commit 2228c3d

Please sign in to comment.