Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2666.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2666 Author: eem Time: 20 January 2020, 10:01:56.914626 pm UUID: 6b17b01a-df44-41b1-8ad0-2fe5571300bc Ancestors: VMMaker.oscog-eem.2665 Cogit: Clean up the definition of the optional trampolines for ZeroCount, low-level locks, processor feature checks and cache flushing. =============== Diff against VMMaker.oscog-eem.2665 =============== Item was removed: - ----- Method: CogARMCompiler>>numICacheFlushOpcodes (in category 'inline cacheing') ----- - numICacheFlushOpcodes - "ARM needs to do icache flushing when code is written" - "for now return 0 to skip it and probably blow up" - ^0 - ! Item was changed: ----- Method: CogAbstractInstruction>>numCheckFeaturesOpcodes (in category 'initialization') ----- numCheckFeaturesOpcodes + "If the processor has a feature check facility answer the number + of opcodes required to compile an accessor for the feature check." - "If the priocessor has a feature check facility answer the number - of opcodes required to compile an accessor for the feature." ^0! Item was changed: ----- Method: CogAbstractInstruction>>numCheckLZCNTOpcodes (in category 'initialization') ----- numCheckLZCNTOpcodes + "If the processor has a feature check facility for a ZeroCount instruction, answer the number + of opcodes required to compile an accessor for the ZeroCount feature." - "If the priocessor has a feature check facility answer the number - of opcodes required to compile an accessor for the feature." ^0! Item was changed: ----- Method: Cogit class>>declareCVarsIn: (in category 'translation') ----- declareCVarsIn: aCCodeGenerator #( 'coInterpreter' 'objectMemory' 'methodZone' 'objectRepresentation' 'cogBlockMethodSurrogateClass' 'cogMethodSurrogateClass' 'nsSendCacheSurrogateClass' 'threadManager' 'processor' 'lastNInstructions' 'simulatedAddresses' 'simulatedTrampolines' 'simulatedVariableGetters' 'simulatedVariableSetters' 'processorFrameValid' 'printRegisters' 'printInstructions' 'clickConfirm' 'singleStep') do: [:simulationVariableNotNeededForRealVM| aCCodeGenerator removeVariable: simulationVariableNotNeededForRealVM]. NewspeakVM ifFalse: [#( 'selfSendTrampolines' 'dynamicSuperSendTrampolines' 'implicitReceiverSendTrampolines' 'outerSendTrampolines' 'ceEnclosingObjectTrampoline' 'numIRCs' 'indexOfIRC' 'theIRCs') do: [:variableNotNeededInNormalVM| aCCodeGenerator removeVariable: variableNotNeededInNormalVM]]. aCCodeGenerator removeConstant: #COGMTVM. "this should be defined at compile time" aCCodeGenerator addHeaderFile:'<stddef.h>'; "for e.g. offsetof" addHeaderFile:'"sqCogStackAlignment.h"'; addHeaderFile:'"dispdbg.h"'; "must precede cointerp.h & cogit.h otherwise NoDbgRegParms gets screwed up" addHeaderFile:'"cogmethod.h"'. NewspeakVM ifTrue: [aCCodeGenerator addHeaderFile:'"nssendcache.h"']. aCCodeGenerator addHeaderFile:'#if COGMTVM'; addHeaderFile:'"cointerpmt.h"'; addHeaderFile:'#else'; addHeaderFile:'"cointerp.h"'; addHeaderFile:'#endif'; addHeaderFile:'"cogit.h"'. aCCodeGenerator var: #ceGetFP declareC: 'usqIntptr_t (*ceGetFP)(void)'; var: #ceGetSP declareC: 'usqIntptr_t (*ceGetSP)(void)'; var: #ceCaptureCStackPointers declareC: 'void (*ceCaptureCStackPointers)(void)'; var: #ceEnterCogCodePopReceiverReg declareC: 'void (*ceEnterCogCodePopReceiverReg)(void)'; var: #realCEEnterCogCodePopReceiverReg declareC: 'void (*realCEEnterCogCodePopReceiverReg)(void)'; var: #ceCallCogCodePopReceiverReg declareC: 'void (*ceCallCogCodePopReceiverReg)(void)'; var: #realCECallCogCodePopReceiverReg declareC: 'void (*realCECallCogCodePopReceiverReg)(void)'; var: #ceCallCogCodePopReceiverAndClassRegs declareC: 'void (*ceCallCogCodePopReceiverAndClassRegs)(void)'; var: #realCECallCogCodePopReceiverAndClassRegs declareC: 'void (*realCECallCogCodePopReceiverAndClassRegs)(void)'; - var: #ceFlushICache - declareC: 'static void (*ceFlushICache)(usqIntptr_t from, usqIntptr_t to)'; - var: #ceCheckFeaturesFunction - declareC: 'static usqIntptr_t (*ceCheckFeaturesFunction)(void)'; - var: #ceCheckLZCNTFunction - declareC: 'static usqIntptr_t (*ceCheckLZCNTFunction)(void)'; - var: #ceTryLockVMOwner - declareC: 'usqIntptr_t (*ceTryLockVMOwner)(void)'; - var: #ceUnlockVMOwner - declareC: 'void (*ceUnlockVMOwner)(void)'; var: #postCompileHook declareC: 'void (*postCompileHook)(CogMethod *)'; var: #openPICList declareC: 'CogMethod *openPICList = 0'; var: #maxMethodBefore type: #'CogBlockMethod *'; var: 'enumeratingCogMethod' type: #'CogMethod *'. + + COGMTVM ifTrue: + [aCCodeGenerator + var: #ceUnlockVMOwner + declareC: 'void (*ceUnlockVMOwner)(void)'; + var: #ceTryLockVMOwner + declareC: 'usqIntptr_t (*ceTryLockVMOwner)(void)']. + CogCompilerClass basicNew numCheckLZCNTOpcodes > 0 ifTrue: + [aCCodeGenerator + var: #ceCheckLZCNTFunction + declareC: 'static usqIntptr_t (*ceCheckLZCNTFunction)(void)']. + CogCompilerClass basicNew numCheckFeaturesOpcodes > 0 ifTrue: + [aCCodeGenerator + var: #ceCheckFeaturesFunction + declareC: 'static usqIntptr_t (*ceCheckFeaturesFunction)(void)']. + CogCompilerClass basicNew numICacheFlushOpcodes > 0 ifTrue: + [aCCodeGenerator + var: #ceFlushICache + declareC: 'static void (*ceFlushICache)(usqIntptr_t from, usqIntptr_t to)']. + aCCodeGenerator declareVar: 'aMethodLabel' type: #'AbstractInstruction'; "Has to come lexicographically before backEnd & methodLabel" var: #backEnd declareC: 'AbstractInstruction * const backEnd = &aMethodLabel'; var: #methodLabel declareC: 'AbstractInstruction * const methodLabel = &aMethodLabel'. self declareC: #(abstractOpcodes stackCheckLabel blockEntryLabel blockEntryNoContextSwitch stackOverflowCall sendMiss entry noCheckEntry selfSendEntry dynSuperEntry fullBlockNoContextSwitchEntry fullBlockEntry picMNUAbort picInterpretAbort endCPICCase0 endCPICCase1 cPICEndOfCodeLabel) as: #'AbstractInstruction *' in: aCCodeGenerator. aCCodeGenerator declareVar: #blockStarts type: #'BlockStart *'; declareVar: #fixups type: #'BytecodeFixup *'. aCCodeGenerator var: #ordinarySendTrampolines declareC: 'sqInt ordinarySendTrampolines[NumSendTrampolines]'; var: #superSendTrampolines declareC: 'sqInt superSendTrampolines[NumSendTrampolines]'. BytecodeSetHasDirectedSuperSend ifTrue: [aCCodeGenerator var: #directedSuperSendTrampolines declareC: 'sqInt directedSuperSendTrampolines[NumSendTrampolines]'; var: #directedSuperBindingSendTrampolines declareC: 'sqInt directedSuperBindingSendTrampolines[NumSendTrampolines]']. NewspeakVM ifTrue: [aCCodeGenerator var: #selfSendTrampolines declareC: 'sqInt selfSendTrampolines[NumSendTrampolines]'; var: #dynamicSuperSendTrampolines declareC: 'sqInt dynamicSuperSendTrampolines[NumSendTrampolines]'; var: #implicitReceiverSendTrampolines declareC: 'sqInt implicitReceiverSendTrampolines[NumSendTrampolines]'; var: #outerSendTrampolines declareC: 'sqInt outerSendTrampolines[NumSendTrampolines]']. aCCodeGenerator var: #trampolineAddresses declareC: 'static char *trampolineAddresses[NumTrampolines*2]'; var: #objectReferencesInRuntime declareC: 'static usqInt objectReferencesInRuntime[NumObjRefsInRuntime+1]'; var: #labelCounter type: #int; var: #traceFlags declareC: 'int traceFlags = 8 /* prim trace log on by default */'; var: #cStackAlignment declareC: 'const int cStackAlignment = STACK_ALIGN_BYTES'. aCCodeGenerator declareVar: #minValidCallAddress type: #'usqIntptr_t'; declareVar: #debugPrimCallStackOffset type: #'usqIntptr_t'. aCCodeGenerator vmClass generatorTable ifNotNil: [:bytecodeGenTable| aCCodeGenerator var: #generatorTable declareC: 'static BytecodeDescriptor generatorTable[', bytecodeGenTable size printString, ']', (self tableInitializerFor: bytecodeGenTable in: aCCodeGenerator)]. "In C the abstract opcode names clash with the Smalltak generator syntactic sugar. Most of the syntactic sugar is inlined, but alas some remains. Rename the syntactic sugar to avoid the clash." (self organization listAtCategoryNamed: #'abstract instructions') do: [:s| aCCodeGenerator addSelectorTranslation: s to: 'g', (aCCodeGenerator cFunctionNameFor: s)]. aCCodeGenerator addSelectorTranslation: #halt: to: 'haltmsg'! |
Free forum by Nabble | Edit this page |