[Vm-dev] VM Maker: VMMaker.oscog-cb.1944.mcz
commits at source.squeak.org
commits at source.squeak.org
Tue Sep 6 15:28:12 UTC 2016
ClementBera uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1944.mcz
==================== Summary ====================
Name: VMMaker.oscog-cb.1944
Author: cb
Time: 6 September 2016, 5:25:54.75903 pm
UUID: 8a25f110-e70d-4ba3-b7b5-c36af4934c16
Ancestors: VMMaker.oscog-cb.1943
Added assertion ensuring that when a method is jitted, the compiled code jitted is a compiled method and when a block is jitted, the compiled code jitted is a compiled block.
=============== Diff against VMMaker.oscog-cb.1943 ===============
Item was changed:
----- Method: Cogit>>cog:selector: (in category 'jit - api') -----
cog: aMethodObj selector: aSelectorOop
"Attempt to produce a machine code method for the bytecode method
object aMethodObj. N.B. If there is no code memory available do *NOT*
attempt to reclaim the method zone. Certain clients (e.g. ceSICMiss:)
depend on the zone remaining constant across method generation."
<api>
<returnTypeC: #'CogMethod *'>
| cogMethod |
<var: #cogMethod type: #'CogMethod *'>
(self exclude: aMethodObj selector: aSelectorOop) ifTrue:
[^nil].
"In Newspeak we support anonymous accessors and hence tolerate the same
method being cogged multiple times. But only if the method class association is nil."
NewspeakVM
ifTrue:
[(coInterpreter methodHasCogMethod: aMethodObj) ifTrue:
[cogMethod := coInterpreter cogMethodOf: aMethodObj.
self deny: cogMethod selector = aSelectorOop.
cogMethod selector = aSelectorOop ifTrue:
[^cogMethod].
(coInterpreter methodClassAssociationOf: aMethodObj) ~= objectMemory nilObject ifTrue:
[self cCode: 'extern void *firstIndexableField(sqInt)'. "Slang, au natural"
self warnMultiple: cogMethod selectors: aSelectorOop.
^nil]]]
ifFalse: [self deny: (coInterpreter methodHasCogMethod: aMethodObj)].
+ self deny: (objectMemory isCompiledMethod: (coInterpreter ultimateLiteralOf: aMethodObj)).
"coInterpreter stringOf: aSelectorOop"
coInterpreter
compilationBreak: aSelectorOop
point: (objectMemory lengthOf: aSelectorOop)
isMNUCase: false.
aMethodObj = breakMethod ifTrue: [self halt: 'Compilation of breakMethod'].
NewspeakVM ifTrue:
[cogMethod := methodZone findPreviouslyCompiledVersionOf: aMethodObj with: aSelectorOop.
cogMethod ifNotNil:
[(coInterpreter methodHasCogMethod: aMethodObj) not ifTrue:
[self assert: (coInterpreter rawHeaderOf: aMethodObj) = cogMethod methodHeader.
cogMethod methodObject: aMethodObj.
coInterpreter rawHeaderOf: aMethodObj put: cogMethod asInteger].
^cogMethod]].
"If the generators for the alternate bytecode set are missing then interpret."
(coInterpreter methodUsesAlternateBytecodeSet: aMethodObj)
ifTrue:
[(self numElementsIn: generatorTable) <= 256 ifTrue:
[^nil].
bytecodeSetOffset := 256]
ifFalse:
[bytecodeSetOffset := 0].
objectRepresentation ensureNoForwardedLiteralsIn: aMethodObj.
methodObj := aMethodObj.
methodHeader := objectMemory methodHeaderOf: aMethodObj.
cogMethod := self compileCogMethod: aSelectorOop.
(cogMethod asInteger between: MaxNegativeErrorCode and: -1) ifTrue:
[cogMethod asInteger = InsufficientCodeSpace ifTrue:
[coInterpreter callForCogCompiledCodeCompaction].
self maybeFreeCounters.
"Right now no errors should be reported, so nothing more to do."
"self reportError: (self cCoerceSimple: cogMethod to: #sqInt)."
^nil].
"self cCode: ''
inSmalltalk:
[coInterpreter printCogMethod: cogMethod.
""coInterpreter symbolicMethod: aMethodObj.""
self assertValidMethodMap: cogMethod."
"self disassembleMethod: cogMethod."
"printInstructions := clickConfirm := true""]."
^cogMethod!
Item was changed:
----- Method: Cogit>>cogFullBlockMethod:numCopied: (in category 'jit - api') -----
cogFullBlockMethod: aMethodObj numCopied: numCopied
"Attempt to produce a machine code method for the bytecode method
object aMethodObj. N.B. If there is no code memory available do *NOT*
attempt to reclaim the method zone. Certain clients (e.g. ceSICMiss:)
depend on the zone remaining constant across method generation."
<api>
<option: #SistaV1BytecodeSet>
<returnTypeC: #'CogMethod *'>
| cogMethod |
<var: #cogMethod type: #'CogMethod *'>
self cCode: [] inSmalltalk: "for debugging, allow excluding methods based on selector or methodClass"
[self class initializationOptions
at: #DoNotJIT
ifPresent:
[:excluded|
(excluded anySatisfy: [:exclude| aMethodObj = exclude]) ifTrue:
[coInterpreter transcript nextPutAll: 'EXCLUDING '; nextPutAll: aMethodObj; nextPutAll: ' (compiled block)'; cr; flush.
^nil]]].
self deny: (coInterpreter methodHasCogMethod: aMethodObj).
+ self assert: (objectMemory isCompiledMethod: (coInterpreter ultimateLiteralOf: aMethodObj)).
aMethodObj = breakMethod ifTrue: [self halt: 'Compilation of breakMethod'].
"If the generators for the alternate bytecode set are missing then interpret."
(coInterpreter methodUsesAlternateBytecodeSet: aMethodObj)
ifTrue:
[(self numElementsIn: generatorTable) <= 256 ifTrue:
[^nil].
bytecodeSetOffset := 256]
ifFalse:
[bytecodeSetOffset := 0].
objectRepresentation ensureNoForwardedLiteralsIn: aMethodObj.
methodObj := aMethodObj.
methodHeader := objectMemory methodHeaderOf: aMethodObj.
cogMethod := self compileCogFullBlockMethod: numCopied.
(cogMethod asInteger between: MaxNegativeErrorCode and: -1) ifTrue:
[cogMethod asInteger = InsufficientCodeSpace ifTrue:
[coInterpreter callForCogCompiledCodeCompaction].
self maybeFreeCounters.
"Right now no errors should be reported, so nothing more to do."
"self reportError: (self cCoerceSimple: cogMethod to: #sqInt)."
^nil].
"self cCode: ''
inSmalltalk:
[coInterpreter printCogMethod: cogMethod.
""coInterpreter symbolicMethod: aMethodObj.""
self assertValidMethodMap: cogMethod."
"self disassembleMethod: cogMethod."
"printInstructions := clickConfirm := true""]."
^cogMethod!
More information about the Vm-dev
mailing list