[Vm-dev] Pharo 2.0 and VM Simulator

Eliot Miranda eliot.miranda at gmail.com
Fri Apr 12 20:24:47 UTC 2013


On Fri, Apr 12, 2013 at 11:37 AM, phil at highoctane.be <phil at highoctane.be>wrote:

>
> Thanks!
>
> A question: loading VMMaker tells me the following. Why should I load
> beforehand?
>

This page describes what you need for VMMaker.oscog to load:

http://www.mirandabanda.org/cogblog/build-image/

But the config approach is a lot easier :)


>
>
> This package depends on the following classes:
>   FFIConstants
>   KlattResonatorIndices
> You must resolve these dependencies before you will be able to load these
> definitions:
>   FFIPlugin
>   declareCVarsIn:
>   hasHeaderFile
>   moduleName
>   requiresPlatformFiles
>   atomicTypeOf:
>   ffiAddressOf:startingAt:size:
>   ffiArgByValue:
>   ffiArgument:Spec:Class:
>   ffiAtomicArgByReference:Class:
>   ffiAtomicStructByReference:Class:
>   ffiCall:WithFlags:AndTypes:
>   ffiCall:WithFlags:Args:AndTypes:OfSize:
>   ffiCalloutTo:WithFlags:
>   ffiCheckReturn:With:
>   ffiContentsOfHandle:errCode:
>   ffiCreateLongLongReturn:
>   ffiCreateReturn:
>   ffiCreateReturnOop:
>   ffiCreateReturnPointer:
>   ffiCreateReturnStruct
>   ffiFail:
>   ffiFloatValueOf:
>   ffiGetLastError
>   ffiIntegerValueOf:
>   ffiLoadCalloutAddress:
>   ffiLoadCalloutAddressFrom:
>   ffiLoadCalloutModule:
>   ffiLogCallout:
>   ffiLogCallsTo:
>   ffiPushPointerContentsOf:
>   ffiPushSignedLongLongOop:
>   ffiPushStructureContentsOf:
>   ffiPushUnsignedLongLongOop:
>   ffiPushVoid:
>   ffiReturnCStringFrom:
>   ffiSetLastError:
>   ffiValidateExternalData:AtomicType:
>   initialiseModule
>   isAtomicType:
>   primitiveCallout
>    primitiveCalloutWithArgs
>   primitiveCreateManualSurface
>   primitiveDestroyManualSurface
>   primitiveFFIAllocate
>   primitiveFFIDoubleAt
>   primitiveFFIDoubleAtPut
>   primitiveFFIFloatAt
>   primitiveFFIFloatAtPut
>   primitiveFFIFree
>   primitiveFFIGetLastError
>   primitiveFFIIntegerAt
>   primitiveFFIIntegerAtPut
>   primitiveForceLoad
>   primitiveLogCallsTo
>   primitiveSetManualSurfacePointer
>   KlattSynthesizerPlugin
>   declareCVarsIn:
>   initialize
>   moduleName
>   addAmplitudeDiplophonia
>   addFlutter
>   addFrequencyDiplophonia
>   addJitter
>   addShimmer
>   antiResonator:frequency:bandwidth:
>   antiResonator:value:
>   cascadeBranch:
>   checkedFloatPtrOf:
>   checkedShortPtrOf:
>   glottalSource
>   linearFromdB:
>   loadFrom:
>   nextRandom
>   normalizeGlottalPulse
>   parallelFrictionBranch:
>   parallelVoicedBranch:
>   pitchSynchronousReset
>   primitiveSynthesizeFrameIntoStartingAt
>   qu:phi:cosphi:sinphi:rphid:
>   resonator:frequency:bandwidth:
>   resonator:frequency:bandwidth:gain:
>   resonator:value:
>   resonatorA:
>   resonatorA:put:
>   resonatorB:
>   resonatorB:put:
>   resonatorC:
>   resonatorC:put:
>   resonatorP1:
>   resonatorP1:put:
>   resonatorP2:
>   resonatorP2:put:
>   ro:ra:rk:
>   saveTo:
>   setCurrentFrame:
>   synthesizeFrame:into:startingAt:
>   voicedPitchSynchronousReset
>   zeroQphi:cosphi:sinphi:rphid:
>   ThreadedARMFFIPlugin
>   calloutStateClass
>   initialize
>   numRegArgs
>   ffiPushDoubleFloat:in:
>   ffiPushPointer:in:
>   ffiPushSignedByte:in:
>   ffiPushSignedChar:in:
>   ffiPushSignedLongLong:in:
>   ffiPushSignedShort:in:
>   ffiPushSingleFloat:in:
>   ffiPushUnsignedByte:in:
>   ffiPushUnsignedChar:in:
>   ffiPushUnsignedLong:in:
>   ffiPushUnsignedLongLong:in:
>   ffiPushUnsignedShort:in:
>   registerArgsSlop
>   ThreadedFFIPlugin
>   ancilliaryStructClasses
>   calloutStateClass
>   declareCVarsIn:
>   initialize
>   maxNumArgs
>   moduleName
>   preambleCCode
>   prepareToBeAddedToCodeGenerator:
>   allocaLiesSoUseGetsp
>   atomicTypeOf:
>   cStackAlignment
>   cleanupCalloutState:
>   dispatchFunctionPointer:
>   externalFunctionHasStackSizeSlot
>   ffiAddressOf:startingAt:size:
>   ffiAlloc:
>   ffiArgByValue:in:
>   ffiArgument:Spec:Class:in:
>   ffiAtomicArgByReference:Class:in:
>   ffiAtomicStructByReference:Class:in:
>   ffiCall:ArgArrayOrNil:NumArgs:
>   ffiCalloutTo:SpecOnStack:in:
>   ffiCheckReturn:With:in:
>   ffiContentsOfHandle:errCode:
>   ffiCreateIntegralResultOop:ofAtomicType:in:
>   ffiFail:
>   ffiFloatValueOf:
>   ffiFree:
>   ffiIntegerValueOf:
>   ffiLoadCalloutAddress:
>   ffiLoadCalloutAddressFrom:
>   ffiLoadCalloutModule:
>   ffiLogCallout:
>   ffiLogCallsTo:
>   ffiPushDoubleFloat:in:
>   ffiPushPointer:in:
>   ffiPushPointerContentsOf:in:
>   ffiPushSignedByte:in:
>   ffiPushSignedChar:in:
>   ffiPushSignedInt:in:
>   ffiPushSignedLongLong:in:
>   ffiPushSignedLongLongOop:in:
>   ffiPushSignedShort:in:
>   ffiPushSingleFloat:in:
>   ffiPushString:OfLength:in:
>   ffiPushStructure:ofSize:typeSpec:ofLength:in:
>   ffiPushStructureContentsOf:in:
>   ffiPushUnsignedByte:in:
>   ffiPushUnsignedChar:in:
>   ffiPushUnsignedInt:in:
>   ffiPushUnsignedLongLong:in:
>   ffiPushUnsignedLongLongOop:in:
>   ffiPushUnsignedShort:in:
>   ffiPushVoid:in:
>   ffiReturnCStringFrom:
>   ffiReturnPointer:ofType:in:
>   ffiReturnStruct:ofType:in:
>   ffiReturnType:
>   ffiSupportsCallingConvention:
>   ffiValidateExternalData:AtomicType:
>   initialiseModule
>   isAlien:
>   isAtomicType:
>   isCalleePopsConvention:
>   isDirectAlien:
>   nonRegisterStructReturnIsViaImplicitFirstArgument
>   primitiveCallout
>   primitiveCalloutWithArgs
>   primitiveCreateManualSurface
>   primitiveDestroyManualSurface
>   primitiveFFIAllocate
>   primitiveFFIDoubleAt
>   primitiveFFIDoubleAtPut
>   primitiveFFIFloatAt
>   primitiveFFIFloatAtPut
>   primitiveFFIFree
>   primitiveFFIGetLastError
>   primitiveFFIIntegerAt
>   primitiveFFIIntegerAtPut
>   primitiveForceLoad
>   primitiveLogCallsTo
>   primitiveSetManualSurfacePointer
>   registerArgsSlop
>   returnStructInRegisters:
>   sizeField:
>   startOfData:
>   ThreadedIA32FFIPlugin
>   ffiCalloutTo:SpecOnStack:in:
>   ffiPushDoubleFloat:in:
>   ffiPushPointer:in:
>   ffiPushSignedByte:in:
>   ffiPushSignedChar:in:
>   ffiPushSignedInt:in:
>   ffiPushSignedLongLong:in:
>   ffiPushSignedShort:in:
>   ffiPushSingleFloat:in:
>   ffiPushStructure:ofSize:typeSpec:ofLength:in:
>   ffiPushUnsignedByte:in:
>   ffiPushUnsignedChar:in:
>   ffiPushUnsignedInt:in:
>   ffiPushUnsignedLongLong:in:
>   ffiPushUnsignedShort:in:
>   ffiReturnStruct:ofType:in:
>   registerArgsSlop
>   returnStructInRegisters:
>   ThreadedPPCBEFFIPlugin
>   calloutStateClass
>   initialize
>   numRegArgs
>   ffiPushDoubleFloat:in:
>   ffiPushPointer:in:
>   ffiPushSignedByte:in:
>   ffiPushSignedChar:in:
>   ffiPushSignedInt:in:
>   ffiPushSignedLongLong:in:
>   ffiPushSignedShort:in:
>   ffiPushSingleFloat:in:
>   ffiPushUnsignedByte:in:
>   ffiPushUnsignedChar:in:
>   ffiPushUnsignedInt:in:
>   ffiPushUnsignedLong:in:
>   ffiPushUnsignedLongLong:in:
>   ffiPushUnsignedShort:in:
>   registerArgsSlop
>   returnStructInRegisters:
>
>
> Select Proceed to continue, or close this window to cancel the operation.
>
>
> 2013/4/12 Eliot Miranda <eliot.miranda at gmail.com>
>
>>
>>
>>
>> On Fri, Apr 12, 2013 at 2:43 AM, phil at highoctane.be <phil at highoctane.be>wrote:
>>
>>>
>>> This is what I do have:
>>>
>>> VMClass subclass: #InterpreterPrimitives
>>> VMClass subclass: #ObjectMemory
>>> ObjectMemory subclass: #Interpreter
>>>
>>> and also:
>>>
>>> InterpreterPrimitives subclass: #StackInterpreter
>>> StackInterpreter subclass: #StackInterpreterPrimitives
>>>
>>> I am interested in getting Interpreter to work at this point, not
>>> StackInterpreter, in the simulator.
>>>
>>
>> Then I would either move to VMMaker or be prepared for a fair bit of
>> work.  I haven't worked on the Interpreter in the Cog branch for many
>> years.
>>
>>
>>>
>>> StackIntepreter simulation has other problems:
>>>
>>> UndefinedObject(Object)>>doesNotUnderstand: #adaptToNumber:andSend:
>>> UndefinedObject(Object)>>adaptToInteger:andSend:
>>> SmallInteger(Integer)>>quo:
>>> SmallInteger>>quo:
>>> SmallInteger(Integer)>>//
>>> SmallInteger>>//
>>>
>>> StackInterpreterSimulatorLSB(StackInterpreter)>>interpreterAllocationReserveBytes
>>> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>openOn:extraMemory:
>>> in Block: [f := FileStream readOnlyFileNamed: fileName....
>>> BlockClosure>>ensure:
>>>
>>> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>openOn:extraMemory:
>>> StackInterpreterSimulatorLSB(StackInterpreterSimulator)>>openOn:
>>> UndefinedObject>>DoIt
>>>
>>> Looks like all of this needs some love... no problem doing that but I
>>> need to sort out these questions with your help :-)
>>>
>>
>> This should be easy to solve.  Hmmm, works in e.g. VMMaker.oscog-eem.284.
>>
>> Try launching it with
>>
>> | vm |
>> StackInterpreter initializeWithOptions: (Dictionary newFromPairs: #()).
>> vm := StackInterpreterSimulator new.
>> vm openOn: 'some.image'.
>> vm openAsMorph; run
>>
>>
>> If it doesn't work then you need to reintegrate
>> from VMMaker.oscog-eem.284.
>>
>> HTH
>> Eliot
>>
>>
>>> Phil
>>>
>>>
>>>
>>>
>>>
>>>
>>> 2013/4/11 Eliot Miranda <eliot.miranda at gmail.com>
>>>
>>>>
>>>>
>>>>
>>>> On Thu, Apr 11, 2013 at 2:11 AM, phil at highoctane.be <phil at highoctane.be
>>>> > wrote:
>>>>
>>>>>
>>>>> Hello,
>>>>>
>>>>> I've been working on getting the simulator to work from VMMaker.
>>>>>
>>>>> Now, I can load my 6505 formatted image inside the simulator and it
>>>>> looks okay (from what I can inspect).
>>>>>
>>>>> Then, I am now running the test of the sim:
>>>>>
>>>>> test
>>>>> transcript clear.
>>>>> byteCount := 0.
>>>>>  quitBlock := [^ self].
>>>>> self internalizeIPandSP.
>>>>> self fetchNextBytecode.
>>>>>  [true] whileTrue:
>>>>> [self dispatchOn: currentBytecode in: BytecodeTable.
>>>>> byteCount := byteCount + 1.
>>>>>  byteCount \\ 10000 = 0 ifTrue: [self fullDisplay]].
>>>>> self externalizeIPandSP.
>>>>>
>>>>>
>>>>> and I hit an issue:
>>>>>
>>>>> MNU: isInstanceOfClassFloat: oop.
>>>>> InterpreterSimulatorLSB(Interpreter)>>floatValueOf:
>>>>> InterpreterSimulatorLSB(Interpreter)>>loadFloatOrIntFrom:
>>>>> InterpreterSimulatorLSB(Interpreter)>>primitiveFloatEqual:toArg:
>>>>> InterpreterSimulatorLSB(Interpreter)>>bytecodePrimEqual
>>>>> InterpreterSimulatorLSB(InterpreterSimulator)>>dispatchOn:in:
>>>>> InterpreterSimulatorLSB(InterpreterSimulator)>>test
>>>>> UndefinedObject>>DoIt
>>>>>
>>>>> This happens here:
>>>>>
>>>>> floatValueOf: oop
>>>>>  "Answer the C double precision floating point value of the argument,
>>>>>  or fail if it is not a Float, and answer 0.
>>>>>  Note: May be called by translated primitive code."
>>>>>
>>>>> | isFloat result |
>>>>> <returnTypeC: #double>
>>>>>  <var: #result type: #double>
>>>>> isFloat := self isInstanceOfClassFloat: oop.
>>>>> isFloat ifTrue:
>>>>>  [self cCode: '' inSmalltalk: [result := Float new: 2].
>>>>>  self fetchFloatAt: oop + BaseHeaderSize into: result.
>>>>>  ^result].
>>>>> self primitiveFail.
>>>>> ^0.0
>>>>>
>>>>> There is such a method in IntepreterPrimitives, but not in the
>>>>> Interpreter itself nor parents.
>>>>>
>>>>> InterpreterPrimitives>>isInstanceOfClassFloat: oop
>>>>>  <inline: true>
>>>>> "N.B.  Because Slang always inlines is:instanceOf:compactClassIndex:
>>>>>  (because is:instanceOf:compactClassIndex: has an inline: pragma) the
>>>>>  phrase (objectMemory splObj: ClassFloat) is expanded in-place and is
>>>>>  _not_ evaluated if oop has a non-zero CompactClassIndex."
>>>>>  ^objectMemory
>>>>> is: oop
>>>>> instanceOf: (objectMemory splObj: ClassFloat)
>>>>>  compactClassIndex: ClassFloatCompactIndex
>>>>>
>>>>> Clues?
>>>>>
>>>>
>>>> Just copy the method into Interpreter and replace objectMemory with
>>>> self.  But I don't understand which VMMsker you're using.  In David Lewis'
>>>> trunk, e.g. VMMaker-dtl.316, Interpreter inherits from
>>>> InterpreterPrimitives.
>>>>
>>>>
>>>>>
>>>>> Phil
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> best,
>>>> Eliot
>>>>
>>>>
>>>
>>>
>>
>>
>> --
>> best,
>> Eliot
>>
>>
>
>


-- 
best,
Eliot
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20130412/6d3d0e16/attachment-0001.htm


More information about the Vm-dev mailing list