VM Maker: VMMaker.oscog-eem.2650.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.2650.mcz

Eliot Miranda uploaded a new version of VMMaker to project VM Maker:

==================== Summary ====================

Name: VMMaker.oscog-eem.2650
Author: eem
Time: 6 January 2020, 4:10:39.496587 pm
UUID: ee83002f-875b-4b5f-bfe7-83c57d677666
Ancestors: VMMaker.oscog-eem.2649

Fix a slip in Lowcode FFI trampoline generation.
Nuke leak checking in run-time calls (getting the stack offset for on-stack pcs right is tricky and so the feature isn't useful without a lot more work, and the current bug wasn't caught by it anyway).
Add robustness to printing ARMv8 embedded 32-bit constants.
Better Halt message when stopping at an opcode breakpoint.

Survive double closes in the FilePluginSimulator.

=============== Diff against VMMaker.oscog-eem.2649 ===============

Item was changed:
  ----- Method: Cogit>>abstractInstructionAt: (in category 'compile abstract instructions') -----
  abstractInstructionAt: index
  <cmacro: '(index) (&abstractOpcodes[index])'>
  <returnTypeC: #'AbstractInstruction *'>
  ((debugOpcodeIndices includes: index)
  and: [breakMethod isNil or: [methodObj = breakMethod]]) ifTrue:
+ [self halt: 'Accessing opcode index ', index printString].
- [self halt].
  ^abstractOpcodes at: index!

Item was changed:
  ----- Method: Cogit>>genFFICalloutTrampoline (in category 'initialization') -----
  <option: #LowcodeVM>
  | startAddress |
+ self zeroOpcodeIndexForNewOpcodes.
- opcodeIndex := 0.
  backEnd hasLinkRegister ifTrue: [
  self MoveR: LinkReg Aw: coInterpreter instructionPointerAddress
  ] ifFalse: [
  self PopR: backEnd registerToSaveIP.
  self MoveR: backEnd registerToSaveIP Aw: coInterpreter instructionPointerAddress
  self CallR: TempReg.
  backEnd hasLinkRegister ifTrue: [
  self MoveAw: coInterpreter instructionPointerAddress R: LinkReg
  ] ifFalse: [
  self MoveAw: coInterpreter instructionPointerAddress R: backEnd registerToSaveIP.
  self PushR: backEnd registerToSaveIP.
  self RetN: 0.
  startAddress := methodZoneBase.
  self outputInstructionsForGeneratedRuntimeAt: startAddress.
  self recordGeneratedRunTime: 'ceFFICalloutTrampoline' address: startAddress.
  self recordRunTimeObjectReferences.
  ^ startAddress

Item was changed:
  ----- Method: Cogit>>handleCallOrJumpSimulationTrap: (in category 'simulation only') -----
  handleCallOrJumpSimulationTrap: aProcessorSimulationTrap
  | evaluable function memory result savedFramePointer savedStackPointer savedArgumentCount leaf retpc |
- objectMemory maybeLeakCheckForRuntimeCall.
  evaluable := simulatedTrampolines
  at: aProcessorSimulationTrap address
  ifAbsent: [self errorProcessingSimulationTrap: aProcessorSimulationTrap
  in: simulatedTrampolines].
  function := evaluable isBlock
  ifTrue: ['aBlock; probably some plugin primitive']
  [evaluable receiver == backEnd ifTrue:
  [^self handleABICallOrJumpSimulationTrap: aProcessorSimulationTrap evaluable: evaluable].
  evaluable selector].
  function ~~ #ceBaseFrameReturn: ifTrue:
  [coInterpreter assertValidExternalStackPointers].
  (backEnd wantsNearAddressFor: function) ifTrue:
  [^self perform: function with: aProcessorSimulationTrap].
  memory := coInterpreter memory.
  aProcessorSimulationTrap type == #call
  [(leaf := coInterpreter mcprims includes: function)
  simulateLeafCallOf: aProcessorSimulationTrap address
  nextpc: aProcessorSimulationTrap nextpc
  memory: memory.
  retpc := processor leafRetpcIn: memory]
  simulateCallOf: aProcessorSimulationTrap address
  nextpc: aProcessorSimulationTrap nextpc
  memory: memory.
  retpc := processor retpcIn: memory].
  self recordInstruction: {'(simulated call of '. aProcessorSimulationTrap address. '/'. function. ')'}]
  [leaf := false.
  simulateJumpCallOf: aProcessorSimulationTrap address
  memory: memory.
  retpc := processor retpcIn: memory. "sideways call; the primitive has pushed a return address."
  self recordInstruction: {'(simulated jump to '. aProcessorSimulationTrap address. '/'. function. ')'}].
  savedFramePointer := coInterpreter framePointer.
  savedStackPointer := coInterpreter stackPointer.
  savedArgumentCount := coInterpreter argumentCount.
  result := ["self halt: evaluable selector."
      clickConfirm ifTrue:
  [(self confirm: 'skip run-time call?') ifFalse:
  [clickConfirm := false. self halt]].
    evaluable valueWithArguments: (processor
  postCallArgumentsNumArgs: evaluable numArgs
  in: memory)]
  on: ReenterMachineCode
  do: [:ex| ex return: ex returnValue].
  coInterpreter assertValidExternalStackPointers.
