[Vm-dev] VM Maker: VMMaker-dtl.343.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Mar 2 15:43:52 UTC 2014
David T. Lewis uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker-dtl.343.mcz
==================== Summary ====================
Name: VMMaker-dtl.343
Author: dtl
Time: 2 March 2014, 10:42:12.883 am
UUID: 7749056b-e9ad-442f-ba10-457f2eb8c0f4
Ancestors: VMMaker-dtl.342
VMMaker 4.13.3
Fix an obscure bug in generating type declarations caused by unreferenced type declarations remaining after their associated variables have been inlined away. See TMethod>>removeUnreferencedDeclarations.
Document the bug in SlangTest>>testRemoveTypeDeclartionForRemovedIntermediate.
Fix SlangTest>>testSetInstanceVariableWithAnAccessorMethod which contained an error that was masked because the test is an expected failure.
Fix code generator initialization for MemoryAccess.
Note - there is no change to generated C code unless MemoryAccess methods are added to the code generator, therefore regeneration of sources for SVN is not required.
=============== Diff against VMMaker-dtl.342 ===============
Item was changed:
----- Method: Interpreter class>>initializeCodeGenerator: (in category 'translation') -----
initializeCodeGenerator: cg
"Load a code generator with classes in a manner suitable for generating
code for this class."
super initializeCodeGenerator: cg.
+ self initializeClassicObjectMemoryInCodeGenerator: cg.
+ VMMaker addMemoryAccessTo: cg.
+ ^cg
- ^ self initializeClassicObjectMemoryInCodeGenerator: cg
"^ self initializeNewObjectMemoryInCodeGenerator: cg"
!
Item was added:
+ ----- Method: InterpreterPlugin class>>initializeCodeGenerator: (in category 'translation') -----
+ initializeCodeGenerator: cg
+ "Load a code generator with classes in a manner suitable for generating
+ code for this class."
+
+ super initializeCodeGenerator: cg.
+ VMMaker addMemoryAccessTo: cg.
+ ^cg
+ !
Item was added:
+ ----- Method: SlangTest>>testRemoveTypeDeclarationForRemovedIntermediate (in category 'testing var decl requires memoryaccess') -----
+ testRemoveTypeDeclarationForRemovedIntermediate
+ "Document a bug in variable declaration. This is hard to reproduce, so the test uses
+ the actual failure. Necessary conditions are to use MemoryAccess (requires deep
+ inlining), then generate the entire interpreter. The error condition appears in the
+ reverseDisplayFrom:to: method. Generating that method alone is not sufficient to
+ reproduce the bug, the entire interpreter must first be generated, after which the
+ method may be individually generated to inspect for the error condition. Symptoms
+ are that #ptr, which is used as a sqInt, is incorrectly declared as (char *) due to a
+ left over unreferenced declaration in one of the inlined methods.
+ The bug exists as of VMMaker-dtl.342 and is corrected in VMMaker-dtl.343."
+
+ | ma maState |
+ ma := Smalltalk classNamed: #MemoryAccess.
+ ma ifNil: [^ self
+ "requires these accessors in combination with object memory / interpreter refactoring in order to reproduce bug"].
+ maState := ma isEnabled.
+ [ | s cg strm meth |
+ ma enable.
+ cg := CCodeGenerator new initialize.
+ cg declareMethodsStatic: false.
+ Interpreter initializeCodeGenerator: cg.
+ cg vmClass: Interpreter.
+ strm := ReadWriteStream on: ''.
+ cg emitCCodeOn: strm doInlining: true doAssertions: false.
+ meth := cg methodNamed: 'reverseDisplayFrom:to:' .
+ strm := ReadWriteStream on: ''.
+ meth emitCCodeOn: strm generator: cg.
+ s := strm contents.
+ self shouldnt: ('*char #ptr;*' match: s).
+ self should: ('*sqInt ptr;*' match: s)
+ ] ensure: [maState
+ ifTrue: [ma enable]
+ ifFalse: [ma disable]]
+ !
Item was changed:
----- Method: SlangTest>>testSetInstanceVariableWithAnAccessorMethod (in category 'testing intermediate variable removal') -----
testSetInstanceVariableWithAnAccessorMethod
"Intermediate variable from parameter of accessor method should be removed.
This is an existing limitation of the inliner, and could be improved for better code
generation. It is not a bug."
| stssi s |
+ stssi := SlangTestSupportInterpreter inline: true.
+ s := (stssi asCString: #setInstanceVariableWithAnAccessorMethod)
- stssi := SlangTestSupportInterpreter inline: false.
- s := (stssi asInlinedCString: #setInstanceVariableWithAnAccessorMethod)
copyReplaceAll: 'setInstanceVariableWithAnAccessorMethod'
with: 'methodName'.
+ self deny: (s includesSubString: 'sqInt oop').
+ self assert: (s includesSubString: 'aVariable = remap(').
- self assert: (s includesSubString: 'aVariable = remap(objectMemory, nilObj);').
+ "Should be translated to something similar to this:
- "Should be translated like this:
aVariable = remap(objectMemory, nilObj);
Not like this:
oop = remap(objectMemory, nilObj);
aVariable = oop;"
!
Item was added:
+ ----- Method: TMethod>>removeUnreferencedDeclarations (in category 'inlining') -----
+ removeUnreferencedDeclarations
+ "Variables may have been eliminated during inlining. Remove declarations for those variables."
+ declarations keys copy
+ do: [:key | (args , locals includes: key)
+ ifFalse: [declarations removeKey: key]]!
Item was changed:
----- Method: TMethod>>tryToInlineMethodsIn: (in category 'inlining') -----
tryToInlineMethodsIn: aCodeGen
"Expand any (complete) inline methods called by this method. Set the complete bit when all inlining has been done. Return true if something was inlined."
| stmtLists didSomething newStatements sendsToInline |
self definedAsMacro ifTrue:
[complete := true.
^false].
didSomething := false.
sendsToInline := Dictionary new: 100.
parseTree
nodesDo:
[:node|
(self inlineableFunctionCall: node in: aCodeGen) ifTrue:
[sendsToInline at: node put: (self inlineFunctionCall: node in: aCodeGen)]]
unless: "Don't inline the arguments to asserts to keep the asserts readable"
[:node|
node isSend
and: [node selector == #cCode:inSmalltalk:
or: [aCodeGen isAssertSelector: node selector]]].
sendsToInline isEmpty ifFalse:
[didSomething := true.
+ self removeUnreferencedDeclarations.
parseTree := parseTree replaceNodesIn: sendsToInline].
didSomething ifTrue:
[writtenToGlobalVarsCache := nil.
^didSomething].
stmtLists := self statementsListsForInliningIn: aCodeGen.
stmtLists do:
[:stmtList|
newStatements := OrderedCollection new: 100.
stmtList statements do:
[:stmt|
(self inlineCodeOrNilForStatement: stmt in: aCodeGen)
ifNil: [newStatements addLast: stmt]
ifNotNil: [:inlinedStmts|
didSomething := true.
newStatements addAllLast: inlinedStmts]].
stmtList setStatements: newStatements asArray].
didSomething ifTrue:
[writtenToGlobalVarsCache := nil.
^didSomething].
complete ifFalse:
[self checkForCompleteness: stmtLists in: aCodeGen.
complete ifTrue: [ didSomething := true ]]. "marking a method complete is progress"
^didSomething!
Item was removed:
- ----- Method: VMClass class>>initializeCodeGenerator: (in category 'translation') -----
- initializeCodeGenerator: cg
- "Load a code generator with classes in a manner suitable for generating
- code for this class."
-
- super initializeCodeGenerator: cg.
- VMMaker addMemoryAccessTo: cg.
- ^cg
- !
More information about the Vm-dev
mailing list