Skip to content

Commit

Permalink
Saving permSpace objects
Browse files Browse the repository at this point in the history
  • Loading branch information
PalumboN committed Apr 4, 2022
1 parent 20ba87a commit 1f62b7a
Show file tree
Hide file tree
Showing 12 changed files with 199 additions and 38 deletions.
5 changes: 4 additions & 1 deletion smalltalksrc/Printf/PrintfFormatDescriptor.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,10 @@ PrintfFormatDescriptor class >> scanFrom: stream [
whileTrue: [desc := desc perform: (Flags at: stream next)].
stream peek isDigit ifTrue: [desc width: (Integer readFrom: stream)].
stream peek == $. ifTrue: [stream next. desc precision: (Integer readFrom: stream)].
stream peek == $l ifTrue: [stream next].
stream peek == $l ifTrue: [stream next.
stream peek == $l ifTrue: [stream next]
].

desc := desc operator: stream next.
^ desc
]
Expand Down
8 changes: 8 additions & 0 deletions smalltalksrc/Printf/PrintfFormatStringTest.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,14 @@ PrintfFormatStringTest >> testOneIntegerWithLength [
self assert: 'Here is a string "0000042".' equals: ('Here is a string "%07.7d".' printf: 42).
]

{ #category : #'as yet unclassified' }
PrintfFormatStringTest >> testOneLongLongInteger [

self
assert: 'Here is a number "2199023255552".'
equals: ('Here is a number "%lld".' printf: 2199023255552)
]

{ #category : #'as yet unclassified' }
PrintfFormatStringTest >> testOnePrintPointer [

Expand Down
14 changes: 13 additions & 1 deletion smalltalksrc/VMMaker/AbstractComposedImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,19 @@ AbstractComposedImageAccess >> initialize [
super initialize.

headFormat := '%s {\n'.
fieldFormat := '\t#%s : %ld'.
fieldFormat := '\t#%s : %lld'.
]

{ #category : #'perm - space' }
AbstractComposedImageAccess >> permSpaceMetadataFileNameInImage: imageFileName into: aBuffer bufferSize: aSize [

^ imageFileName , '/permSpace.ston'
]

{ #category : #'perm - space' }
AbstractComposedImageAccess >> permanentDataFileinImage: imageFileName [

^ imageFileName , '/permSpace.data'
]

{ #category : #'file operations' }
Expand Down
8 changes: 6 additions & 2 deletions smalltalksrc/VMMaker/AbstractImageAccess.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -169,9 +169,13 @@ AbstractImageAccess >> loadImageFromFile: imageFile withHeader: header [
"read in the image in bulk, then swap the bytes if necessary"

<var: #header type: #SpurImageHeaderStruct>
| bytesRead |
| bytesRead oldSpaceBytesRead permSpaceBytesRead |

bytesRead := self readSegmentsFromImageFile: imageFile header: header.
oldSpaceBytesRead := self readSegmentsFromImageFile: imageFile header: header.

permSpaceBytesRead := self readPermSpaceFromImageFile: imageFile header: header.

bytesRead := oldSpaceBytesRead + permSpaceBytesRead.

self initializeInterpreterFromHeader: header withBytes: bytesRead

Expand Down
87 changes: 82 additions & 5 deletions smalltalksrc/VMMaker/ComposedImageReader.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,83 @@ ComposedImageReader >> readImageNamed: imageName [
^ 0 "Must return sqInt"
]

{ #category : #'perm - space' }
ComposedImageReader >> readPermSpaceDataFromImage: imageFileName startingAt: startingAddress bytes: bytesToRead [

<inline: true>
<var: #file type: #sqImageFile>
<var: #buffer declareC: 'char buffer[255]'>
| buffer file bytes |
self simulationOnly: [ buffer := nil ].

file := self
sqImageFile: (self permanentDataFileinImage: imageFileName)
Open: 'rb'.

bytes := self
sq: startingAddress
Image: (self sizeof: #char)
File: bytesToRead
Read: file.

self sqImageFileClose: file.

^ bytes
]

{ #category : #'perm - space' }
ComposedImageReader >> readPermSpaceFromImageFile: imageFileName header: aHeader [

| newBase permSpaceMetadata oldBase dataSize bytesRead |
newBase := objectMemory getMemoryMap permSpaceStart.
permSpaceMetadata := self readPermSpaceMetadataFromImage:
imageFileName.
oldBase := permSpaceMetadata startAddress.
dataSize := permSpaceMetadata dataSize.

newBase ~= oldBase ifTrue: [ interpreter unableToReadImageError ].

"check if permsSpace is allocated"

bytesRead := self
readPermSpaceDataFromImage: imageFileName
startingAt: (self pointerForOop: newBase)
bytes: dataSize.

"Check segment bytes read"
bytesRead ~= dataSize ifTrue: [ interpreter unableToReadImageError ].

^ bytesRead
]

{ #category : #'perm - space' }
ComposedImageReader >> readPermSpaceMetadataFromImage: imageFileName [

"self >> readSegmentMetadata: segmentIndex fromImage: imageFileName"

<inline: true>
<var: #file type: #sqImageFile>
<var: #buffer declareC: 'char buffer[255]'>
<var: #segmentMetadata type: #ComposedMetadataStruct>
| metadata buffer file |
self simulationOnly: [
buffer := nil.
metadata := ComposedMetadataStruct new ].

file := self
sqImageFile: (self
permSpaceMetadataFileNameInImage: imageFileName
into: buffer
bufferSize: 255)
Open: 'r'.

self readSTONFrom: file into: (self addressOf: metadata).

self sqImageFileClose: file.

^ metadata
]

{ #category : #reading }
ComposedImageReader >> readSTONFrom: file into: aStruct [

Expand Down Expand Up @@ -144,11 +221,11 @@ ComposedImageReader >> readSegmentMetadata: segmentIndex fromImage: imageFileNam
<inline: true>
<var: #file type: #sqImageFile>
<var: #buffer declareC: 'char buffer[255]'>
<var: #segmentMetadata type: #ComposedSegmentMetadataStruct>
<var: #segmentMetadata type: #ComposedMetadataStruct>
| segmentMetadata buffer file |
self simulationOnly: [
buffer := nil.
segmentMetadata := ComposedSegmentMetadataStruct new ].
segmentMetadata := ComposedMetadataStruct new ].

file := self
sqImageFile: (self
Expand All @@ -173,7 +250,7 @@ ComposedImageReader >> readSegmentsFromImageFile: imageFileName header: aHeader
<var: #imageFile type: #sqImageFile>
<var: 'segInfo' type: #'SpurSegmentInfo *'>
<var: 'aHeader' type: #SpurImageHeaderStruct>
<var: #segmentMetadata type: #ComposedSegmentMetadataStruct>
<var: #segmentMetadata type: #ComposedMetadataStruct>
| bytesRead totalBytesRead segmentSize oldBase newBase segmentIndex segmentMetadata |
self prepareSegmentsToRead.

Expand All @@ -185,8 +262,8 @@ ComposedImageReader >> readSegmentsFromImageFile: imageFileName header: aHeader
[

segmentMetadata := self readSegmentMetadata: segmentIndex fromImage: imageFileName.
oldBase := segmentMetadata segStart.
segmentSize := segmentMetadata segSize.
oldBase := segmentMetadata startAddress.
segmentSize := segmentMetadata dataSize.

segmentManager withNewSegmentDo: [ :segInfo |
segInfo
Expand Down
65 changes: 59 additions & 6 deletions smalltalksrc/VMMaker/ComposedImageWriter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,21 @@ ComposedImageWriter >> writeImageFile: imageFileName fromHeader: header [

oldSpaceBytesWritten := self writeImageSegments: imageFileName.

permanentSpaceBytesWritten := 0. "self writeImagePermanentSpace: imageFileName."
permanentSpaceBytesWritten := self writeImagePermanentSpace: imageFileName.

bytesWritten := oldSpaceBytesWritten + permanentSpaceBytesWritten.

interpreter success: bytesWritten = header dataSize
]

{ #category : #permanentSpace }
ComposedImageWriter >> writeImagePermanentSpace: imageFileName [

self writePermanentSpaceMetadata: imageFileName.

^ self writePermanentSpaceData: imageFileName
]

{ #category : #segments }
ComposedImageWriter >> writeImageSegments: imageFileName [

Expand All @@ -71,6 +79,51 @@ ComposedImageWriter >> writeImageSegments: imageFileName [
inImage: imageFileName ].


]

{ #category : #permanentSpace }
ComposedImageWriter >> writePermanentSpaceData: imageFileName [

<var: #dataFile type: #sqImageFile>
| dataFile nWritten |
dataFile := self
sqImageFile:
(self permanentDataFileinImage: imageFileName)
Open: 'wb'.
dataFile ifNil: [ "could not open the file for writing"
^ self primitiveFail ].

nWritten := self
sq:
objectMemory getMemoryMap permSpaceStart asVoidPointer
Image: 1
File: objectMemory totalBytesInPermanentSpace
Write: dataFile.

self sqImageFileClose: dataFile.

^ nWritten
]

{ #category : #permanentSpace }
ComposedImageWriter >> writePermanentSpaceMetadata: imageFileName [

<var: #metadataFile type: #sqImageFile>
| metadataFile aBuffer metadata |

metadataFile := self sqImageFile: (self permSpaceMetadataFileNameInImage: imageFileName into: aBuffer bufferSize: 255 ) Open: 'w'.
metadataFile ifNil: [ "could not open the file for writing"
^ self primitiveFail ].

self simulationOnly: [ metadata := ComposedMetadataStruct new. ].
metadata startAddress: objectMemory getMemoryMap permSpaceStart.
metadata dataSize: objectMemory totalBytesInPermanentSpace.

self writeSegmentSTON: metadata toFile: metadataFile.

self sqImageFileClose: metadataFile.


]

{ #category : #writing }
Expand Down Expand Up @@ -145,12 +198,12 @@ ComposedImageWriter >> writeSegmentMetadata: segment nextIndex: segmentIndex inI
{ #category : #segments }
ComposedImageWriter >> writeSegmentMetadata: segment toFile: file [

<var: #metadata type: #ComposedSegmentMetadataStruct>
<var: #metadata type: #ComposedMetadataStruct>
| metadata |

self simulationOnly: [ metadata := ComposedSegmentMetadataStruct new. ].
metadata segStart: segment segStart.
metadata segSize: segment segSize.
self simulationOnly: [ metadata := ComposedMetadataStruct new. ].
metadata startAddress: segment segStart.
metadata dataSize: segment segSize.

self writeSegmentSTON: metadata toFile: file

Expand All @@ -161,7 +214,7 @@ ComposedImageWriter >> writeSegmentMetadata: segment toFile: file [
ComposedImageWriter >> writeSegmentSTON: segmentMetadata toFile: f [

<var: #f type: #sqImageFile>
<var: #segmentMetadata type: #ComposedSegmentMetadataStruct>
<var: #segmentMetadata type: #ComposedMetadataStruct>

self writeSTON: segmentMetadata toFile: f
]
Original file line number Diff line number Diff line change
@@ -1,23 +1,23 @@
Class {
#name : #ComposedSegmentMetadataStruct,
#name : #ComposedMetadataStruct,
#superclass : #VMStructType,
#instVars : [
'segStart',
'segSize'
'startAddress',
'dataSize'
],
#category : #'VMMaker-ImageFormat'
}

{ #category : #'simulation only' }
ComposedSegmentMetadataStruct class >> byteSizeForSimulator: aCogit [
ComposedMetadataStruct class >> byteSizeForSimulator: aCogit [

"Answer an approximation of the byte size of an AbstractInstruction struct.
This is for estimating the alloca in allocateOpcodes:bytecodes:ifFail:"
^self instSize * (aCogit sizeof: #'void *').
]

{ #category : #translation }
ComposedSegmentMetadataStruct class >> instVarNamesAndTypesForTranslationDo: aBinaryBlock [
ComposedMetadataStruct class >> instVarNamesAndTypesForTranslationDo: aBinaryBlock [
"enumerate aBinaryBlock with the names and C type strings for the inst vars to include in a struct of this type."

<var: #segSize type: #size_t>
Expand All @@ -31,25 +31,25 @@ ComposedSegmentMetadataStruct class >> instVarNamesAndTypesForTranslationDo: aBi
]

{ #category : #accessing }
ComposedSegmentMetadataStruct >> segSize [
ComposedMetadataStruct >> dataSize [

^ segSize
^ dataSize
]

{ #category : #accessing }
ComposedSegmentMetadataStruct >> segSize: anInt [
ComposedMetadataStruct >> dataSize: anObject [

segSize := anInt
dataSize := anObject
]

{ #category : #accessing }
ComposedSegmentMetadataStruct >> segStart [
ComposedMetadataStruct >> startAddress [

^ segStart
^ startAddress
]

{ #category : #accessing }
ComposedSegmentMetadataStruct >> segStart: anInt [
ComposedMetadataStruct >> startAddress: anObject [

segStart := anInt
startAddress := anObject
]
12 changes: 7 additions & 5 deletions smalltalksrc/VMMaker/SpurMemoryManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -1973,7 +1973,7 @@ SpurMemoryManager >> allocateMemoryOfSize: memoryBytes newSpaceSize: newSpaceByt
will be set to sane values."
<doNotGenerate>
| allocatedMemory newSpaceStartOffset allocatedAddress |
| allocatedMemory newSpaceStartOffset allocatedAddress vmMemoryConf |
self assert: (memoryBytes \\ self allocationUnit = 0 and: [
newSpaceBytes \\ self allocationUnit = 0 and: [
Expand Down Expand Up @@ -2012,12 +2012,14 @@ SpurMemoryManager >> allocateMemoryOfSize: memoryBytes newSpaceSize: newSpaceByt
manager: self;
yourself.
vmMemoryConf := (VMMemoryMapConfiguration forWordsize: self wordSize) new.
permSpaceSize isZero
ifTrue: [
memoryMap permSpaceStart: 16r10000000.
memoryMap permSpaceEnd: 16r10000000]
ifTrue: [
memoryMap permSpaceStart: vmMemoryConf permSpaceInitialAddress.
memoryMap permSpaceEnd: vmMemoryConf permSpaceInitialAddress]
ifFalse: [
memoryMap permSpaceStart: (self allocateMemoryOfSize: permSpaceSize initialAddress: 16r10000000).
memoryMap permSpaceStart: (self allocateMemoryOfSize: permSpaceSize initialAddress: vmMemoryConf permSpaceInitialAddress).
memoryMap permSpaceEnd: memoryMap permSpaceStart + permSpaceSize ].
permSpaceFreeStart := memoryMap permSpaceStart
Expand Down
1 change: 1 addition & 0 deletions smalltalksrc/VMMaker/SpurSegmentManager.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ SpurSegmentManager >> addSegmentOfSize: ammount [
<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)
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/StackInterpreter.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -500,7 +500,7 @@ StackInterpreter class >> ancilliaryClasses [
LibFFI.
CogStackPage.
SpurImageHeaderStruct.
ComposedSegmentMetadataStruct.
ComposedMetadataStruct.
"I am putting the abstract superclasses... because I cannot make it work else"
AbstractImageAccess.
AbstractComposedImageAccess.
Expand Down
2 changes: 1 addition & 1 deletion smalltalksrc/VMMaker/VMClass.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -670,7 +670,7 @@ VMClass >> fprintf: aStream format: aFormat arguments: arguments [
<doNotGenerate>
| printf |
printf := PrintfFormatString new setFormat: aFormat.

aStream nextPutAll: (printf
printf: arguments;
string)
Expand Down

0 comments on commit 1f62b7a

Please sign in to comment.