[Vm-dev] VM Maker: VMMaker.oscog-nice.1852.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Apr 29 19:13:52 UTC 2016
Nicolas Cellier uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-nice.1852.mcz
==================== Summary ====================
Name: VMMaker.oscog-nice.1852
Author: nice
Time: 29 April 2016, 9:10:25.503 pm
UUID: c50f4c61-776f-4081-af84-ea320b056c30
Ancestors: VMMaker.oscog-eem.1851
Correct slip in primitiveMethodXray, the flags were not set in each caseOf: branch (thanks to -Wunused-value).
Remove assert in classTagForClass: because ensureBehaviorHash: already does it.
Correct typeCompatibility test.
=============== Diff against VMMaker.oscog-eem.1851 ===============
Item was changed:
----- Method: CCodeGenerator>>node:typeCompatibleWith:inliningInto:in: (in category 'inlining') -----
node: exprNode typeCompatibleWith: argName inliningInto: targetMethod in: aTMethod
"Answer either exprNode or, if required, a cast of exprNode to the type of argName.
The cast is required if
- argName is typed and exprNode is untyped
- argName is untyped and exprNode is an arithmetic type of size > #sqInt
- both argName and exprNode are typed but they are incompatible"
| formalType actualType |
formalType := targetMethod typeFor: argName in: self.
actualType := self typeFor: exprNode in: aTMethod.
^((exprNode isSend or: [exprNode isVariable])
and: [(formalType notNil and: [actualType isNil])
or: [(formalType isNil and: [actualType notNil and: [(self isIntegralCType: actualType) and: [(self sizeOfIntegralCType: actualType) > (self sizeOfIntegralCType: #sqInt)]]])
or: [(self variableOfType: formalType acceptsValue: exprNode ofType: actualType) not]]])
ifTrue: [self nodeToCast: exprNode to: (formalType ifNil: [#sqInt])]
ifFalse:
[((exprNode isSend or: [exprNode isVariable])
and: [(self
+ variableOfType: (targetMethod typeFor: argName in: self)
- variableOfType: (self typeFor: exprNode in: aTMethod)
acceptsValue: exprNode
+ ofType: (self typeFor: exprNode in: aTMethod)) not]) ifTrue:
- ofType: (targetMethod typeFor: argName in: self)) not]) ifTrue:
[logger
nextPutAll:
'type mismatch for formal ', argName, ' and actual "', exprNode asString,
'" when inlining ', targetMethod selector, ' in ', aTMethod selector, '. Use a cast.';
cr; flush].
exprNode]!
Item was changed:
----- Method: CoInterpreterPrimitives>>primitiveMethodXray (in category 'indexing primitives') -----
primitiveMethodXray
"Lift the veil from a method and answer an integer describing the interior state
of its machine code.
Used for e.g. VM tests so they can verify they're testing what they think they're testing.
0 implies a vanilla method.
Bit 0 = method might be compiled to machine code
Bit 1 = method is currently compiled to machine code
Bit 2 = is compiled frameless.
Bit 3 = method refers to young object.
Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile)
Bit 5 = method contains unknown/unjittable bytecode
+ Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)"
- Bit 7 = method should not be jitted because it contains a primitive not to be called from machine code (unused)"
| alreadyCogged flags cogMethod |
<var: #cogMethod type: #'CogMethod *'>
(self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop))
ifTrue:
[alreadyCogged := self maybeMethodHasCogMethod: self stackTop.
flags := 1.
alreadyCogged ifFalse:
[cogMethod := cogit cog: self stackTop selector: objectMemory nilObject.
(cogMethod = nil
and: [cogCompiledCodeCompactionCalledFor]) ifTrue:
[self commenceCogCompiledCodeCompaction.
cogMethod := cogit cog: self stackTop selector: objectMemory nilObject].
cogMethod asInteger
caseOf: {
[MethodTooBig] -> [flags := 1 + 16].
+ [EncounteredUnknownBytecode] -> [flags := 1 + 32].
+ [ShouldNotJIT] -> [flags := 1 + 64] }
- [EncounteredUnknownBytecode] -> [1 + 32].
- [ShouldNotJIT] -> [1 + 64] }
otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]].
(flags = 1
and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue:
[cogMethod := self cogMethodOf: self stackTop.
flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3].
cogMethod cmRefersToYoung ifTrue:
[flags := flags + 8].
alreadyCogged ifFalse:
[cogit freeMethod: cogMethod]]]
ifFalse: [flags := 0].
self pop: 1 thenPush: (objectMemory integerObjectOf: flags)!
Item was changed:
----- Method: SpurMemoryManager>>classTagForClass: (in category 'interpreter access') -----
classTagForClass: classObj
"Answer the classObj's identityHash to use as a tag in the first-level method lookup cache."
<api>
- self assert: (coInterpreter addressCouldBeClassObj: classObj).
^self ensureBehaviorHash: classObj!
More information about the Vm-dev
mailing list