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

commits at source.squeak.org commits at source.squeak.org
Wed Dec 3 22:12:26 UTC 2014


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

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

Name: VMMaker.oscog-eem.962
Author: eem
Time: 3 December 2014, 2:09:45.26 pm
UUID: 7f55aa33-f2c1-4b7d-8456-5c2a33e4298b
Ancestors: VMMaker.oscog-eem.961

Improve stack trace printing for Newspeak and
Glue by providing something that assumes the
penultimate literal is the selector or an
AdditionalMethodState-like thing containing it.

Fix generation of 64-bit Spur VMs by adding
translation support for timesRepeat:, by initializing
BytesPerOop in SpurMemoryManager class, and
by initializing is64BitVM in VMMaker.

Add a configuration for the 64-bit Spur Stack VM.

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

Item was added:
+ ----- Method: CCodeGenerator>>generateTimesRepeat:on:indent: (in category 'C translation') -----
+ generateTimesRepeat: msgNode on: aStream indent: level
+ 	"Generate while(1) { stmtList } "
+ 
+ 	msgNode receiver value timesRepeat:
+ 		[msgNode args first emitCCodeOn: aStream level: level generator: self]!

Item was changed:
  ----- Method: CCodeGenerator>>initializeCTranslationDictionary (in category 'C translation') -----
  initializeCTranslationDictionary 
  	"Initialize the dictionary mapping message names to actions for C code generation."
  
  	| pairs |
  	
  	translationDict := Dictionary new: 200.
  	pairs := #(
  	#&				#generateAnd:on:indent:
  	#|				#generateOr:on:indent:
  	#and:			#generateSequentialAnd:on:indent:
  	#or:			#generateSequentialOr:on:indent:
  	#not			#generateNot:on:indent:
  
  	#+				#generatePlus:on:indent:
  	#-				#generateMinus:on:indent:
  	#negated		#generateNegated:on:indent:
  	#*				#generateTimes:on:indent:
  	#/				#generateDivide:on:indent:
  	#//				#generateDivide:on:indent:
  	#\\				#generateModulo:on:indent:
  	#<<			#generateShiftLeft:on:indent:
  	#>>			#generateShiftRight:on:indent:
  	#>>>			#generateSignedShiftRight:on:indent:
  	#min:			#generateMin:on:indent:
  	#max:			#generateMax:on:indent:
  	#between:and:	#generateBetweenAnd:on:indent:
  
  	#bitAnd:			#generateBitAnd:on:indent:
  	#bitOr:				#generateBitOr:on:indent:
  	#bitXor:			#generateBitXor:on:indent:
  	#bitShift:			#generateBitShift:on:indent:
  	#signedBitShift:	#generateSignedBitShift:on:indent:
  	#bitInvert32		#generateBitInvert:on:indent:
  	#bitInvert64		#generateBitInvert:on:indent:
  	#bitClear:			#generateBitClear:on:indent:
  	#truncateTo:		#generateTruncateTo:on:indent:
  	#rounded			#generateRounded:on:indent:
  
  	#<				#generateLessThan:on:indent:
  	#<=			#generateLessThanOrEqual:on:indent:
  	#=				#generateEqual:on:indent:
  	#>				#generateGreaterThan:on:indent:
  	#>=			#generateGreaterThanOrEqual:on:indent:
  	#~=			#generateNotEqual:on:indent:
  	#==			#generateEqual:on:indent:
  	#~~			#generateNotEqual:on:indent:
  	#isNil			#generateIsNil:on:indent:
  	#notNil			#generateNotNil:on:indent:
  
  	#whileTrue: 	#generateWhileTrue:on:indent:
  	#whileFalse:	#generateWhileFalse:on:indent:
  	#whileTrue 	#generateDoWhileTrue:on:indent:
  	#whileFalse		#generateDoWhileFalse:on:indent:
  	#to:do:			#generateToDo:on:indent:
  	#to:by:do:		#generateToByDo:on:indent:
  	#repeat 		#generateRepeat:on:indent:
