[Vm-dev] VM Maker: VMMaker.oscog-rsf.2127.mcz

commits at source.squeak.org commits at source.squeak.org
Fri Feb 10 02:48:14 UTC 2017


Ronie Salgado Faila uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-rsf.2127.mcz

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

Name: VMMaker.oscog-rsf.2127
Author: rsf
Time: 9 February 2017, 11:44:14.589619 pm
UUID: 1a6d3cce-b752-4e79-905f-e1b6c155d910
Ancestors: VMMaker.oscog-eem.2126

Do not destroy registers that are used in the standard C calling convention when going through the Lowcode callout trampoline.
Fix some minor compilation problems.

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

Item was added:
+ ----- Method: CogIA32Compiler>>registerToSaveIP (in category 'abi') -----
+ registerToSaveIP
+ 	"Temporary register used for fetching the instruction pointer. This should
+ 	not be used for passing parameters in a standard ABI"
+ 	<option: #LowcodeVM>
+ 	^ ClassReg!

Item was added:
+ ----- Method: CogMethod>>counters (in category 'accessing') -----
+ counters
+ 	^ 0!

Item was added:
+ ----- Method: CogX64Compiler>>registerToSaveIP (in category 'abi') -----
+ registerToSaveIP
+ 	"Temporary register used for fetching the instruction pointer. This should
+ 	not be used for passing parameters in a standard ABI"
+ 	<option: #LowcodeVM>
+ 	^ R15!

Item was changed:
  ----- Method: Cogit>>checkIfValidOopRefAndTarget:pc:cogMethod: (in category 'garbage collection') -----
  checkIfValidOopRefAndTarget: annotation pc: mcpc cogMethod: cogMethod
  	"Check for a valid object reference, if any, at a map entry.  Answer a code unique to each error for debugging."
  	<var: #mcpc type: #'char *'>
  	<var: #nsSendCache type: #'NSSendCache *'>
  	| literal entryPoint |
  	annotation = IsObjectReference ifTrue:
  		[literal := literalsManager fetchLiteralAtAnnotatedAddress: mcpc asUnsignedInteger using: backEnd.
  		 (self asserta: (objectRepresentation checkValidOopReference: literal)) ifFalse:
  			[^1].
  		((objectRepresentation couldBeObject: literal)
  		 and: [objectMemory isReallyYoungObject: literal]) ifTrue:
  			[(self asserta: (self cCoerceSimple: cogMethod to: #'CogMethod *') cmRefersToYoung) ifFalse:
  				[^2]]].
  
  	NewspeakVM ifTrue:
  		[annotation = IsNSSendCall ifTrue:
  			[| nsSendCache classTag enclosingObject nsTargetMethod |
  			nsSendCache := self nsSendCacheFromReturnAddress: mcpc asInteger.
  			(self asserta: (objectRepresentation checkValidOopReference: nsSendCache selector)) ifFalse:
  				[^9].
  			classTag := nsSendCache classTag.
  			(self asserta: (classTag = 0 or: [objectRepresentation validInlineCacheTag: classTag])) ifFalse:
  				[^10].
  			enclosingObject := nsSendCache enclosingObject.
  			(self asserta: (enclosingObject = 0 or: [objectRepresentation checkValidOopReference: enclosingObject])) ifFalse:
  				[^11].
  			entryPoint := nsSendCache target.
  			entryPoint ~= 0 ifTrue: [
  				nsTargetMethod := self cCoerceSimple: entryPoint - cmNoCheckEntryOffset to: #'CogMethod *'.
  				(self asserta: (nsTargetMethod cmType = CMMethod)) ifFalse:
  					[^12]]]].
  
  	(self isPureSendAnnotation: annotation) ifTrue:
  		[(self asserta: (self cCoerceSimple: cogMethod to: #'CogMethod *') cmType = CMMethod) ifFalse:
  			[^3].
  		 self entryCacheTagAndCouldBeObjectAt: mcpc annotation: annotation into:
  			[:entryPt :cacheTag :tagCouldBeObject|
  			entryPoint := entryPt.
  			tagCouldBeObject
  				ifTrue:
  					[(objectRepresentation couldBeObject: cacheTag)
  						ifTrue:
  							[(self asserta: (objectRepresentation checkValidOopReference: cacheTag)) ifFalse:
  								[^4]]
  						ifFalse:
  							[(self asserta: (objectRepresentation validInlineCacheTag: cacheTag)) ifFalse:
  								[^5]].
  					((objectRepresentation couldBeObject: cacheTag)
  					 and: [objectMemory isReallyYoungObject: cacheTag]) ifTrue:
  						[(self asserta: (self cCoerceSimple: cogMethod to: #'CogMethod *') cmRefersToYoung) ifFalse:
  							[^6]]]
  				ifFalse:
  					[(self inlineCacheTagsAreIndexes
+ 					  and: [self entryPointTagIsSelector: entryPoint])
- 					  and: [self self entryPointTagIsSelector: entryPoint])
  						ifTrue:
  							[cacheTag signedIntFromLong < 0
  								ifTrue:
  									[cacheTag signedIntFromLong negated > NumSpecialSelectors ifTrue:
  										[^7]]
  								ifFalse:
  									[cacheTag >= (objectMemory literalCountOf: enumeratingCogMethod methodObject) ifTrue:
  										[^8]]]
  						ifFalse:
  							[(self asserta: (objectRepresentation validInlineCacheTag: cacheTag)) ifFalse:
  								[^9]]]].
  		entryPoint > methodZoneBase ifTrue:
  			["It's a linked send; find which kind."
  			 self targetMethodAndSendTableFor: entryPoint annotation: annotation into:
  					[:targetMethod :sendTable|
  					 (self asserta: (targetMethod cmType = CMMethod
  								   or: [targetMethod cmType = CMClosedPIC
  								   or: [targetMethod cmType = CMOpenPIC]])) ifFalse:
  						[^10]]]].
  	^0 "keep scanning"!

Item was changed:
  ----- Method: Cogit>>genFFICalloutTrampoline (in category 'initialization') -----
  genFFICalloutTrampoline
  	<option: #LowcodeVM>
  	| startAddress |
  	opcodeIndex := 0.
  	backEnd hasLinkRegister ifTrue: [
  		self MoveR: LinkReg Aw: coInterpreter instructionPointerAddress
  	] ifFalse: [
+ 		self PopR: backEnd registerToSaveIP.
+ 		self MoveR: backEnd registerToSaveIP Aw: coInterpreter instructionPointerAddress
- 		self PopR: ClassReg.
- 		self MoveR: ClassReg Aw: coInterpreter instructionPointerAddress
  	].
  
  	self CallR: TempReg.
  
  	backEnd hasLinkRegister ifTrue: [
  		self MoveAw: coInterpreter instructionPointerAddress R: LinkReg 
  	] ifFalse: [
+ 		self MoveAw: coInterpreter instructionPointerAddress R: backEnd registerToSaveIP.
+ 		self PushR: backEnd registerToSaveIP.
- 		self MoveAw: coInterpreter instructionPointerAddress R: ClassReg.
- 		self PushR: ClassReg.
  	].
  
  	self RetN: 0.
  
  	startAddress := methodZoneBase.
  	self outputInstructionsForGeneratedRuntimeAt: startAddress.
  	self recordGeneratedRunTime: 'ceFFICalloutTrampoline' address: startAddress.
  	self recordRunTimeObjectReferences.
  	^ startAddress
  !



More information about the Vm-dev mailing list