[Vm-dev] VM Maker: VMMaker.oscog-eem.2325.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Jan 25 21:31:25 UTC 2018
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2325.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.2325
Author: eem
Time: 25 January 2018, 1:30:51.009627 pm
UUID: 48552a26-3c86-41d7-9b6f-75832766ff68
Ancestors: VMMaker.oscog-eem.2324
StackToRegisterMappingCogit:
Fix ancient bug in voidReceiverResultRegContainsSelf. The computed index is the right argument for ssFlushTo:; it shouldn't be subtracted from simStackPtr!
Make stackTopIsBoolean more robust.
Better support for in-image compilation. Make sure to fill the code zone with stops (& provide better implementations of stopsFrom:to:). Extract creating an initialized Cogit instance to a method. Provide simStackPrintString.
=============== Diff against VMMaker.oscog-eem.2324 ===============
Item was changed:
----- Method: CogIA32Compiler>>stopsFrom:to: (in category 'generate machine code') -----
stopsFrom: startAddr to: endAddr
+ self
+ cCode: [self self me: startAddr ms: self stop et: endAddr - startAddr + 1]
+ inSmalltalk:
+ [| alignedEnd alignedStart stops |
+ stops := self stop << 8 + self stop.
+ stops := stops << 16 + stops.
+ alignedStart := startAddr + 3 // 4 * 4.
+ alignedEnd := endAddr - 1 // 4 * 4.
+ alignedEnd <= startAddr
+ ifTrue:
+ [startAddr to: endAddr do:
+ [:addr | objectMemory byteAt: addr put: self stop]]
+ ifFalse:
+ [startAddr to: alignedStart - 1 do:
+ [:addr | objectMemory byteAt: addr put: self stop].
+ alignedStart to: alignedEnd by: 4 do:
+ [:addr | objectMemory long32At: addr put: stops].
+ alignedEnd + 4 to: endAddr do:
+ [:addr | objectMemory byteAt: addr put: self stop]]]!
- startAddr to: endAddr do:
- [:addr | objectMemory byteAt: addr put: self stop]!
Item was changed:
----- Method: CogMethodZone>>quickClearCogCompiledCode (in category 'jit - api') -----
quickClearCogCompiledCode
"Quick, for in-image testing"
<doNotGenerate>
mzFreeStart := baseAddress.
+ self clearCogCompiledCode.
+ cogit backEnd stopsFrom: mzFreeStart to: limitAddress - 1!
- self clearCogCompiledCode!
Item was changed:
----- Method: CogX64Compiler>>stopsFrom:to: (in category 'generate machine code') -----
stopsFrom: startAddr to: endAddr
+ self
+ cCode: [self self me: startAddr ms: self stop et: endAddr - startAddr + 1]
+ inSmalltalk:
+ [| alignedEnd alignedStart stops |
+ stops := self stop << 8 + self stop.
+ stops := stops << 16 + stops.
+ stops := stops << 32 + stops.
+ alignedStart := startAddr + 7 // 8 * 8.
+ alignedEnd := endAddr - 1 // 8 * 8.
+ alignedEnd <= startAddr
+ ifTrue:
+ [startAddr to: endAddr do:
+ [:addr | objectMemory byteAt: addr put: self stop]]
+ ifFalse:
+ [startAddr to: alignedStart - 1 do:
+ [:addr | objectMemory byteAt: addr put: self stop].
+ alignedStart to: alignedEnd by: 8 do:
+ [:addr | objectMemory long64At: addr put: stops].
+ alignedEnd + 8 to: endAddr do:
+ [:addr | objectMemory byteAt: addr put: self stop]]]!
- startAddr to: endAddr do:
- [:addr | objectMemory byteAt: addr put: self stop]!
Item was changed:
----- Method: Cogit class>>cog:selectorOrNumCopied:options: (in category 'in-image compilation') -----
cog: aCompiledMethod selectorOrNumCopied: selectorOrNumCopied options: optionsDictionaryOrArray
"StackToRegisterMappingCogit cog: (Integer >> #benchFib) selector: #benchFib options: #(COGMTVM false)"
| cogit coInterpreter |
+ cogit := self initializedInstanceForTests: optionsDictionaryOrArray.
+ coInterpreter := cogit coInterpreter.
- cogit := self instanceForTests: optionsDictionaryOrArray.
self attemptToComputeTempNamesFor: aCompiledMethod.
self attemptToComputeInstVarNamesFor: aCompiledMethod.
- coInterpreter := CurrentImageCoInterpreterFacade forCogit: cogit.
- [cogit
- setInterpreter: coInterpreter;
- singleStep: true;
- initializeCodeZoneFrom: 1024 upTo: coInterpreter memory size / 2. "leave space for rump C stack"
- cogit methodZone freeStart: (cogit methodZone freeStart roundUpTo: 1024)]
- on: Notification
- do: [:ex|
- (ex messageText beginsWith: 'cannot find receiver for') ifTrue:
- [ex resume: coInterpreter].
- ex pass].
^{ coInterpreter.
cogit.
selectorOrNumCopied isInteger
ifTrue: [ cogit cogFullBlockMethod: (coInterpreter oopForObject: aCompiledMethod) numCopied: selectorOrNumCopied ]
ifFalse: [ cogit cog: (coInterpreter oopForObject: aCompiledMethod) selector: (coInterpreter oopForObject: selectorOrNumCopied) ] }!
Item was changed:
----- Method: Cogit class>>genAndDisPICoptions: (in category 'in-image compilation') -----
genAndDisPICoptions: optionsDictionaryOrArray
+ "StackToRegisterMappingCogit genAndDisPICoptions: #(ISA ARMv5 CogCompilerClass CogOutOfLineLiteralsARMCompiler)"
+ | cogit |
+ cogit := self initializedInstanceForTests: optionsDictionaryOrArray.
- "StackToRegisterMappingCogit genAndDisPICoptions: #(ISA ARMv5 CogCompilerClass CogInLineLiteralsARMCompiler)"
- | cogit coInterpreter |
- cogit := self instanceForTests: optionsDictionaryOrArray.
- coInterpreter := CurrentImageCoInterpreterFacade forCogit: cogit.
- [cogit
- setInterpreter: coInterpreter;
- singleStep: true;
- initializeCodeZoneFrom: 1024 upTo: coInterpreter memory size / 2. "leave space for rump C stack"
- cogit methodZone freeStart: (cogit methodZone freeStart roundUpTo: 1024)]
- on: Notification
- do: [:ex|
- (ex messageText beginsWith: 'cannot find receiver for') ifTrue:
- [ex resume: coInterpreter]].
cogit disassembleFrom: cogit cPICPrototype + (cogit sizeof: CogMethod) to: cogit cPICPrototype + cogit closedPICSize!
Item was added:
+ ----- Method: Cogit class>>initializedInstanceForTests: (in category 'in-image compilation support') -----
+ initializedInstanceForTests: optionsDictionaryOrArray
+ "Answer an instance of a Cogit suitable for running tests that has initialized
+ its method zone (generated trampolines etc)"
+ | cogit coInterpreter |
+ cogit := self instanceForTests: optionsDictionaryOrArray.
+ coInterpreter := CurrentImageCoInterpreterFacade forCogit: cogit.
+ [cogit
+ setInterpreter: coInterpreter;
+ singleStep: true;
+ initializeCodeZoneFrom: 1024 upTo: coInterpreter memory size.
+ cogit methodZone freeStart: (cogit methodZone freeStart roundUpTo: 1024)]
+ on: Notification
+ do: [:ex|
+ (ex messageText beginsWith: 'cannot find receiver for') ifTrue:
+ [ex resume: coInterpreter].
+ ex pass].
+ ^cogit!
Item was changed:
----- Method: Cogit class>>testPCMappingSelect:options: (in category 'tests') -----
testPCMappingSelect: aBlock options: optionsDictionaryOrArray
"Test pc mapping both ways using a selection of the methods in the current image."
+ | cogit coInterpreter n |
+ cogit := self initializedInstanceForTests: optionsDictionaryOrArray.
+ coInterpreter := cogit coInterpreter.
- | n cogit coInterpreter |
- cogit := self instanceForTests: optionsDictionaryOrArray.
- coInterpreter := CurrentImageCoInterpreterFacade forCogit: cogit.
- [cogit
- setInterpreter: coInterpreter;
- singleStep: true;
- initializeCodeZoneFrom: 1024 upTo: coInterpreter memory size]
- on: Notification
- do: [:ex|
- (ex messageText beginsWith: 'cannot find receiver for') ifTrue:
- [ex resume: coInterpreter]].
n := -1.
SystemNavigation new allSelect:
[:m| | cm |
(m isQuick not
and: [aBlock value: m]) ifTrue:
[(n := n + 1) \\ 10 = 0 ifTrue: [Transcript nextPut: $.; flush].
cm := cogit
cog: (coInterpreter oopForObject: m)
selector: (coInterpreter oopForObject: m selector).
cm ifNil:
[cogit methodZone clearCogCompiledCode.
coInterpreter initializeObjectMap.
cm := cogit
cog: (coInterpreter oopForObject: m)
selector: (coInterpreter oopForObject: m selector).
cm ifNil: [Transcript show: 'After 1 Cog compiled code compaction, still not able to generate the cog method...' ] ].
cm ifNotNil:
[cogit testPCMappingForCompiledMethod: m cogMethod: cm]].
+ false]!
- false] !
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>long64At: (in category 'accessing') -----
+ long64At: byteIndex
+ ^objectMemory long64At: byteIndex!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>long64At:put: (in category 'accessing') -----
+ long64At: byteIndex put: aValue
+ ^objectMemory long64At: byteIndex put: aValue!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacade>>mcprimFunctionForPrimitiveIndex: (in category 'accessing') -----
+ mcprimFunctionForPrimitiveIndex: primIndex
+ ^self oopForObject: (coInterpreter mcprimFunctionForPrimitiveIndex: primIndex)!
Item was added:
+ ----- Method: CurrentImageCoInterpreterFacadeForSpurObjectRepresentation>>maybeMethodClassOf:seemsToBeInstantiating: (in category 'accessing') -----
+ maybeMethodClassOf: methodObj seemsToBeInstantiating: format
+ "Answers if the code is installed in a class instantiating objects with the format. Used in primitive
+ generation to make a quick path based on where the method is installed. This method cannot
+ be used as a guarantee as there can be false positive, it's just a heuristic.
+ Tries to interpret the last literal of the method as a behavior (more than 3 fields, 3rd field a Smi).
+ If it can be interpreted as a behavior, answers if instSpec matches the format, else answers false."
+ <api>
+ | maybeClassObj|
+ maybeClassObj := (self objectForOop: methodObj) methodClass.
+ ^maybeClassObj isBehavior
+ and: [maybeClassObj instSpec = format]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>printSimStack:toDepth:spillBase:on: (in category 'simulation only') -----
printSimStack: aSimStack toDepth: limit spillBase: spillBase on: aStream
<doNotGenerate>
| tempNames width tabWidth |
aStream ensureCr.
limit < 0 ifTrue:
[^aStream nextPutAll: 'simStackEmpty'; cr; flush].
aSimStack ifNil:
[^aStream nextPutAll: 'nil simStack'; cr; flush].
(self class initializationOptions at: #tempNames ifAbsent: nil) ifNotNil:
[:tempNamesDictOrNil | | tab longest |
tempNames := tempNamesDictOrNil at: (self class initializationOptions at: #startpc ifAbsent: [initialPC]) + 1.
longest := tempNames inject: '' into: [:m :t| m size >= t size ifTrue: [m] ifFalse: [t]].
tabWidth := self widthInDefaultFontOf: (tab := String with: Character tab).
width := self widthInDefaultFontOf: longest, tab.
width <= ((self widthInDefaultFontOf: longest, (String with: Character space)) + 4) ifTrue:
[width := width + tabWidth]].
0 to: limit do:
[:i|
width ifNotNil:
[self put: (tempNames at: i + 1 ifAbsent: ['']) paddedTo: width tabWidth: tabWidth on: aStream].
aStream print: i.
+ i = simStackPtr ifTrue:
+ [aStream nextPutAll: '<-' ].
+ i = spillBase ifTrue:
+ [aStream nextPutAll: '(sb)'].
+ aStream tab: (i = spillBase ifTrue: [1] ifFalse: [2]).
- i = spillBase
- ifTrue: [aStream nextPutAll: ' sb'; tab]
- ifFalse: [aStream tab; tab].
(aSimStack at: i) printStateOn: aStream.
aStream cr; flush]!
Item was added:
+ ----- Method: StackToRegisterMappingCogit>>simStackPrintString (in category 'simulation only') -----
+ simStackPrintString
+ <doNotGenerate>
+ ^String streamContents:
+ [:s|
+ optStatus printStateOn: s.
+ self printSimStack: simStack toDepth: simStackPtr spillBase: simSpillBase on: s]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>stackTopIsBoolean (in category 'testing') -----
stackTopIsBoolean
<inline: true>
+ ^simStackPtr >= methodOrBlockNumArgs and: [self stackEntryIsBoolean: self ssTop]!
- ^simStackPtr > 0 and: [self stackEntryIsBoolean: self ssTop]!
Item was changed:
----- Method: StackToRegisterMappingCogit>>voidReceiverResultRegContainsSelf (in category 'bytecode generator support') -----
voidReceiverResultRegContainsSelf
"Used when ReceiverResultReg is allocated for other than simSelf, and
there may be references to ReceiverResultReg which need to be spilled."
| spillIndex |
self voidReceiverOptStatus.
spillIndex := -1.
(methodOrBlockNumTemps max: simSpillBase) to: simStackPtr do:
[:i|
(self simStackAt: i) registerOrNone = ReceiverResultReg ifTrue:
[spillIndex := i]].
spillIndex > 0 ifTrue:
+ [self ssFlushTo: spillIndex]!
- [self ssFlushTo: simStackPtr - spillIndex]!
More information about the Vm-dev
mailing list