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

commits at source.squeak.org commits at source.squeak.org
Wed Oct 13 22:32:14 UTC 2021


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

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

Name: VMMaker.oscog-eem.3087
Author: eem
Time: 13 October 2021, 3:32:02.224265 pm
UUID: 27c5bd11-8d79-40f2-b273-5794bb04cea2
Ancestors: VMMaker.oscog-eem.3086

CoInterpreter prim trace log:
- record the primitive method instead of the message selector
- add the class of the receiver as a parameter in printing TracePrimitiveFailure events

Fix an anachronism in SpurMemoryManager's class comment.
Fix a slip in Slang revealled by the prim trace log changes.

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

Item was changed:
  ----- Method: CoInterpreter>>ceCheckAndMaybeRetryPrimitive: (in category 'primitive support') -----
  ceCheckAndMaybeRetryPrimitive: primIndex
  	"Log failure and then retry if there's an accessorDepth or failure due to no memory."
  	<api>
  	<option: #SpurObjectMemory>
  	| retried |
  	(cogit recordPrimTrace and: [primTracePluginName isNil]) ifTrue:
+ 		[self fastLogPrim: TracePrimitiveFailure.
+ 		 self fastLogPrim: (objectMemory fetchClassOf: (self stackValue: argumentCount))].
- 		[self fastLogPrim: TracePrimitiveFailure].
  	retried := self retryPrimitiveOnFailure.
  	(retried and: [cogit recordPrimTrace]) ifTrue:
  		[self fastLogPrim: TracePrimitiveRetry]!

Item was changed:
  ----- Method: CoInterpreter>>checkForAndFollowForwardedPrimitiveState (in category 'primitive support') -----
  checkForAndFollowForwardedPrimitiveState
  	"Override to log and export to Cogit"
  	<api>
  	<option: #SpurObjectMemory>
  	| found |
  	(cogit recordPrimTrace and: [primTracePluginName isNil]) ifTrue:
+ 		[self fastLogPrim: TracePrimitiveFailure.
+ 		 self fastLogPrim: (objectMemory fetchClassOf: (self stackValue: argumentCount))].
- 		[self fastLogPrim: TracePrimitiveFailure].
  	found := super checkForAndFollowForwardedPrimitiveState.
  	(found and: [cogit recordPrimTrace]) ifTrue:
  		[self fastLogPrim: TracePrimitiveRetry].
  	^found!

Item was changed:
  ----- Method: CoInterpreter>>dumpPrimTraceLog (in category 'debug support') -----
  dumpPrimTraceLog
  	"The prim trace log is a circular buffer of entries. If there is
  	 an entry at primTraceLogIndex \\ PrimTraceLogSize it has entries.
  	 If there is something at primTraceLogIndex it has wrapped."
  
  	<api>
  	<inline: false>
+ 	| hasParameter |
  	(primTraceLog at: (self safe: primTraceLogIndex - 1 mod: PrimTraceLogSize)) = 0 ifTrue: [^self].
+ 	hasParameter := false.
  	(primTraceLog at: primTraceLogIndex) ~= 0 ifTrue:
  		[primTraceLogIndex to: PrimTraceLogSize - 1 do:
+ 			[:i | hasParameter := self printPrimLogEntryAt: i hasParameter: hasParameter]].
- 			[:i | self printPrimLogEntryAt: i; cr]].
  	0 to: primTraceLogIndex - 1 do:
+ 		[:i | hasParameter := self printPrimLogEntryAt: i hasParameter: hasParameter]!
- 		[:i | self printPrimLogEntryAt: i; cr]!

Item was changed:
  ----- Method: CoInterpreter>>fastLogPrim: (in category 'debug support') -----
+ fastLogPrim: aMethodSelectorOrImmediate
- fastLogPrim: aSelectorOrImmediate
  	"Fast tracing of named primitives.  primTraceLogIndex is a byte variable.
+ 	 aMethodSelectorOrImmediate is a method oop, a selector oop or one of TraceCodeCompaction et al.
- 	 aSelectorOrImmediate is a selector oop or one of TraceCodeCompaction et al.
  	 primTraceLog has 256 entries.  In C the + 1 below is hence implicitly modulo 256."
  	<inline: true>
+ 	primTraceLog at: primTraceLogIndex put: aMethodSelectorOrImmediate.
- 	primTraceLog at: primTraceLogIndex put: aSelectorOrImmediate.
  	self primTraceLogIndex: primTraceLogIndex + 1!

