[Vm-dev] VM Maker: VMMaker.oscog-cb.1654.mcz

Eliot Miranda eliot.miranda at gmail.com
Thu Jan 21 17:56:08 UTC 2016


Hi Clément,

On Tue, Jan 19, 2016 at 11:44 PM, Clément Bera <bera.clement at gmail.com>
wrote:

>
>
> 2016-01-20 2:35 GMT+01:00 Eliot Miranda <eliot.miranda at gmail.com>:
>
>> Hi Clément,
>>
>>
>>
>>     alas the bytecode <-> machine code mapping machinery isn't capable of
>> distinguishing different variants of a complex bytecode such
>> as extendedStoreAndPopBytecode.  The map machinery is based on parsing
>> bytecodes by looking up their descriptors.  So if a bytecode descriptor is
>> marked as mapped, all instantiations of the bytecode in machine code must
>> be mapped, not just the ones we know we're going to need a map entry for
>> for message handling etc.
>>
> So where you write
>>
>> extendedStoreAndPopBytecode
>> | variableType variableIndex |
>> variableType := byte1 >> 6 bitAnd: 3.
>> variableIndex := byte1 bitAnd: 63.
>> variableType = 0 ifTrue:
>> [^self genStorePop: true ReceiverVariable: variableIndex].
>> variableType = 1 ifTrue:
>> [self genStorePop: true TemporaryVariable: variableIndex.
>> "needs a fake map entry is Immutability is ON..."
>> self cppIf: IMMUTABILITY ifTrue: [ self annotateBytecode: self Label. ].
>> ^ 0].
>> variableType = 3 ifTrue:
>> [^self genStorePop: true LiteralVariable: variableIndex].
>> ^EncounteredUnknownBytecode
>>
>> you're actually going to have to write something like
>>
>> extendedStoreAndPopBytecode
>> | variableType variableIndex |
>> variableType := byte1 >> 6 bitAnd: 3.
>> variableIndex := byte1 bitAnd: 63.
>> variableType = 0 ifTrue:
>> [self genStorePop: true ReceiverVariable: variableIndex].
>> variableType = 1 ifTrue:
>> [self genStorePop: true TemporaryVariable: variableIndex].
>> variableType = 2 ifTrue:
>> [^EncounteredUnknownBytecode].
>> variableType = 3 ifTrue:
>> [self genStorePop: true LiteralVariable: variableIndex].
>> "If IMMUTABILITY is on then this bytecode could send back and so must be
>> mapped."
>> self cppIf: IMMUTABILITY ifTrue: [self annotateBytecode: self lastOpcode]
>>
>>
> I think this should fix your instabilities.  What's happening is that your
>> nearly-correct code creates the occasional method with a bad map and if the
>> map is used (which it isn't often, but is in the debugger) then method
>> execution can get screwed up.
>>
>>
> As stated in the commit comment, my code generates a correct map for all
> methods but the ones with primitive with error code... The
> test #testPCMappingFor:options: proves it (you can run it on all methods to
> check).
>
> I don't think your change is a good idea because the mcpc mapped would be
> incorrect.
>
> However, if you have an idea on how to handle correctly primitive with
> error code (the extStore for error code is compiled differently and lacks
> the map entry), it would be helpful. I tried to generate an entry at the
> beginning of the method body but it didn't work.
>

Oh you're right.  genStorePop:LiteralVariable: contains an immutability
check so it also annotates.  The only case that doesn't is the temporary
store pop.  Forgive me :-).


