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

commits at source.squeak.org commits at source.squeak.org
Thu Jul 9 17:47:02 UTC 2020


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

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

Name: VMMaker.oscog-eem.2773
Author: eem
Time: 9 July 2020, 10:46:46.555474 am
UUID: 3c51054d-e839-4959-b3e1-562845a4fa54
Ancestors: VMMaker.oscog-eem.2772

Cogit:
Fix the use of the undefined ceFlushDCache function when DUAL_WRITE_CODE_ZONE is not defined and flushDCacheFrom:to: is not a no-op.
Make sure any generated check features, and the generated run-time are cache flushed before use.
Move maybeGenerateCheckLZCNT later initializeCodeZoneFrom:upTo:; its result is not used until compiling primitives.

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

Item was added:
+ ----- Method: CogIA32Compiler>>initialFlushICacheFrom:to: (in category 'inline cacheing') -----
+ initialFlushICacheFrom: startAddress "<Integer>" to: endAddress "<Integer>"
+ 	"This must be implemented only if a back end defines any of the following as non-zero:
+ 		numCheckFeaturesOpcodes
+ 		numDCacheFlushOpcodes
+ 		numICacheFlushOpcode.
+ 
+ 	 This is a no-op on IA32."
+ 	<cmacro: '(me,startAddress,endAddress) 0'>!

Item was changed:
  ----- Method: Cogit>>initializeCodeZoneFrom:upTo: (in category 'initialization') -----
  initializeCodeZoneFrom: startAddress upTo: endAddress
  	<api>
  	self initializeBackend.
  	self sqMakeMemoryExecutableFrom: startAddress
  		To: endAddress
  		CodeToDataDelta: (self cppIf: #DUAL_MAPPED_CODE_ZONE
  								ifTrue: [self addressOf: codeToDataDelta put: [:v| codeToDataDelta := v]]
  								ifFalse: [nil]).
  	backEnd stopsFrom: startAddress to: endAddress - 1.
  	self cCode: '' inSmalltalk:
  		[self initializeProcessor.
  		 backEnd stopsFrom: 0 to: guardPageSize - 1].
  	codeBase := methodZoneBase := startAddress.
  	minValidCallAddress := (codeBase min: coInterpreter interpretAddress)
  								min: coInterpreter primitiveFailAddress.
  	methodZone manageFrom: methodZoneBase to: endAddress.
  	self assertValidDualZone.
  	self maybeGenerateCheckFeatures.
- 	self maybeGenerateCheckLZCNT.
  	self maybeGenerateCacheFlush.
+ 	self maybeGenerateCheckLZCNT.
  	self generateVMOwnerLockFunctions.
  	self genGetLeafCallStackPointers.
  	self generateStackPointerCapture.
  	self generateTrampolines.
  	self computeEntryOffsets.
  	self computeFullBlockEntryOffsets.
  	self generateClosedPICPrototype.
  	self alignMethodZoneBase.
  
+ 	"None of the above is executed beyond ceCheckFeatures, so a bulk flush now is the leanest thing to do."
+ 	backEnd flushICacheFrom: startAddress to: methodZoneBase asUnsignedInteger.
- 	"None of the above is executed beyond ceCheckFeatures & ceCheckLZCNTFunction,
- 	 so a bulk flush now is the leanest thing to do."
  	self maybeFlushWritableZoneFrom: startAddress to: methodZoneBase asUnsignedInteger.
+ 	"Repeat so that now the methodZone ignores the generated run-time."
- 	"repeat so that now the methodZone ignores the generated run-time"
  	methodZone manageFrom: methodZoneBase to: endAddress.
+ 	"N.B. this is assumed to be the last thing done in initialization; see Cogit>>initialized.
+ 	 This is done only to compute openPICSize; the generated code is discarded."
- 	"N.B. this is assumed to be the last thing done in initialization; see Cogit>>initialized"
  	self generateOpenPICPrototype!

Item was changed:
  ----- Method: Cogit>>maybeFlushWritableZoneFrom:to: (in category 'generate machine code - dual mapped zone support') -----
  maybeFlushWritableZoneFrom: startAddress to: endAddress
  	"If there is a dual mapped code zone (the normal zone but marked with read/execute,
  	 and a read/write zone codeToDataDelta bytes away) then the data cache for the read/write
  	 zone must be flushed, and the data cache for the read/execute zone must be invalidated,
  	 for the Cogit to see the same values in both zones after a write to the read/write zone."
  	<var: 'startAddress' type: #usqInt>
  	<var: 'endAddress' type: #usqInt>
+ 	<inline: #always>
+ 	self cppIf: #DUAL_MAPPED_CODE_ZONE
+ 		ifTrue:
+ 			[codeToDataDelta > 0 ifTrue:
+ 				[backEnd flushDCacheFrom: startAddress to: endAddress]]!
- 	codeToDataDelta > 0 ifTrue:
- 		[backEnd flushDCacheFrom: startAddress to: endAddress]!

Item was changed:
  ----- Method: Cogit>>maybeGenerateCheckFeatures (in category 'initialization') -----
  maybeGenerateCheckFeatures
  	| startAddress |
  	<inline: true>
  	backEnd numCheckFeaturesOpcodes > 0 ifTrue:
  		[self allocateOpcodes: backEnd numCheckFeaturesOpcodes bytecodes: 0.
  		 startAddress := methodZoneBase.
  		 backEnd generateCheckFeatures.
  		 self outputInstructionsForGeneratedRuntimeAt: startAddress.
  		 self recordGeneratedRunTime: 'ceCheckFeaturesFunction' address: startAddress.
+ 		 ceCheckFeaturesFunction := self cCoerceSimple: startAddress to: #'usqIntptr_t (*)(void)'.
+ 		 backEnd initialFlushICacheFrom: startAddress to: methodZoneBase]!
- 		 ceCheckFeaturesFunction := self cCoerceSimple: startAddress to: #'usqIntptr_t (*)(void)']!

Item was removed:
- ----- Method: Cogit>>processorHasLZCNTSupport (in category 'initialization') -----
- processorHasLZCNTSupport
- 	<option: #DPFPReg0>
- 	<inline: true>
- 	^backEnd hasLZCNTInstructions!



More information about the Vm-dev mailing list