Item was changed:
  ----- Method: CoInterpreter>>mapPrimTraceLog (in category 'debug support') -----
  mapPrimTraceLog
+ 	"The prim trace log is a circular buffer of objects. If there is
- 	"The prim trace log is a circular buffer of selectors. If there is
  	 an entry at primTraceLogIndex - 1 \\ PrimTraceBufferSize it has entries.
  	 If there is something at primTraceLogIndex it has wrapped."
  	<inline: false>
+ 	| entryOop |
  	(primTraceLog at: (self safe: primTraceLogIndex - 1 mod: PrimTraceLogSize)) = 0 ifTrue:
  		[^self].
  	(primTraceLog at: primTraceLogIndex) ~= 0 ifTrue:
  		[primTraceLogIndex to: PrimTraceLogSize - 1 do:
+ 			[:i|
+ 			 entryOop := primTraceLog at: i.
+ 			 (entryOop ~= 0
+ 			  and: [objectMemory shouldRemapOop: entryOop]) ifTrue:
+ 				[primTraceLog at: i put: (objectMemory remapObj: entryOop)]]].
- 			[:i| | selector |
- 			 selector := primTraceLog at: i.
- 			 (selector ~= 0
- 			  and: [objectMemory shouldRemapOop: selector]) ifTrue:
- 				[primTraceLog at: i put: (objectMemory remapObj: selector)]]].
  	0 to: primTraceLogIndex - 1 do:
+ 		[:i|
+ 		 entryOop := primTraceLog at: i.
+ 		 (entryOop ~= 0
+ 		  and: [objectMemory shouldRemapOop: entryOop]) ifTrue:
+ 			[primTraceLog at: i put: (objectMemory remapObj: entryOop)]]!
- 		[:i| | selector |
- 		 selector := primTraceLog at: i.
- 		 (selector ~= 0
- 		  and: [objectMemory shouldRemapOop: selector]) ifTrue:
- 			[primTraceLog at: i put: (objectMemory remapObj: selector)]]!

Item was changed:
  ----- Method: CoInterpreter>>markAndTracePrimTraceLog (in category 'debug support') -----
  markAndTracePrimTraceLog
+ 	"The prim trace log is a circular buffer of objects. If there is
- 	"The prim trace log is a circular buffer of selectors. If there is
  	 an entry at primTraceLogIndex - 1 \\ PrimTraceBufferSize it has entries.
  	 If there is something at primTraceLogIndex it has wrapped."
  	<inline: false>
+ 	| entryOop |
  	(primTraceLog at: (self safe: primTraceLogIndex - 1 mod: PrimTraceLogSize)) = 0 ifTrue:
  		[^self].
  	(primTraceLog at: primTraceLogIndex) ~= 0 ifTrue:
  		[primTraceLogIndex to: PrimTraceLogSize - 1 do:
+ 			[:i|
+ 			 entryOop := primTraceLog at: i.
+ 			 (entryOop ~= 0
+ 			  and: [objectMemory isNonImmediate: entryOop]) ifTrue:
+ 				[objectMemory markAndTrace: entryOop]]].
- 			[:i| | selector |
- 			 selector := primTraceLog at: i.
- 			 (selector ~= 0
- 			  and: [objectMemory isNonImmediate: selector]) ifTrue:
- 				[objectMemory markAndTrace: selector]]].
  	0 to: primTraceLogIndex - 1 do:
+ 		[:i|
+ 		entryOop := primTraceLog at: i.
+ 		(entryOop ~= 0
+ 		  and: [objectMemory isNonImmediate: entryOop]) ifTrue:
+ 			[objectMemory markAndTrace: entryOop]]!
- 		[:i| | selector |
- 		selector := primTraceLog at: i.
- 		(selector ~= 0
- 		  and: [objectMemory isNonImmediate: selector]) ifTrue:
- 			[objectMemory markAndTrace: selector]]!

