VM Maker: VMMaker.oscog-eem.2205.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.2205.mcz

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

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

Name: VMMaker.oscog-eem.2205
Author: eem
Time: 27 April 2017, 12:57:00.992119 pm
UUID: c552d4f3-c593-4a3e-9f31-635d61a96c5d
Ancestors: VMMaker.oscog-eem.2204

includesSubString: is deprecated.

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

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 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: ' : ']]])
- 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:
  [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].
  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 changed:
  ----- Method: CCodeGenerator>>emitCConstantsOn: (in category 'C code generator') -----
  emitCConstantsOn: aStream
  "Store the global variable declarations on the given stream."
  | unused |
  unused := constants keys asSet.
  "Don't generate any defines for the externally defined constants,
  STACKVM, COGVM, COGMTVM et al, unless they're actually used."
  (VMClass class>>#initializeMiscConstants) literalsDo:
  [:lit|
  (lit isVariableBinding and: [lit key isString]) ifTrue:
  [unused add: lit key]].
  methods do:
  [:meth|
  meth declarations keysDo:
  [:v|
  (meth typeFor: v in: self) ifNotNil:
  [:type| unused remove: type ifAbsent: []]].
  unused remove: meth returnType ifAbsent: [].
  meth parseTree nodesDo:
  [:n| n isConstant ifTrue: [unused remove: n name ifAbsent: []]]].
  unused copy do:
  [:const|
+ (variableDeclarations anySatisfy: [:value| value includesSubstring: const]) ifTrue:
- (variableDeclarations anySatisfy: [:value| value includesSubString: const]) ifTrue:
  [unused remove: const ifAbsent: []]].
  "and VMBasicConstants mostBasicConstantNames *must* be taken from interp.h"
  unused addAll: VMBasicConstants mostBasicConstantNames.
  self emitCConstants: (constants keys reject: [:any| unused includes: any]) on: aStream!

Item was changed:
  ----- Method: CCodeGenerator>>emitCMacros:on: (in category 'C code generator') -----
  emitCMacros: methodList on: aStream
  "Store the global variable declarations on the given stream.  Answer any constants used in the macros."
  | usedConstants |
  macros isEmpty ifTrue: [^#()].
  aStream cr; nextPutAll: '/*** Macros ***/'; cr.
  usedConstants := Set new.
  (methodList reject: [:m| m isRealMethod]) do:
  [:m |
  m definedAsMacro ifTrue:
  [aStream
  nextPutAll: '#define ';
  nextPutAll:(self cFunctionNameFor: m selector);
  nextPutAll: (macros at: m selector); cr.
  m compiledMethod literalsDo:
  [:lit|
+ (lit isVariableBinding and: [(macros at: m selector) includesSubstring: lit key]) ifTrue:
- (lit isVariableBinding and: [(macros at: m selector) includesSubString: lit key]) ifTrue:
  [usedConstants add: lit key]]]].
  aStream cr.
  ^usedConstants!

Item was changed:
  ----- Method: CCodeGenerator>>emitGlobalCVariablesOn: (in category 'C code generator') -----
  emitGlobalCVariablesOn: aStream
  "Store the global variable declarations on the given stream."
 
  aStream cr; nextPutAll: '/*** Global Variables ***/'; cr.
 
  (self sortStrings: (variables select: [:v| vmClass mustBeGlobal: v])) do:
  [:var | | varString decl |
  varString := var asString.
  decl := variableDeclarations at: varString ifAbsent: ['sqInt ' , varString].
  decl first == $# "support cgen var: #bytecodeSetSelector declareC: '#define bytecodeSetSelector 0' hack"
  ifTrue:
  [aStream nextPutAll: decl; cr]
  ifFalse:
+ [(decl includesSubstring: ' private ') ifFalse: "work-around hack to prevent localization of variables only referenced once."
- [(decl includesSubString: ' private ') ifFalse: "work-around hack to prevent localization of variables only referenced once."
  [(decl beginsWith: 'static') ifFalse: [aStream nextPutAll: 'VM_EXPORT '].
  (decl includes: $=) ifTrue:
  [decl := decl copyFrom: 1 to: (decl indexOf: $=) - 1].
  aStream
  nextPutAll: decl;
  nextPut: $;;
  cr]]].
  aStream cr!

Item was changed:
  ----- Method: CCodeGenerator>>selectAPIVariables (in category 'accessing') -----
  selectAPIVariables
+ ^variableDeclarations reject: [:decl| decl includesSubstring: 'static ']!
- ^variableDeclarations reject: [:decl| decl includesSubString: 'static ']!

Item was changed:
  ----- Method: CCodeGenerator>>var:declareC: (in category 'public') -----
  var: varName declareC: declarationString
  "Record the given C declaration for a global variable."
 
+ (declarationString includesSubstring: varName) ifFalse:
- (declarationString includesSubString: varName) ifFalse:
  [self error: 'declaration omits variable name.  probably an error.  use e.g. var:type:'].
  variableDeclarations at: varName asString put: declarationString.!

Item was changed:
  ----- Method: CCodeGeneratorGlobalStructure>>placeInStructure: (in category 'C code generator') -----
  placeInStructure: var
  "See if we should put this array into a structure.
  The variables listed are hardcoded as C in the interpreter thus they don't get resolved via TVariableNode logic.
  Also let's ignore variables that have special definitions that require initialization, and the function def which has problems."
 
  | check |
  check := variableDeclarations at: var ifAbsent: [''].
  (check includes: $=) ifTrue: [^false].
  (check includes: $() ifTrue: [^false].
+ (check includesSubstring: 'static') ifTrue: [^false].
+ (check includesSubstring: 'volatile') ifTrue: [^false].
- (check includesSubString: 'static') ifTrue: [^false].
- (check includesSubString: 'volatile') ifTrue: [^false].
 
  ^(vmClass mustBeGlobal: var) not!

Item was changed:
  ----- Method: StackInterpreter class>>reorganizeAsISeeFit (in category 'miscellaneous') -----
  reorganizeAsISeeFit
  "StackInterpreter reorganizeAsISeeFit"
  "CoInterpreter reorganizeAsISeeFit"
  | initializations bytecodes privates remainder |
  initializations := OrderedCollection new.
  bytecodes := OrderedCollection new.
  privates := OrderedCollection new.
  remainder := OrderedCollection new.
  self organization categories do:
  [:cat|
+ ((cat includesSubstring: 'initializ')
- ((cat includesSubString: 'initializ')
  ifTrue: [initializations]
  ifFalse:
+ [((cat endsWith: 'bytecodes') or: [cat includesSubstring: 'selector sends'])
- [((cat endsWith: 'bytecodes') or: [cat includesSubString: 'selector sends'])
  ifTrue: [bytecodes]
  ifFalse:
+ [(cat includesSubstring: 'private')
- [(cat includesSubString: 'private')
  ifTrue: [privates]
  ifFalse: [remainder]]])
  add: cat].
  self organization categories: initializations sort, bytecodes sort, remainder sort, privates sort!

Item was changed:
  ----- Method: TMethod>>argConversionExprFor:stackIndex: (in category 'primitive compilation') -----
  argConversionExprFor: varName stackIndex: stackIndex
  "Return the parse tree for an expression that fetches and converts the
  primitive argument at the given stack offset."
  | exprList decl type stmtList |
  exprList := OrderedCollection new.
  ((decl := declarations at: varName ifAbsent: []) notNil
  and: ['int' ~= (type := (decl copyReplaceAll: varName with: '') withBlanksTrimmed)])
  ifTrue:
  [(decl includes: $*) ifTrue: "array"
+ [(decl includesSubstring: 'char')
- [(decl includesSubString: 'char')
  ifTrue:
  [| expr |
  expr := '(interpreterProxy isBytes: (interpreterProxy stackValue: (stackIndex))) ifFalse: [^interpreterProxy primitiveFail]'.
  expr := expr copyReplaceAll: 'interpreterProxy' with: self vmNameString.
  expr := expr copyReplaceAll: 'stackIndex' with: stackIndex printString.
  exprList addLast: expr].
  exprList addLast: varName , ' := ', self vmNameString, ' arrayValueOf: (', self vmNameString, ' stackValue: (' , stackIndex printString , '))'.
  exprList addLast: varName , ' := ' , varName , ' - 1'] "so that varName[1] is the zero'th element"
  ifFalse: "must be a double"
  [type ~= 'double' ifTrue:
  [self error: 'unsupported type declaration in a translated primitive method'].
  exprList addLast: varName , ' := ', self vmNameString, ' stackFloatValue: ' , stackIndex printString]]
  ifFalse: "undeclared variables are taken to be integer"
  [exprList addLast: varName , ' := ', self vmNameString, ' stackIntegerValue: ' , stackIndex printString].
  stmtList := OrderedCollection new.
  exprList do: [:e | stmtList addAll: (self statementsFor: e varName: varName)].
  ^ stmtList!

Item was changed:
  ----- Method: TMethod>>emitCFunctionPrototype:generator:isPrototype: (in category 'C code generation') -----
  emitCFunctionPrototype: aStream generator: aCodeGen isPrototype: isPrototype "<Boolean>"
  "Emit a C function header for this method onto the given stream.
  Answer if the method has any compileTimeOptionPragmas"
  | compileTimeOptionPragmas returnTypeIsFunctionPointer |
  (compileTimeOptionPragmas := self compileTimeOptionPragmas) notEmpty ifTrue:
  [self outputConditionalDefineFor: compileTimeOptionPragmas on: aStream].
  returnTypeIsFunctionPointer := returnType notNil
  and: [returnType last = $)
+ and: [returnType includesSubstring: (aCodeGen cFunctionNameFor: selector)]].
- and: [returnType includesSubString: (aCodeGen cFunctionNameFor: selector)]].
  export
  ifTrue:
  [aStream nextPutAll: 'EXPORT('; nextPutAll: returnType; nextPut: $)]
  ifFalse:
  [self isStatic
  ifTrue: [aStream nextPutAll: 'static ']
  ifFalse:
  [isPrototype ifTrue:
  [aStream nextPutAll: 'extern ']].
  (isPrototype or: [inline ~~ #always]) ifFalse: [aStream nextPutAll: 'inline '].
  aStream nextPutAll: (returnType ifNil: [#sqInt])].
  (functionAttributes isNil or: [returnTypeIsFunctionPointer]) ifFalse:
  [aStream space; nextPutAll: functionAttributes].
  isPrototype ifTrue: [aStream space] ifFalse: [aStream cr].
  returnTypeIsFunctionPointer ifFalse:
  [aStream
  nextPutAll: (aCodeGen cFunctionNameFor: selector);
  nextPut: $(.
  args isEmpty
  ifTrue: [aStream nextPutAll: #void]
  ifFalse:
  [args
  do: [:arg| aStream nextPutAll: (self declarationAt: arg)]
  separatedBy: [aStream nextPutAll: ', ']].
  aStream nextPut: $)].
  isPrototype ifTrue:
  [aStream nextPut: $;; cr.
  compileTimeOptionPragmas isEmpty ifFalse:
  [aCodeGen maybeEmitPrimitiveFailureDefineFor: selector on: aStream.
  self terminateConditionalDefineFor: compileTimeOptionPragmas on: aStream]].
  ^compileTimeOptionPragmas notEmpty!

Item was changed:
  ----- Method: TMethod>>removeUnusedTempsIn: (in category 'utilities') -----
  removeUnusedTempsIn: aCodeGen
  "Remove all of the unused temps in this method. Answer a set of the references."
  "After inlining some variable references are now obsolete, we could fix them there
  but the code seems a bit complicated, the other choice to to rebuild the locals
  before extruding. This is done here"
  | usedVariables |
  usedVariables := self allReferencedVariablesUsing: aCodeGen.
  "reset the locals to be only those still referred to"
  locals do:
  [:local|
  ((usedVariables includes: local) not
+  and: [((declarations at: local ifAbsent: ['']) includesSubstring: 'static') not
+  and: [((declarations at: local ifAbsent: ['']) includesSubstring: 'extern') not]]) ifTrue:
-  and: [((declarations at: local ifAbsent: ['']) includesSubString: 'static') not
-  and: [((declarations at: local ifAbsent: ['']) includesSubString: 'extern') not]]) ifTrue:
  [locals remove: local.
  declarations removeKey: local ifAbsent: []]].
  ^usedVariables!

Item was changed:
  ----- Method: VMClass class>>initialize (in category 'initialization') -----
  initialize
  (Utilities classPool at: #CommonRequestStrings ifAbsent: []) ifNotNil:
  [:commonRequestStringHolder|
+ (commonRequestStringHolder contents asString includesSubstring: 'VMClass open') ifFalse:
- (commonRequestStringHolder contents asString includesSubString: 'VMClass open') ifFalse:
  [Utilities appendToCommonRequests: '-\VMMaker generateConfiguration\VMMaker generateAllConfigurationsUnderVersionControl\VMMaker generateAllSpurConfigurations\VMClass openCogMultiWindowBrowser\VMClass openObjectMemoriesInterpretersBrowser\VMClass openSpurMultiWindowBrowser\VMClass openCogSpurMultiWindowBrowser' withCRs]].
  ExpensiveAsserts := false!

Item was changed:
  ----- Method: VMMaker>>generateExportsFile (in category 'exports') -----
  generateExportsFile
  "Store the exports on the given file"
  | cg contents filePath fileStream |
  filePath := self interpreterExportsFilePath.
  "don't bother endlessly regenerating the example file."
  (internalPlugins isEmpty
+ and: [(filePath includesSubstring: 'example')
- and: [(filePath includesSubString: 'example')
  and: [FileDirectory default fileExists: filePath]]) ifTrue:
  [^self].
  cg := self createCodeGenerator.
  cg vmClass: self interpreterClass.
  contents := String streamContents:
  [:s|
  s
  nextPutAll:'/* This is an automatically generated table of all builtin modules in the VM';
  cr;
  next: 3 put: Character space;
  nextPutAll: (cg shortMonticelloDescriptionForClass: cg vmClass);
  cr;
  nextPutAll:' */';
  cr.
  s cr; nextPutAll:'extern sqExport vm_exports[];'.
  s cr; nextPutAll: 'extern sqExport os_exports[];'.
  self internalPluginsDo:[:cls|
  s cr; nextPutAll: 'extern sqExport '; nextPutAll: cls moduleName; nextPutAll:'_exports[];'.
  ].
  s cr.
 
  s cr; nextPutAll:'sqExport *pluginExports[] = {'.
  s crtab; nextPutAll:'vm_exports,'.
  s crtab; nextPutAll: 'os_exports,'.
  self internalPluginsDo:[:cls|
  s crtab; nextPutAll: cls moduleName; nextPutAll:'_exports,'
  ].
  s crtab; nextPutAll:'NULL'.
  s cr; nextPutAll:'};'; cr].
  (cg needToGenerateHeader: (FileDirectory baseNameFor: filePath) file: filePath contents: contents) ifTrue:
  [[fileStream := VMMaker forceNewFileNamed: filePath]
  on: FileDoesNotExistException
  do:[^self couldNotOpenFile: filePath].
  fileStream nextPutAll: contents; close]!

Item was changed:
  ----- Method: VMStructType class>>needsTypeTag (in category 'translation') -----
  needsTypeTag
  self instVarNamesAndTypesForTranslationDo:
  [:ivn :type|
  ((type isArray ifTrue: [type] ifFalse: [{type}]) anySatisfy:
  [:str|
  str isString
+ and: [str includesSubstring: self structTagName]]) ifTrue:
- and: [str includesSubString: self structTagName]]) ifTrue:
  [^true]].
  ^false
 
  "VMStructType allSubclasses select: [:sc| sc needsTypeTag]"!