Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2650.mcz ==================== 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 Cogit: 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. Plugins: 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') ----- genFFICalloutTrampoline <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 <doNotGenerate> | 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'] ifFalse: [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 ifTrue: [(leaf := coInterpreter mcprims includes: function) ifTrue: [processor simulateLeafCallOf: aProcessorSimulationTrap address nextpc: aProcessorSimulationTrap nextpc memory: memory. retpc := processor leafRetpcIn: memory] ifFalse: [processor simulateCallOf: aProcessorSimulationTrap address nextpc: aProcessorSimulationTrap nextpc memory: memory. retpc := processor retpcIn: memory]. self recordInstruction: {'(simulated call of '. aProcessorSimulationTrap address. '/'. function. ')'}] ifFalse: [leaf := false. processor 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]]] ifFalse: [self assert: savedFramePointer = coInterpreter framePointer. self assert: savedStackPointer = coInterpreter stackPointer]]. result ~~ #continueNoReturn ifTrue: [self recordInstruction: {'(simulated return to '. processor retpcIn: memory. ')'}. leaf 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| 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" <doNotGenerate> | class classSize classNameIndex thisClassIndex | + (hiddenRootsObj notNil + and: [word between: 1 and: self classIndexMask]) ifFalse: - (word between: 1 and: self classIndexMask) ifFalse: [^nil]. 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: [^nil]. "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]! |
Free forum by Nabble | Edit this page |