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

commits at source.squeak.org commits at source.squeak.org
Thu Mar 19 20:45:08 UTC 2015


Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1102.mcz

==================== Summary ====================

Name: VMMaker.oscog-eem.1102
Author: eem
Time: 19 March 2015, 1:43:07.647 pm
UUID: ba19f395-e6a0-4a6a-9949-b3ee0c06a28f
Ancestors: VMMaker.oscog-eem.1101

Trampolines should not pop the link register unless they push them.

Correct shortcutTrampoline:to: for ARM.

Generate the actual tracing trampolines when simulating so one can grok them.

=============== Diff against VMMaker.oscog-eem.1101 ===============

Item was added:
+ ----- Method: CogARMCompiler>>genRemoveNArgsFromStack: (in category 'abi') -----
+ genRemoveNArgsFromStack: n
+ 	"This is a no-op on ARM since the ABI passes up to 4 args in registers and trampolines currently observe that limit."
+ 	self assert: n <= 4.
+ 	^0!

Item was changed:
  ----- Method: Cogit>>compileTrampolineFor:numArgs:arg:arg:arg:arg:saveRegs:pushLinkReg:resultReg: (in category 'initialization') -----
  compileTrampolineFor: aRoutine numArgs: numArgs arg: regOrConst0 arg: regOrConst1 arg: regOrConst2 arg: regOrConst3 saveRegs: saveRegs pushLinkReg: pushLinkReg resultReg: resultRegOrNil
  	"Generate a trampoline with up to four arguments.  Generate either a call or a jump to aRoutine
  	 as requested by callJumpBar.  If generating a call and resultRegOrNil is non-zero pass the C result
  	 back in resultRegOrNil.
  	 Hack: a negative value indicates an abstract register, a non-negative value indicates a constant."
  	<var: #aRoutine type: #'void *'>
  	<inline: false>
  	"If on a RISC processor, the return address needs to be pushed to the
  	 stack so that the interpreter sees the same stack layout as on CISC."
  	(pushLinkReg and: [backEnd hasLinkRegister]) ifTrue:
  		[self PushR: LinkReg].
  	self genSmalltalkToCStackSwitch.
  	self
  		compileCallFor: aRoutine
  		numArgs: numArgs
  		arg: regOrConst0
  		arg: regOrConst1
  		arg: regOrConst2
  		arg: regOrConst3
  		resultReg: resultRegOrNil
  		saveRegs: saveRegs.
  	backEnd genLoadStackPointers.
+ 	(pushLinkReg and: [backEnd hasLinkRegister]) ifTrue:
- 	backEnd hasLinkRegister ifTrue:
  		[self PopR: LinkReg].
  	self RetN: 0!

Item was changed:
  ----- Method: Cogit>>shortcutTrampoline:to: (in category 'simulation only') -----
  shortcutTrampoline: aProcessorSimulationTrap to: aBlock
  	<doNotGenerate>
+ 	backEnd hasLinkRegister ifTrue:
+ 		[processor pushWord: processor lr in: coInterpreter memory].
- 	coInterpreter printFrameAtEachStep ifTrue:
- 		[coInterpreter
- 			printFrame: processor fp
- 			WithSP: processor sp].
  	processor
  		simulateLeafCallOf: aProcessorSimulationTrap address
  		nextpc: aProcessorSimulationTrap nextpc
  		memory: coInterpreter memory.
  	coInterpreter
  		stackPointer: processor sp;
  		framePointer: processor fp.
  	processor
  		sp: self getCStackPointer;
  		fp: self getCFramePointer.
  	aBlock value.
  	processor
  		sp: coInterpreter stackPointer;
  		fp: coInterpreter framePointer;
  		simulateLeafReturnIn: coInterpreter memory.
+ 	backEnd hasLinkRegister ifTrue:
+ 		[processor lr: (processor popWordIn: coInterpreter memory)]!
- 	coInterpreter printFrameAtEachStep ifTrue:
- 		[coInterpreter
- 			printFrame: processor fp
- 			WithSP: processor sp]!

Item was changed:
  ----- Method: SimpleStackBasedCogit>>generateTracingTrampolines (in category 'initialization') -----
  generateTracingTrampolines
  	"Generate trampolines for tracing.  In the simulator we can save a lot of time
  	 and avoid noise instructions in the lastNInstructions log by short-cutting these
  	 trampolines, but we need them in the real vm."
