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

commits at source.squeak.org commits at source.squeak.org
Sat Jun 19 03:27:49 UTC 2021


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

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

Name: VMMaker.oscog-eem.2969
Author: eem
Time: 18 June 2021, 8:27:39.266763 pm
UUID: e47dec6d-965d-4dc1-ad51-ad192f9f6181
Ancestors: VMMaker.oscog-eem.2968

Fix a bug in the assert in Fix a bug in the assert in cogMethodContaining: when supplied the mcpc of a block method at its stack check offset.

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

Item was changed:
  ----- Method: CogMethodZone>>cogMethodContaining: (in category 'jit - api') -----
  cogMethodContaining: mcpc
  	"Answer the method containing mcpc for the purposes of code zone compaction,
  	 where mcpc is actually the value of instructionPointer at the time of a compaction."
  	<var: 'mcpc' type: #usqInt>
  	<api>
  	| cogMethod prevMethod |
  	mcpc > limitAddress ifTrue:
  		[^nil].
  	mcpc < baseAddress ifTrue:
  		[cogit assertMcpcIsPrimReturn: mcpc.
  		 ^nil].
  	self assert: mcpc < self freeStart.
  	cogMethod := coInterpreter cCoerceSimple: baseAddress to: #'CogMethod *'.
  	[cogMethod asUnsignedInteger < mcpc] whileTrue:
  		[prevMethod := cogMethod.
  		 cogMethod := self methodAfter: cogMethod].
  
  	"Since mcpc is actually instructionPointer we expect that it is either at the stack check
  	 (normal code zone reclamation invoked through checkForEventsMayContextSwitch:)
  	 or is in a primitive, immediately following the call of the C primitive routine."
  	self assert: (prevMethod notNil
  				and: [mcpc = (prevMethod asUnsignedInteger + prevMethod stackCheckOffset)
+ 					or: [(self mcpc: mcpc isAtStackCheckOfBlockMethodIn: prevMethod)
  					or: [(cogit backEnd isCallPrecedingReturnPC: mcpc)
  						and: [(coInterpreter
  									primitiveIndexOfMethod: prevMethod methodObject
  									header: prevMethod methodHeader) > 0
+ 							or: [(cogit backEnd callTargetFromReturnAddress: mcpc) = cogit ceCheckForInterruptTrampoline]]]]]).
- 							or: [(cogit backEnd callTargetFromReturnAddress: mcpc) = cogit ceCheckForInterruptTrampoline]]]]).
  	 ^prevMethod!

Item was added:
+ ----- Method: CogMethodZone>>mcpc:isAtStackCheckOfBlockMethodIn: (in category 'testing') -----
+ mcpc: mcpc isAtStackCheckOfBlockMethodIn: cogMethod
+ 	"For assert checking..."
+ 	<var: 'cogMethod' type: #'CogMethod *'>
+ 	cogMethod blockEntryOffset = 0 ifTrue:
+ 		[^false].
+ 	^(cogit blockDispatchTargetsFor: cogMethod perform: #stackCheckOffsetOfBlockAt:isMcpc: arg: mcpc) ~= 0!

Item was added:
+ ----- Method: Cogit>>stackCheckOffsetOfBlockAt:isMcpc: (in category 'testing') -----
+ stackCheckOffsetOfBlockAt: blockEntryMcpc isMcpc: mcpc
+ 	<returnTypeC: #usqInt>
+ 	| cogBlockMethod |
+ 	<var: #cogBlockMethod type: #'CogBlockMethod *'>
+ 	cogBlockMethod := self cCoerceSimple: blockEntryMcpc - (self sizeof: CogBlockMethod)
+ 							  to: #'CogBlockMethod *'.
+ 	cogBlockMethod asInteger + cogBlockMethod stackCheckOffset = mcpc ifTrue:
+ 		[^cogBlockMethod asUnsignedInteger].
+ 	^0 "keep scanning..."!



More information about the Vm-dev mailing list