VM Maker: VMMaker.oscog-eem.2092.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

VM Maker: VMMaker.oscog-eem.2092.mcz

commits-2
 
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]!