+ 	#timesRepeat:	#generateTimesRepeat:on:indent:
  
  	#ifTrue:			#generateIfTrue:on:indent:
  	#ifFalse:		#generateIfFalse:on:indent:
  	#ifTrue:ifFalse:	#generateIfTrueIfFalse:on:indent:
  	#ifFalse:ifTrue:	#generateIfFalseIfTrue:on:indent:
  
  	#ifNotNil:		#generateIfNotNil:on:indent:
  	#ifNil:			#generateIfNil:on:indent:
  	#ifNotNil:ifNil:	#generateIfNotNilIfNil:on:indent:
  	#ifNil:ifNotNil:	#generateIfNilIfNotNil:on:indent:
  
  	#at:				#generateAt:on:indent:
  	#at:put:			#generateAtPut:on:indent:
  	#basicAt:		#generateAt:on:indent:
  	#basicAt:put:	#generateAtPut:on:indent:
  
  	#integerValueOf:			#generateIntegerValueOf:on:indent:
  	#integerObjectOf:			#generateIntegerObjectOf:on:indent:
  	#isIntegerObject: 			#generateIsIntegerObject:on:indent:
  	#cCode:					#generateInlineCCode:on:indent:
  	#cCode:inSmalltalk:			#generateInlineCCode:on:indent:
  	#cPreprocessorDirective:	#generateInlineCPreprocessorDirective:on:indent:
  	#cppIf:ifTrue:ifFalse:		#generateInlineCppIfElse:on:indent:
  	#cppIf:ifTrue:				#generateInlineCppIfElse:on:indent:
  	#cCoerce:to:				#generateCCoercion:on:indent:
  	#cCoerceSimple:to:			#generateCCoercion:on:indent:
  	#addressOf:				#generateAddressOf:on:indent:
  	#addressOf:put:			#generateAddressOf:on:indent:
  	#asAddress:put:			#generateAsAddress:on:indent:
  	#signedIntFromLong		#generateSignedIntFromLong:on:indent:
  	#signedIntToLong			#generateSignedIntToLong:on:indent:
  	#signedIntFromShort		#generateSignedIntFromShort:on:indent:
  	#signedIntToShort			#generateSignedIntToShort:on:indent:
  	#preIncrement				#generatePreIncrement:on:indent:
  	#preDecrement			#generatePreDecrement:on:indent:
  	#inline:						#generateInlineDirective:on:indent:
  	#asFloat					#generateAsFloat:on:indent:
  	#asInteger					#generateAsInteger:on:indent:
  	#asUnsignedInteger		#generateAsUnsignedInteger:on:indent:
  	#asLong					#generateAsLong:on:indent:
  	#asUnsignedLong			#generateAsUnsignedLong:on:indent:
  	#asVoidPointer				#generateAsVoidPointer:on:indent:
  	#asSymbol					#generateAsSymbol:on:indent:
  	#flag:						#generateFlag:on:indent:
  	#anyMask:					#generateBitAnd:on:indent:
  	#noMask:					#generateNoMask:on:indent:
  	#raisedTo:					#generateRaisedTo:on:indent:
  	#touch:						#generateTouch:on:indent:
  
  	#bytesPerOop 				#generateBytesPerOop:on:indent:
  	#bytesPerWord 			#generateBytesPerWord:on:indent:
  	#wordSize		 			#generateBytesPerWord:on:indent:
  	#baseHeaderSize			#generateBaseHeaderSize:on:indent:
  	#minSmallInteger			#generateSmallIntegerConstant:on:indent:
  	#maxSmallInteger			#generateSmallIntegerConstant:on:indent:
  	
  	#sharedCodeNamed:inCase:		#generateSharedCodeDirective:on:indent:
  
  	#perform:							#generatePerform:on:indent:
  	#perform:with:						#generatePerform:on:indent:
  	#perform:with:with:					#generatePerform:on:indent:
  	#perform:with:with:with:				#generatePerform:on:indent:
  	#perform:with:with:with:with:		#generatePerform:on:indent:
  	#perform:with:with:with:with:with:	#generatePerform:on:indent:
  
  	#value								#generateValue:on:indent:
  	#value:								#generateValue:on:indent:
  	#value:value:						#generateValue:on:indent:
  	#value:value:value:					#generateValue:on:indent:
  
  	#deny:								#generateDeny:on:indent:
  
  	#shouldNotImplement				#generateSmalltalkMetaError:on:indent:
  	#shouldBeImplemented			#generateSmalltalkMetaError:on:indent:
  	#subclassResponsibility			#generateSmalltalkMetaError:on:indent:
  	).
  
  	1 to: pairs size by: 2 do: [:i |
  		translationDict at: (pairs at: i) put: (pairs at: i + 1)].
  
  	pairs := #(
  	#ifTrue:					#generateIfTrueAsArgument:on:indent:	
  	#ifFalse:				#generateIfFalseAsArgument:on:indent:
  	#ifTrue:ifFalse:			#generateIfTrueIfFalseAsArgument:on:indent:
  	#ifFalse:ifTrue:			#generateIfFalseIfTrueAsArgument:on:indent:
  	#ifNotNil:				#generateIfNotNilAsArgument:on:indent:	
  	#ifNil:					#generateIfNilAsArgument:on:indent:
  	#ifNotNil:ifNil:			#generateIfNotNilIfNilAsArgument:on:indent:
  	#ifNil:ifNotNil:			#generateIfNilIfNotNilAsArgument:on:indent:
  	#cCode:				#generateInlineCCodeAsArgument:on:indent:
  	#cCode:inSmalltalk:		#generateInlineCCodeAsArgument:on:indent:
  	#cppIf:ifTrue:ifFalse:	#generateInlineCppIfElseAsArgument:on:indent:
  	#cppIf:ifTrue:			#generateInlineCppIfElseAsArgument:on:indent:
  
  	#value					#generateValueAsArgument:on:indent:
  	#value:					#generateValueAsArgument:on:indent:
  	#value:value:			#generateValueAsArgument:on:indent:
  	).
  
  	asArgumentTranslationDict := Dictionary new: 8.
  	1 to: pairs size by: 2 do: [:i |
  		asArgumentTranslationDict at: (pairs at: i) put: (pairs at: i + 1)].
  !

