VM Maker: VMMaker.oscog-eem.2361.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.2361.mcz

commits-2
 
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!