Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2279.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2279 Author: eem Time: 15 November 2017, 2:26:14.871383 pm UUID: ec78abc1-3128-47b0-bff8-25bab14bae2d Ancestors: VMMaker.oscog-eem.2278 VMMaker: Fix bad misinitialization bug where options from a previous translation were not clearedf out. This caused the recent misgeneration of src/vm/cogit.c Slang: Back out of the inlining optimization used in the logging methods that are now unused. Better format a method. =============== Diff against VMMaker.oscog-eem.2278 =============== Item was changed: ----- Method: BraceNode>>asTranslatorNodeIn: (in category '*VMMaker-C translation') ----- asTranslatorNodeIn: aTMethod "make a CCodeGenerator equivalent of me." "This is for case statements" + (elements allSatisfy: [:elem| elem isMessageNode and: [elem selector key = #->]]) ifTrue: - (elements allSatisfy: - [:elem| - elem isMessageNode - and: [elem selector key = #->]]) ifTrue: [self assert: (elements allSatisfy: [:elem| elem receiver isBlockNode and: [elem arguments first isBlockNode and: [elem receiver isPotentialCCaseLabelIn: aTMethod]]]). ^TBraceCaseNode new caseLabels: (elements collect: [:elem| elem receiver asTranslatorNodeIn: aTMethod]); cases: (elements collect: [:elem| elem arguments first asTranslatorNodeIn: aTMethod]); comment: comment]. "This is for varargs selectors (variants of printf:)" ^elements collect: [:elem| elem asTranslatorNodeIn: aTMethod]! Item was changed: ----- Method: TMethod>>inlineSend:directReturn:exitVar:in: (in category 'inlining') ----- inlineSend: aSendNode directReturn: directReturn exitVar: exitVar in: aCodeGen "Answer a collection of statements to replace the given send. directReturn indicates that the send is the expression in a return statement, so returns can be left in the body of the inlined method. If exitVar is nil, the value returned by the send is not used; thus, returns need not assign to the output variable. Types are propagated to as-yet-untyped variables when inlining a send that is assigned, otherwise the assignee variable type must match the return type of the inlinee. Return types are not propagated." + | sel meth methArgs exitLabel inlineStmts label exitType elidedArgs | - | sel meth methArgs exitLabel inlineStmts exitType elidedArgs argAssignments conditional | sel := aSendNode selector. meth := aCodeGen methodNamed: sel. methArgs := meth args. "convenient for debugging..." aCodeGen maybeBreakForInlineOf: aSendNode in: self. elidedArgs := #(). (methArgs notEmpty and: [methArgs first beginsWith: 'self_in_']) ifTrue: "If the first arg is not used we can and should elide it." [| varNode | varNode := TVariableNode new setName: methArgs first. (meth parseTree noneSatisfy: [:node| varNode isSameAs: node]) ifTrue: [elidedArgs := {methArgs first}]. methArgs := methArgs allButFirst]. methArgs size = aSendNode args size ifFalse: [^nil]. meth := meth copy. (meth statements size > 1 and: [meth statements first isSend and: [meth statements first selector == #flag:]]) ifTrue: [meth statements removeFirst]. "Propagate the return type of an inlined method" (directReturn or: [exitVar notNil]) ifTrue: [exitType := directReturn ifTrue: [returnType] ifFalse: [(self typeFor: exitVar in: aCodeGen) ifNil: [#sqInt]]. (exitType = #void or: [exitType = meth returnType]) ifFalse: [meth propagateReturnIn: aCodeGen]]. "Propagate any unusual argument types to untyped argument variables" methArgs with: aSendNode args do: [:formal :actual| (meth declarationAt: formal ifAbsent: nil) ifNil: [(self typeFor: actual in: aCodeGen) ifNotNil: [:type| type ~= #sqInt ifTrue: [meth declarationAt: formal put: (type last = $* ifTrue: [type, formal] ifFalse: [type, ' ', formal])]]]]. meth renameVarsForInliningInto: self except: elidedArgs in: aCodeGen. meth renameLabelsForInliningInto: self. self addVarsDeclarationsAndLabelsOf: meth except: elidedArgs. meth hasReturn ifTrue: [directReturn ifFalse: [exitLabel := self unusedLabelForInliningInto: self. (meth exitVar: exitVar label: exitLabel) "is label used?" ifTrue: [ labels add: exitLabel ] ifFalse: [ exitLabel := nil ]]]. (inlineStmts := OrderedCollection new: meth statements size + meth args size + 2) + add: (label := TLabeledCommentNode new setComment: 'begin ', sel); + addAll: (self argAssignmentsFor: meth send: aSendNode except: elidedArgs in: aCodeGen); + addAll: meth statements. "method body" - add: (TLabeledCommentNode new setComment: 'begin ', sel). - argAssignments := self argAssignmentsFor: meth send: aSendNode except: elidedArgs in: aCodeGen. - "If the method being inlined is of the form - guard ifTrue: [...] - and the argument assignments have no side effects, - and guard does not refer to the arguments, - push the argument assignments past the guard into the block so that they too are guarded." - (meth statements size = 1 - and: [(conditional := meth statements first) isConditionalSend - and: [conditional numArgs = 1 - and: [(argAssignments noneSatisfy: [:assign| assign expression hasSideEffect]) - and: [conditional receiver noneSatisfy: [:node| node isVariable and: [methArgs includes: node name]]]]]]) - ifTrue: [conditional args first statements addAllFirst: argAssignments] - ifFalse: [inlineStmts addAll: argAssignments]. - inlineStmts addAll: meth statements. "method body" directReturn ifTrue: [meth endsWithReturn ifTrue: [exitVar ifNotNil: "don't remove the returns if being invoked in the context of a return" [inlineStmts at: inlineStmts size put: inlineStmts last copyWithoutReturn]] ifFalse: [inlineStmts add: (TReturnNode new setExpression: (TVariableNode new setName: 'nil'))]]. exitLabel ifNotNil: [inlineStmts add: (TLabeledCommentNode new setLabel: exitLabel comment: 'end ', meth selector)]. inlineStmts size = 1 ifTrue: "Nuke empty methods; e.g. override of flushAtCache" [self assert: inlineStmts first isComment. inlineStmts removeFirst]. ^inlineStmts! Item was changed: ----- Method: VMMaker>>options: (in category 'initialize') ----- options: anArrayOfPairs + optionsDictionary removeAll. self assert: anArrayOfPairs size even. 1 to: anArrayOfPairs size by: 2 do: [:i| | key | key := anArrayOfPairs at: i. self assert: key isSymbol. optionsDictionary at: key put: (anArrayOfPairs at: i + 1)]! |
Free forum by Nabble | Edit this page |