Item was changed:
  ----- Method: SpurMemoryManager class>>initBytesPerWord: (in category 'class initialization') -----
+ initBytesPerWord: wordSize
- initBytesPerWord: nBytes
  
+ 	BytesPerWord := BytesPerOop := wordSize.
- 	BytesPerWord := nBytes.
  	"The following is necessary to avoid confusing the compiler with shifts that are larger than the width of the type on which they operate.  In gcc, such shifts cause incorrect code to be generated."
  	BytesPerWord = 8
  		ifTrue:					"64-bit VM"
  			[Byte0Mask := 16r00000000000000FF.	Byte0Shift := 0.
  			 Byte1Mask := 16r000000000000FF00.	Byte1Shift := 8.
  			 Byte2Mask := 16r0000000000FF0000.	Byte2Shift := 16.
  			 Byte3Mask := 16r00000000FF000000.	Byte3Shift := 24.
  			 Byte4Mask := 16r000000FF00000000.	Byte4Shift := 32.
  			 Byte5Mask := 16r0000FF0000000000.	Byte5Shift := 40.
  			 Byte6Mask := 16r00FF000000000000.	Byte6Shift := 48.
  			 Byte7Mask := 16rFF00000000000000.	Byte7Shift := 56.
  			 Bytes3to0Mask := 16r00000000FFFFFFFF.
  			 Bytes7to4Mask := 16rFFFFFFFF00000000]
  		ifFalse:					"32-bit VM"
  			[Byte0Mask := 16r00000000000000FF.	Byte0Shift := 0.
  			 Byte1Mask := 16r000000000000FF00.	Byte1Shift := 8.
  			 Byte2Mask := 16r0000000000FF0000.	Byte2Shift := 16.
  			 Byte3Mask := 16r00000000FF000000.	Byte3Shift := 24.
  			 Byte4Mask := nil.							Byte4Shift := 0.	"unused"
  			 Byte5Mask := nil.							Byte5Shift := 0.	"unused"
  			 Byte6Mask := nil.							Byte6Shift := 0.	"unused"
  			 Byte7Mask := nil.							Byte7Shift := 0.	"unused"
  			 Bytes3to0Mask := nil.											"unused"
  			 Bytes7to4Mask := nil											"unused"].
  	Byte1ShiftNegated := Byte1Shift negated.
  	Byte3ShiftNegated := Byte3Shift negated.
  	Byte4ShiftNegated := Byte4Shift negated.
  	Byte5ShiftNegated := Byte5Shift negated.
  	Byte7ShiftNegated := Byte7Shift negated.
  	"N.B.  This is *not* output when generating the interpreter file.
  	 It is left to the various sqConfig.h files to define correctly."
  	VMBIGENDIAN := Smalltalk endianness == #big!