> HTH
>>
>> On Tue, Jan 19, 2016 at 5:29 AM, <commits at source.squeak.org> wrote:
>>
>>>
>>> Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
>>> http://source.squeak.org/VMMaker/VMMaker.oscog-cb.1654.mcz
>>>
>>> ==================== Summary ====================
>>>
>>> Name: VMMaker.oscog-cb.1654
>>> Author: cb
>>> Time: 19 January 2016, 2:28:37.278 pm
>>> UUID: 35bdf68b-ea60-4f01-8799-14baa71ab416
>>> Ancestors: VMMaker.oscog-cb.1653
>>>
>>> In the SqueakV3Bytecode set, extendedStore and extStoreAndPop are now
>>> mapped as instVar and LiteralVar stores need to be mapped for immutability.
>>> We need to generate a fake mapping to make the mcpc to bcpc mapping happy.
>>>
>>> Starting from this version, the mcpc to bcpc is happy *except* for
>>> primitive error code. In this case, an extStore bytecode is used for the
>>> error code but is still not mapped.
>>>
>>> =============== Diff against VMMaker.oscog-cb.1653 ===============
>>>
>>> Item was changed:
>>>   ----- Method: SimpleStackBasedCogit>>extendedStoreAndPopBytecode (in
>>> category 'bytecode generators') -----
>>>   extendedStoreAndPopBytecode
>>>         | variableType variableIndex |
>>>         variableType := byte1 >> 6 bitAnd: 3.
>>>         variableIndex := byte1 bitAnd: 63.
>>>         variableType = 0 ifTrue:
>>>                 [^self genStorePop: true ReceiverVariable:
>>> variableIndex].
>>>         variableType = 1 ifTrue:
>>> +               [self genStorePop: true TemporaryVariable: variableIndex.
>>> +               "needs a fake map entry is Immutability is ON..."
>>> +               self cppIf: IMMUTABILITY ifTrue: [ self
>>> annotateBytecode: self Label. ].
>>> +               ^ 0].
>>> -               [^self genStorePop: true TemporaryVariable:
>>> variableIndex].
>>>         variableType = 3 ifTrue:
>>>                 [^self genStorePop: true LiteralVariable: variableIndex].
>>>         ^EncounteredUnknownBytecode!
>>>
>>> Item was changed:
>>>   ----- Method: SimpleStackBasedCogit>>extendedStoreBytecode (in
>>> category 'bytecode generators') -----
>>>   extendedStoreBytecode
>>>         | variableType variableIndex |
>>>         variableType := byte1 >> 6 bitAnd: 3.
>>>         variableIndex := byte1 bitAnd: 63.
>>>         variableType = 0 ifTrue:
>>>                 [^self genStorePop: false ReceiverVariable:
>>> variableIndex].
>>>         variableType = 1 ifTrue:
>>> +               [self genStorePop: false TemporaryVariable:
>>> variableIndex.
>>> +               "needs a fake map entry is Immutability is ON..."
>>> +               self cppIf: IMMUTABILITY ifTrue: [ self
>>> annotateBytecode: self Label. ].
>>> +               ^ 0].
>>> -               [^self genStorePop: false TemporaryVariable:
>>> variableIndex].
>>>         variableType = 3 ifTrue:
>>>                 [^self genStorePop: false LiteralVariable:
>>> variableIndex].
>>>         ^EncounteredUnknownBytecode!
>>>
>>> Item was changed:
>>>   ----- Method:
>>> StackToRegisterMappingCogit>>doubleExtendedDoAnythingBytecode (in category
>>> 'bytecode generators') -----
>>>   doubleExtendedDoAnythingBytecode
>>>         "Replaces the Blue Book double-extended send [132], in which the
>>> first byte was wasted on 8 bits of argument count.
>>>         Here we use 3 bits for the operation sub-type (opType),  and the
>>> remaining 5 bits for argument count where needed.
>>>         The last byte give access to 256 instVars or literals.
>>>         See also secondExtendedSendBytecode"
>>>         | opType |
>>>         opType := byte1 >> 5.
>>>         opType = 0 ifTrue:
>>>                 [^self genSend: byte2 numArgs: (byte1 bitAnd: 31)].
>>>         opType = 1 ifTrue:
>>>                 [^self genSendSuper: byte2 numArgs: (byte1 bitAnd: 31)].
>>>         "We need a map entry for this bytecode for correct parsing.
>>>          The sends will get an IsSend entry anyway.  The other cases
>>> need a
>>>          fake one.  We could of course special case the scanning but
>>> that's silly."
>>>         opType caseOf: {
>>>                         [2]     ->      [(coInterpreter
>>> isReadMediatedContextInstVarIndex: byte2)
>>>                                                 ifTrue: [self
>>> genPushMaybeContextReceiverVariable: byte2]
>>>                                                 ifFalse: [self
>>> genPushReceiverVariable: byte2.
>>>                                                                 self
>>> ssTop annotateUse: true.
>>>                                                                 ^0]].
>>>                         [3]     ->      [self genPushLiteralIndex: byte2.
>>>                                          self ssTop annotateUse: true.
>>>                                          ^0].
>>>                         [4]     ->      [self genPushLiteralVariable:
>>> byte2.].
>>> +                       [7]     ->      [self genStorePop: false
>>> LiteralVariable: byte2.
>>> +                                       self cppIf: IMMUTABILITY ifTrue:
>>> [ "instruction is mapped" ^0 ] ] }
>>> -                       [7]     ->      [self genStorePop: false
>>> LiteralVariable: byte2] }
>>>                 otherwise: "5 & 6"
>>>                         [(coInterpreter
>>> isWriteMediatedContextInstVarIndex: byte2)
>>>                                 ifTrue: [self genStorePop: opType = 6
>>> MaybeContextReceiverVariable: byte2]
>>> +                               ifFalse: [self genStorePop: opType = 6
>>> ReceiverVariable: byte2].
>>> +                       self cppIf: IMMUTABILITY ifTrue: [ "instruction
>>> is mapped" ^0 ]].
>>> -                               ifFalse: [self genStorePop: opType = 6
>>> ReceiverVariable: byte2]].
>>>         "We need a map entry for this bytecode for correct parsing (if
>>> the method builds a frame).
>>>          We could of course special case the scanning but that's silly
>>> (or is it?)."
>>>         self assert: needsFrame.
>>>         "genPushMaybeContextInstVar, pushListVar, store & storePop all
>>> generate code"
>>>         self assert: self prevInstIsPCAnnotated not.
>>>         self annotateBytecode: self Label.
>>>         ^0!
>>>
>>>
>>
>>
>> --
>> _,,,^..^,,,_
>> best, Eliot
>>
>
>


-- 
_,,,^..^,,,_
best, Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20160121/d84ce9c5/attachment-0001.htm


More information about the Vm-dev mailing list