On Thu, Jul 24, 2014 at 2:50 AM, Clément Bera <bera.clement@gmail.com> wrote:
 



2014-07-24 11:35 GMT+02:00 <commits@source.squeak.org>:

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

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

Name: VMMaker.oscog-eem.833
Author: eem
Time: 23 July 2014, 11:34:44.69 pm
UUID: ca999c15-a8a5-449e-82b8-8b9d683b3e1b
Ancestors: VMMaker.oscog-eem.832

Start adding the SistaV1 bytecode set to the Sista VMs.

Yeeeessss !!!!! I can't wait to see that.

Btw, are you really committing this version at 3am ?

I'm on Kauai for a vacation with the kids.  Kauai is 10 hours behind UTC.  I tend to wake up at about 6am and do a little programming.  That's 5 in the evening your time, 8am in San Francisco.  (I think)


Make Slang provide a comprehensible error message when
certain bytecodes are as-yet-unimplemented instead of
crashing horribly deep in interpreter dispatch inlining.

Nuke a couple of the obsolete VMMaker subclasses.

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

Item was added:
+ ----- Method: CCodeGenerator>>abortBlock (in category 'accessing') -----
+ abortBlock
+       ^vmMaker ifNotNil: [:vmm| vmm abortBlock]!

Item was added:
+ ----- Method: Cogit class>>initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid (in category 'class initialization') -----
+ initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid
+       "SimpleStackBasedCogit initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid"
+       "StackToRegisterMappingCogit initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid"
+
+       | v3Table v1Table |
+       "N.B. Must do it backwards to evaluate AltBlockCreationBytecodeSize & BlockCreationBytecodeSize correctly."
+       self initializeBytecodeTableForSistaV1.
+       v1Table := generatorTable.
+       AltBlockCreationBytecodeSize := BlockCreationBytecodeSize.
+       self initializeBytecodeTableForSqueakV3PlusClosures.
+       v3Table := generatorTable.
+       generatorTable := CArrayAccessor on: v3Table object, v1Table object!

Item was removed:
- MacOSPowerPCOS9VMMaker subclass: #MacOSPowerPCOS9BrowserVMMaker
-       instanceVariableNames: ''
-       classVariableNames: ''
-       poolDictionaries: ''
-       category: 'VMMaker-Building'!
-
- !MacOSPowerPCOS9BrowserVMMaker commentStamp: 'tpr 5/5/2003 12:26' prior: 0!
- A Special subclass of VMMaker for building MAc OS-9 browser-plugin vms!

Item was removed:
- ----- Method: MacOSPowerPCOS9BrowserVMMaker class>>isActiveVMMakerClassFor: (in category 'initialisation') -----
- isActiveVMMakerClassFor: platformName
-       ^false!

Item was removed:
- ----- Method: MacOSPowerPCOS9BrowserVMMaker>>initialize (in category 'initialize') -----
- initialize
-       super initialize.
-       forBrowser := true!

Item was removed:
- VMMaker subclass: #MacOSPowerPCOS9VMMaker
-       instanceVariableNames: ''
-       classVariableNames: ''
-       poolDictionaries: ''
-       category: 'VMMaker-Building'!
-
- !MacOSPowerPCOS9VMMaker commentStamp: 'tpr 5/5/2003 12:27' prior: 0!
- A VMMaker subclass to suit Mac OS!

Item was removed:
- ----- Method: MacOSPowerPCOS9VMMaker class>>isActiveVMMakerClassFor: (in category 'initialisation') -----
- isActiveVMMakerClassFor: platformName
-       "Does this class claim to be that properly active subclass of VMMaker for this platform?"
-
-       ^platformName = 'Mac OS'" and: [Smalltalk platformSubtype = 'PowerPC'] <- this used to be used but prevents any attempt to do the crossplatform generation thang. How can we handle that bit properly?"!

