[Vm-dev] VM Maker: VMMaker.oscog-eem.2666.mcz

commits at source.squeak.org commits at source.squeak.org
Tue Jan 21 06:02:11 UTC 2020


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'!



More information about the Vm-dev mailing list