VM Maker: VMMaker.oscog-sk.2261.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-sk.2261.mcz

commits-2
 
Sophie Kaleba uploaded a new version of VMMaker to project VM Maker:
http://source.squeak.org/VMMaker/VMMaker.oscog-sk.2261.mcz

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

Name: VMMaker.oscog-sk.2261
Author: sk
Time: 10 August 2017, 11:03:27.62493 am
UUID: 2502e8bf-7a6c-4656-ab61-b3da8e6f5199
Ancestors: VMMaker.oscog-eem.2260

Modify the profiling primitive cogCodeConstituents: to be able to differentiate the closedPICs from the openPICs in the profiling report

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

Item was changed:
  ----- Method: Cogit>>cogCodeConstituents: (in category 'profiling primitives') -----
  cogCodeConstituents: withDetails
  "Answer the contents of the code zone as an array of pair-wise element, address in ascending address order.
  Answer a string for a runtime routine or abstract label (beginning, end, etc), a CompiledMethod for a CMMethod,
  or a selector (presumably a Symbol) for a PIC."
  <api>
  | count cogMethod constituents label value |
  <var: #cogMethod type: #'CogMethod *'>
  count := trampolineTableIndex / 2 + 3. "+ 3 for start, freeStart and end"
  cogMethod := self cCoerceSimple: methodZoneBase to: #'CogMethod *'.
  [cogMethod < methodZone limitZony] whileTrue:
  [cogMethod cmType ~= CMFree ifTrue:
  [count := count + 1].
  cogMethod := methodZone methodAfter: cogMethod].
  constituents := coInterpreter instantiateClass: coInterpreter classArray indexableSize: count * 2.
  constituents ifNil:
  [^constituents].
  coInterpreter pushRemappableOop: constituents.
  ((label := objectMemory stringForCString: 'CogCode') isNil
  or: [(value := self positiveMachineIntegerFor: codeBase) isNil]) ifTrue:
  [^nil].
  coInterpreter
  storePointerUnchecked: 0 ofObject: coInterpreter topRemappableOop withValue: label;
  storePointerUnchecked: 1 ofObject: coInterpreter topRemappableOop withValue: value.
  0 to: trampolineTableIndex - 1 by: 2 do:
  [:i|
  ((label := objectMemory stringForCString: (trampolineAddresses at: i)) isNil
  or: [(value := self positiveMachineIntegerFor: (trampolineAddresses at: i + 1) asUnsignedInteger) isNil]) ifTrue:
  [coInterpreter popRemappableOop.
  ^nil].
  coInterpreter
  storePointerUnchecked: 2 + i ofObject: coInterpreter topRemappableOop withValue: label;
  storePointerUnchecked: 3 + i ofObject: coInterpreter topRemappableOop withValue: value].
  count := trampolineTableIndex + 2.
  cogMethod := self cCoerceSimple: methodZoneBase to: #'CogMethod *'.
  [cogMethod < methodZone limitZony] whileTrue:
  [cogMethod cmType ~= CMFree ifTrue:
  [coInterpreter
  storePointerUnchecked: count
  ofObject: coInterpreter topRemappableOop
+ withValue: (self valueOf: cogMethod).
- withValue: (cogMethod cmType = CMMethod
- ifTrue: [cogMethod methodObject]
- ifFalse: [cogMethod selector]).
  value := withDetails
  ifFalse: [self positiveMachineIntegerFor: cogMethod asUnsignedInteger]
  ifTrue: [self collectCogMethodConstituent: cogMethod].
  value ifNil: [coInterpreter popRemappableOop. ^nil].
  coInterpreter
  storePointerUnchecked: count + 1
  ofObject: coInterpreter topRemappableOop
  withValue: value.
  count := count + 2].
  cogMethod := methodZone methodAfter: cogMethod].
  ((label := objectMemory stringForCString: 'CCFree') isNil
  or: [(value := self positiveMachineIntegerFor: methodZone zoneFree) isNil]) ifTrue:
  [coInterpreter popRemappableOop.
  ^nil].
  coInterpreter
  storePointerUnchecked: count ofObject: coInterpreter topRemappableOop withValue: label;
  storePointerUnchecked: count + 1 ofObject: coInterpreter topRemappableOop withValue: value.
  ((label := objectMemory stringForCString: 'CCEnd') isNil
  or: [(value := self positiveMachineIntegerFor: methodZone zoneEnd) isNil]) ifTrue:
  [coInterpreter popRemappableOop.
  ^nil].
  coInterpreter
  storePointerUnchecked: count + 2 ofObject: coInterpreter topRemappableOop withValue: label;
  storePointerUnchecked: count + 3 ofObject: coInterpreter topRemappableOop withValue: value.
  constituents := coInterpreter popRemappableOop.
  coInterpreter beRootIfOld: constituents.
  ^constituents!

Item was added:
+ ----- Method: Cogit>>createCPICData: (in category 'profiling primitives') -----
+ createCPICData: cPIC
+ <var: #cPIC type: #'CogMethod *'>
+ | pc entryPoint targetMethod value array |
+ <var: #targetMethod type: #'CogMethod *'>
+ array := 1.
+ array := objectMemory instantiateClass: objectMemory classArray indexableSize: 1 + cPIC cPICNumCases.
+       objectMemory storePointerUnchecked: 0 ofObject: array withValue: cPIC selector.
+ 1 to: cPIC cPICNumCases do:
+ [:i|
+ pc := self addressOfEndOfCase: i inCPIC: cPIC.
+ entryPoint := i = 1
+ ifTrue: [backEnd jumpLongTargetBeforeFollowingAddress: pc]
+ ifFalse: [backEnd jumpLongConditionalTargetBeforeFollowingAddress: pc].
+ "Find target from jump.  A jump to the MNU entry-point should collect #doesNotUnderstand:"
+ (cPIC containsAddress: entryPoint)
+ ifTrue:
+ [value := objectMemory splObj: SelectorDoesNotUnderstand]
+ ifFalse:
+ [targetMethod := self cCoerceSimple: entryPoint - cmNoCheckEntryOffset to: #'CogMethod *'.
+ self assert: targetMethod cmType = CMMethod.
+ value := targetMethod methodObject].
+ objectMemory storePointer: i ofObject: array withValue: value].
+ ^ array!

Item was added:
+ ----- Method: Cogit>>valueOf: (in category 'profiling primitives') -----
+ valueOf: cogMethod
+ "gives the type of the cogMethod and returns a CompiledMethod for a compiled method, a selector for an openPIC or an array containing a selector followed by the methods present in the closedPIC for a closedPIC"
+
+ <var: #cogMethod type: #'CogMethod *'>
+ ^cogMethod cmType = CMMethod
+ ifTrue: [cogMethod methodObject]
+ ifFalse: [cogMethod cmType = CMClosedPIC
+ ifTrue: [self createCPICData: cogMethod.]
+ ifFalse: [cogMethod selector]]
+                      !