Item was changed:
  ----- Method: StackInterpreter>>findSelectorOfMethod: (in category 'debug support') -----
  findSelectorOfMethod: methArg
  	| meth classObj classDict classDictSize methodArray i |
  	(objectMemory addressCouldBeObj: methArg) ifFalse:
  		[^objectMemory nilObject].
  	(objectMemory isForwarded: methArg)
  		ifTrue: [meth := objectMemory followForwarded: methArg]
  		ifFalse: [meth := methArg].
  	 (objectMemory isOopCompiledMethod: meth) ifFalse:
  		[^objectMemory nilObject].
+ 	NewspeakVM ifTrue:
+ 		[(self maybeSelectorOfMethod: meth) ifNotNil:
+ 			[:selector| ^selector]].
  	classObj := self safeMethodClassOf: meth.
  	(self addressCouldBeClassObj: classObj) ifTrue:
  		[classDict := objectMemory fetchPointer: MethodDictionaryIndex ofObject: classObj.
  		 classDictSize := objectMemory numSlotsOf: classDict.
  		 classDictSize > MethodArrayIndex ifTrue:
  			[methodArray := objectMemory fetchPointer: MethodArrayIndex ofObject: classDict.
  			 i := 0.
  			 [i < (classDictSize - SelectorStart)] whileTrue:
  				[meth = (objectMemory fetchPointer: i ofObject: methodArray) ifTrue:
  					[^(objectMemory fetchPointer: i + SelectorStart ofObject: classDict)].
  					 i := i + 1]]].
  	^objectMemory nilObject!

Item was added:
+ ----- Method: StackInterpreter>>maybeSelectorOfMethod: (in category 'debug support') -----
+ maybeSelectorOfMethod: methodObj
+ 	"Answer the selector of a method, assuming its penultimate literal is either
+ 	 a symbol or a pointer object whose first slot references the method and
+ 	 whose second slot is a symbol (i.e. an AdditionalMethodState).  If a Symbol
+ 	 can't be found answer nil.  This isn't satisfactory, as it puts a lot of information
+ 	 into the VM, but it is needed for adequate crash debugging at Cadence."
+ 	| penultimateLiteral maybeSelector |
+ 	self assert: (objectMemory isOopCompiledMethod: methodObj).
+ 	penultimateLiteral := self penultimateLiteralOf: methodObj.
+ 	(objectMemory isWordsOrBytes: penultimateLiteral) ifTrue:
+ 		[^(objectMemory fetchClassTagOfNonImm: penultimateLiteral)
+ 			= (objectMemory fetchClassTagOfNonImm: (objectMemory splObj: SelectorDoesNotUnderstand)) ifTrue:
+ 			[penultimateLiteral]].
+ 	^((objectMemory isPointers: penultimateLiteral)
+ 	 and: [(objectMemory numSlotsOf: penultimateLiteral) >= 2
+ 	 and: [(objectMemory fetchPointer: 0 ofObject: penultimateLiteral) = methodObj
+ 	 and: [maybeSelector := objectMemory fetchPointer: 1 ofObject: penultimateLiteral.
+ 		(objectMemory isWordsOrBytes: maybeSelector)
+ 	 and: [(objectMemory fetchClassTagOfNonImm: maybeSelector)
+ 			= (objectMemory fetchClassTagOfNonImm: (objectMemory splObj: SelectorDoesNotUnderstand))]]]]) ifTrue:
+ 		[penultimateLiteral]!

Item was changed:
  ----- Method: StackInterpreter>>printLikelyImplementorsOfSelector: (in category 'debug printing') -----
  printLikelyImplementorsOfSelector: selector
  	"Print all methods whose penultimate literal is either selector,
  	 or an object whose first inst var is the method and whose
  	 second is selector (e.g. an AdditionalMethodState)."
  	<api>
  	objectMemory allObjectsDo:
