[Vm-dev] VM Maker: VMMaker.oscog-eem.3137.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Jan 12 04:50:16 UTC 2022
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.3137.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.3137
Author: eem
Time: 11 January 2022, 8:50:04.810202 pm
UUID: bf7c9af8-02ad-4d4b-b0c9-95bb93d59019
Ancestors: VMMaker.oscog-mt.3136
In-image compilation: fix issues with converting method header formats and with accessing primitive property flags via functionPointerForCompiledMethod:primitiveIndex:primitivePropertyFlagsInto:. The fundamental fix is to have the facade's CoInterpreter's objectMemory set to the facade, hence indirecting through the facade to get to the actual obejctMemory.
=============== Diff against VMMaker.oscog-mt.3136 ===============
Item was changed:
----- Method: CurrentImageCoInterpreterFacade>>functionPointerForCompiledMethod:primitiveIndex:primitivePropertyFlagsInto: (in category 'accessing') -----
functionPointerForCompiledMethod: methodOop primitiveIndex: primIndex primitivePropertyFlagsInto: flagsPtr
+ primIndex = PrimNumberExternalCall ifTrue:
+ [flagsPtr
+ at: 0
+ put: (coInterpreter
+ primitivePropertyFlagsFor: (self primitiveMethodForMethodContainingExternalPrimitive: methodOop)
+ primitiveIndex: primIndex).
+ ^self oopForObject: ((self objectForOop: methodOop) literalAt: 1) second].
+ ^(coInterpreter functionPointerForCompiledMethod: methodOop primitiveIndex: primIndex primitivePropertyFlagsInto: flagsPtr) ifNotNil:
+ [:symbol| self addressForLabel: symbol]!
- ^([coInterpreter
- functionPointerForCompiledMethod: methodOop
- primitiveIndex: primIndex
- primitivePropertyFlagsInto: flagsPtr]
- on: Error
- do: [:ex|
- #someExternalPrimitive]) ifNotNil:
- [:symbol|
- self addressForLabel: symbol]!
Item was changed:
----- Method: CurrentImageCoInterpreterFacade>>initialize (in category 'initialize-release') -----
initialize
objectMemory := self class objectMemoryClass simulatorClass new.
objectMemory allocateMemoryOfSize: 4*1024*1024.
memory := objectMemory memory.
objectMemory
initializeFreeSpaceForFacadeFrom: self startOfMemory
to: self variablesBase.
coInterpreter := CoInterpreter new.
coInterpreter
instVarNamed: 'objectMemory'
+ put: (false ifTrue: [objectMemory] ifFalse: [self]);
- put: objectMemory;
instVarNamed: 'primitiveTable'
put: (CArrayAccessor on: CoInterpreter primitiveTable copy).
variables := Dictionary new!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>isBytes: (in category 'testing') -----
+ isBytes: anOop
+ ^(self objectForOop: anOop) class isBytes!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>numBytesOfBytes: (in category 'accessing') -----
+ numBytesOfBytes: objOop
+ ^self numBytesOf: objOop!
Item was changed:
----- Method: CurrentImageCoInterpreterFacade>>primitiveIndexOfMethod:header: (in category 'accessing') -----
primitiveIndexOfMethod: anOop header: header
| method |
method := self objectForOop: anOop.
- self assert: (self objectForOop: header) = method header.
^method primitive!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>primitiveMethodForMethodContainingExternalPrimitive: (in category 'cog jit support') -----
+ primitiveMethodForMethodContainingExternalPrimitive: methodOop
+ "Look up a primitive in a method and answer that method."
+ | candidates literal method |
+ method := self objectForOop: methodOop.
+ self assert: method primitive = PrimNumberExternalCall.
+ literal := method literalAt: 1.
+ candidates := self sn
+ allImplementorsOf: literal second
+ localTo: (literal first basicSize = 0
+ ifTrue: [InterpreterPrimitives]
+ ifFalse: [InterpreterPlugin allSubclasses
+ detect: [:pluginClass| pluginClass moduleName = literal first]]).
+ self assert: candidates size = 1.
+ ^candidates first compiledMethod!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>primitivePropertyFlags:numArgs: (in category 'accessing') -----
+ primitivePropertyFlags: primIndex numArgs: numArgs
+ ^coInterpreter primitivePropertyFlags: primIndex numArgs: numArgs!
Item was changed:
----- Method: CurrentImageCoInterpreterFacade>>rawHeaderOf: (in category 'accessing') -----
rawHeaderOf: aMethodOop
+ self subclassResponsibility!
- | method header correctedHeader headerOop |
- method := self objectForOop: aMethodOop.
- header := method header.
-
- "(index 0) 15 bits: number of literals (#numLiterals)
- (index 15) 1 bit: jit without counters - reserved for methods that have been optimized by Sista
- (index 16) 1 bit: has primitive
- (index 17) 1 bit: whether a large frame size is needed (#frameSize => either SmallFrame or LargeFrame)
- (index 18) 6 bits: number of temporary variables (#numTemps)
- (index 24) 4 bits: number of arguments to the method (#numArgs)
- (index 28) 2 bits: reserved for an access modifier (00-unused, 01-private, 10-protected, 11-public), although accessors for bit 29 exist (see #flag).
- sign bit: 1 bit: selects the instruction set, >= 0 Primary, < 0 Secondary (#signFlag)"
-
- correctedHeader := self wordSize = Smalltalk wordSize
- ifTrue: [header]
- ifFalse:
- [(header bitAnd: (1 bitShift: 30) - 1)
- - (header < 0 ifTrue: [2 raisedTo: self wordSize * 8] ifFalse: [0])].
- headerOop := objectMemory integerObjectOf: correctedHeader.
- headerOop := headerOop bitAnd: (2 raisedTo: self wordSize * 8) - 1.
- self assert: (objectMemory literalCountOfMethodHeader: headerOop) = method numLiterals.
- self assert: (coInterpreter argumentCountOfMethodHeader: headerOop) = method numArgs.
- self assert: (coInterpreter temporaryCountOfMethodHeader: headerOop) = method numTemps.
- self assert: (objectMemory headerIndicatesAlternateBytecodeSet: headerOop) = method signFlag.
- headerToMethodMap
- at: headerOop
- ifPresent: [:existing| self assert: existing == method]
- ifAbsentPut: [method].
- ^headerOop!
Item was removed:
- ----- Method: CurrentImageCoInterpreterFacadeForSpurObjectRepresentation>>functionPointerForCompiledMethod:primitiveIndex:primitivePropertyFlagsInto: (in category 'cog jit support') -----
- functionPointerForCompiledMethod: methodOop primitiveIndex: primIndex primitivePropertyFlagsInto: flagsPtr
- primIndex = PrimNumberExternalCall ifTrue:
- [flagsPtr
- at: 0
- put: (coInterpreter
- primitivePropertyFlagsFor: (self primitiveMethodForMethodContainingExternalPrimitive: methodOop)
- primitiveIndex: primIndex).
- ^self oopForObject: ((self objectForOop: methodOop) literalAt: 1) second].
- ^super functionPointerForCompiledMethod: methodOop primitiveIndex: primIndex primitivePropertyFlagsInto: flagsPtr!
Item was removed:
- ----- Method: CurrentImageCoInterpreterFacadeForSpurObjectRepresentation>>primitiveMethodForMethodContainingExternalPrimitive: (in category 'cog jit support') -----
- primitiveMethodForMethodContainingExternalPrimitive: methodOop
- "Look up a primitive in a method and answer that method."
- | candidates literal method |
- method := self objectForOop: methodOop.
- self assert: method primitive = PrimNumberExternalCall.
- literal := method literalAt: 1.
- candidates := self sn
- allImplementorsOf: literal second
- localTo: (literal first basicSize = 0
- ifTrue: [InterpreterPrimitives]
- ifFalse: [InterpreterPlugin allSubclasses
- detect: [:pluginClass| pluginClass moduleName = literal first]]).
- self assert: candidates size = 1.
- ^candidates first compiledMethod!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacadeForSpurObjectRepresentation>>rawHeaderOf: (in category 'accessing') -----
+ rawHeaderOf: aMethodOop
+ | method header correctedHeader headerOop |
+ method := aMethodOop isCompiledCode
+ ifTrue: [aMethodOop]
+ ifFalse: [self objectForOop: aMethodOop].
+ header := method header.
+
+ "(index 0) 15 bits: number of literals (#numLiterals)
+ (index 15) 1 bit: jit without counters - reserved for methods that have been optimized by Sista
+ (index 16) 1 bit: has primitive
+ (index 17) 1 bit: whether a large frame size is needed (#frameSize => either SmallFrame or LargeFrame)
+ (index 18) 6 bits: number of temporary variables (#numTemps)
+ (index 24) 4 bits: number of arguments to the method (#numArgs)
+ (index 28) 2 bits: reserved for an access modifier (00-unused, 01-private, 10-protected, 11-public), although accessors for bit 29 exist (see #flag).
+ sign bit: 1 bit: selects the instruction set, >= 0 Primary, < 0 Secondary (#signFlag)"
+
+ correctedHeader := self wordSize = Smalltalk wordSize
+ ifTrue: [header]
+ ifFalse: [(header bitAnd: (1 bitShift: 30) - 1)
+ + (header < 0
+ ifTrue: [1 bitShift: self wordSize * 8 - objectMemory numTagBits]
+ ifFalse: [0])].
+ headerOop := objectMemory integerObjectOf: correctedHeader.
+ self assert: (objectMemory literalCountOfMethodHeader: headerOop) = method numLiterals.
+ self assert: (coInterpreter argumentCountOfMethodHeader: headerOop) = method numArgs.
+ self assert: (coInterpreter temporaryCountOfMethodHeader: headerOop) = method numTemps.
+ self assert: (objectMemory headerIndicatesAlternateBytecodeSet: headerOop) = method signFlag.
+ headerToMethodMap
+ at: headerOop
+ ifPresent: [:existing| self assert: existing == method]
+ ifAbsentPut: [method].
+ ^headerOop!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacadeForSqueakV3ObjectRepresentation>>rawHeaderOf: (in category 'accessing') -----
+ rawHeaderOf: aMethodOop
+ | method header correctedHeader headerOop |
+ method := aMethodOop isCompiledCode
+ ifTrue: [aMethodOop]
+ ifFalse: [self objectForOop: aMethodOop].
+ header := method header.
+ "original (+ve header):
+ (index 0) 9 bits: main part of primitive number (#primitive)
+ (index 9) 8 bits: number of literals (#numLiterals)
+ (index 17) 1 bit: whether a large frame size is needed (#frameSize)
+ (index 18) 6 bits: number of temporary variables (#numTemps)
+ (index 24) 4 bits: number of arguments to the method (#numArgs)
+ (index 28) 1 bit: high-bit of primitive number (#primitive)
+ (index 29) 1 bit: flag bit, ignored by the VM (#flag)"
+
+ "new: (-ve header)
+ (index 0) 15 bits: number of literals (#numLiterals)
+ (index 15) 1 bit: jit without counters - reserved for methods that have been optimized by Sista
+ (index 16) 1 bit: has primitive
+ (index 17) 1 bit: whether a large frame size is needed (#frameSize => either SmallFrame or LargeFrame)
+ (index 18) 6 bits: number of temporary variables (#numTemps)
+ (index 24) 4 bits: number of arguments to the method (#numArgs)
+ (index 28) 2 bits: reserved for an access modifier (00-unused, 01-private, 10-protected, 11-public), although accessors for bit 29 exist (see #flag).
+ sign bit: 1 bit: selects the instruction set, >= 0 Primary, < 0 Secondary (#signFlag)"
+
+ "This could be smarter. If MULTIPLEBYTECODESETS is in effect we can switch hit. If not, we can map to the relevant format.
+ For now we just reinterpret the method itself, answering a header in the format its bytecode set dictates..."
+ correctedHeader := header >= 0
+ ifTrue:
+ [method numLiterals > 255 ifTrue: [self error: 'cannot map method to the old header format'].
+ (method primitive bitAnd: 16r1FF)
+ + (method numLiterals bitShift: 9)
+ + (header bitAnd: 16r3FFFF bitInvert)]
+ ifFalse:
+ [self wordSize = Smalltalk wordSize
+ ifTrue: [header]
+ ifFalse: [(header bitAnd: (1 bitShift: 30) - 1) + (1 bitShift: 30)]].
+ headerOop := objectMemory integerObjectOf: correctedHeader.
+ self assert: (objectMemory literalCountOfMethodHeader: headerOop) = method numLiterals.
+ self assert: (coInterpreter argumentCountOfMethodHeader: headerOop) = method numArgs.
+ self assert: (coInterpreter temporaryCountOfMethodHeader: headerOop) = method numTemps.
+ self assert: (objectMemory headerIndicatesAlternateBytecodeSet: headerOop) = method signFlag.
+ headerToMethodMap
+ at: headerOop
+ ifPresent: [:existing| self assert: existing == method]
+ ifAbsentPut: [method].
+ ^headerOop!
More information about the Vm-dev
mailing list