- objectMemory maybeLeakCheckForRuntimeCall.
  "Verify the stack layout assumption compileInterpreterPrimitive: makes, provided we've
  not called something that has built a frame, such as closure value or evaluate method, or
  switched frames, such as primitiveSignal, primitiveWait, primitiveResume, primitiveSuspend et al."
  (function beginsWith: 'primitive') ifTrue:
  [coInterpreter checkForLastObjectOverwrite.
  coInterpreter primFailCode = 0
  ifTrue: [(#( primitiveClosureValue primitiveClosureValueWithArgs primitiveClosureValueNoContextSwitch
  primitiveFullClosureValue primitiveFullClosureValueWithArgs primitiveFullClosureValueNoContextSwitch
  primitiveSignal primitiveWait primitiveResume primitiveSuspend primitiveYield
  primitiveExecuteMethodArgsArray primitiveExecuteMethod
  primitivePerform primitivePerformWithArgs primitivePerformInSuperclass
  primitiveTerminateTo primitiveStoreStackp primitiveDoPrimitiveWithArgs)
  includes: function) ifFalse:
  ["This is a rare case (e.g. in Scorch where a married context's sender is set to nil on trapTrpped and hence the stack layout is altered."
  (function == #primitiveSlotAtPut and: [objectMemory isContext: (coInterpreter frameReceiver: coInterpreter framePointer)]) ifFalse:
  [self assert: savedFramePointer = coInterpreter framePointer.
  self assert: savedStackPointer + (savedArgumentCount * objectMemory wordSize)
  = coInterpreter stackPointer]]]
  [self assert: savedFramePointer = coInterpreter framePointer.
  self assert: savedStackPointer = coInterpreter stackPointer]].
  result ~~ #continueNoReturn ifTrue:
  [self recordInstruction: {'(simulated return to '. processor retpcIn: memory. ')'}.
  ifTrue: [processor simulateLeafReturnIn: memory]
  ifFalse: [processor simulateReturnIn: memory].
  self assert: processor pc = retpc.
  processor smashCallerSavedRegistersWithValuesFrom: 16r80000000 by: objectMemory wordSize in: memory].
  self assert: (result isInteger "an oop result"
  or: [result == coInterpreter
  or: [result == objectMemory
  or: [#(nil continue continueNoReturn) includes: result]]]).
  processor cResultRegister: (result
  ifNil: [0]
  ifNotNil: [result isInteger
  ifTrue: [result]
  ifFalse: [16rF00BA222]])
  "coInterpreter cr.
  processor sp + 32 to: processor sp - 32 by: -4 do:
  sp = processor sp
  ifTrue: [coInterpreter print: 'sp->'; tab]
  ifFalse: [coInterpreter printHex: sp].
  coInterpreter tab; printHex: (coInterpreter longAt: sp); cr]"!

Item was changed:
  ----- Method: FilePluginSimulator>>close (in category 'initialize-release') -----
+ close
+ "close any files that ST may have opened"
+ openFiles do:
+ [:f |
+ [f close]
+ on: Error
+ do: [:ex|
+ ex messageText ~= 'primClose: failed' ifTrue:
+ [ex pass]]]!
- close  "close any files that ST may have opened"
- openFiles do: [:f | f close]!

Item was removed:
- ----- Method: NewObjectMemory>>maybeLeakCheckForRuntimeCall (in category 'debug support') -----
- maybeLeakCheckForRuntimeCall
- <doNotGenerate>
- (checkForLeaks bitAnd: 32) ~= 0 ifTrue:
- [coInterpreter runLeakChecker]!

Item was changed:
  ----- Method: SpurMemoryManager>>lookup32BitWordConstant: (in category 'simulation only') -----
  lookup32BitWordConstant: word
  "If word appears to be a class index answer the class name, otherwise answer nil.
  For code disassembly"
  | class classSize classNameIndex thisClassIndex |
+ (hiddenRootsObj notNil
+ and: [word between: 1 and: self classIndexMask]) ifFalse:
- (word between: 1 and: self classIndexMask) ifFalse:
  class := self noCheckClassAtIndex: word.
  (class isNil or: [class = nilObj]) ifTrue:
  [^nil]. "address is either a class or a metaclass, or an instance of a class or invalid.  determine which."
  classNameIndex := coInterpreter classNameIndex.
  thisClassIndex := coInterpreter thisClassIndex.
  ((classSize := self numSlotsOf: class) <= (classNameIndex max: thisClassIndex)
  or: [classSize > 255]) ifTrue:
  "Address could be a class or a metaclass"
  (self lookupAddress: (self fetchPointer: classNameIndex ofObject: class)) ifNotNil:
  [:maybeClassName| ^maybeClassName allButFirst].
  (self lookupAddress: (self fetchPointer: thisClassIndex ofObject: class)) ifNotNil:
  [:maybeClassName| ^maybeClassName allButFirst, ' class'].!

Item was removed:
- ----- Method: SpurMemoryManager>>maybeLeakCheckForRuntimeCall (in category 'debug support') -----
- maybeLeakCheckForRuntimeCall
- <doNotGenerate>
- (checkForLeaks bitAnd: 32) ~= 0 ifTrue:
- [coInterpreter runLeakChecker]!