Item was removed:
- ----- Method: CoInterpreter>>printPrimLogEntryAt: (in category 'debug support') -----
- printPrimLogEntryAt: i
- 	<inline: false>
- 	| intOrSelector |
- 	intOrSelector := primTraceLog at: i.
- 	(objectMemory isImmediate: intOrSelector)
- 		ifTrue:
- 			[intOrSelector = TraceIncrementalGC ifTrue:
- 				[self print: '**IncrementalGC**'. ^nil].
- 			 intOrSelector = TraceFullGC ifTrue:
- 				[self print: '**FullGC**'. ^nil].
- 			 intOrSelector = TraceCodeCompaction ifTrue:
- 				[self print: '**CompactCode**'. ^nil].
- 			 intOrSelector = TraceStackOverflow ifTrue:
- 				[self print: '**StackOverflow**'. ^nil].
- 			 intOrSelector = TracePrimitiveFailure ifTrue:
- 				[self print: '**PrimitiveFailure**'. ^nil].
- 			 intOrSelector = TracePrimitiveRetry ifTrue:
- 				[self print: '**PrimitiveRetry**'. ^nil].
- 			 self print: '???']
- 		ifFalse:
- 			[intOrSelector = 0
- 				ifTrue: ['%d!!!!!!' f: transcript printf: i]
- 				ifFalse: [objectMemory safePrintStringOf: intOrSelector]]!

Item was added:
+ ----- Method: CoInterpreter>>printPrimLogEntryAt:hasParameter: (in category 'debug support') -----
+ printPrimLogEntryAt: i hasParameter: hasParameter
+ 	<inline: false>
+ 	"print the entry and answer if it takes a parameter (as the following entry)"
+ 	| entryOop className length |
+ 	entryOop := primTraceLog at: i.
+ 	hasParameter ifTrue:
+ 		[(objectMemory addressCouldBeObj: entryOop)
+ 			ifTrue: [className := self nameOfClass: entryOop lengthInto: (self addressOf: length put: [:v| length := v])]
+ 			ifFalse: [className := 'bad class'. length := 9].
+ 		 '%.*s\n' f: transcript printf: { length. className }.
+ 		 ^false].
+ 	(objectMemory isImmediate: entryOop)
+ 		ifTrue:
+ 			[entryOop = TraceIncrementalGC ifTrue:
+ 				[self print: '**IncrementalGC**\n'. ^false].
+ 			 entryOop = TraceFullGC ifTrue:
+ 				[self print: '**FullGC**\n'. ^false].
+ 			 entryOop = TraceCodeCompaction ifTrue:
+ 				[self print: '**CompactCode**\n'. ^false].
+ 			 entryOop = TraceStackOverflow ifTrue:
+ 				[self print: '**StackOverflow**\n'. ^false].
+ 			 entryOop = TracePrimitiveFailure ifTrue:
+ 				[self print: '**PrimitiveFailure** '. ^true].
+ 			 entryOop = TracePrimitiveRetry ifTrue:
+ 				[self print: '**PrimitiveRetry**\n'. ^false].
+ 			 self print: '???\n']
+ 		ifFalse:
+ 			[(objectMemory addressCouldBeObj: entryOop)
+ 				ifFalse: ['%d!!!!!!\n' f: transcript printf: i]
+ 				ifTrue:
+ 					[(objectMemory isCompiledMethod: entryOop)
+ 						ifTrue:
+ 							[| methodClass methodSel |
+ 							 className := '???'. length := 3.
+ 							 methodClass := self safeMethodClassOf: entryOop.
+ 							 methodClass ~= objectMemory nilObject ifTrue:
+ 								[className := self nameOfClass: methodClass lengthInto: (self addressOf: length put: [:v| length := v])].
+ 							 methodSel := self findSelectorOfMethod: entryOop.
+ 							 methodSel = objectMemory nilObject
+ 								ifTrue:
+ 									['%.*s>>bad selector %p\n'
+ 										f: transcript
+ 										printf: { length. className. methodSel }]
+ 								ifFalse:
+ 									['%.*s>>#%.*s\n'
+ 										f: transcript
+ 										printf: { length. className.
+ 												objectMemory numBytesOfBytes: methodSel. objectMemory firstIndexableField: methodSel }]]
+ 						ifFalse: [objectMemory safePrintStringOf: entryOop. self cr]]].
+ 	^false!

Item was changed:
  ----- Method: CoInterpreter>>slowPrimitiveResponse (in category 'primitive support') -----
  slowPrimitiveResponse
  	"Invoke a normal (non-quick) primitive.
  	 Called under the assumption that primFunctionPointer has been preloaded.
  	 Override to log primitive."
  	(self recordPrimTraceForMethod: newMethod) ifTrue:
+ 		[self fastLogPrim: newMethod].
- 		[self fastLogPrim: messageSelector].
  	^super slowPrimitiveResponse!