Item was removed:
- ----- Method: MacOSPowerPCOS9VMMaker>>createCodeGenerator (in category 'initialize') -----
- createCodeGenerator
-       "Set up a CCodeGenerator for this VMMaker - Mac OS uses the global struct and local def of the
-        structure.  The global struct/loca def regime appears to be about 10% faster than the default
-        regime for Smalltalk-intensive macro benchmarks for both the Intel and gcc 4.0 compiler on x86.
-        eem 12/10/2008 14:34 2.16 GHz Intel Core Duo MacBook Pro Mac OS X 10.4.11"
-       ^CCodeGeneratorGlobalStructure new
-               vmMaker: self;
-               structDefDefine: '1';
-               "structDefDefine: 'defined(PPC) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__)';"
-               logger: logger;
-               yourself!

Item was changed:
  ----- Method: RiscOSVMMaker>>createCodeGenerator (in category 'initialize') -----
  createCodeGenerator
  "set up a CCodeGenerator for this VMMaker - RiscOS uses the global struct and no local def of the structure because of the global register trickery"
        ^CCodeGeneratorGlobalStructure new
                vmMaker: self;
                logger: logger;
+               options: optionsDictionary;
                yourself!

Item was changed:
  ----- Method: StackInterpreter class>>initializeBytecodeTable (in category 'initialization') -----
  initializeBytecodeTable
        "StackInterpreter initializeBytecodeTable"

