Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.235.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.235 Author: eem Time: 14 December 2012, 12:40:24.977 pm UUID: 954df856-3f83-498c-9735-6cd3777ba9c7 Ancestors: VMMaker.oscog-eem.234
Fix doubling of include file declarations in plugins (now plugin code is generated an exctra time to extract usedf functions we must avoid adding headers twice in emitCHeaderOn:).
Provide a hook, InterpreterPlugin class>>exportBuildInfoOrNil, for build info comments as in the UnixOSProcessPlugin.
Make constant generation look for method var and return types so as not to nuke types introduced as #defines via addConstantForBinding: (again a la UnixOSProcessPlugin).
EMit constants more carefully, not converting defs that contain a comment into C literals, again so that UnixOSProcessPlugin can declare FILEHANDLETYPE et al.
Add all headers through addHeaderFile[First]: so that warnings can be issued aboud multiple defs etc.
Fix MNU handler for missing NullStream protocol as per trunk4.3.
Nuke a duplicate include in VMProfileMacSupportPlugin.
=============== Diff against VMMaker.oscog-eem.234 ===============
Item was changed: ----- Method: CCodeGenerator>>addHeaderFile: (in category 'public') ----- addHeaderFile: aString + "Add a header file. As a hack we allow C preprocessor defs such as #ifdef" + self assert: (('"<#' includes: aString first) or: [(aString last: 2) = '_H']). + (aString first ~= $# + and: [headerFiles includes: aString]) ifTrue: + [logger nextPutAll: 'warning, attempt to include ', aString, ' a second time'; cr; flush. + ^self]. + headerFiles addLast: aString! - "Add a header file. The argument must be a quoted string!!" - headerFiles addLast: aString.!
Item was added: + ----- Method: CCodeGenerator>>addHeaderFileFirst: (in category 'public') ----- + addHeaderFileFirst: aString + "Add a header file to the front of the sequence." + self assert: (('"<' includes: aString first) and: ['">' includes: aString last]). + self assert: (headerFiles includes: aString) not. + headerFiles addFirst: aString!
Item was changed: ----- Method: CCodeGenerator>>emitCConstantsOn: (in category 'C code generator') ----- emitCConstantsOn: aStream "Store the global variable declarations on the given stream." | unused constList | unused := constants keys asSet. "Don't generate any defines for the externally defined constants, + STACKVM, COGVM, COGMTVM et al, unless they're actually used." - STACKVM, COGVM, COGMTVM et al, unless they're actuaslly used." (VMClass class>>#initializeMiscConstantsWith:) 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: [unused remove: const ifAbsent: []]]. unused remove: #BytesPerWord ifAbsent: []. "force inclusion of BytesPerWord declaration" constList := constants keys reject: [:any| unused includes: any]. aStream cr; nextPutAll: '/*** Constants ***/'; cr. (self sortStrings: constList) do: [:varName| | node default value | node := constants at: varName. node name isEmpty ifFalse: + ["If the definition includes a C comment, 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: '/*']) + ifTrue: [node value] + ifFalse: [self cLiteralFor: node value name: varName]. - ["Allow the class to provide an alternative definition, either of just the value or the whole shebang" - default := self cLiteralFor: node value name: varName. value := vmClass ifNotNil: [(vmClass specialValueForConstant: node name default: default) ifNotNil: [:specialDef| specialDef] ifNil: [default]] ifNil: [default]. value first ~= $# ifTrue: [aStream nextPutAll: '#define '; nextPutAll: node name; space]. aStream nextPutAll: value; cr]]. aStream cr!
Item was changed: ----- Method: CCodeGenerator>>emitCHeaderOn: (in category 'C code generator') ----- emitCHeaderOn: aStream "Emit the initial part of a source file on aStream, comprising the version stamp, the global struct usage flags, the header files and preamble code."
| headerClass | headerClass := [vmClass coreInterpreterClass] on: MessageNotUnderstood do: [:ex| vmClass]. aStream nextPutAll: (self fileHeaderVersionStampForSourceClass: headerClass); cr; cr. self emitGlobalStructFlagOn: aStream.
+ self addHeaderFileFirst: '"sq.h"'. - headerFiles addFirst: '"sq.h"'. vmClass isInterpreterClass ifTrue: + [self addHeaderFile: '"sqMemoryAccess.h"']. - [headerFiles addLast: '"sqMemoryAccess.h"']. "Additional header files; include C library ones first." self emitHeaderFiles: (headerFiles select: [:hdr| hdr includes: $<]) on: aStream. "Additional header files; include squeak VM ones last" self emitHeaderFiles: (headerFiles reject: [:hdr| hdr includes: $<]) on: aStream.
vmClass isInterpreterClass ifTrue: [aStream cr; cr; nextPutAll: vmClass preambleCCode].
aStream cr!
Item was changed: ----- Method: CCodeGenerator>>fileHeaderVersionStampForSourceClass: (in category 'C code generator') ----- fileHeaderVersionStampForSourceClass: sourceClass "Answer a suitable versiomn stamp to include in the header." | exportBuildInfo slangDescription sourceDescription | [exportBuildInfo := sourceClass isInterpreterClass ifTrue: ['char *__interpBuildInfo = __buildInfo;'] ifFalse: [sourceClass isCogitClass + ifTrue: ['char *__cogitBuildInfo = __buildInfo;'] + ifFalse: + [sourceClass isPluginClass ifTrue: + [sourceClass exportBuildInfoOrNil]]]] - ifTrue: ['char *__cogitBuildInfo = __buildInfo;']]] on: MessageNotUnderstood do: [:ex| ex resume: false]. [slangDescription := self monticelloDescriptionFor: self class. sourceClass ifNotNil: [sourceDescription := self monticelloDescriptionFor: sourceClass]] on: Error do: [:ex| | now | now := Time dateAndTimeNow printString. ^String streamContents: [:s| s nextPutAll: '/* Automatically generated from Squeak on '. s nextPutAll: now. s nextPutAll: ' */'; cr; cr. s nextPutAll: 'static char __buildInfo[] = "Generated on '. s nextPutAll: now. s nextPutAll: '. Compiled on "'. s nextPutAll: '__DATE__ ;'; cr. exportBuildInfo ifNotNil: [s nextPutAll: exportBuildInfo; cr]. s cr]]. ^String streamContents: [:s| s nextPutAll: '/* Automatically generated by'. s crtab. s nextPutAll: slangDescription. sourceDescription ifNotNil: [s cr; nextPutAll: ' from'; crtab; nextPutAll: sourceDescription]. s cr; nextPutAll: ' */'; cr. sourceDescription ifNotNil: [s nextPutAll: 'static char __buildInfo[] = "'. s nextPutAll: sourceDescription. s nextPutAll: ' " __DATE__ ;'; cr. exportBuildInfo ifNotNil: [s nextPutAll: exportBuildInfo; cr]. s cr]]!
Item was added: + ----- Method: InterpreterPlugin class>>exportBuildInfoOrNil (in category 'translation') ----- + exportBuildInfoOrNil + "A hook for classes to emit some descriptive build string. + See CCodeGenerator>>fileHeaderVersionStampForSourceClass:" + ^nil!
Item was added: + ----- Method: InterpreterPlugin class>>isPluginClass (in category 'translation') ----- + isPluginClass + ^true!
Item was added: + ----- Method: VMClass class>>isPluginClass (in category 'translation') ----- + isPluginClass + "InterpreterPlugin class override this." + ^false!
Item was changed: ----- Method: VMPluginCodeGenerator>>emitCCodeOn:doInlining:doAssertions: (in category 'C code generator') ----- emitCCodeOn: aStream doInlining: inlineFlag doAssertions: assertionFlag "Generate twice; the first time to collect the used functions, the second to output the used functions." + | savedHeaders | + savedHeaders := headerFiles copy. [super emitCCodeOn: NullStream new doInlining: inlineFlag doAssertions: assertionFlag] on: MessageNotUnderstood do: [:ex| + (#(cr crtab: peekLast space tab tab:) includes: ex message selector) ifTrue: - (#(peekLast tab: crtab:) includes: ex message selector) ifTrue: [ex resume: nil]. ex pass]. + headerFiles := savedHeaders. super emitCCodeOn: aStream doInlining: inlineFlag doAssertions: assertionFlag!
Item was changed: ----- Method: VMPluginCodeGenerator>>emitCHeaderOn: (in category 'C code generator') ----- emitCHeaderOn: aStream "Write a C file header onto the given stream."
aStream nextPutAll: (self fileHeaderVersionStampForSourceClass: pluginClass). aStream cr; cr.
#('<math.h>' '<stdio.h>' '<stdlib.h>' '<string.h>' '<time.h>') reverseDo: + [:hdr| self addHeaderFileFirst: hdr]. - [:hdr| headerFiles addFirst: hdr].
"Additional header files; include C library ones first." self emitHeaderFiles: (headerFiles select: [:hdr| hdr includes: $<]) on: aStream.
aStream cr; nextPutAll:'/* Default EXPORT macro that does nothing (see comment in sq.h): */ #define EXPORT(returnType) returnType
/* Do not include the entire sq.h file but just those parts needed. */ /* The virtual machine proxy definition */ #include "sqVirtualMachine.h" /* Configuration options */ #include "sqConfig.h" /* Platform specific definitions */ #include "sqPlatformSpecific.h"
#define true 1 #define false 0 #define null 0 /* using ''null'' because nil is predefined in Think C */ #ifdef SQUEAK_BUILTIN_PLUGIN #undef EXPORT // was #undef EXPORT(returnType) but screws NorCroft cc #define EXPORT(returnType) static returnType #endif'; cr; cr. + self addHeaderFile: '"sqMemoryAccess.h"'. - headerFiles addLast: '"sqMemoryAccess.h"'. "Additional header files; include squeak VM ones last" self emitHeaderFiles: (headerFiles reject: [:hdr| hdr includes: $<]) on: aStream. pluginClass preambleCCode ifNotNil: [:preamble| aStream cr; nextPutAll: preamble]. aStream cr.!
Item was changed: ----- Method: VMProfileMacSupportPlugin class>>declareCVarsIn: (in category 'translation') ----- declareCVarsIn: aCCodeGen aCCodeGen - addHeaderFile: '<stdlib.h>'; addHeaderFile: '<dlfcn.h>'; addHeaderFile: '<mach-o/dyld.h>'; addHeaderFile: '<mach-o/getsect.h>'!
vm-dev@lists.squeakfoundation.org