Eliot Miranda uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker.oscog-eem.126.mcz ==================== Summary ==================== Name: VMMaker.oscog-eem.126 Author: eem Time: 22 September 2011, 6:02:25.985 pm UUID: 6af3249f-6c5c-4e1b-8a69-f59e542154c5 Ancestors: VMMaker.oscog-eem.125 Cogit: Fix cPICEndSize mis-computation caused by using rounded-up closedPICSize. Compute cPICEndSize and /then/ round-up closedPICSize. Fix for simulation callTargetFromReturnAddress: asserts in relocation calls. =============== Diff against VMMaker.oscog-eem.125 =============== Item was changed: ----- Method: CogIA32Compiler>>relocateCallBeforeReturnPC:by: (in category 'inline cacheing') ----- relocateCallBeforeReturnPC: retpc by: delta | distance | delta ~= 0 ifTrue: [distance := ((objectMemory byteAt: retpc - 1) << 24) + ((objectMemory byteAt: retpc - 2) << 16) + ((objectMemory byteAt: retpc - 3) << 8) + (objectMemory byteAt: retpc - 4). distance := distance + delta. objectMemory byteAt: retpc - 1 put: (distance >> 24 bitAnd: 16rFF); byteAt: retpc - 2 put: (distance >> 16 bitAnd: 16rFF); byteAt: retpc - 3 put: (distance >> 8 bitAnd: 16rFF); byteAt: retpc - 4 put: (distance bitAnd: 16rFF). false + ifTrue: [self assert: (self callTargetFromReturnAddress: retpc) signedIntToLong >= cogit minCallAddress] + ifFalse: [(self callTargetFromReturnAddress: retpc) signedIntToLong >= cogit minCallAddress ifFalse: - ifTrue: [self assert: (self callTargetFromReturnAddress: retpc) >= cogit minCallAddress] - ifFalse: [(self callTargetFromReturnAddress: retpc) >= cogit minCallAddress ifFalse: [self error: 'relocating call to invalid address']]]! Item was changed: ----- Method: CogIA32Compiler>>rewriteCallAt:target: (in category 'inline cacheing') ----- rewriteCallAt: callSiteReturnAddress target: callTargetAddress "Rewrite a call instruction to call a different target. This variant is used to link PICs in ceSendMiss et al, and to rewrite cached primitive calls. Answer the extent of the code change which is used to compute the range of the icache to flush." <var: #callSiteReturnAddress type: #usqInt> | callDistance | "self cCode: '' inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]." false ifTrue: [self assert: callTargetAddress >= cogit minCallAddress] ifFalse: [callTargetAddress >= cogit minCallAddress ifFalse: [self error: 'linking callsite to invalid address']]. callDistance := (callTargetAddress - callSiteReturnAddress) signedIntToLong. objectMemory byteAt: callSiteReturnAddress - 1 put: (callDistance >> 24 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 2 put: (callDistance >> 16 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 3 put: (callDistance >> 8 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 4 put: (callDistance bitAnd: 16rFF). + self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) signedIntToLong = callTargetAddress. - self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) = callTargetAddress. "self cCode: '' inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]." ^5! Item was changed: ----- Method: CogIA32Compiler>>rewriteInlineCacheAt:tag:target: (in category 'inline cacheing') ----- rewriteInlineCacheAt: callSiteReturnAddress tag: cacheTag target: callTargetAddress "Rewrite an inline cache to call a different target for a new tag. This variant is used to link unlinked sends in ceSend:to:numArgs: et al. Answer the extent of the code change which is used to compute the range of the icache to flush." <var: #callSiteReturnAddress type: #usqInt> | callDistance | "self cCode: '' inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]." false ifTrue: [self assert: callTargetAddress >= cogit minCallAddress] ifFalse: [callTargetAddress >= cogit minCallAddress ifFalse: [self error: 'linking callsite to invalid address']]. callDistance := (callTargetAddress - callSiteReturnAddress) signedIntToLong. objectMemory byteAt: callSiteReturnAddress - 1 put: (callDistance >> 24 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 2 put: (callDistance >> 16 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 3 put: (callDistance >> 8 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 4 put: (callDistance bitAnd: 16rFF); byteAt: callSiteReturnAddress - 6 put: (cacheTag >> 24 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 7 put: (cacheTag >> 16 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 8 put: (cacheTag >> 8 bitAnd: 16rFF); byteAt: callSiteReturnAddress - 9 put: (cacheTag bitAnd: 16rFF). + self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) signedIntToLong = callTargetAddress. - self assert: (self callTargetFromReturnAddress: callSiteReturnAddress) = callTargetAddress. "self cCode: '' inSmalltalk: [cogit disassembleFrom: callSiteReturnAddress - 10 to: callSiteReturnAddress - 1]." ^10! Item was changed: ----- Method: Cogit>>generateClosedPICPrototype (in category 'initialization') ----- generateClosedPICPrototype "Generate the prototype ClosedPIC to determine how much space as full PIC takes. When we first allocate a closed PIC it only has one or two cases and we want to grow it. So we have to determine how big a full one is before hand." | headerSize | numPICCases := 6. "stack allocate the various collections so that they are effectively garbage collected on return." self allocateOpcodes: numPICCases * 7 bytecodes: 0. self compileClosedPICPrototype. self computeMaximumSizes. headerSize := self sizeof: CogMethod. + closedPICSize := headerSize + (self generateInstructionsAt: methodZoneBase + headerSize). - closedPICSize := methodZone roundUpLength: headerSize + (self generateInstructionsAt: methodZoneBase + headerSize). firstCPICCaseOffset := endCPICCase0 address - methodZoneBase. cPICCaseSize := endCPICCase1 address - endCPICCase0 address. + cPICEndSize := closedPICSize - (numPICCases - 1 * cPICCaseSize + firstCPICCaseOffset). + closedPICSize := methodZone roundUpLength: closedPICSize - cPICEndSize := closedPICSize - (numPICCases - 1 * cPICCaseSize + firstCPICCaseOffset) "self cCode: '' inSmalltalk: [| end | end := self outputInstructionsAt: methodZoneBase + headerSize. self disassembleFrom: methodZoneBase + headerSize to: end - 1. self halt]"! |
Free forum by Nabble | Edit this page |