+       (initializationOptions at: #bytecodeTableInitializer ifAbsent: nil) ifNotNil:
+               [:initalizer| ^self perform: initalizer].
+
        NewspeakVM ifTrue:
                [^MULTIPLEBYTECODESETS
                        ifTrue: [self initializeBytecodeTableForNewspeakV3PlusClosuresNewspeakV4Hybrid]
                        ifFalse: [self initializeBytecodeTableForNewspeakV3PlusClosures]].

        ^self initializeBytecodeTableForSqueakV3PlusClosures!

Item was added:
+ ----- Method: StackInterpreter class>>initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid (in category 'initialization') -----
+ initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid
+       "StackInterpreter initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid"
+
+       | v3Table v1Table |
+       self initializeBytecodeTableForSistaV1.
+       v1Table := BytecodeTable.
+       AltBytecodeEncoderClassName := BytecodeEncoderClassName.
+       AltLongStoreBytecode := LongStoreBytecode.
+       self initializeBytecodeTableForSqueakV3PlusClosures.
+       v3Table := BytecodeTable.
+       BytecodeTable := v3Table, v1Table!

Item was added:
+ ----- Method: StackToRegisterMappingCogit class>>initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid (in category 'class initialization') -----
+ initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid
+       "StackToRegisterMappingCogit initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid"
+
+       super initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid.
+       isPushNilFunction := #squeakV3orSistaV1:Is:Push:Nil:.
+       pushNilSizeFunction := #squeakV3orSistaV1PushNilSize:!

Item was removed:
- ----- Method: TMethod>>buildCaseStmt: (in category 'transformations') -----
- buildCaseStmt: aSendNode
-       "Build a case statement node for the given send of dispatchOn:in:."
-       "Note: the first argument is the variable to be dispatched on. The second argument is a constant node holding an array of unary selectors, which will be turned into sends to self."
-
-       ((aSendNode args size >= 2) and:
-        [aSendNode args second isConstant and:
-        [aSendNode args second value class = Array]]) ifFalse: [
-               self error: 'wrong node structure for a case statement'.
-       ].
-
-       ^TCaseStmtNode new
-               setExpression: aSendNode args first
-               selectors: aSendNode args second value
-               arguments: (aSendNode args copyFrom: 3 to: aSendNode args size)!

Item was added:
+ ----- Method: TMethod>>buildCaseStmt:in: (in category 'transformations') -----
+ buildCaseStmt: aSendNode in: aCodeGen
+       "Build a case statement node for the given send of dispatchOn:in:."
+       "Note: the first argument is the variable to be dispatched on. The second argument is a constant node holding an array of unary selectors, which will be turned into sends to self."
+
+       | unimplemented errorMessage |
+       ((aSendNode args size >= 2) and:
+        [aSendNode args second isConstant and:
+        [aSendNode args second value class = Array]]) ifFalse:
+               [self error: 'wrong node structure for a case statement'].
+
+       unimplemented := aSendNode args second value reject: [:s| self definingClass includesSelector: s].
+       unimplemented isEmpty ifFalse:
+               [errorMessage := 'The following selectors are unimplemented: ',
+                                                       (String streamContents: [:s| unimplemented do: [:sel| s crtab; store: sel]]).
+                (self confirm: errorMessage
+                       orCancel: aCodeGen abortBlock) ifFalse:
+                               [self halt]].
+
+       ^TCaseStmtNode new
+               setExpression: aSendNode args first
+               selectors: aSendNode args second value
+               arguments: (aSendNode args copyFrom: 3 to: aSendNode args size)!

Item was changed:
  ----- Method: TMethod>>prepareMethodIn: (in category 'transformations') -----
  prepareMethodIn: aCodeGen
        "Record sends of builtin operators, map sends of the special selector dispatchOn:in:
         with case statement nodes, and map sends of caseOf:[otherwise:] to switch statements.
         As a hack also update the types of variables introduced to implement cascades correctly.
         This has to be done at the same time as this is done, so why not piggy back here?"
        extraVariableNumber ifNotNil:
                [declarations keysAndValuesDo:
                        [:varName :decl|
                        decl isBlock ifTrue:
                                [self assert: ((varName beginsWith: 'cascade') and: [varName last isDigit]).
                                 locals add: varName.
                                 self declarationAt: varName
                                        put: (decl value: self value: aCodeGen), ' ', varName]]].
        aCodeGen
                pushScope: declarations
                while:"N.B.  nodesWithParentsDo: is bottom-up, hence replacement is destructive and conserved."
                        [parseTree nodesWithParentsDo:
                                [:node :parent|
                                 node isSend ifTrue:
                                        [(aCodeGen isBuiltinSelector: node selector)
                                                ifTrue:
                                                        [node isBuiltinOperator: true.
                                                        "If a to:by:do:'s limit has side-effects, declare the limit variable, otherwise delete it from the args"
                                                         (node selector = #to:by:do:
                                                          and: [node args size = 4]) ifTrue:
                                                                [| limitExpr |
                                                                 limitExpr := node args first.
                                                                 (limitExpr anySatisfy:
                                                                                [:subNode|
                                                                                subNode isSend
                                                                                and: [(aCodeGen isBuiltinSelector: subNode selector) not
                                                                                and: [(subNode isStructSendIn: aCodeGen) not]]])
                                                                        ifTrue: [locals add: node args last name]
                                                                        ifFalse:
                                                                                [node arguments: node args allButLast]]]
                                                ifFalse:
                                                        [(CaseStatements includes: node selector) ifTrue:
+                                                               [parent replaceNodesIn: (Dictionary newFromPairs: { node. self buildCaseStmt: node in: aCodeGen})].
-                                                               [parent replaceNodesIn: (Dictionary newFromPairs: { node. self buildCaseStmt: node})].
                                                         (#(caseOf: #caseOf:otherwise:) includes: node selector) ifTrue:
                                                                [parent replaceNodesIn: (Dictionary newFromPairs: { node. self buildSwitchStmt: node parent: parent })]]]]]!

Item was changed:
  ----- Method: UnixVMMaker>>createCodeGenerator (in category 'initialisation') -----
  createCodeGenerator

        ^CCodeGeneratorGlobalStructure new
                vmMaker: self;
                logger: logger;
+               options: optionsDictionary;
                yourself!

Item was changed:
  Object subclass: #VMMaker
+       instanceVariableNames: 'inline forBrowser allPlugins internalPlugins externalPlugins platformName sourceDirName platformRootDirName logger interpreterClassName cogitClassName is64BitVM optionsDictionary abortBlock'
-       instanceVariableNames: 'inline forBrowser allPlugins internalPlugins externalPlugins platformName sourceDirName platformRootDirName logger interpreterClassName cogitClassName is64BitVM optionsDictionary'
        classVariableNames: 'DirNames'
        poolDictionaries: ''
        category: 'VMMaker-Building'!

  !VMMaker commentStamp: 'tpr 5/5/2003 12:28' prior: 0!
  This class builds a VM codebase from the in-image and on-file code.

  The platforms file tree you need can be downloaded via cvs from http://squeak.Sourceforge.net. See also the swiki (http://minnow.cc.gatech.edu/squeak/2106) for instructions.

  It is fairly configurable as to where directories live and can handle multiple platform's source trees at once. It's main purpose is to allow easy building of source trees with any combination of internal/external/unused plugins to suit your platform needs and capabilities. For example, the Acorn has no need of Sound or AsynchFile plugins since I haven't written any platform code for them.

  There is a simple UI tool for this
        VMMakerTool openInWorld
  will open a reasonably self explanatory tool with balloon help to explain all the fields - and a help window on top of that.

  There are some simple workspace & inspector commands, allowing scripted building:
        VMMaker default initializeAllExternal generateEntire
  for example will build sources for a system with all the plugins external whereas
        VMMaker default initializeAllInternal generateEntire
  would build all applicable plugins for internal compilation.
        (VMMaker forPlatform: 'Mac OS') initializeAllExternal generateEntire
  would build a source tree for a Mac even on a Windows machine (err, ignoring for now the irritation of lineends).

        If you have a slightly more complex configuration you want to use, perhaps with Socket and Serial support external (because for your case they are rarely used and saving the space has some value) then you could try
                (VMMaker default initializeAllInternalBut: #(SocketPlugin SerialPlugin) generateEntire
        More complex still would be
                (VMMaker default initializeInternal: #(BitBltPlugin MiscPrimsPlugin FilePlugin) external: #(SocketPlugin ZipPlugin B2DPlugin)
  which allows you to precisely list all the plugins to use.

  WARNING If you miss out a plugin you need, it won't be there. This message is really best suited to use by a UI like VMMakerTool.

        To save a configuration for later use, you need to send #saveConfiguration to an active instance of VMMaker. Obviously you could simply use
                (VMMaker default initializeAllInternalBut: #(SocketPlugin SerialPlugin) saveConfiguration
  but inspecting
                VMMaker default
  and altering the internalPlugins and externalPlugins or the boolean flags for inline or forBrowser followed by saving the configuration allows ultimate power for now. To load a saved configuration file, use #loadConfigurationFrom: aFilename whilst inspecting a VMMaker. The loaded state will completely override any pre-existing state, so take care.
        You can generate only parts of the source tree if you wish; as shown above #generateEntire will create the whole collection of internal and external plugins as well as the core VM. To create only  the external plugins use #generateExternalPlugins, or create a single  plugin with #generateExternalPlugin: name. To assemble the main VM including the internal plugins, use #generateMainVM. The interpreter 'interp.c' file is made with #generateInterpreterFile. You can generate a single internal plugin with #generateInternalPlugin: only if it has already been generated before; this interlocking is intended to make sure the named primitive table in the vm is correct.

  There are some rules to observe in order to use this:-
  - under the working directory (by default - you can configure it) you need a directory called 'platforms' (also configurable) with subdirectories named as the platform names returned by Smalltalk platformName (ie unix, RiscOS, Mac OS, etc - this isn't configurable). At the very least you need the one for your own platform and the pseudo-platform called 'Cross'. By adding a 'DirNames' entry for #machineType you can cross 'compile' for some other platform. Now all we need is a cross-compiler for the C code :-)
  - under this directory you must have a simple structure of directories for each generated plugin that you support on the platform, plus 'vm'. In each directory you place any/all platform specific files (and subdirectories) for that plugin. In 'misc' you can place any miscellaneous files such as makefiles, resources etc. For example, for unix you have
        platforms/
                unix/
                        plugins/
                                AsynchFilePlugin /
                                        sqUnixAsynchfile.c
                        vm/
                                sqGnu.h
                                Profile/
                        misc/
                                makefile.in
                                util/

                                ...etc
  Any plugins requiring platform files that you don't support shouldn't appear in the resulting code tree. If you try to include an unsupported plugin in the list to be made external, the VMMaker simply ignores it. However, if you include it in the list to be made internal you will get an error since that seems like a potentially serious source of confusion.

  There are three lists of plugins maintained herein:-
  1) the list of all known generatable plugins. We scan this list and compare with the supported plugins as indicated by the file tree.
  2) the list of chosen internal plugins.
  3) the list of chosen external plugins.
  See initializeAllPlugins, initialiseAllExternal etc for fairly obvious usage.
  There is also a short list of directory names in the class variable 'DirNames' that you can alter if needed.

  Known problems:-
  a) since Squeak has really poor filename handling, you can't simply change the directory names to '/foo/bar/myEvilCodeBase' and expect it to work. You fix file names and I'll fix VMMaker :-)
  b) Squeak copying of a file loses the assorted permissions, filetype info and other useful bits. To workaround this problem, see the FileCopyPlugin, which provides the platform independent part of a simple access for the OS filecopy capability. So far there are functional plugins for unix, Mac and Acorn. DOS machines appear not to need one. This is less of a problem in practise now that unix, Acorn & Mac no longer copy files from /platforms to /src.

  inline <Boolean> - is the generated code to be inlined or not
  forBrowser <Boolean> - is this to be a build for in-Browser use? Only relevent to Macs
  allPlugins <Collection> - all the known possible plugins
  internalPlugins <Collection> - the plugins chosen to be generated for internal linking
  externalPlugins <Collection> - the plugins intended to be external plugins
  exportList <Collection> - a list of function names exported from plugins intended to be internal
  platformName <String> - the name of the platform for which we are building a source tree. It is possible to do 'cross-compiles'
  sourceDirName, platformRootDirName <String> - the name of the directory into which we write the generated sources and the name of the directory where we should find the platforms tree.!

