Esteban Lorenzano uploaded a new version of VMMaker to project VM Maker: http://source.squeak.org/VMMaker/VMMaker-oscog-EstebanLorenzano.140.mcz ==================== Summary ==================== Name: VMMaker-oscog-EstebanLorenzano.140 Author: EstebanLorenzano Time: 18 November 2011, 6:03:18 pm UUID: 1961b8af-fb68-4813-89a9-67f2401441d0 Ancestors: VMMaker-oscog-EstebanLorenzano.139, VMMaker.oscog-eem.139 -merged with Eliot's 139. Everything seems to work =============== Diff against VMMaker-oscog-EstebanLorenzano.139 =============== Item was changed: ----- Method: CogMethodZone>>compactCompiledCode: (in category 'compaction') ----- compactCompiledCode: objectHeaderValue | source dest bytes | <var: #source type: #'CogMethod *'> <var: #dest type: #'CogMethod *'> source := coInterpreter cCoerceSimple: baseAddress to: #'CogMethod *'. openPICList := nil. [source < self limitZony and: [source cmType ~= CMFree]] whileTrue: [self assert: (cogit cogMethodDoesntLookKosher: source) = 0. source objectHeader: objectHeaderValue. source cmUsageCount > 0 ifTrue: [source cmUsageCount: source cmUsageCount // 2]. source cmType = CMOpenPIC ifTrue: [source nextOpenPIC: openPICList asUnsignedInteger. openPICList := source]. source := self methodAfter: source]. source >= self limitZony ifTrue: [^self halt: 'no free methods; cannot compact.']. dest := source. [source < self limitZony] whileTrue: [self assert: (cogit maybeFreeCogMethodDoesntLookKosher: source) = 0. bytes := source blockSize. source cmType ~= CMFree ifTrue: [self mem: dest mo: source ve: bytes. dest objectHeader: objectHeaderValue. dest cmType = CMMethod ifTrue: ["For non-Newspeak there should ne a one-to-one mapping metween bytecoded and cog methods. For Newspeak not necessarily, but only for anonymous accessors." self assert: ((coInterpreter rawHeaderOf: dest methodObject) asInteger = source asInteger + or: [(cogit noAssertMethodClassAssociationOf: dest methodObject) = objectMemory nilObject]). - or: [(coInterpreter noAssertMethodClassAssociationOf: dest methodObject) = objectMemory nilObject]). "Only update the original method's header if it is referring to this CogMethod." (coInterpreter rawHeaderOf: dest methodObject) asInteger = source asInteger ifTrue: [coInterpreter rawHeaderOf: dest methodObject put: dest asInteger]] ifFalse: [dest cmType = CMOpenPIC ifTrue: [dest nextOpenPIC: openPICList asUnsignedInteger. openPICList := dest]]. dest cmUsageCount > 0 ifTrue: [dest cmUsageCount: dest cmUsageCount // 2]. dest := coInterpreter cCoerceSimple: dest asInteger + bytes to: #'CogMethod *']. source := coInterpreter cCoerceSimple: source asInteger + bytes to: #'CogMethod *']. mzFreeStart := dest asInteger. methodBytesFreedSinceLastCompaction := 0! Item was removed: - ----- Method: CogVMSimulator>>printCallStackOf: (in category 'debug printing') ----- - printCallStackOf: aContext - self printCallStackOf: aContext currentFP: localFP! Item was changed: ----- Method: Cogit>>cog:selector: (in category 'jit - api') ----- cog: aMethodObj selector: aSelectorOop "Attempt to produce a machine code method for the bytecode method object aMethodObj. N.B. If there is no code memory available do *NOT* attempt to reclaim the method zone. Certain clients (e.g. ceSICMiss:) depend on the zone remaining constant across method generation." <api> <returnTypeC: #'CogMethod *'> | cogMethod | <var: #cogMethod type: #'CogMethod *'> self assert: ((coInterpreter methodHasCogMethod: aMethodObj) not + or: [(self noAssertMethodClassAssociationOf: aMethodObj) = objectMemory nilObject]). - or: [(coInterpreter noAssertMethodClassAssociationOf: aMethodObj) = objectMemory nilObject]). "coInterpreter stringOf: aSelectorOop" coInterpreter compilationBreak: aSelectorOop point: (objectMemory lengthOf: aSelectorOop). aMethodObj = breakMethod ifTrue: [self halt: 'Compilation of breakMethod']. self cppIf: NewspeakVM ifTrue: [cogMethod := methodZone findPreviouslyCompiledVersionOf: aMethodObj with: aSelectorOop. cogMethod ifNotNil: [(coInterpreter methodHasCogMethod: aMethodObj) not ifTrue: [self assert: (coInterpreter rawHeaderOf: aMethodObj) = cogMethod methodHeader. cogMethod methodObject: aMethodObj. coInterpreter rawHeaderOf: aMethodObj put: cogMethod asInteger]. ^cogMethod]]. methodObj := aMethodObj. cogMethod := self compileCogMethod: aSelectorOop. (cogMethod asInteger between: MaxNegativeErrorCode and: -1) ifTrue: [cogMethod asInteger >= MaxUnreportableError ifTrue: [cogMethod asInteger = InsufficientCodeSpace ifTrue: [coInterpreter callForCogCompiledCodeCompaction]] ifFalse: [self reportError: (self cCoerceSimple: cogMethod to: #sqInt)]. ^nil]. "self cCode: '' inSmalltalk: [coInterpreter printCogMethod: cogMethod. ""coInterpreter symbolicMethod: aMethodObj."" self assertValidMethodMap: cogMethod." "self disassembleMethod: cogMethod." "printInstructions := clickConfirm := true""]." ^cogMethod! Item was changed: ----- Method: Cogit>>mapObjectReferencesInMachineCodeForBecome (in category 'garbage collection') ----- mapObjectReferencesInMachineCodeForBecome "Update all references to objects in machine code for a become. Unlike incrementalGC or fullGC a method that does not refer to young may refer to young as a result of the become operation." | cogMethod hasYoungObj hasYoungObjPtr freedPIC | <var: #cogMethod type: #'CogMethod *'> hasYoungObj := false. hasYoungObjPtr := self cCode: [(self addressOf: hasYoungObj) asInteger] inSmalltalk: [CPluggableAccessor new setObject: nil; atBlock: [:obj :idx| hasYoungObj] atPutBlock: [:obj :idx :val| hasYoungObj := val]]. codeModified := freedPIC := false. self mapObjectReferencesInGeneratedRuntime. cogMethod := self cCoerceSimple: methodZoneBase to: #'CogMethod *'. [cogMethod < methodZone limitZony] whileTrue: [self assert: hasYoungObj not. cogMethod cmType ~= CMFree ifTrue: [self assert: (self cogMethodDoesntLookKosher: cogMethod) = 0. cogMethod selector: (objectRepresentation remapOop: cogMethod selector).. cogMethod cmType = CMClosedPIC ifTrue: [((objectMemory isYoung: cogMethod selector) or: [self mapObjectReferencesInClosedPIC: cogMethod]) ifTrue: [freedPIC := true. methodZone freeMethod: cogMethod]] ifFalse: [(objectMemory isYoung: cogMethod selector) ifTrue: [hasYoungObj := true]. cogMethod cmType = CMMethod ifTrue: [self assert: cogMethod objectHeader = objectMemory nullHeaderForMachineCodeMethod. cogMethod methodObject: (objectRepresentation remapOop: cogMethod methodObject). self assert: ((coInterpreter rawHeaderOf: cogMethod methodObject) = cogMethod asInteger + or: [(self noAssertMethodClassAssociationOf: cogMethod methodObject) - or: [(coInterpreter noAssertMethodClassAssociationOf: cogMethod methodObject) = objectMemory nilObject]). (objectMemory isYoung: cogMethod methodObject) ifTrue: [hasYoungObj := true]]. self mapFor: cogMethod performUntil: (self cppIf: NewspeakVM ifTrue: [#remapNSIfObjectRef:pc:hasYoung: asSymbol] ifFalse: [#remapIfObjectRef:pc:hasYoung: asSymbol]) arg: hasYoungObjPtr. hasYoungObj ifTrue: [cogMethod cmRefersToYoung ifFalse: [cogMethod cmRefersToYoung: true. methodZone addToYoungReferrers: cogMethod]. hasYoungObj := false] ifFalse: [cogMethod cmRefersToYoung: false]]]. cogMethod := methodZone methodAfter: cogMethod]. methodZone pruneYoungReferrers. freedPIC ifTrue: [self unlinkSendsToFree. codeModified := true]. codeModified ifTrue: "After updating oops in inline caches we need to flush the icache." [processor flushICacheFrom: codeBase to: methodZone limitZony asInteger]! Item was added: + ----- Method: CurrentImageCoInterpreterFacade>>interpretAddress (in category 'accessing') ----- + interpretAddress + ^self addressForLabel: #interpret! Item was added: + ----- Method: CurrentImageCoInterpreterFacade>>primitiveFailAddress (in category 'accessing') ----- + primitiveFailAddress + ^self addressForLabel: #primitiveFail! Item was changed: ----- Method: IA32ABIPlugin class>>simulatorClass (in category 'simulation only') ----- simulatorClass + ^NewspeakVM ifFalse: [IA32ABIPluginSimulator]! - ^IA32ABIPluginSimulator! Item was added: + ----- Method: IA32ABIPluginSimulator>>longAt: (in category 'memory access') ----- + longAt: byteAddress + ^interpreterProxy longAt: byteAddress! Item was added: + ----- Method: IA32ABIPluginSimulator>>longAt:put: (in category 'memory access') ----- + longAt: byteAddress put: a32BitValue + ^interpreterProxy longAt: byteAddress put: a32BitValue! Item was added: + ----- Method: NewCoObjectMemorySimulator class>>vmProxyMajorVersion (in category 'simulation only') ----- + vmProxyMajorVersion + "hack around the CoInterpreter/ObjectMemory split refactoring" + ^CoInterpreter vmProxyMajorVersion! Item was added: + ----- Method: NewCoObjectMemorySimulator class>>vmProxyMinorVersion (in category 'simulation only') ----- + vmProxyMinorVersion + "hack around the CoInterpreter/ObjectMemory split refactoring" + ^CoInterpreter vmProxyMinorVersion! Item was added: + ----- Method: NewCoObjectMemorySimulator>>internalIsImmutable: (in category 'simulation only') ----- + internalIsImmutable: oop + "hack around the CoInterpreter/ObjectMemory split refactoring" + ^coInterpreter internalIsImmutable: oop! Item was added: + ----- Method: NewCoObjectMemorySimulator>>methodReturnValue: (in category 'simulation only') ----- + methodReturnValue: oop + "hack around the CoInterpreter/ObjectMemory split refactoring" + ^coInterpreter methodReturnValue: oop! Item was added: + ----- Method: NewCoObjectMemorySimulator>>signed32BitIntegerFor: (in category 'simulation only') ----- + signed32BitIntegerFor: integerValue + "hack around the CoInterpreter/ObjectMemory split refactoring" + ^coInterpreter signed32BitIntegerFor: integerValue! Item was added: + ----- Method: NewCoObjectMemorySimulator>>signed32BitValueOf: (in category 'simulation only') ----- + signed32BitValueOf: oop + "hack around the CoInterpreter/ObjectMemory split refactoring" + ^coInterpreter signed32BitValueOf: oop! Item was changed: ----- Method: NewspeakInterpreter>>shortPrintOop: (in category 'debug printing') ----- shortPrintOop: oop <inline: false> + self printHex: oop. - self printNum: oop. (self isIntegerObject: oop) ifTrue: [^self cCode: 'printf("=%ld\n", integerValueOf(oop))' inSmalltalk: [self print: (self shortPrint: oop); cr]]. (oop between: self startOfMemory and: freeBlock) ifFalse: [self printHex: oop; print: ' is not on the heap'; cr. ^nil]. (oop bitAnd: (BytesPerWord - 1)) ~= 0 ifTrue: [self printHex: oop; print: ' is misaligned'; cr. ^nil]. self print: ': a(n) '. self printNameOfClass: (self fetchClassOf: oop) count: 5. self cr! Item was changed: ----- Method: NewsqueakIA32ABIPlugin class>>simulatorClass (in category 'simulation only') ----- simulatorClass + ^NewspeakVM ifTrue: [NewsqueakIA32ABIPluginSimulator]! - ^NewsqueakIA32ABIPluginSimulator! Item was changed: + NewsqueakIA32ABIPlugin subclass: #NewsqueakIA32ABIPluginSimulator - IA32ABIPlugin subclass: #NewsqueakIA32ABIPluginSimulator instanceVariableNames: '' classVariableNames: '' poolDictionaries: '' category: 'VMMaker-Plugins-Alien'! Item was added: + ----- Method: NewsqueakIA32ABIPluginSimulator>>longAt: (in category 'memory access') ----- + longAt: byteAddress + ^interpreterProxy longAt: byteAddress! Item was added: + ----- Method: NewsqueakIA32ABIPluginSimulator>>longAt:put: (in category 'memory access') ----- + longAt: byteAddress put: a32BitValue + ^interpreterProxy longAt: byteAddress put: a32BitValue! Item was changed: ----- Method: StackInterpreter>>activeProcess (in category 'process primitive support') ----- activeProcess "Answer the current activeProcess." + <api> "useful for VM debugging" ^objectMemory fetchPointer: ActiveProcessIndex ofObject: self schedulerPointer! Item was added: + ----- Method: StackInterpreter>>internalIsImmutable: (in category 'object format') ----- + internalIsImmutable: oop + <option: #NewspeakVM> + <inline: true> + <export: true> + ^((objectMemory baseHeader: oop) bitAnd: ImmutabilityBit) ~= 0! Item was changed: ----- Method: StackInterpreter>>longPrintOop: (in category 'debug printing') ----- longPrintOop: oop <api> | fmt lastIndex startIP bytecodesPerLine | ((objectMemory isIntegerObject: oop) or: [(oop between: objectMemory startOfMemory and: objectMemory freeStart) not or: [(oop bitAnd: (BytesPerWord - 1)) ~= 0 or: [(objectMemory isFreeObject: oop) or: [(fmt := objectMemory formatOf: oop) between: 5 and: 11]]]]) ifTrue: [^self printOop: oop]. self printHex: oop; print: ': a(n) '; printNameOfClass: (objectMemory fetchClassOfNonInt: oop) count: 5. fmt > 4 ifTrue: [self print: ' nbytes '; printNum: (objectMemory byteSizeOf: oop)]. self cr. lastIndex := 64 min: (startIP := (objectMemory lastPointerOf: oop) / BytesPerWord). lastIndex > 0 ifTrue: [1 to: lastIndex do: [:index| | fieldOop | fieldOop := objectMemory fetchPointer: index - 1 ofObject: oop. self space; printHex: fieldOop; space; printOopShort: fieldOop; cr]]. (objectMemory isCompiledMethod: oop) ifFalse: [startIP > 64 ifTrue: [self print: '...'; cr]] ifTrue: [startIP := startIP * BytesPerWord + 1. lastIndex := objectMemory lengthOf: oop. + lastIndex - startIP > 104 ifTrue: + [lastIndex := startIP + 103]. - lastIndex - startIP > 100 ifTrue: - [lastIndex := startIP + 100]. bytecodesPerLine := 8. startIP to: lastIndex do: [:index| | byte | byte := objectMemory fetchByte: index - 1 ofObject: oop. self cCode: 'printf(" %02x/%-3d", byte,byte)' inSmalltalk: [self space; print: (byte radix: 16); printChar: $/; printNum: byte]. + (index = lastIndex and: [(objectMemory lengthOf: oop) > index]) ifTrue: + [self print: '...']. ((index - startIP + 1) \\ bytecodesPerLine) = 0 ifTrue: [self cr]]. ((lastIndex - startIP + 1) \\ bytecodesPerLine) = 0 ifFalse: [self cr]]! Item was changed: ----- Method: StackInterpreter>>printContext: (in category 'debug printing') ----- printContext: aContext | sender ip sp | <inline: false> self shortPrintContext: aContext. sender := objectMemory fetchPointer: SenderIndex ofObject: aContext. ip := objectMemory fetchPointer: InstructionPointerIndex ofObject: aContext. (objectMemory isIntegerObject: sender) ifTrue: [(self checkIsStillMarriedContext: aContext currentFP: framePointer) ifTrue: [self print: 'married (assuming framePointer valid)'; cr] ifFalse: [self print: 'widdowed (assuming framePointer valid)'; cr]. self print: 'sender '; printNum: sender; print: ' ('; printHexPtr: (self withoutSmallIntegerTags: sender); printChar: $); cr. self print: 'ip '; printNum: ip; print: ' ('; printHexPtr: (self withoutSmallIntegerTags: ip); printChar: $); cr] ifFalse: [self print: 'sender '; shortPrintOop: sender. + self print: 'ip '. + ip = objectMemory nilObject + ifTrue: [self shortPrintOop: ip] + ifFalse: [self printNum: ip; print: ' ('; printNum: (objectMemory integerValueOf: ip); space; printHex: (objectMemory integerValueOf: ip); printChar: $); cr]]. - self print: 'ip '; printNum: ip; print: ' ('; printNum: (objectMemory integerValueOf: ip); space; printHex: (objectMemory integerValueOf: ip); printChar: $); cr]. sp := objectMemory fetchPointer: StackPointerIndex ofObject: aContext. sp := sp min: (objectMemory lengthOf: aContext) - ReceiverIndex. self print: 'sp '; printNum: sp; print: ' ('; printNum: (objectMemory integerValueOf: sp); printChar: $); cr. self print: 'method '; shortPrintOop: (objectMemory fetchPointer: MethodIndex ofObject: aContext). self print: 'closure '; shortPrintOop: (objectMemory fetchPointer: ClosureIndex ofObject: aContext). self print: 'receiver '; shortPrintOop: (objectMemory fetchPointer: ReceiverIndex ofObject: aContext). sp := objectMemory integerValueOf: sp. 1 to: sp do: [:i| self print: ' '; printNum: i; space; shortPrintOop: (objectMemory fetchPointer: ReceiverIndex + i ofObject: aContext)]! Item was changed: ----- Method: StackInterpreter>>shortPrintContext: (in category 'debug printing') ----- shortPrintContext: aContext + | home theFP | - | home | <inline: false> + <var: #theFP type: #'char *'> (self isContext: aContext) ifFalse: [self printHex: aContext; print: ' is not a context'; cr. ^nil]. home := self findHomeForContext: aContext. + self printHex: aContext. - self printNum: aContext. (self isMarriedOrWidowedContext: aContext) + ifTrue: [(self checkIsStillMarriedContext: aContext currentFP: framePointer) + ifTrue: + [(self isMachineCodeFrame: (theFP := self frameOfMarriedContext: aContext)) + ifTrue: [self print: ' M ('] + ifFalse: [self print: ' I (']. + self printHex: theFP; print: ') '] + ifFalse: + [self print: ' w ']] - ifTrue: [((self checkIsStillMarriedContext: aContext currentFP: framePointer) - and: [self isMachineCodeFrame: (self frameOfMarriedContext: aContext)]) - ifTrue: [self print: ' m '] - ifFalse: [self print: ' i ']] ifFalse: [self print: ' s ']. self printActivationNameFor: (objectMemory fetchPointer: MethodIndex ofObject: home) receiver: (objectMemory fetchPointer: ReceiverIndex ofObject: home) isBlock: home ~= aContext firstTemporary: (objectMemory fetchPointer: 0 + CtxtTempFrameStart ofObject: home). self cr! Item was changed: ----- Method: StackInterpreter>>shortPrintFrame: (in category 'debug printing') ----- shortPrintFrame: theFP <inline: false> <var: #theFP type: #'char *'> | rcvr | + (stackPages couldBeFramePointer: theFP) ifFalse: + [self print: 'invalid frame pointer'; cr. - theFP = 0 ifTrue: - [self print: 'null fp'; cr. ^nil]. rcvr := self frameReceiver: theFP. self printHexPtr: theFP. self space. self printActivationNameFor: (self frameMethod: theFP) receiver: rcvr isBlock: (self frameIsBlockActivation: theFP) firstTemporary: (self temporary: 0 in: theFP). self space. self shortPrintOop: rcvr "shortPrintOop: adds a cr"! Item was changed: ----- Method: StackInterpreter>>shortPrintFrame:AndNCallers: (in category 'debug printing') ----- shortPrintFrame: theFP AndNCallers: n <api> <inline: false> <var: #theFP type: #'char *'> + (n ~= 0 and: [stackPages couldBeFramePointer: theFP]) ifTrue: - (n > 0 and: [stackPages couldBeFramePointer: theFP]) ifTrue: [self shortPrintFrame: theFP. self shortPrintFrame: (self frameCallerFP: theFP) AndNCallers: n - 1]! Item was removed: - ----- Method: StackInterpreterSimulator>>printCallStackOf: (in category 'debug printing') ----- - printCallStackOf: aContext - self printCallStackOf: aContext currentFP: localFP! Item was added: + ----- Method: StackToRegisterMappingCogit>>isValidFramelessRegister: (in category 'testing') ----- + isValidFramelessRegister: reg + "Answer if the receiver is valid in a frameless method." + ^reg = ReceiverResultReg or: [reg = Arg0Reg]! Item was changed: ----- Method: StackToRegisterMappingCogit>>ssFlushUpThroughReceiverVariable: (in category 'simulation stack') ----- ssFlushUpThroughReceiverVariable: slotIndex + "Any occurrences on the stack of the value being stored (which is the top of stack) + must be flushed, and hence any values colder than them stack." - "Any occurrences on the stack of the value being stored must - be flushed, and hence any values colder than them stack." <var: #desc type: #'CogSimStackEntry *'> + simStackPtr - 1 to: (simSpillBase max: 0) by: -1 do: - simStackPtr to: (simSpillBase max: 0) by: -1 do: [:index| | desc | desc := self simStackAt: index. (desc type = SSBaseOffset and: [desc register = ReceiverResultReg and: [desc offset = (objectRepresentation slotOffsetOfInstVarIndex: slotIndex)]]) ifTrue: [self ssFlushTo: index. ^self]]! Item was changed: ----- Method: StackToRegisterMappingCogit>>ssFlushUpThroughTemporaryVariable: (in category 'simulation stack') ----- ssFlushUpThroughTemporaryVariable: tempIndex + "Any occurrences on the stack of the value being stored (which is the top of stack) + must be flushed, and hence any values colder than them stack." - "Any occurrences on the stack of the value being stored must - be flushed, and hence any values colder than them stack." <var: #desc type: #'CogSimStackEntry *'> + simStackPtr - 1 to: simSpillBase by: -1 do: - simStackPtr to: simSpillBase by: -1 do: [:index| | desc | desc := self simStackAt: index. (desc type = SSBaseOffset and: [desc register = FPReg and: [desc offset = (self frameOffsetOfTemporary: tempIndex)]]) ifTrue: [self ssFlushTo: index. ^self]]! Item was changed: ----- Method: VMMaker>>logDateAndTime (in category 'UI access') ----- logDateAndTime + | now | + "do it this way since Time now includes milliseconds in some versions." + now := Time dateAndTimeNow. + logger print: now first; space; print: now last; cr; flush! - logger print: Date today; space; print: Time now; cr; flush.! |
Free forum by Nabble | Edit this page |