Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.2202.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.2202 Author: eem Time: 26 April 2017, 2:45:32.212149 pm UUID: 664974d4-7a05-43ae-a940-515e14f5f110 Ancestors: VMMaker.oscog-cb.2201 Fix pc mapping issue with inlined identityhash primitive. Inlined primitives are not mapped. Fix extension issue with bc-mc mapping tests. As elsewhere, the mapped bcpc is that of the prefixed bytecode, not the bytecode following the prefix. =============== Diff against VMMaker.oscog-cb.2201 =============== Item was changed: ----- Method: CogObjectRepresentationForSpur>>genGetIdentityHash:resultReg: (in category 'sista support') ----- genGetIdentityHash: rcvrReg resultReg: resultReg <var: #jumpSet type: #'AbstractInstruction *'> | jumpSet | "ReceiverResultReg is required for the trampoline. We force the allocation, and we have two path to avoid conflicts in ReceiverResultReg." cogit voidReceiverResultRegContainsSelf. resultReg = ReceiverResultReg ifTrue: [cogit ssTop popToReg: rcvrReg. self genGetHashFieldNonImmOf: rcvrReg asSmallIntegerInto: resultReg. cogit CmpCq: ConstZero R: resultReg. jumpSet := cogit JumpNonZero: 0. cogit MoveR: rcvrReg R: resultReg. + cogit CallRT: ceInlineNewHashTrampoline] - cogit CallRT: ceInlineNewHashTrampoline. - cogit annotateBytecode: cogit Label] ifFalse: [cogit ssTop popToReg: ReceiverResultReg. self genGetHashFieldNonImmOf: ReceiverResultReg asSmallIntegerInto: resultReg. cogit CmpCq: ConstZero R: resultReg. jumpSet := cogit JumpNonZero: 0. cogit CallRT: ceInlineNewHashTrampoline. + cogit MoveR: ReceiverResultReg R: resultReg]. - cogit annotateBytecode: (cogit MoveR: ReceiverResultReg R: resultReg)]. jumpSet jmpTarget: cogit Label! Item was changed: ----- Method: Cogit>>testBcToMcPcMappingForCogMethod: (in category 'testing') ----- testBcToMcPcMappingForCogMethod: cogMethod <doNotGenerate> "self disassembleMethod: cogMethod" "self printPCMapPairsFor: cogMethod on: Transcript" | aMethodObj subMethods bsOffset | aMethodObj := cogMethod methodObject. subMethods := self subMethodsAsRangesFor: cogMethod. subMethods first endPC: (self endPCOf: aMethodObj). bsOffset := self bytecodeSetOffsetFor: aMethodObj. self bcpcsDescriptorsAndStartpcsFor: aMethodObj bsOffset: bsOffset do: [:bcpc :byte :desc :nExts :startpc| (desc notNil and: [desc isBlockCreation]) ifTrue: ["dead code removal may result in blocks not being generated ;-)" (subMethods detect: [:sm| sm startpc = (bcpc + desc numBytes)] ifNone: [nil]) ifNotNil: [:subMethod| subMethod endPC: bcpc + desc numBytes + (self spanFor: desc at: bcpc exts: -1 in: aMethodObj) - 1]]]. subMethods allButFirst do: [:blockSubMethod| | cogBlockMethod | cogBlockMethod := self findMethodForStartBcpc: blockSubMethod startpc inHomeMethod: cogMethod. self assert: cogBlockMethod address = (blockSubMethod first - (self sizeof: CogBlockMethod))]. self bcpcsDescriptorsAndStartpcsFor: aMethodObj bsOffset: bsOffset do: [:bcpc :byte :desc :nExts :startpc| | startBcpc currentSubMethod subCogMethod absMcpc mappedBcpc | currentSubMethod := self innermostSubMethodFor: bcpc in: subMethods startingAt: 1. startpc = currentSubMethod startpc ifTrue: [subCogMethod := currentSubMethod cogMethod. (subCogMethod stackCheckOffset > 0 and: [desc isNil or: [desc isMapped or: [inBlock = InFullBlock and: [desc isMappedInBlock]]]]) ifTrue: [startBcpc := subCogMethod = cogMethod ifTrue: [coInterpreter startPCOfMethod: aMethodObj] ifFalse: [currentSubMethod startpc]. "The first bytecode and backward branch bytecodes are mapped to their pc. Other bytecodes map to their following pc." absMcpc := (desc notNil and: [desc isBranch and: [self isBackwardBranch: desc at: bcpc exts: nExts in: aMethodObj]]) ifTrue: "Backward branches have a special mapper" + [mappedBcpc := bcpc - (2 * nExts). - [mappedBcpc := bcpc. self mcPCForBackwardBranch: mappedBcpc startBcpc: startBcpc in: subCogMethod] ifFalse: "All others use the generic mapper" [mappedBcpc := desc ifNil: [bcpc] ifNotNil: [bcpc + desc numBytes]. self mcPCFor: mappedBcpc startBcpc: startBcpc in: subCogMethod]. self assert: absMcpc >= (subCogMethod asInteger + subCogMethod stackCheckOffset). self assert: (self bytecodePCFor: absMcpc startBcpc: startBcpc in: subCogMethod) = mappedBcpc]]]! |
Free forum by Nabble | Edit this page |