Item was changed:
  ----- Method: VMMaker class>>generateSqueakCogSistaVM (in category 'configurations') -----
  generateSqueakCogSistaVM
        "No primitives since we can use those for the Cog VM"
        ^VMMaker
                generate: CoInterpreter
                and: SistaStackToRegisterMappingCogit
+               with: #(        MULTIPLEBYTECODESETS true
+                               bytecodeTableInitializer initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid)
                to: (FileDirectory default pathFromURI: self sourceTree, '/sistasrc')
                platformDir: (FileDirectory default pathFromURI: self sourceTree, '/platforms')
                including: #()!

Item was changed:
  ----- Method: VMMaker class>>generateSqueakSpurCogSistaVM (in category 'configurations') -----
  generateSqueakSpurCogSistaVM
        "No primitives since we can use those for the Cog VM"
        ^VMMaker
                generate: CoInterpreter
                and: SistaStackToRegisterMappingCogit
+               with: #(        ObjectMemory Spur32BitCoMemoryManager
+                               MULTIPLEBYTECODESETS true
+                               bytecodeTableInitializer initializeBytecodeTableForSqueakV3PlusClosuresSistaV1Hybrid)
-               with: #(ObjectMemory Spur32BitCoMemoryManager)
                to: (FileDirectory default pathFromURI: self sourceTree, '/spursistasrc')
                platformDir: (FileDirectory default pathFromURI: self sourceTree, '/platforms')
                including:#()!

