Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2092.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2092 Author: eem Time: 15 January 2017, 5:15:16.260067 pm UUID: fc6e5ee2-2b3a-4a94-bbf5-d0ac982d8d8d Ancestors: VMMaker.oscog-eem.2091 Cogit: Finally understand and fix the non-local return stack depth assert fail issue. Interpreter: Make printFrame: lax enough to accept a married context and print its frame without complaint. =============== Diff against VMMaker.oscog-eem.2091 =============== Item was removed: - ----- Method: CogVMSimulator>>externalAboutToReturn:through: (in category 'return bytecodes') ----- - externalAboutToReturn: resultOop through: aContext - self transcript ensureCr. - self print: 'externalAboutToReturn: '; printOopShortInner: resultOop; - print: ' through: '; printOopShortInner: aContext; - print: ' in '; printActivationNameFor: (self frameMethodObject: framePointer) - receiver: (self frameReceiver: framePointer) - isBlock: (self frameIsBlockActivation: framePointer) - firstTemporary: (self temporary: 0 in: framePointer); - cr. - ^super externalAboutToReturn: resultOop through: aContext! Item was changed: ----- Method: CogVMSimulator>>maybeCheckStackDepth:sp:pc: (in category 'debug support') ----- maybeCheckStackDepth: delta sp: sp pc: mcpc | asp bcpc startbcpc cogHomeMethod cogBlockMethod csp debugStackPointers | debugStackDepthDictionary ifNil: [^self]. (self isMachineCodeFrame: framePointer) ifFalse: [^self]. cogBlockMethod := self mframeCogMethod: framePointer. cogHomeMethod := self asCogHomeMethod: cogBlockMethod. debugStackPointers := debugStackDepthDictionary at: cogHomeMethod methodObject ifAbsentPut: [self debugStackPointersFor: cogHomeMethod methodObject]. startbcpc := cogHomeMethod = cogBlockMethod ifTrue: [self startPCOfMethod: cogHomeMethod methodObject] ifFalse: [self startPCOfClosure: (self pushedReceiverOrClosureOfFrame: framePointer)]. bcpc := cogit bytecodePCFor: mcpc startBcpc: startbcpc in: cogBlockMethod. self assert: bcpc ~= 0. + (cogBlockMethod ~= cogHomeMethod + and: [cogit isNonLocalReturnPC: mcpc]) ifTrue: - cogBlockMethod ~= cogHomeMethod ifTrue: [| lastbcpc | + "Method returns within a block (within an unwind-protect) must check the stack depth at the + return, not the bytecode following, but the pc mapping maps to the bytecode following the + return. lastBytecodePCForBlockAt:in: catches method returns at the end of a block, modifying + the bcpc to that of the return. isNonLocalReturnPC: catches method returns not at the end. + Assumes method return bytecodes are 1 bytecode long;a dodgy assumption, but good enough." lastbcpc := cogit lastBytecodePCForBlockAt: startbcpc in: cogHomeMethod methodObject. + bcpc := bcpc > lastbcpc ifTrue: [lastbcpc] ifFalse: [bcpc - 1]]. - bcpc > lastbcpc ifTrue: - [bcpc := lastbcpc]]. asp := self stackPointerIndexForFrame: framePointer WithSP: sp + objectMemory wordSize. csp := debugStackPointers at: bcpc ifAbsent: [-1]. "Compensate lazily for absent receiver sends." (NewspeakVM and: [asp - delta = csp and: [cogit isAbsentReceiverSendAt: mcpc in: cogHomeMethod]]) ifTrue: [csp := debugStackPointers at: bcpc put: csp + 1]. self assert: asp - delta + 1 = csp! Item was added: + ----- Method: Cogit>>isNonLocalReturnPC: (in category 'jit - api') ----- + isNonLocalReturnPC: retpc + <doNotGenerate> + "Answer if the instruction preceding retpc is a call instruction." + (backEnd isCallPrecedingReturnPC: retpc) ifFalse: + [^false]. + ^(backEnd callTargetFromReturnAddress: retpc) = ceNonLocalReturnTrampoline! Item was changed: ----- Method: StackInterpreter>>printFrame: (in category 'debug printing') ----- printFrame: theFP | thePage frameAbove theSP | <inline: false> <var: #theFP type: #'char *'> <var: #theSP type: #'char *'> <var: #frameAbove type: #'char *'> <var: #thePage type: #'StackPage *'> (stackPages couldBeFramePointer: theFP) ifFalse: + [((objectMemory addressCouldBeObj: theFP asInteger) + and: [(objectMemory isInMemory: theFP asInteger) + and: [(objectMemory isContextNonImm: theFP asInteger) + and: [(self checkIsStillMarriedContext: theFP asInteger currentFP: framePointer)]]]) ifTrue: + [^self printFrame: (self frameOfMarriedContext: theFP asInteger)]. + self printHexPtr: theFP; print: ' is not in the stack zone?!!'; cr. - [self printHexPtr: theFP; print: ' is not in the stack zone?!!'; cr. ^nil]. frameAbove := nil. theFP = framePointer ifTrue: [theSP := stackPointer] ifFalse: [thePage := stackPages stackPageFor: theFP. (stackPages isFree: thePage) ifTrue: [self printHexPtr: theFP; print: ' is on a free page?!!'; cr. ^nil]. (thePage ~= stackPage and: [theFP = thePage headFP]) ifTrue: [theSP := thePage headSP] ifFalse: [frameAbove := self safeFindFrameAbove: theFP on: thePage startingFrom: ((thePage = stackPage and: [framePointer between: thePage realStackLimit and: thePage baseAddress]) ifTrue: [framePointer] ifFalse: [thePage headFP]). theSP := frameAbove ifNotNil: [self frameCallerSP: frameAbove]]]. theSP ifNil: [self print: 'could not find sp; using bogus value'; cr. theSP := self frameReceiverLocation: theFP]. self printFrame: theFP WithSP: theSP. frameAbove ifNotNil: [self printFrameThing: 'frame pc' at: frameAbove + FoxCallerSavedIP]! |
Free forum by Nabble | Edit this page |