[Vm-dev] VM Maker: VMMaker.oscog-eem.1601.mcz
commits at source.squeak.org
commits at source.squeak.org
Wed Dec 16 22:11:47 UTC 2015
Eliot Miranda uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-eem.1601.mcz
==================== Summary ====================
Name: VMMaker.oscog-eem.1601
Author: eem
Time: 16 December 2015, 2:09:56.371 pm
UUID: faa527e8-769c-4c9d-b4c9-8ce48b8edbd5
Ancestors: VMMaker.oscog-eem.1600
Slang:
Fix determining types for implicitly typed pointer variables.
Fix indenting of some arithmetic expressions.
=============== Diff against VMMaker.oscog-eem.1600 ===============
Item was changed:
----- Method: CCodeGenerator>>generateAnd:on:indent: (in category 'C translation') -----
generateAnd: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' && '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateBitAnd:on:indent: (in category 'C translation') -----
generateBitAnd: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' & '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateBitOr:on:indent: (in category 'C translation') -----
generateBitOr: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' | '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateBitShift:on:indent: (in category 'C translation') -----
generateBitShift: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
| arg rcvr |
arg := msgNode args first.
rcvr := msgNode receiver.
+ arg isConstant
+ ifTrue: "bit shift amount is a constant"
+ [aStream nextPutAll: '((usqInt) '.
+ self emitCExpression: rcvr on: aStream.
+ arg value < 0
+ ifTrue: [aStream nextPutAll: ' >> ', arg value negated printString]
+ ifFalse: [aStream nextPutAll: ' << ', arg value printString].
+ aStream nextPutAll: ')']
+ ifFalse: "bit shift amount is an expression"
+ [aStream nextPutAll: '(('.
+ self emitCExpression: arg on: aStream indent: level.
+ aStream nextPutAll: ' < 0) ? ((usqInt) '.
+ self emitCExpression: rcvr on: aStream indent: level.
+ aStream nextPutAll: ' >> -'.
+ self emitCExpression: arg on: aStream indent: level.
+ aStream nextPutAll: ') : ((usqInt) '.
+ self emitCExpression: rcvr on: aStream indent: level.
+ aStream nextPutAll: ' << '.
+ self emitCExpression: arg on: aStream indent: level.
+ aStream nextPutAll: '))']!
- arg isConstant ifTrue: [
- "bit shift amount is a constant"
- aStream nextPutAll: '((usqInt) '.
- self emitCExpression: rcvr on: aStream.
- arg value < 0 ifTrue: [
- aStream nextPutAll: ' >> ', arg value negated printString.
- ] ifFalse: [
- aStream nextPutAll: ' << ', arg value printString.
- ].
- aStream nextPutAll: ')'.
- ] ifFalse: [
- "bit shift amount is an expression"
- aStream nextPutAll: '(('.
- self emitCExpression: arg on: aStream.
- aStream nextPutAll: ' < 0) ? ((usqInt) '.
- self emitCExpression: rcvr on: aStream.
- aStream nextPutAll: ' >> -'.
- self emitCExpression: arg on: aStream.
- aStream nextPutAll: ') : ((usqInt) '.
- self emitCExpression: rcvr on: aStream.
- aStream nextPutAll: ' << '.
- self emitCExpression: arg on: aStream.
- aStream nextPutAll: '))'.
- ].!
Item was changed:
----- Method: CCodeGenerator>>generateBitXor:on:indent: (in category 'C translation') -----
generateBitXor: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' ^ '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateEqual:on:indent: (in category 'C translation') -----
generateEqual: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' == '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateGreaterThan:on:indent: (in category 'C translation') -----
generateGreaterThan: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' > '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateGreaterThanOrEqual:on:indent: (in category 'C translation') -----
generateGreaterThanOrEqual: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' >= '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateLessThan:on:indent: (in category 'C translation') -----
generateLessThan: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' < '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateLessThanOrEqual:on:indent: (in category 'C translation') -----
generateLessThanOrEqual: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' <= '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateNotEqual:on:indent: (in category 'C translation') -----
generateNotEqual: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPutAll: ' !!= '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream.!
Item was changed:
----- Method: CCodeGenerator>>generateShiftRight:on:indent: (in category 'C translation') -----
generateShiftRight: msgNode on: aStream indent: level
"Generate the C code for this message onto the given stream."
| type |
"If the variable is a 64-bit type then don't cast it to usqInt (typically a 32-bit type)"
(self is64BitIntegralVariable: msgNode receiver typeInto: [:t| type := t])
ifTrue:
["If not unsigned cast it to unsigned."
type first ~= $u ifTrue:
[aStream nextPutAll: '((unsigned '; nextPutAll: type; nextPut: $)].
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
type first ~= $u ifTrue:
[aStream nextPut: $)]]
ifFalse:
[aStream nextPutAll: '((usqInt) '.
+ self emitCExpression: msgNode receiver on: aStream indent: level.
- self emitCExpression: msgNode receiver on: aStream.
aStream nextPut: $)].
aStream nextPutAll: ' >> '.
+ self emitCExpression: msgNode args first on: aStream indent: level!
- self emitCExpression: msgNode args first on: aStream!
Item was added:
+ ----- Method: CCodeGenerator>>isPointerCType: (in category 'type inference') -----
+ isPointerCType: aType
+ ^aType last == $*!
Item was changed:
----- Method: CCodeGenerator>>isSimpleType: (in category 'type inference') -----
isSimpleType: aType
"For the purposes of the read-before-written initializer, answer if
aType is simple, e.g. not a structure, and array or an opaque type."
+ ^(self isPointerCType: aType)
+ or: [self isIntegralCType: aType]!
- ^aType last = $*
- or: [#( sqInt usqInt sqLong usqLong
- int #'unsigned int' double float
- short #'unsigned short'
- char #'unsigned char' #'signed char') includes: aType]!
Item was removed:
- ----- Method: CCodeGenerator>>mergeTypeOf:in:with: (in category 'type inference') -----
- mergeTypeOf: var in: aDictionary with: newType
- "var is a variable that has been assigned an expression of type newType.
- Either assign its type, if it is as yet untyped, or merge newType with its existing type.
- N.B. We refuse to promote a variable that already has integral type to a floating point
- type. The existing plugins depend on this; one can always use an explicit type in future."
- | existingType mergedType |
- existingType := self
- extractTypeFor: var
- fromDeclaration: (aDictionary at: var ifAbsentPut: [newType, ' ', var]).
- existingType ~= newType ifTrue:
- [((self isIntegralCType: existingType)
- and: [self isFloatingPointCType: newType]) ifFalse:
- [mergedType := self promoteArithmeticTypes: existingType and: newType.
- aDictionary at: var put: mergedType, ' ', var]]!
Item was added:
+ ----- Method: CCodeGenerator>>mergeTypeOf:in:with:method: (in category 'type inference') -----
+ mergeTypeOf: var in: aDictionary with: newType method: tMethod
+ "var is a variable that has been assigned an expression of type newType.
+ Either assign its type, if it is as yet untyped, or merge newType with its existing type.
+ N.B. We refuse to promote a variable that already has integral type to a floating point
+ type. The existing plugins depend on this; one can always use an explicit type in future."
+ | existingType mergedType |
+ existingType := self
+ extractTypeFor: var
+ fromDeclaration: (aDictionary at: var ifAbsentPut: [newType, ' ', var]).
+ existingType ~= newType ifTrue:
+ [((self isPointerCType: existingType)
+ or: [self isPointerCType: newType])
+ ifTrue:
+ [existingType = #'void *' ifTrue: [^newType].
+ newType = #'void *' ifTrue: [^existingType].
+ self logger show: 'conflicting types ', existingType, ' ', newType, ' for ', var, ' in ', tMethod selector.
+ ^existingType]
+ ifFalse:
+ [((self isIntegralCType: existingType)
+ and: [self isFloatingPointCType: newType]) ifFalse:
+ [mergedType := self promoteArithmeticTypes: existingType and: newType.
+ aDictionary at: var put: mergedType, ' ', var]]]!
Item was changed:
----- Method: TMethod>>inferTypesForImplicitlyTypedVariablesIn: (in category 'type inference') -----
inferTypesForImplicitlyTypedVariablesIn: aCodeGen
"infer types for untyped variables from assignments and arithmetic uses.
For debugging answer a Dictionary from var to the nodes that determined types
This for debugging:
(self copy inferTypesForImplicitlyTypedVariablesIn: aCodeGen)"
| alreadyExplicitlyTyped effectiveNodes |
aCodeGen maybeBreakForTestToInline: selector in: self.
alreadyExplicitlyTyped := declarations keys asSet.
effectiveNodes := Dictionary new. "this for debugging"
parseTree nodesDo:
[:node| | type var |
"If there is something of the form i >= 0, then i should be signed, not unsigned."
(node isSend
and: [(locals includes: (var := node receiver variableNameOrNil))
and: [(alreadyExplicitlyTyped includes: var) not "don't be fooled by inferred unsigned types"
and: [(#(<= < >= >) includes: node selector)
and: [node args first isConstant
and: [node args first value = 0
and: [(type := self typeFor: var in: aCodeGen) notNil
and: [type first == $u]]]]]]]) ifTrue:
[declarations at: var put: (aCodeGen signedTypeForIntegralType: type), ' ', var.
effectiveNodes at: var put: { declarations at: var. node }].
"if an assignment to an untyped local of a known type, set the local's type to that type.
Only observe known sends (methods in the current set) and typed local variables."
(node isAssignment
and: [(locals includes: (var := node variable name))
and: [(alreadyExplicitlyTyped includes: var) not "don't be fooled by previously inferred types"
and: [(type := node expression isSend
ifTrue: [aCodeGen returnTypeForSend: node expression in: self]
ifFalse: [self typeFor: node expression in: aCodeGen]) notNil
+ and: [aCodeGen isSimpleType: type]]]]) ifTrue:
+ [aCodeGen mergeTypeOf: var in: declarations with: type method: self.
- and: [aCodeGen isIntegralCType: type]]]]) ifTrue:
- [aCodeGen mergeTypeOf: var in: declarations with: type.
effectiveNodes at: var put: { declarations at: var. node }, (effectiveNodes at: var ifAbsent: [#()])]].
^effectiveNodes!
More information about the Vm-dev
mailing list