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

commits at source.squeak.org commits at source.squeak.org
Wed May 27 18:44:50 UTC 2015


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

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

Name: VMMaker.oscog-eem.1329
Author: eem
Time: 27 May 2015, 11:42:44.314 am
UUID: d25444c7-af99-40e1-ab8a-a765c046eae5
Ancestors: VMMaker.oscog-eem.1328

Fix cache tag access for ARM in cPICHasForwardedClass:

Guard access to the inline cache tag in PICs in
GC routines by inlineCacheTagsMayBeObjects.

Mark inlineCacheTagsMayBeObjects as inline to
eliminate dead code.

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

Item was changed:
  ----- Method: CogARMCompiler>>literalBeforeFollowingAddress: (in category 'inline cacheing') -----
  literalBeforeFollowingAddress: followingAddress
  	"Answer the long constant loaded by a MOV/ORR/ORR/ORR
+ 	 or MOV/ORR/ORR/ORR/PUSH, or MOV/ORR/ORR/ORR/CMP sequence, just before this address:"
- 	 or MOV/ORR/ORR/ORR/PUSH  sequence, just before this address:"
  	^(self instructionIsOR: (self instructionBeforeAddress: followingAddress))
  		ifTrue: [self extract32BitOperandFrom4InstructionsPreceeding: followingAddress]
  		ifFalse: [self extract32BitOperandFrom4InstructionsPreceeding: followingAddress - 4]!

Item was changed:
  ----- Method: CogObjectRepresentation>>inlineCacheTagsMayBeObjects (in category 'in-line cacheing') -----
  inlineCacheTagsMayBeObjects
+ 	<inline: true>
  	^self subclassResponsibility!

Item was changed:
  ----- Method: CogObjectRepresentationForSpur>>inlineCacheTagsMayBeObjects (in category 'in-line cacheing') -----
  inlineCacheTagsMayBeObjects
+ 	<inline: true>
  	^false!

Item was changed:
  ----- Method: CogObjectRepresentationForSqueakV3>>inlineCacheTagsMayBeObjects (in category 'in-line cacheing') -----
  inlineCacheTagsMayBeObjects
+ 	<inline: true>
  	^true!

Item was changed:
  ----- Method: Cogit>>cPICHasForwardedClass: (in category 'in-line cacheing') -----
  cPICHasForwardedClass: cPIC
  	<var: #cPIC type: #'CogMethod *'>
  	| pc |
  	pc := cPIC asUnsignedInteger
  		+ firstCPICCaseOffset
  		+ cPICCaseSize
  		- backEnd jumpLongConditionalByteSize.
  	2 to: cPIC cPICNumCases do:
  		[:i| | classIndex |
+ 		classIndex := backEnd literalBeforeFollowingAddress: pc - backEnd loadLiteralByteSize.
- 		classIndex := backEnd inlineCacheTagAt: pc.
  		(objectMemory isForwardedClassIndex: classIndex) ifTrue:
  			[^true].
  		pc := pc + cPICCaseSize].
  	^false!

Item was changed:
  ----- Method: Cogit>>closedPICRefersToUnmarkedObject: (in category 'garbage collection') -----
  closedPICRefersToUnmarkedObject: cPIC
  	"Answer if the ClosedPIC refers to any unmarked objects or freed/freeable target methods,
  	 applying markAndTraceOrFreeCogMethod:firstVisit: to those targets to determine if freed/freeable."
  	<var: #cPIC type: #'CogMethod *'>
  	| pc offsetToLiteral object entryPoint targetMethod |
  	<var: #targetMethod type: #'CogMethod *'>
  	(objectMemory isMarked: cPIC selector)  ifFalse:
  		[^true].
  	pc := cPIC asInteger + firstCPICCaseOffset.
  	"First jump is unconditional; subsequent ones are conditional"
  	offsetToLiteral := backEnd jumpLongByteSize.
  	1 to: cPIC cPICNumCases do:
  		[:i|
+ 		objectRepresentation inlineCacheTagsMayBeObjects ifTrue:
+ 			[object := backEnd literalBeforeFollowingAddress: pc - offsetToLiteral - backEnd loadLiteralByteSize.
+ 			 ((objectRepresentation couldBeObject: object)
+ 			  and: [(objectMemory isMarked: object) not]) ifTrue:
+ 				[^true]].
- 		object := backEnd literalBeforeFollowingAddress: pc - offsetToLiteral - backEnd loadLiteralByteSize.
- 		((objectRepresentation couldBeObject: object)
- 		 and: [(objectMemory isMarked: object) not]) ifTrue:
- 			[^true].
  		object := backEnd literalBeforeFollowingAddress: pc - offsetToLiteral.
  		((objectRepresentation couldBeObject: object)
  		 and: [(objectMemory isMarked: object) not]) ifTrue:
  			[^true].
  		entryPoint := backEnd jumpLongTargetBeforeFollowingAddress: pc.
  		"Find target from jump.  Ignore jumps to the interpret and MNU calls within this PIC"
  		(entryPoint asUnsignedInteger < cPIC asUnsignedInteger
  		 or: [entryPoint asUnsignedInteger > (cPIC asUnsignedInteger + cPIC blockSize) asUnsignedInteger]) ifTrue:
  			[targetMethod := self cCoerceSimple: entryPoint - cmNoCheckEntryOffset to: #'CogMethod *'.
  			 self assert: (targetMethod cmType = CMMethod
  						or: [targetMethod cmType = CMFree]).
  			 (self markAndTraceOrFreeCogMethod: targetMethod
  				  firstVisit: targetMethod asUnsignedInteger > pc asUnsignedInteger) ifTrue:
  				[^true]].
  		offsetToLiteral := backEnd jumpLongConditionalByteSize.
  		pc := pc + cPICCaseSize].
  	^false!

Item was changed:
  ----- Method: Cogit>>mapObjectReferencesInClosedPIC: (in category 'garbage collection') -----
  mapObjectReferencesInClosedPIC: cPIC
  	"Remap all object references in the closed PIC.  Answer if any references are young.
  	Set codeModified if any modifications are made."
  	<var: #cPIC type: #'CogMethod *'>
  	| pc refersToYoung |
  	pc := cPIC asInteger + firstCPICCaseOffset.
  	refersToYoung := self updateMaybeObjRefAt: pc - backEnd jumpLongByteSize.
  	pc := pc + cPICCaseSize.
  	2 to: cPIC cPICNumCases do:
  		[:i|
+ 		objectRepresentation inlineCacheTagsMayBeObjects ifTrue:
+ 			[(self updateMaybeObjRefAt: pc - backEnd jumpLongConditionalByteSize - backEnd loadLiteralByteSize) ifTrue:
+ 				[refersToYoung := true]].
- 		(self updateMaybeObjRefAt: pc - backEnd jumpLongConditionalByteSize - backEnd loadLiteralByteSize) ifTrue:
- 			[refersToYoung := true].
  		(self updateMaybeObjRefAt: pc - backEnd jumpLongConditionalByteSize) ifTrue:
  			[refersToYoung := true].
  		pc := pc + cPICCaseSize].
  	^refersToYoung!



More information about the Vm-dev mailing list