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

commits at source.squeak.org commits at source.squeak.org
Wed Dec 11 23:54:58 UTC 2019


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

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

Name: VMMaker.oscog-eem.2608
Author: eem
Time: 11 December 2019, 3:54:39.87751 pm
UUID: 56d4f721-2b53-47a0-848a-845793297010
Ancestors: VMMaker.oscog-eem.2607

Fix poor code for locating the last jump in the PIC prototype.

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

Item was changed:
  ----- Method: Cogit>>expectedClosedPICPrototype: (in category 'in-line cacheing') -----
  expectedClosedPICPrototype: cPIC
  	"Use asserts to check if the ClosedPICPrototype is as expected from compileClosedPICPrototype,
  	 and can be updated as required via rewriteCPICCaseAt:tag:objRef:target:.  If all asserts pass, answer
  	 0, otherwise answer a bit mask identifying all the errors."
  	"self disassembleFrom: methodZoneBase + (self sizeof: CogMethod) to: methodZoneBase + closedPICSize"
  	<var: #cPIC type: #'CogMethod *'>
  	| pc errors object classTag entryPoint |
  	errors := 0.
  	pc := cPIC asUnsignedInteger + firstCPICCaseOffset.
  	"First jump is unconditional; subsequent ones are conditional"
  	object := backEnd literalBeforeFollowingAddress: pc - backEnd jumpLongByteSize.
  	(self asserta: object = self firstPrototypeMethodOop) ifFalse:
  		[errors := 1].
  
  	entryPoint := backEnd jumpLongTargetBeforeFollowingAddress: pc.
  	(self asserta: entryPoint = (self cPICPrototypeCaseOffset + 16rCA5E10)) ifFalse:
  		[errors := errors + 2].
  
  	1 to: MaxCPICCases - 1 do:
  		[:i | | methodObjPC classTagPC |
  		pc := pc + cPICCaseSize.
  
  		"verify information in case is as expected."
  		methodObjPC := pc - backEnd jumpLongConditionalByteSize - backEnd cmpC32RTempByteSize.
  		object := backEnd literalBeforeFollowingAddress: methodObjPC.
  		(self asserta: object = (self subsequentPrototypeMethodOop+ i)) ifFalse:
  			[errors := errors bitOr: 4].
  
  		classTagPC := pc - backEnd jumpLongConditionalByteSize.
  		classTag := backEnd literal32BeforeFollowingAddress: classTagPC.
  		(self asserta: classTag = (16rBABE1F15 + i)) ifFalse:
  			[errors := errors bitOr: 8].
  
  		entryPoint := backEnd jumpLongConditionalTargetBeforeFollowingAddress: pc.
  		(self asserta: entryPoint = (self cPICPrototypeCaseOffset + 16rCA5E10 + (i * 16))) ifFalse:
  			[errors := errors bitOr: 16].
  
  		"change case via rewriteCPICCaseAt:tag:objRef:target:"
  		self rewriteCPICCaseAt: pc
  			tag: (classTag bitXor: 16r5A5A5A5A)
  			objRef: (object bitXor: 16rA5A5A5A5)
  			target: (entryPoint bitXor: 16r55AA50). "don't xor least 4 bits to leave instruction alignment undisturbed"
  
  		"verify information in case is as expected post update."
  		object := backEnd literalBeforeFollowingAddress: methodObjPC.
  		(self asserta: object = (self subsequentPrototypeMethodOop + i bitXor: 16rA5A5A5A5)) ifFalse:
  			[errors := errors bitOr: 32].
  		classTag := backEnd literal32BeforeFollowingAddress: classTagPC.
  		(self asserta: classTag = (16rBABE1F15 + i bitXor: 16r5A5A5A5A)) ifFalse:
  			[errors := errors bitOr: 64].
  		entryPoint := backEnd jumpLongConditionalTargetBeforeFollowingAddress: pc.
  		(self asserta: entryPoint = ((self cPICPrototypeCaseOffset + 16rCA5E10 + (i * 16)) bitXor: 16r55AA50)) ifFalse:
  			[errors := errors bitOr: 128].
  
  		"finally restore case to the original state"
  		self rewriteCPICCaseAt: pc
  			tag: (classTag bitXor: 16r5A5A5A5A)
  			objRef: (object bitXor: 16rA5A5A5A5)
  			target: (entryPoint bitXor: 16r55AA50)].
  
+ 	entryPoint := backEnd jumpLongTargetBeforeFollowingAddress: cPIC asUnsignedInteger + cPICEndOfCodeOffset.
- 	entryPoint := backEnd jumpLongTargetBeforeFollowingAddress: pc + cPICEndSize - literalsManager endSizeOffset.
  	(self asserta: entryPoint = (self cPICMissTrampolineFor: 0)) ifFalse:
  		[errors := errors + 256].
  	
  	^errors!



More information about the Vm-dev mailing list