Item was added:
+ ----- Method: VMMaker>>abortBlock (in category 'accessing') -----
+ abortBlock
+       ^abortBlock!

Item was changed:
  ----- Method: VMMaker>>generateEntire (in category 'generate sources') -----
  generateEntire
        "Generate the interp, internal plugins and exports as well as the external plugins.
         If this comes from a generator, log it for convenience."
+       abortBlock := [^self].
        self configurationGeneratorNameOrNil ifNotNil:
                [:generator|
                 logger cr; nextPutAll: (generator selector copyReplaceAll: 'generate' with: '').
                 interpreterClassName ifNotNil:
                        [logger space; nextPutAll: (CCodeGenerator shortMonticelloDescriptionForClass: (Smalltalk classNamed: interpreterClassName))].
                 logger cr; flush].
        self generateMainVM.
        self generateExternalPlugins!

Item was changed:
  ----- Method: Win32VMMaker>>createCodeGenerator (in category 'initialize') -----
  createCodeGenerator
        "Set up a CCodeGenerator for this VMMaker - On Windows we use the gcc 2.95.x compiler
         which does better without the global struct."
        ^CCodeGeneratorGlobalStructure new
                vmMaker: self;
                structDefDefine: '0';
                "structDefDefine: 'defined(PPC) || defined(_POWER) || defined(__powerpc__) || defined(__ppc__)';"
                logger: logger;
+               options: optionsDictionary;
                yourself!






--
best,
Eliot