Item was changed:
  ----- Method: InterpreterPrimitives>>primitiveSetOrHasIdentityHash (in category 'object access primitives') -----
  primitiveSetOrHasIdentityHash
  	| hash oldHash thisReceiver isReceiverAClass |
  	argumentCount = 0 ifTrue:
  		[| hasHash |
  		 hasHash := (objectMemory isNonImmediate: self stackTop)
  						and: [objectMemory hasIdentityHash: self stackTop].
  		 ^self methodReturnBool: hasHash].
  	isReceiverAClass := false.
  	argumentCount = 2 
  		ifTrue: 
  			[| lastArg |
  			 lastArg := self stackTop.
  			 (objectMemory isIntegerObject: lastArg)
  				ifTrue: "e.g. Symbol primitiveSetIdentityHashOf: aSymbol to: hash"
  					[hash := lastArg.
  					 thisReceiver := self stackValue: 1]
  				ifFalse: "anObject primitiveSetIdentityHash: hashValue isBehavior: boolean"
  					[thisReceiver := self stackValue: 2.
  					 hash := self stackValue: 1.
  					 lastArg = objectMemory trueObject
  						ifTrue: [isReceiverAClass := true]
  						ifFalse:
  							[lastArg = objectMemory falseObject ifFalse:
  								[^self primitiveFailFor: PrimErrBadArgument]]]]
  		ifFalse: "anObject primitiveSetIdentityHashTo: hash"
  			[thisReceiver := self stackValue: 1.
  			 hash := self stackTop].
  	((objectMemory isIntegerObject: hash)
+ 	 and: [hash := objectMemory integerValueOf: hash. "if written naturally, clang warns: unsequenced modification and access to 'hash' "
+ 		  (hash bitAnd: objectMemory maxIdentityHash) = hash]) ifFalse:
+ 		[^self primitiveFailFor: PrimErrBadArgument].
- 	and: [((hash := objectMemory integerValueOf: hash) bitAnd: objectMemory maxIdentityHash) = hash]) ifFalse:
- 		 [^self primitiveFailFor: PrimErrBadArgument].
  	(objectMemory isNonImmediate: thisReceiver) ifFalse:
  		[^self primitiveFailFor: (thisReceiver = (self stackValue: argumentCount)
  									ifTrue: [PrimErrBadReceiver]
  									ifFalse: [PrimErrBadArgument])].
  	oldHash := objectMemory hashBitsOf: thisReceiver.
  	objectMemory setHashBitsOf: thisReceiver to: hash.
  	(isReceiverAClass and: [objectMemory hasSpurMemoryManagerAPI]) ifTrue:
  		[objectMemory classAtIndex: hash put: thisReceiver.
  		"this figures out if the index is ambiguous and fixes all the instances if needed"
  		objectMemory allInstancesOf: thisReceiver].
  	 self methodReturnInteger: oldHash!

Item was changed:
  ----- Method: SimpleStackBasedCogit>>genFastPrimTraceUsing:and: (in category 'primitive generators') -----
  genFastPrimTraceUsing: r1 and: r2
+ 	"Suport for compileInterpreterPrimitive.  Generate inline code
+ 	 so as to record the primitive trace as fast as possible."
- 	"Suport for compileInterpreterPrimitive.  Generate inline code so as to record the primitive
- 	 trace as fast as possible."
  	backEnd byteReadsZeroExtend ifFalse:
  		[self MoveCq: 0 R: r2].
  	self MoveAb: coInterpreter primTraceLogIndexAddress R: r2.
  	self LoadEffectiveAddressMw: 1 r: r2 R: r1.
  	self MoveR: r1 Ab: coInterpreter primTraceLogIndexAddress.
  	methodLabel addDependent:
  		(self annotateAbsolutePCRef:
  			(self MoveCw: methodLabel asInteger R: r1)).
+ 	self MoveMw: (self offset: CogMethod of: #methodObject) r: r1 R: TempReg.
- 	self MoveMw: (self offset: CogMethod of: #selector) r: r1 R: TempReg.
  	self MoveCw: coInterpreter primTraceLogAddress asInteger R: r1.
  	self MoveR: TempReg Xwr: r2 R: r1!

Item was changed:
  CogClass subclass: #SpurMemoryManager
(excessive size, no diff calculated)

Item was added:
+ ----- Method: TVarArgsSendNode>>isSameAs: (in category 'comparing') -----
+ isSameAs: aTParseNode
+ 	(aTParseNode isSend
+ 	and: [self numArgs = aTParseNode numArgs]) ifFalse:
+ 		[^false].
+ 	^super isSameAs: aTParseNode!



More information about the Vm-dev mailing list