Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2361.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2361 Author: eem Time: 17 March 2018, 3:46:08.32065 pm UUID: 7ca2f89a-de70-422f-b92b-54f91ac4e47b Ancestors: VMMaker.oscog-eem.2360 Spur: Make read-only (-DIMMUTABILITY) the default wth Spur VMs. Add MT versions to the Slang generation. Slang: Refactor define generation into putConditionalDefineOf:as:comment:on: putDefineOf:as:on:. To make use of these refactor writeVMHeaderTo:bytesPerWord: to writeVMHeaderTo:bytesPerWord:generator:. =============== Diff against VMMaker.oscog-eem.2360 =============== Item was changed: ----- Method: CCodeGenerator>>emitCConstants:on: (in category 'C code generator') ----- emitCConstants: constList on: aStream "Store the global variable declarations on the given stream." constList isEmpty ifTrue: [^self]. aStream cr; nextPutAll: '/*** Constants ***/'; cr. (self sortStrings: constList) do: + [:varName| | node default value | - [:varName| | node default value conditional | node := constants at: varName. node name isEmpty ifFalse: ["If the definition includes a C comment, or looks like a conditional, take it as is, otherwise convert the value from Smalltalk to C. Allow the class to provide an alternative definition, either of just the value or the whole shebang." default := (node value isString and: [(node value includesSubstring: '/*') or: [(node value includesSubstring: ' ? ') and: [node value includesSubstring: ' : ']]]) ifTrue: [node value] ifFalse: [self cLiteralFor: node value name: varName]. default = #undefined ifTrue: [aStream nextPutAll: '#undef '; nextPutAll: node name; cr] ifFalse: + [value := vmClass - [conditional := (vmClass ifNil: VMBasicConstants) defineAtCompileTime: node name. - conditional ifTrue: - [aStream nextPutAll: '#if !!defined('; nextPutAll: node name; nextPutAll: ') /* Allow this to be overridden on the compiler command line */'; cr]. - value := vmClass ifNotNil: [(vmClass specialValueForConstant: node name default: default) ifNotNil: [:specialDef| specialDef] ifNil: [default]] ifNil: [default]. + ((vmClass ifNil: VMBasicConstants) defineAtCompileTime: node name) + ifTrue: [self putConditionalDefineOf: node name + as: value + comment: 'Allow this to be overridden on the compiler command line' + on: aStream] + ifFalse: [self putDefineOf: node name as: value on: aStream]]]]. - value first ~= $# ifTrue: - [aStream nextPutAll: (conditional ifTrue: ['# define '] ifFalse: ['#define ']); nextPutAll: node name; space]. - aStream nextPutAll: value; cr. - conditional ifTrue: - [aStream nextPutAll: '#endif'; cr]]]]. aStream cr! Item was added: + ----- Method: CCodeGenerator>>putConditionalDefineOf:as:comment:on: (in category 'C code generator') ----- + putConditionalDefineOf: aConstantNameString as: valueOrValueString comment: commentOrNil on: aStream + self withConditionalDefineOf: aConstantNameString + comment: commentOrNil + on: aStream + do: [| valueAsString | + valueAsString := valueOrValueString asString. + valueAsString first ~= $# ifTrue: + [aStream nextPutAll: '# define '; nextPutAll: aConstantNameString; space]. + aStream nextPutAll: valueAsString; cr]! Item was added: + ----- Method: CCodeGenerator>>putDefineOf:as:on: (in category 'C code generator') ----- + putDefineOf: aConstantNameString as: valueOrValueString on: aStream + aStream + nextPutAll: '#define '; + nextPutAll: aConstantNameString; + space; + nextPutAll: valueOrValueString asString; + cr! Item was changed: ----- Method: CCodeGenerator>>vmHeaderContentsWithBytesPerWord: (in category 'public') ----- vmHeaderContentsWithBytesPerWord: bytesPerWord "Store C header code on the given stream." + ^ ByteString + streamContents: [ :tempStream | vmClass writeVMHeaderTo: tempStream bytesPerWord: bytesPerWord generator: self ]! - ^ByteString streamContents: - [:tempStream| - vmClass writeVMHeaderTo: tempStream bytesPerWord: bytesPerWord]! Item was added: + ----- Method: CCodeGenerator>>withConditionalDefineOf:comment:on:do: (in category 'C code generator') ----- + withConditionalDefineOf: aConstantNameString comment: commentOrNil on: aStream do: aBlock + | start | + aStream nextPutAll: '#if !!defined('; nextPutAll: aConstantNameString; nextPut: $). + commentOrNil ifNotNil: [aStream nextPutAll: ' /* '; nextPutAll: commentOrNil; nextPutAll: ' */']. + aStream cr. + start := aStream position. + aBlock value. + aStream nextPutAll: '#endif'. + aStream position - start > 80 ifTrue: + [aStream nextPutAll: ' /* !!defined('; nextPutAll: aConstantNameString; nextPutAll: ') */']. + aStream cr! Item was removed: - ----- Method: CoInterpreter class>>writeVMHeaderTo:bytesPerWord: (in category 'translation') ----- - writeVMHeaderTo: aStream bytesPerWord: bytesPerWord - super writeVMHeaderTo: aStream bytesPerWord: bytesPerWord. - aStream - nextPutAll: '#define COGVM 1'; cr; - nextPutAll: '#if !!defined(COGMTVM)'; cr; - nextPutAll: '# define COGMTVM 0'; cr; - nextPutAll: '#endif'; cr; cr. - "This constant is a hack for the MT VM on SqueakV3. Eventually it will disappear. - But having it here rather than in CoInterpreterMT means that the interp.h header - doesn't get regenerated every time the sources are, which means less recompilation." - ((VMBasicConstants classPool associations select: [:a| a key beginsWith: 'DisownVM']) - asSortedCollection: [:a1 :a2| a1 value <= a2 value]) - do: [:a| - aStream nextPutAll: '#define '; nextPutAll: a key; space; print: a value; cr]! Item was added: + ----- Method: CoInterpreter class>>writeVMHeaderTo:bytesPerWord:generator: (in category 'translation') ----- + writeVMHeaderTo: aStream bytesPerWord: bytesPerWord generator: aCCodeGenerator + super writeVMHeaderTo: aStream bytesPerWord: bytesPerWord generator: aCCodeGenerator. + aCCodeGenerator + putDefineOf: #COGVM as: 1 on: aStream; + putConditionalDefineOf: #COGMTVM as: 0 comment: nil on: aStream. + aStream cr. + "This constant is a hack for the MT VM on SqueakV3. Eventually it will disappear. + But having it here rather than in CoInterpreterMT means that the interp.h header + doesn't get regenerated every time the sources are, which is a good thing." + aCCodeGenerator + putDefineOf: #DisownVMLockOutFullGC as: DisownVMLockOutFullGC on: aStream! Item was removed: - ----- Method: Interpreter class>>writeVMHeaderTo:bytesPerWord: (in category 'translation') ----- - writeVMHeaderTo: aStream bytesPerWord: bytesPerWord - "Currently the Interpreter adds nothing to interp.h above and beyond VMClass's default. - But the code in trunk's CCodeGenerator>>emitDefineBytesPerWordOn: is a candidate." - super writeVMHeaderTo: aStream bytesPerWord: bytesPerWord! Item was removed: - ----- Method: StackInterpreter class>>writeVMHeaderTo:bytesPerWord: (in category 'translation') ----- - writeVMHeaderTo: aStream bytesPerWord: bytesPerWord - super writeVMHeaderTo: aStream bytesPerWord: bytesPerWord. - SistaVM ifTrue: - [aStream nextPutAll: '#define SistaVM 1'; cr]. - NewspeakVM ifTrue: - [aStream nextPutAll: '#define NewspeakVM 1'; cr]. - MULTIPLEBYTECODESETS ifTrue: - [aStream nextPutAll: '#define MULTIPLEBYTECODESETS 1'; cr]. - IMMUTABILITY ifTrue: - [aStream nextPutAll: '#define IMMUTABILITY 1'; cr]. - NewspeakVM | MULTIPLEBYTECODESETS | IMMUTABILITY ifTrue: - [aStream cr]. - aStream nextPutAll: '#define STACKVM 1'; cr. - (initializationOptions at: #SpurObjectMemory ifAbsent: false) ifTrue: - [aStream nextPutAll: '#define SPURVM 1'; cr]! Item was added: + ----- Method: StackInterpreter class>>writeVMHeaderTo:bytesPerWord:generator: (in category 'translation') ----- + writeVMHeaderTo: aStream bytesPerWord: bytesPerWord generator: aCCodeGenerator + super writeVMHeaderTo: aStream bytesPerWord: bytesPerWord generator: aCCodeGenerator. + SistaVM ifTrue: + [aCCodeGenerator putDefineOf: #SistaVM as: 1 on: aStream]. + NewspeakVM ifTrue: + [aCCodeGenerator putDefineOf: #NewspeakVM as: 1 on: aStream]. + MULTIPLEBYTECODESETS ifTrue: + [aCCodeGenerator putDefineOf: #MULTIPLEBYTECODESETS as: 1 on: aStream]. + IMMUTABILITY ifTrue: + [aCCodeGenerator + putConditionalDefineOf: #IMMUTABILITY + as: 1 + comment: 'Allow this to be overridden on the compiler command line' + on: aStream]. + SistaVM | NewspeakVM | MULTIPLEBYTECODESETS | IMMUTABILITY ifTrue: + [aStream cr]. + aCCodeGenerator putDefineOf: #STACKVM as: 1 on: aStream. + (initializationOptions at: #SpurObjectMemory ifAbsent: false) ifTrue: + [aCCodeGenerator putDefineOf: #SPURVM as: 1 on: aStream]! Item was changed: ----- Method: VMClass class>>initializeMiscConstants (in category 'initialization') ----- initializeMiscConstants "Falsify the `what type of VM is this?' flags that are defined in the various interp.h files. Subclass implementations need to include a super initializeMiscConstants" | omc | VMBIGENDIAN class. "Mention this for the benefit of CCodeGenerator>>emitCConstantsOn:" SPURVM := STACKVM := COGVM := COGMTVM := false. initializationOptions ifNil: [self initializationOptions: Dictionary new]. omc := initializationOptions at: #ObjectMemory ifAbsent: nil. (omc isNil and: [self defaultObjectMemoryClass notNil]) ifTrue: [omc := initializationOptions at: #ObjectMemory put: self defaultObjectMemoryClass name]. initializationOptions at: #SqueakV3ObjectMemory "the good ole default" ifAbsentPut: (omc ifNil: [true] ifNotNil: [(Smalltalk at: omc) includesBehavior: ObjectMemory]); at: #SpurObjectMemory "the new contender" ifAbsentPut: (omc ifNil: [false] ifNotNil: [(Smalltalk at: omc) includesBehavior: SpurMemoryManager]). "Use ifAbsentPut: so that they will get copied back to the VMMaker's options and dead code will likely be eliminated." PharoVM := initializationOptions at: #PharoVM ifAbsentPut: [false]. NewspeakVM := initializationOptions at: #NewspeakVM ifAbsentPut: [false]. SistaVM := initializationOptions at: #SistaVM ifAbsentPut: [false]. LowcodeVM := initializationOptions at: #LowcodeVM ifAbsentPut: [false]. MULTIPLEBYTECODESETS := initializationOptions at: #MULTIPLEBYTECODESETS ifAbsentPut: [false]. - "But not these; they're compile-time" - IMMUTABILITY := initializationOptions at: #IMMUTABILITY ifAbsent: [false]. "These must be set only if specified, not defaulted, because they are set on the command line or in include files." initializationOptions at: #VMBIGENDIAN ifPresent: [:value| VMBIGENDIAN := value]; at: #ObjectMemory ifPresent: [:value| SPURVM := value beginsWith: 'Spur']; at: #STACKVM ifPresent: [:value| STACKVM := value]; at: #COGVM ifPresent: [:value| COGVM := initializationOptions at: #COGVM]; + at: #COGMTVM ifPresent: [:value| COGMTVM := initializationOptions at: #COGMTVM]. + + "And not these; they're compile-time" + IMMUTABILITY := initializationOptions at: #IMMUTABILITY ifAbsent: [SPURVM] "Default as enabled for Spur VMs"! - at: #COGMTVM ifPresent: [:value| COGMTVM := initializationOptions at: #COGMTVM]! Item was removed: - ----- Method: VMClass class>>writeVMHeaderTo:bytesPerWord: (in category 'translation') ----- - writeVMHeaderTo: aStream bytesPerWord: bytesPerWord - "Generate the contents of interp.h on aStream. Specific Interpreter subclasses - override to add more stuff." - aStream - nextPutAll: '#define VM_PROXY_MAJOR '; print: self vmProxyMajorVersion; cr; - nextPutAll: '#define VM_PROXY_MINOR '; print: self vmProxyMinorVersion; cr; - cr; - nextPutAll: '#define SQ_VI_BYTES_PER_WORD '; print: bytesPerWord; cr; - cr. - - "The most basic constants must be defined here, not in e.g. the plugin sources, so allow those - other sources to be shared between different builds (Spur vs SqueakV3, 32-bit vs 64-bit, etc)" - VMBasicConstants mostBasicConstantNames asSet asArray sort do: - [:constName| - (VMBasicConstants classPool at: constName ifAbsent: []) ifNotNil: - [:const| - aStream nextPutAll: '#define '; nextPutAll: constName; space; print: const; cr]]. - aStream cr. - - ((VMBasicConstants classPool associations select: [:a| a key beginsWith: 'PrimErr']) - asSortedCollection: [:a1 :a2| a1 value <= a2 value]) - do: [:a| - aStream nextPutAll: '#define '; nextPutAll: a key; space; print: a value; cr]. - aStream cr. - - aStream - nextPutAll: '#define MinSmallInteger '; print: self objectMemoryClass minSmallInteger; cr; - nextPutAll: '#define MaxSmallInteger '; print: self objectMemoryClass maxSmallInteger; cr; - nextPutAll: '#define NumSmallIntegerTagBits '; print: self objectMemoryClass numSmallIntegerTagBits; cr; - cr.! Item was added: + ----- Method: VMClass class>>writeVMHeaderTo:bytesPerWord:generator: (in category 'translation') ----- + writeVMHeaderTo: aStream bytesPerWord: bytesPerWord generator: aCCodeGenerator + "Generate the contents of interp.h on aStream. Specific Interpreter subclasses + override to add more stuff." + aCCodeGenerator + putDefineOf: 'VM_PROXY_MAJOR' as: self vmProxyMajorVersion on: aStream; + putDefineOf: 'VM_PROXY_MINOR' as: self vmProxyMinorVersion on: aStream. + aStream cr. + aCCodeGenerator + putDefineOf: 'SQ_VI_BYTES_PER_WORD' as: bytesPerWord on: aStream. + aStream cr. + + "The most basic constants must be defined here, not in e.g. the plugin sources, to allow those + other sources to be shared between different builds (Spur vs SqueakV3, 32-bit vs 64-bit, etc)" + VMBasicConstants mostBasicConstantNames asSet sorted do: + [:constName| + (VMBasicConstants classPool at: constName ifAbsent: []) ifNotNil: + [:const| aCCodeGenerator putDefineOf: constName as: const on: aStream]]. + aStream cr. + + ((VMBasicConstants classPool associations select: [:a| a key beginsWith: 'PrimErr']) + sorted: [:a1 :a2| a1 value <= a2 value]) + do: [:a| aCCodeGenerator putDefineOf: a key as: a value on: aStream]. + aStream cr. + + aCCodeGenerator + putDefineOf: 'MinSmallInteger' as: self objectMemoryClass minSmallInteger on: aStream; + putDefineOf: 'MaxSmallInteger' as: self objectMemoryClass maxSmallInteger on: aStream; + putDefineOf: 'NumSmallIntegerTagBits' as: self objectMemoryClass numSmallIntegerTagBits on: aStream. + aStream cr! Item was changed: ----- Method: VMMaker class>>generateAllSpurConfigurationsUnderVersionControl (in category 'configurations') ----- generateAllSpurConfigurationsUnderVersionControl self generateNewspeakSpurStackVM; generateNewspeakSpurCog64VM; generateSqueakSpurStackVM; generateSqueakSpurStack64VM; generateNewspeakSpurCogVM; generateSqueakSpurCogVM; generateSqueakSpurCog64VM; + generateSqueakSpurCogMTVM; + generateSqueakSpurCog64MTVM; generateSqueakSpurCogSistaVM; generateSqueakSpurCogSista64VM! Item was changed: ----- Method: VMPluginCodeGenerator>>generateInterpreterProxyFunctionDereference:on:indent: (in category 'C translation') ----- generateInterpreterProxyFunctionDereference: aNode on: aStream indent: anInteger | pluginsToClone | pluginsToClone := self pluginFunctionsToClone copyWithoutAll: self selectorsThatAreGeneratedAsMacros. pluginsToClone isEmpty ifTrue: [^self]. + aStream cr. + self withConditionalDefineOf: 'SQUEAK_BUILTIN_PLUGIN' + comment: nil + on: aStream + do: [pluginsToClone do: + [:s| | cs | + cs := self cFunctionNameFor: s. + self withOptionalVerbiageFor: s + on: aStream + do: [aStream tab: anInteger; nextPutAll: cs; nextPutAll: ' = interpreterProxy->'; nextPutAll: cs; nextPut: $;; cr] + ifOptionalDo: + [self + withConditionalDefineOf: cs + comment: nil + on: aStream + do: [aStream tab: anInteger; nextPutAll: cs; nextPutAll: ' = 0;']]]]! - aStream cr; nextPutAll: '#if !!defined(SQUEAK_BUILTIN_PLUGIN)'; cr. - pluginsToClone do: - [:s| | cs | - cs := self cFunctionNameFor: s. - self withOptionalVerbiageFor: s - on: aStream - do: [aStream tab: anInteger; nextPutAll: cs; nextPutAll: ' = interpreterProxy->'; nextPutAll: cs; nextPut: $;; cr] - ifOptionalDo: [aStream - nextPutAll: '# if !!defined('; nextPutAll: cs; nextPut: $); - crtab: anInteger; nextPutAll: cs; nextPutAll: ' = 0;'; - cr; nextPutAll: '# endif'; cr]]. - aStream nextPutAll: '#endif /* !!defined(SQUEAK_BUILTIN_PLUGIN) */'.! Item was changed: ----- Method: VMPluginCodeGenerator>>withGuardAgainstDefinitionOf:on:do: (in category 'C translation') ----- withGuardAgainstDefinitionOf: selector on: aStream do: aBlock "Evaluate aBlock, surrounded by a define if selector is defined as a macro (i.e. by preDeclareInterpreterProxyOn:" (self selectorsThatMayBeGeneratedAsMacros includes: selector) ifFalse: [^aBlock value]. + self + withConditionalDefineOf: (self cFunctionNameFor: selector) + comment: nil + on: aStream + do: aBlock value! - aStream nextPutAll: '#if !!defined('; nextPutAll: (self cFunctionNameFor: selector); nextPut: $); cr. - aBlock value. - aStream nextPutAll: '#endif'; cr! |
Free forum by Nabble | Edit this page |