+ 		[:obj| | methodClassAssociation |
+ 		((objectMemory isCompiledMethod: obj)
+ 		 and: [(self maybeSelectorOfMethod: obj) = selector]) ifTrue:
+ 			["try and print the key of the method class association (the name of the implementing class)"
+ 			 methodClassAssociation := self methodClassAssociationOf: obj.
+ 			 self printHexnp: obj;
+ 				space;
+ 				printOopShortInner: (((objectMemory isPointers: methodClassAssociation)
+ 									  and: [(objectMemory numSlotsOf: methodClassAssociation) >= 2])
+ 										ifTrue: [objectMemory fetchPointer: 0 ofObject: methodClassAssociation]
+ 										ifFalse: [methodClassAssociation]);
+ 				cr]]!
- 		[:obj| | penultimateLiteral methodClassAssociation |
- 		(objectMemory isCompiledMethod: obj) ifTrue:
- 			[penultimateLiteral := self penultimateLiteralOf: obj.
- 			 (penultimateLiteral = selector
- 			 or: [(objectMemory isPointers: penultimateLiteral)
- 				and: [(objectMemory numSlotsOf: penultimateLiteral) >= 2
- 				and: [(objectMemory fetchPointer: 0 ofObject: penultimateLiteral) = obj
- 				and: [(objectMemory fetchPointer: 1 ofObject: penultimateLiteral) = selector]]]]) ifTrue:
- 				["try and print the key of the method class association (the name of the implementing class)"
- 				 methodClassAssociation := self methodClassAssociationOf: obj.
- 				 self printHexnp: obj;
- 					space;
- 					printOopShortInner: (((objectMemory isPointers: methodClassAssociation)
- 										  and: [(objectMemory numSlotsOf: methodClassAssociation) >= 2])
- 											ifTrue: [objectMemory fetchPointer: 0 ofObject: methodClassAssociation]
- 											ifFalse: [methodClassAssociation]);
- 					cr]]]!

Item was changed:
  ----- Method: StackInterpreter>>writeImageFileIO (in category 'image save/restore') -----
  writeImageFileIO
  	"Write the image header and heap contents to imageFile for snapshot. c.f. writeImageFileIOSimulation.
  	 The game below is to maintain 64-bit alignment for all putLong:toFile: occurrences."
  	| imageName headerStart headerSize f imageBytes bytesWritten sCWIfn okToWrite |
  	<var: #f type: #sqImageFile>
  	<var: #headerStart type: #squeakFileOffsetType>
  	<var: #sCWIfn type: #'void *'>
  	<var: #imageName declareC: 'extern char imageName[]'>
  
  	self cCode: [] inSmalltalk: [imageName := 'sooth compiler'. ^self writeImageFileIOSimulation].
  
  	"If the security plugin can be loaded, use it to check for write permission.
  	 If not, assume it's ok"
  	sCWIfn := self ioLoadFunction: 'secCanWriteImage' From: 'SecurityPlugin'.
  	sCWIfn ~= 0 ifTrue:
  		[okToWrite := self cCode: '((sqInt (*)(void))sCWIfn)()'.
  		 okToWrite ifFalse:[^self primitiveFail]].
  	
  	"local constants"
  	headerStart := 0.  
  	headerSize := objectMemory wordSize = 4 ifTrue: [64] ifFalse: [128].  "header size in bytes; do not change!!"
  
  	f := self sqImageFile: imageName Open: 'wb'.
  	f = nil ifTrue: "could not open the image file for writing"
  		[^self primitiveFail].
  
  	imageBytes := objectMemory imageSizeToWrite.
  	headerStart := self sqImage: f File: imageName StartLocation: headerSize + imageBytes.
  	self cCode: '/* Note: on Unix systems one could put an exec command here, padded to 512 bytes */'.
  	"position file to start of header"
  	self sqImageFile: f Seek: headerStart.
  
  	self putWord32: self imageFormatVersion toFile: f.
  	self putWord32: headerSize toFile: f.
  	self putLong: imageBytes toFile: f.
  	self putLong: objectMemory baseAddressOfImage toFile: f.
  	self putLong: objectMemory specialObjectsOop toFile: f.
  	self putLong: objectMemory newObjectHash toFile: f.
  	self putLong: self ioScreenSize toFile: f.
  	self putLong: self getImageHeaderFlags toFile: f.
  	self putWord32: extraVMMemory toFile: f.
  	self putShort: desiredNumStackPages toFile: f.
  	self putShort: self unknownShortOrCodeSizeInKs toFile: f.
  	self putWord32: desiredEdenBytes toFile: f.
  	self putShort: (maxExtSemTabSizeSet ifTrue: [self ioGetMaxExtSemTableSize] ifFalse: [0]) toFile: f.
  	self putShort: the2ndUnknownShort toFile: f.
  	objectMemory hasSpurMemoryManagerAPI
  		ifTrue:
  			[self putLong: objectMemory firstSegmentBytes toFile: f.
  			 self putLong: objectMemory bytesLeftInOldSpace toFile: f.
+ 			 2 timesRepeat: [self putLong: 0 toFile: f]	"Pad the rest of the header."]
- 			 1 to: 2 do: [:i| self putLong: 0 toFile: f]	"Pad the rest of the header."]
  		ifFalse:
+ 			[4 timesRepeat: [self putLong: 0 toFile: f]].  "Pad the rest of the header."
- 			[1 to: 4 do: [:i| self putLong: 0 toFile: f]].  "Pad the rest of the header."
  
  	 objectMemory wordSize = 8 ifTrue:
  		[3 timesRepeat: [self putLong: 0 toFile: f]]. "Pad the rest of the header."
  
  	self assert: headerStart + headerSize = (self sqImageFilePosition: f).
  	"position file after the header"
  	self sqImageFile: f Seek: headerStart + headerSize.
  
  	self successful ifFalse: "file write or seek failure"
  		[self sqImageFileClose: f.
  		 ^nil].
  
  	"write the image data"
  	objectMemory hasSpurMemoryManagerAPI
  		ifTrue:
  			[bytesWritten := objectMemory writeImageSegmentsToFile: f]
  		ifFalse:
  			[bytesWritten := self sq: (self pointerForOop: objectMemory baseAddressOfImage)
  								Image: (self sizeof: #char)
  								File: imageBytes
  								Write: f].
  	self success: bytesWritten = imageBytes.
  	self sqImageFileClose: f!

Item was added:
+ ----- Method: VMMaker class>>generateSqueakSpurStack64VM (in category 'configurations') -----
+ generateSqueakSpurStack64VM
+ 	"No primitives since we can use those for the Cog VM"
+ 	^VMMaker
+ 		generate: StackInterpreter
+ 		with: #(ObjectMemory Spur64BitMemoryManager)
+ 		to: (FileDirectory default directoryNamed: self sourceTree, '/spurstack64src') fullName
+ 		platformDir: (FileDirectory default directoryNamed: self sourceTree, '/platforms') fullName
+ 		including: #()!

Item was changed:
  ----- Method: VMMaker>>generateInterpreterFile (in category 'generate sources') -----
  generateInterpreterFile
  	"Translate the Smalltalk description of the virtual machine into C.  If 'self doInlining' is true, small method bodies are inlined to reduce procedure call overhead.  On the PPC, this results in a factor of three speedup with only 30% increase in code size.  Subclasses can use specialised versions of CCodeGenerator and interpreterClass."
  
  	| cg vmHeaderContents |
  	cg := [self buildCodeGeneratorForInterpreter]
  			on: Notification
  			do: [:ex|
  				ex tag == #getVMMaker
  					ifTrue: [ex resume: self]
  					ifFalse: [(ex respondsTo: #rearmHandlerDuring:)
  								ifTrue: [ex rearmHandlerDuring: [ex pass]]
  								ifFalse: [ex pass]]].
+ 	self reinitializeWordSizeFrom: cg.
  	self needsToRegenerateInterpreterFile ifFalse: [^nil].
  
  	cg inferTypesForImplicitlyTypedVariablesAndMethods.
  
  	self interpreterClass preGenerationHook: cg.
  	vmHeaderContents := cg vmHeaderContentsWithBytesPerWord: self wordSize.
  	(cg needToGenerateHeader: self interpreterHeaderName file: self interpreterHeaderPath contents: vmHeaderContents) ifTrue:
  		[cg storeHeaderOnFile: self interpreterHeaderPath contents: vmHeaderContents].
  	cg storeCodeOnFile: (self sourceFilePathFor: self interpreterClass sourceFileName) doInlining: self doInlining.
  	self interpreterClass additionalHeadersDo:
  		[:headerName :headerContents| | filePath |
  		 filePath := self coreVMDirectory fullNameFor: headerName.
  		 (cg needToGenerateHeader: headerName file: filePath contents: headerContents) ifTrue:
  			 [cg storeHeaderOnFile: filePath contents: headerContents]].
  	self interpreterClass apiExportHeaderName ifNotNil:
  		[cg storeAPIExportHeader: self interpreterClass apiExportHeaderName
  			OnFile: (self sourceFilePathFor: self interpreterClass apiExportHeaderName)].
  	self gnuifyInterpreterFile!

Item was added:
+ ----- Method: VMMaker>>reinitializeWordSizeFrom: (in category 'initialize') -----
+ reinitializeWordSizeFrom: aCCodeGenerator
+ 	| wordSize |
+ 	wordSize := aCCodeGenerator vmClass objectMemoryClass wordSize.
+ 	optionsDictionary at: #BytesPerWord put: wordSize.
+ 	is64BitVM := wordSize = 8!



More information about the Vm-dev mailing list