+ 	ceTraceLinkedSendTrampoline :=
+ 		self genSafeTrampolineFor: #ceTraceLinkedSend:
+ 			called: 'ceTraceLinkedSendTrampoline'
+ 			arg: ReceiverResultReg.
+ 	ceTraceBlockActivationTrampoline :=
+ 		self genTrampolineFor: #ceTraceBlockActivation
+ 			called: 'ceTraceBlockActivationTrampoline'.
+ 	ceTraceStoreTrampoline :=
+ 		self genSafeTrampolineFor: #ceTraceStoreOf:into:
+ 			called: 'ceTraceStoreTrampoline'
+ 			arg: ClassReg
+ 			arg: ReceiverResultReg.
+ 	self cCode: [] inSmalltalk:
+ 		[ceTraceLinkedSendTrampoline := self simulatedTrampolineFor: #ceShortCutTraceLinkedSend:.
+ 		 ceTraceBlockActivationTrampoline := self simulatedTrampolineFor: #ceShortCutTraceBlockActivation:.
+ 		 ceTraceStoreTrampoline := self simulatedTrampolineFor: #ceShortCutTraceStore:]!
- 	ceTraceLinkedSendTrampoline
- 		:= self cCode:
- 					[self genSafeTrampolineFor: #ceTraceLinkedSend:
- 						called: 'ceTraceLinkedSendTrampoline'
- 						arg: ReceiverResultReg]
- 				inSmalltalk:
- 					[| a |
- 					 simulatedTrampolines
- 						at: (a := self simulatedAddressFor: #ceShortCutTraceLinkedSend:)
- 						put: #ceShortCutTraceLinkedSend:.
- 					 a].
- 	ceTraceBlockActivationTrampoline
- 		:= self cCode:
- 					[self genTrampolineFor: #ceTraceBlockActivation
- 						called: 'ceTraceBlockActivationTrampoline']
- 				inSmalltalk:
- 					[| a |
- 					 simulatedTrampolines
- 						at: (a := self simulatedAddressFor: #ceShortCutTraceBlockActivation:)
- 						put: #ceShortCutTraceBlockActivation:.
- 					 a].
- 	ceTraceStoreTrampoline
- 		:= self cCode:
- 					[self genSafeTrampolineFor: #ceTraceStoreOf:into:
- 						called: 'ceTraceStoreTrampoline'
- 						arg: ClassReg
- 						arg: ReceiverResultReg]
- 				inSmalltalk:
- 					[| a |
- 					simulatedTrampolines
- 						at: (a := self simulatedAddressFor: #ceShortCutTraceStore:)
- 						put: #ceShortCutTraceStore:.
- 					 a]!

Item was changed:
  ----- Method: StackToRegisterMappingCogit>>generateTracingTrampolines (in category 'initialization') -----
  generateTracingTrampolines
  	"Generate trampolines for tracing.  In the simulator we can save a lot of time
  	 and avoid noise instructions in the lastNInstructions log by short-cutting these
  	 trampolines, but we need them in the real vm."
+ 	ceTraceLinkedSendTrampoline :=
+ 		self genSafeTrampolineFor: #ceTraceLinkedSend:
+ 			called: 'ceTraceLinkedSendTrampoline'
+ 			arg: ReceiverResultReg.
+ 	ceTraceBlockActivationTrampoline :=
+ 		self genTrampolineFor: #ceTraceBlockActivation
+ 			called: 'ceTraceBlockActivationTrampoline'.
+ 	ceTraceStoreTrampoline :=
+ 		self genSafeTrampolineFor: #ceTraceStoreOf:into:
+ 			called: 'ceTraceStoreTrampoline'
+ 			arg: TempReg
+ 			arg: ReceiverResultReg.
+ 	self cCode: [] inSmalltalk:
+ 		[ceTraceLinkedSendTrampoline := self simulatedTrampolineFor: #ceShortCutTraceLinkedSend:.
+ 		 ceTraceBlockActivationTrampoline := self simulatedTrampolineFor: #ceShortCutTraceBlockActivation:.
+ 		 ceTraceStoreTrampoline := self simulatedTrampolineFor: #ceShortCutTraceStore:]!
- 	ceTraceLinkedSendTrampoline
- 		:= self cCode:
- 					[self genSafeTrampolineFor: #ceTraceLinkedSend:
- 						called: 'ceTraceLinkedSendTrampoline'
- 						arg: ReceiverResultReg]
- 				inSmalltalk:
- 					[self simulatedTrampolineFor: #ceShortCutTraceLinkedSend:].
- 	ceTraceBlockActivationTrampoline
- 		:= self cCode:
- 					[self genTrampolineFor: #ceTraceBlockActivation
- 						called: 'ceTraceBlockActivationTrampoline']
- 				inSmalltalk:
- 					[self simulatedTrampolineFor: #ceShortCutTraceBlockActivation:].
- 	ceTraceStoreTrampoline
- 		:= self cCode:
- 					[self genSafeTrampolineFor: #ceTraceStoreOf:into:
- 						called: 'ceTraceStoreTrampoline'
- 						arg: TempReg
- 						arg: ReceiverResultReg]
- 				inSmalltalk:
- 					[self simulatedTrampolineFor: #ceShortCutTraceStore:]!



More information about the Vm-dev mailing list