About primitiveMethodXray

SD
stephane ducasse
Thu, Sep 15, 2022 7:15 PM

Hi

In CoInterpreter we can find

initializePrimitiveTable
super initializePrimitiveTable.
PrimNumberHashMultiply := 159.
self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply.

#(216 253) do:
	[:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail].
self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod.
PrimitiveTable
	at: 253 + 1 put: #primitiveCollectCogCodeConstituents;
	at: 215 + 1 put: #primitiveVoidVMStateForMethod;
	at: 216 + 1 put: #primitiveMethodXray

There is a primitive primitiveMethodXray :)

primitiveMethodXray
"Lift the veil from a method and answer an integer describing the interior state
of its machine code.
Used for e.g. VM tests so they can verify they're testing what they think they're testing.
0 implies a vanilla method.
Bit 0 = method might be compiled to machine code
Bit 1 = method is currently compiled to machine code
Bit 2 = is compiled frameless.
Bit 3 = method refers to young object.
Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile)
Bit 5 = method contains unknown/unjittable bytecode
Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)"
| alreadyCogged flags cogMethod |
<var: #cogMethod type: #'CogMethod *'>
(self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop))
ifTrue:
[alreadyCogged := self maybeMethodHasCogMethod: self stackTop.
flags := 1.
alreadyCogged ifFalse:
[cogMethod := cogit cog: self stackTop selector: objectMemory nilObject.
(cogMethod = nil
and: [cogCompiledCodeCompactionCalledFor]) ifTrue:
[self commenceCogCompiledCodeCompaction.
cogMethod := cogit cog: self stackTop selector: objectMemory nilObject].
cogMethod asInteger
caseOf: {
[MethodTooBig] -> [flags := 1 + 16].
[EncounteredUnknownBytecode] -> [flags := 1 + 32].
[ShouldNotJIT] -> [flags := 1 + 64] }
otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]].
(flags = 1
and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue:
[cogMethod := self cogMethodOf: self stackTop.
flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3].
cogMethod cmRefersToYoung ifTrue:
[flags := flags + 8].
alreadyCogged ifFalse:
[cogit freeMethod: cogMethod]]]
ifFalse: [flags := 0].
self pop: 1 thenPush: (objectMemory integerObjectOf: flags)

and I wanted to execute it.

So on compiledMethod I defined a method

CompiledMethod >> xray

<primitive: 216>

and I did (Point>>#degrees) xray
but when I execute I get a compiled method and not an integer.

So I probably do something silly.
But I would like to understand what.

Tx

Hi In CoInterpreter we can find initializePrimitiveTable super initializePrimitiveTable. PrimNumberHashMultiply := 159. self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply. #(216 253) do: [:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail]. self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod. PrimitiveTable at: 253 + 1 put: #primitiveCollectCogCodeConstituents; at: 215 + 1 put: #primitiveVoidVMStateForMethod; at: 216 + 1 put: #primitiveMethodXray There is a primitive primitiveMethodXray :) primitiveMethodXray "Lift the veil from a method and answer an integer describing the interior state of its machine code. Used for e.g. VM tests so they can verify they're testing what they think they're testing. 0 implies a vanilla method. Bit 0 = method might be compiled to machine code Bit 1 = method is currently compiled to machine code Bit 2 = is compiled frameless. Bit 3 = method refers to young object. Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile) Bit 5 = method contains unknown/unjittable bytecode Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)" | alreadyCogged flags cogMethod | <var: #cogMethod type: #'CogMethod *'> (self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop)) ifTrue: [alreadyCogged := self maybeMethodHasCogMethod: self stackTop. flags := 1. alreadyCogged ifFalse: [cogMethod := cogit cog: self stackTop selector: objectMemory nilObject. (cogMethod = nil and: [cogCompiledCodeCompactionCalledFor]) ifTrue: [self commenceCogCompiledCodeCompaction. cogMethod := cogit cog: self stackTop selector: objectMemory nilObject]. cogMethod asInteger caseOf: { [MethodTooBig] -> [flags := 1 + 16]. [EncounteredUnknownBytecode] -> [flags := 1 + 32]. [ShouldNotJIT] -> [flags := 1 + 64] } otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]]. (flags = 1 and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue: [cogMethod := self cogMethodOf: self stackTop. flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3]. cogMethod cmRefersToYoung ifTrue: [flags := flags + 8]. alreadyCogged ifFalse: [cogit freeMethod: cogMethod]]] ifFalse: [flags := 0]. self pop: 1 thenPush: (objectMemory integerObjectOf: flags) and I wanted to execute it. So on compiledMethod I defined a method CompiledMethod >> xray <primitive: 216> and I did (Point>>#degrees) xray but when I execute I get a compiled method and not an integer. So I probably do something silly. But I would like to understand what. Tx
GP
Guillermo Polito
Sat, Sep 24, 2022 8:19 PM

Just as a follow-up, last week we did together with Jean Privat and Stef a pass on this primitive, and the primitive that exposes method pic information.
The work we did can be found in the following PR

https://github.com/pharo-project/pharo-vm/pull/463

The PR includes a couple of fixes, tests, and cleanups.
The mashed log is

Fixes on primitiveMethodXray https://github.com/pharo-project/pharo-vm/pull/463/commits/67780af2e454a348fb5047f8bde51056bc804c7b:

fixing flags + tests
use externalWriteBackHeadFramePointers before code compaction to ensure stacks are in sync
declare it as maycallback to ensure call is made through a trampoline and the return address remains correct after compacting jit code
Protect method freeing in xray primitive https://github.com/pharo-project/pharo-vm/commit/8a4b4b4ee93ea6ff71ca5671ae653db68ee14978
Expose method profiling data (PICs and linked sends type information):

Expose method profiling data https://github.com/pharo-project/pharo-vm/commit/dbf4154e553109ff17757f4565ca1086cc5cbe91
rename picData -> profilingData as it may yield also execution counters
do not expose counters if not available
Fix type of methodClassIfSuper, restore array shrinking https://github.com/pharo-project/pharo-vm/commit/903ba641446c591412b59ff4f258985db9f84f45
Rename dollowing the literature https://github.com/pharo-project/pharo-vm/pull/463/commits/10aba4ad1d6db046074bbf645bb134e5e5543280:

OpenPIC -> MegamorphicIC
ClosedPIC -> PolymorphicIC
Cleanups:

Adding notYetImplemented with message parameter https://github.com/pharo-project/pharo-vm/commit/75be0cddfe3037aa5f574c6a3791d1f307467259
Remove old block compilation related methods https://github.com/pharo-project/pharo-vm/commit/a806e2f7811973cdfca76f47ee6f45a8c0243b9f
Remove SistaCogitClone https://github.com/pharo-project/pharo-vm/commit/7ea5b11e031707b83b1b6ca0371167f4fd114ccc
Cleaning morphic related method https://github.com/pharo-project/pharo-vm/commit/1ee56c2528503f6380415085a118d11b95078295
Cheers,
G

El 15 sept 2022, a las 21:15, stephane ducasse stephane.ducasse@inria.fr escribi贸:

Hi

In CoInterpreter we can find

initializePrimitiveTable
super initializePrimitiveTable.
PrimNumberHashMultiply := 159.
self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply.

#(216 253) do:
	[:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail].
self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod.
PrimitiveTable
	at: 253 + 1 put: #primitiveCollectCogCodeConstituents;
	at: 215 + 1 put: #primitiveVoidVMStateForMethod;
	at: 216 + 1 put: #primitiveMethodXray

There is a primitive primitiveMethodXray :)

primitiveMethodXray
"Lift the veil from a method and answer an integer describing the interior state
of its machine code.
Used for e.g. VM tests so they can verify they're testing what they think they're testing.
0 implies a vanilla method.
Bit 0 = method might be compiled to machine code
Bit 1 = method is currently compiled to machine code
Bit 2 = is compiled frameless.
Bit 3 = method refers to young object.
Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile)
Bit 5 = method contains unknown/unjittable bytecode
Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)"
| alreadyCogged flags cogMethod |
<var: #cogMethod type: #'CogMethod *'>
(self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop))
ifTrue:
[alreadyCogged := self maybeMethodHasCogMethod: self stackTop.
flags := 1.
alreadyCogged ifFalse:
[cogMethod := cogit cog: self stackTop selector: objectMemory nilObject.
(cogMethod = nil
and: [cogCompiledCodeCompactionCalledFor]) ifTrue:
[self commenceCogCompiledCodeCompaction.
cogMethod := cogit cog: self stackTop selector: objectMemory nilObject].
cogMethod asInteger
caseOf: {
[MethodTooBig] -> [flags := 1 + 16].
[EncounteredUnknownBytecode] -> [flags := 1 + 32].
[ShouldNotJIT] -> [flags := 1 + 64] }
otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]].
(flags = 1
and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue:
[cogMethod := self cogMethodOf: self stackTop.
flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3].
cogMethod cmRefersToYoung ifTrue:
[flags := flags + 8].
alreadyCogged ifFalse:
[cogit freeMethod: cogMethod]]]
ifFalse: [flags := 0].
self pop: 1 thenPush: (objectMemory integerObjectOf: flags)

and I wanted to execute it.

So on compiledMethod I defined a method

CompiledMethod >> xray

<primitive: 216>

and I did (Point>>#degrees) xray
but when I execute I get a compiled method and not an integer.

So I probably do something silly.
But I would like to understand what.

Tx


Pharo-vm mailing list -- pharo-vm@lists.pharo.org
To unsubscribe send an email to pharo-vm-leave@lists.pharo.org

Just as a follow-up, last week we did together with Jean Privat and Stef a pass on this primitive, and the primitive that exposes method pic information. The work we did can be found in the following PR https://github.com/pharo-project/pharo-vm/pull/463 The PR includes a couple of fixes, tests, and cleanups. The mashed log is Fixes on primitiveMethodXray <https://github.com/pharo-project/pharo-vm/pull/463/commits/67780af2e454a348fb5047f8bde51056bc804c7b>: fixing flags + tests use externalWriteBackHeadFramePointers before code compaction to ensure stacks are in sync declare it as maycallback to ensure call is made through a trampoline and the return address remains correct after compacting jit code Protect method freeing in xray primitive <https://github.com/pharo-project/pharo-vm/commit/8a4b4b4ee93ea6ff71ca5671ae653db68ee14978> Expose method profiling data (PICs and linked sends type information): Expose method profiling data <https://github.com/pharo-project/pharo-vm/commit/dbf4154e553109ff17757f4565ca1086cc5cbe91> rename picData -> profilingData as it may yield also execution counters do not expose counters if not available Fix type of methodClassIfSuper, restore array shrinking <https://github.com/pharo-project/pharo-vm/commit/903ba641446c591412b59ff4f258985db9f84f45> Rename dollowing the literature <https://github.com/pharo-project/pharo-vm/pull/463/commits/10aba4ad1d6db046074bbf645bb134e5e5543280>: OpenPIC -> MegamorphicIC ClosedPIC -> PolymorphicIC Cleanups: Adding notYetImplemented with message parameter <https://github.com/pharo-project/pharo-vm/commit/75be0cddfe3037aa5f574c6a3791d1f307467259> Remove old block compilation related methods <https://github.com/pharo-project/pharo-vm/commit/a806e2f7811973cdfca76f47ee6f45a8c0243b9f> Remove SistaCogitClone <https://github.com/pharo-project/pharo-vm/commit/7ea5b11e031707b83b1b6ca0371167f4fd114ccc> Cleaning morphic related method <https://github.com/pharo-project/pharo-vm/commit/1ee56c2528503f6380415085a118d11b95078295> Cheers, G > El 15 sept 2022, a las 21:15, stephane ducasse <stephane.ducasse@inria.fr> escribi贸: > > Hi > > In CoInterpreter we can find > > initializePrimitiveTable > super initializePrimitiveTable. > PrimNumberHashMultiply := 159. > self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply. > > #(216 253) do: > [:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail]. > self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod. > PrimitiveTable > at: 253 + 1 put: #primitiveCollectCogCodeConstituents; > at: 215 + 1 put: #primitiveVoidVMStateForMethod; > at: 216 + 1 put: #primitiveMethodXray > > > There is a primitive primitiveMethodXray :) > > primitiveMethodXray > "Lift the veil from a method and answer an integer describing the interior state > of its machine code. > Used for e.g. VM tests so they can verify they're testing what they think they're testing. > 0 implies a vanilla method. > Bit 0 = method might be compiled to machine code > Bit 1 = method is currently compiled to machine code > Bit 2 = is compiled frameless. > Bit 3 = method refers to young object. > Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile) > Bit 5 = method contains unknown/unjittable bytecode > Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)" > | alreadyCogged flags cogMethod | > <var: #cogMethod type: #'CogMethod *'> > (self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop)) > ifTrue: > [alreadyCogged := self maybeMethodHasCogMethod: self stackTop. > flags := 1. > alreadyCogged ifFalse: > [cogMethod := cogit cog: self stackTop selector: objectMemory nilObject. > (cogMethod = nil > and: [cogCompiledCodeCompactionCalledFor]) ifTrue: > [self commenceCogCompiledCodeCompaction. > cogMethod := cogit cog: self stackTop selector: objectMemory nilObject]. > cogMethod asInteger > caseOf: { > [MethodTooBig] -> [flags := 1 + 16]. > [EncounteredUnknownBytecode] -> [flags := 1 + 32]. > [ShouldNotJIT] -> [flags := 1 + 64] } > otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]]. > (flags = 1 > and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue: > [cogMethod := self cogMethodOf: self stackTop. > flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3]. > cogMethod cmRefersToYoung ifTrue: > [flags := flags + 8]. > alreadyCogged ifFalse: > [cogit freeMethod: cogMethod]]] > ifFalse: [flags := 0]. > self pop: 1 thenPush: (objectMemory integerObjectOf: flags) > > > and I wanted to execute it. > > So on compiledMethod I defined a method > > CompiledMethod >> xray > > <primitive: 216> > > > and I did (Point>>#degrees) xray > but when I execute I get a compiled method and not an integer. > > So I probably do something silly. > But I would like to understand what. > > Tx > > > _______________________________________________ > Pharo-vm mailing list -- pharo-vm@lists.pharo.org > To unsubscribe send an email to pharo-vm-leave@lists.pharo.org
SD
stephane ducasse
Sun, Sep 25, 2022 6:31 AM

Thanks guille for the recap.
It was a cool session and we learned a lot from you.

S

On 24 Sep 2022, at 22:19, Guillermo Polito guillermopolito@gmail.com wrote:

Just as a follow-up, last week we did together with Jean Privat and Stef a pass on this primitive, and the primitive that exposes method pic information.
The work we did can be found in the following PR

https://github.com/pharo-project/pharo-vm/pull/463 https://github.com/pharo-project/pharo-vm/pull/463

The PR includes a couple of fixes, tests, and cleanups.
The mashed log is

Fixes on primitiveMethodXray https://github.com/pharo-project/pharo-vm/pull/463/commits/67780af2e454a348fb5047f8bde51056bc804c7b:

fixing flags + tests
use externalWriteBackHeadFramePointers before code compaction to ensure stacks are in sync
declare it as maycallback to ensure call is made through a trampoline and the return address remains correct after compacting jit code
Protect method freeing in xray primitive https://github.com/pharo-project/pharo-vm/commit/8a4b4b4ee93ea6ff71ca5671ae653db68ee14978
Expose method profiling data (PICs and linked sends type information):

Expose method profiling data https://github.com/pharo-project/pharo-vm/commit/dbf4154e553109ff17757f4565ca1086cc5cbe91
rename picData -> profilingData as it may yield also execution counters
do not expose counters if not available
Fix type of methodClassIfSuper, restore array shrinking https://github.com/pharo-project/pharo-vm/commit/903ba641446c591412b59ff4f258985db9f84f45
Rename dollowing the literature https://github.com/pharo-project/pharo-vm/pull/463/commits/10aba4ad1d6db046074bbf645bb134e5e5543280:

OpenPIC -> MegamorphicIC
ClosedPIC -> PolymorphicIC
Cleanups:

Adding notYetImplemented with message parameter https://github.com/pharo-project/pharo-vm/commit/75be0cddfe3037aa5f574c6a3791d1f307467259
Remove old block compilation related methods https://github.com/pharo-project/pharo-vm/commit/a806e2f7811973cdfca76f47ee6f45a8c0243b9f
Remove SistaCogitClone https://github.com/pharo-project/pharo-vm/commit/7ea5b11e031707b83b1b6ca0371167f4fd114ccc
Cleaning morphic related method https://github.com/pharo-project/pharo-vm/commit/1ee56c2528503f6380415085a118d11b95078295
Cheers,
G

El 15 sept 2022, a las 21:15, stephane ducasse <stephane.ducasse@inria.fr mailto:stephane.ducasse@inria.fr> escribi贸:

Hi

In CoInterpreter we can find

initializePrimitiveTable
super initializePrimitiveTable.
PrimNumberHashMultiply := 159.
self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply.

#(216 253) do:
	[:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail].
self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod.
PrimitiveTable
	at: 253 + 1 put: #primitiveCollectCogCodeConstituents;
	at: 215 + 1 put: #primitiveVoidVMStateForMethod;
	at: 216 + 1 put: #primitiveMethodXray

There is a primitive primitiveMethodXray :)

primitiveMethodXray
"Lift the veil from a method and answer an integer describing the interior state
of its machine code.
Used for e.g. VM tests so they can verify they're testing what they think they're testing.
0 implies a vanilla method.
Bit 0 = method might be compiled to machine code
Bit 1 = method is currently compiled to machine code
Bit 2 = is compiled frameless.
Bit 3 = method refers to young object.
Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile)
Bit 5 = method contains unknown/unjittable bytecode
Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)"
| alreadyCogged flags cogMethod |
<var: #cogMethod type: #'CogMethod *'>
(self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop))
ifTrue:
[alreadyCogged := self maybeMethodHasCogMethod: self stackTop.
flags := 1.
alreadyCogged ifFalse:
[cogMethod := cogit cog: self stackTop selector: objectMemory nilObject.
(cogMethod = nil
and: [cogCompiledCodeCompactionCalledFor]) ifTrue:
[self commenceCogCompiledCodeCompaction.
cogMethod := cogit cog: self stackTop selector: objectMemory nilObject].
cogMethod asInteger
caseOf: {
[MethodTooBig] -> [flags := 1 + 16].
[EncounteredUnknownBytecode] -> [flags := 1 + 32].
[ShouldNotJIT] -> [flags := 1 + 64] }
otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]].
(flags = 1
and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue:
[cogMethod := self cogMethodOf: self stackTop.
flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3].
cogMethod cmRefersToYoung ifTrue:
[flags := flags + 8].
alreadyCogged ifFalse:
[cogit freeMethod: cogMethod]]]
ifFalse: [flags := 0].
self pop: 1 thenPush: (objectMemory integerObjectOf: flags)

and I wanted to execute it.

So on compiledMethod I defined a method

CompiledMethod >> xray

<primitive: 216>

and I did (Point>>#degrees) xray
but when I execute I get a compiled method and not an integer.

So I probably do something silly.
But I would like to understand what.

Tx


Pharo-vm mailing list -- pharo-vm@lists.pharo.org mailto:pharo-vm@lists.pharo.org
To unsubscribe send an email to pharo-vm-leave@lists.pharo.org mailto:pharo-vm-leave@lists.pharo.org

Thanks guille for the recap. It was a cool session and we learned a lot from you. S > On 24 Sep 2022, at 22:19, Guillermo Polito <guillermopolito@gmail.com> wrote: > > Just as a follow-up, last week we did together with Jean Privat and Stef a pass on this primitive, and the primitive that exposes method pic information. > The work we did can be found in the following PR > > https://github.com/pharo-project/pharo-vm/pull/463 <https://github.com/pharo-project/pharo-vm/pull/463> > > The PR includes a couple of fixes, tests, and cleanups. > The mashed log is > > Fixes on primitiveMethodXray <https://github.com/pharo-project/pharo-vm/pull/463/commits/67780af2e454a348fb5047f8bde51056bc804c7b>: > > fixing flags + tests > use externalWriteBackHeadFramePointers before code compaction to ensure stacks are in sync > declare it as maycallback to ensure call is made through a trampoline and the return address remains correct after compacting jit code > Protect method freeing in xray primitive <https://github.com/pharo-project/pharo-vm/commit/8a4b4b4ee93ea6ff71ca5671ae653db68ee14978> > Expose method profiling data (PICs and linked sends type information): > > Expose method profiling data <https://github.com/pharo-project/pharo-vm/commit/dbf4154e553109ff17757f4565ca1086cc5cbe91> > rename picData -> profilingData as it may yield also execution counters > do not expose counters if not available > Fix type of methodClassIfSuper, restore array shrinking <https://github.com/pharo-project/pharo-vm/commit/903ba641446c591412b59ff4f258985db9f84f45> > Rename dollowing the literature <https://github.com/pharo-project/pharo-vm/pull/463/commits/10aba4ad1d6db046074bbf645bb134e5e5543280>: > > OpenPIC -> MegamorphicIC > ClosedPIC -> PolymorphicIC > Cleanups: > > Adding notYetImplemented with message parameter <https://github.com/pharo-project/pharo-vm/commit/75be0cddfe3037aa5f574c6a3791d1f307467259> > Remove old block compilation related methods <https://github.com/pharo-project/pharo-vm/commit/a806e2f7811973cdfca76f47ee6f45a8c0243b9f> > Remove SistaCogitClone <https://github.com/pharo-project/pharo-vm/commit/7ea5b11e031707b83b1b6ca0371167f4fd114ccc> > Cleaning morphic related method <https://github.com/pharo-project/pharo-vm/commit/1ee56c2528503f6380415085a118d11b95078295> > Cheers, > G > >> El 15 sept 2022, a las 21:15, stephane ducasse <stephane.ducasse@inria.fr <mailto:stephane.ducasse@inria.fr>> escribi贸: >> >> Hi >> >> In CoInterpreter we can find >> >> initializePrimitiveTable >> super initializePrimitiveTable. >> PrimNumberHashMultiply := 159. >> self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply. >> >> #(216 253) do: >> [:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail]. >> self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod. >> PrimitiveTable >> at: 253 + 1 put: #primitiveCollectCogCodeConstituents; >> at: 215 + 1 put: #primitiveVoidVMStateForMethod; >> at: 216 + 1 put: #primitiveMethodXray >> >> >> There is a primitive primitiveMethodXray :) >> >> primitiveMethodXray >> "Lift the veil from a method and answer an integer describing the interior state >> of its machine code. >> Used for e.g. VM tests so they can verify they're testing what they think they're testing. >> 0 implies a vanilla method. >> Bit 0 = method might be compiled to machine code >> Bit 1 = method is currently compiled to machine code >> Bit 2 = is compiled frameless. >> Bit 3 = method refers to young object. >> Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile) >> Bit 5 = method contains unknown/unjittable bytecode >> Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)" >> | alreadyCogged flags cogMethod | >> <var: #cogMethod type: #'CogMethod *'> >> (self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop)) >> ifTrue: >> [alreadyCogged := self maybeMethodHasCogMethod: self stackTop. >> flags := 1. >> alreadyCogged ifFalse: >> [cogMethod := cogit cog: self stackTop selector: objectMemory nilObject. >> (cogMethod = nil >> and: [cogCompiledCodeCompactionCalledFor]) ifTrue: >> [self commenceCogCompiledCodeCompaction. >> cogMethod := cogit cog: self stackTop selector: objectMemory nilObject]. >> cogMethod asInteger >> caseOf: { >> [MethodTooBig] -> [flags := 1 + 16]. >> [EncounteredUnknownBytecode] -> [flags := 1 + 32]. >> [ShouldNotJIT] -> [flags := 1 + 64] } >> otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]]. >> (flags = 1 >> and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue: >> [cogMethod := self cogMethodOf: self stackTop. >> flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3]. >> cogMethod cmRefersToYoung ifTrue: >> [flags := flags + 8]. >> alreadyCogged ifFalse: >> [cogit freeMethod: cogMethod]]] >> ifFalse: [flags := 0]. >> self pop: 1 thenPush: (objectMemory integerObjectOf: flags) >> >> >> and I wanted to execute it. >> >> So on compiledMethod I defined a method >> >> CompiledMethod >> xray >> >> <primitive: 216> >> >> >> and I did (Point>>#degrees) xray >> but when I execute I get a compiled method and not an integer. >> >> So I probably do something silly. >> But I would like to understand what. >> >> Tx >> >> >> _______________________________________________ >> Pharo-vm mailing list -- pharo-vm@lists.pharo.org <mailto:pharo-vm@lists.pharo.org> >> To unsubscribe send an email to pharo-vm-leave@lists.pharo.org <mailto:pharo-vm-leave@lists.pharo.org> >
N
Nahuel
Sun, Sep 25, 2022 9:29 AM

Wwoooooo this is very nice!!! Congrats 馃憦

On 25 Sep 2022, at 08:31, stephane ducasse stephane.ducasse@inria.fr wrote:

Thanks guille for the recap.
It was a cool session and we learned a lot from you.

S

On 24 Sep 2022, at 22:19, Guillermo Polito <guillermopolito@gmail.com mailto:guillermopolito@gmail.com> wrote:

Just as a follow-up, last week we did together with Jean Privat and Stef a pass on this primitive, and the primitive that exposes method pic information.
The work we did can be found in the following PR

https://github.com/pharo-project/pharo-vm/pull/463 https://github.com/pharo-project/pharo-vm/pull/463

The PR includes a couple of fixes, tests, and cleanups.
The mashed log is

Fixes on primitiveMethodXray https://github.com/pharo-project/pharo-vm/pull/463/commits/67780af2e454a348fb5047f8bde51056bc804c7b:

fixing flags + tests
use externalWriteBackHeadFramePointers before code compaction to ensure stacks are in sync
declare it as maycallback to ensure call is made through a trampoline and the return address remains correct after compacting jit code
Protect method freeing in xray primitive https://github.com/pharo-project/pharo-vm/commit/8a4b4b4ee93ea6ff71ca5671ae653db68ee14978
Expose method profiling data (PICs and linked sends type information):

Expose method profiling data https://github.com/pharo-project/pharo-vm/commit/dbf4154e553109ff17757f4565ca1086cc5cbe91
rename picData -> profilingData as it may yield also execution counters
do not expose counters if not available
Fix type of methodClassIfSuper, restore array shrinking https://github.com/pharo-project/pharo-vm/commit/903ba641446c591412b59ff4f258985db9f84f45
Rename dollowing the literature https://github.com/pharo-project/pharo-vm/pull/463/commits/10aba4ad1d6db046074bbf645bb134e5e5543280:

OpenPIC -> MegamorphicIC
ClosedPIC -> PolymorphicIC
Cleanups:

Adding notYetImplemented with message parameter https://github.com/pharo-project/pharo-vm/commit/75be0cddfe3037aa5f574c6a3791d1f307467259
Remove old block compilation related methods https://github.com/pharo-project/pharo-vm/commit/a806e2f7811973cdfca76f47ee6f45a8c0243b9f
Remove SistaCogitClone https://github.com/pharo-project/pharo-vm/commit/7ea5b11e031707b83b1b6ca0371167f4fd114ccc
Cleaning morphic related method https://github.com/pharo-project/pharo-vm/commit/1ee56c2528503f6380415085a118d11b95078295
Cheers,
G

El 15 sept 2022, a las 21:15, stephane ducasse <stephane.ducasse@inria.fr mailto:stephane.ducasse@inria.fr> escribi贸:

Hi

In CoInterpreter we can find

initializePrimitiveTable
super initializePrimitiveTable.
PrimNumberHashMultiply := 159.
self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply.

#(216 253) do:
	[:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail].
self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod.
PrimitiveTable
	at: 253 + 1 put: #primitiveCollectCogCodeConstituents;
	at: 215 + 1 put: #primitiveVoidVMStateForMethod;
	at: 216 + 1 put: #primitiveMethodXray

There is a primitive primitiveMethodXray :)

primitiveMethodXray
"Lift the veil from a method and answer an integer describing the interior state
of its machine code.
Used for e.g. VM tests so they can verify they're testing what they think they're testing.
0 implies a vanilla method.
Bit 0 = method might be compiled to machine code
Bit 1 = method is currently compiled to machine code
Bit 2 = is compiled frameless.
Bit 3 = method refers to young object.
Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile)
Bit 5 = method contains unknown/unjittable bytecode
Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)"
| alreadyCogged flags cogMethod |
<var: #cogMethod type: #'CogMethod *'>
(self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop))
ifTrue:
[alreadyCogged := self maybeMethodHasCogMethod: self stackTop.
flags := 1.
alreadyCogged ifFalse:
[cogMethod := cogit cog: self stackTop selector: objectMemory nilObject.
(cogMethod = nil
and: [cogCompiledCodeCompactionCalledFor]) ifTrue:
[self commenceCogCompiledCodeCompaction.
cogMethod := cogit cog: self stackTop selector: objectMemory nilObject].
cogMethod asInteger
caseOf: {
[MethodTooBig] -> [flags := 1 + 16].
[EncounteredUnknownBytecode] -> [flags := 1 + 32].
[ShouldNotJIT] -> [flags := 1 + 64] }
otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]].
(flags = 1
and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue:
[cogMethod := self cogMethodOf: self stackTop.
flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3].
cogMethod cmRefersToYoung ifTrue:
[flags := flags + 8].
alreadyCogged ifFalse:
[cogit freeMethod: cogMethod]]]
ifFalse: [flags := 0].
self pop: 1 thenPush: (objectMemory integerObjectOf: flags)

and I wanted to execute it.

So on compiledMethod I defined a method

CompiledMethod >> xray

<primitive: 216>

and I did (Point>>#degrees) xray
but when I execute I get a compiled method and not an integer.

So I probably do something silly.
But I would like to understand what.

Tx


Pharo-vm mailing list -- pharo-vm@lists.pharo.org mailto:pharo-vm@lists.pharo.org
To unsubscribe send an email to pharo-vm-leave@lists.pharo.org mailto:pharo-vm-leave@lists.pharo.org


Pharo-vm mailing list -- pharo-vm@lists.pharo.org
To unsubscribe send an email to pharo-vm-leave@lists.pharo.org

Wwoooooo this is very nice!!! Congrats 馃憦 > On 25 Sep 2022, at 08:31, stephane ducasse <stephane.ducasse@inria.fr> wrote: > > Thanks guille for the recap. > It was a cool session and we learned a lot from you. > > S > >> On 24 Sep 2022, at 22:19, Guillermo Polito <guillermopolito@gmail.com <mailto:guillermopolito@gmail.com>> wrote: >> >> Just as a follow-up, last week we did together with Jean Privat and Stef a pass on this primitive, and the primitive that exposes method pic information. >> The work we did can be found in the following PR >> >> https://github.com/pharo-project/pharo-vm/pull/463 <https://github.com/pharo-project/pharo-vm/pull/463> >> >> The PR includes a couple of fixes, tests, and cleanups. >> The mashed log is >> >> Fixes on primitiveMethodXray <https://github.com/pharo-project/pharo-vm/pull/463/commits/67780af2e454a348fb5047f8bde51056bc804c7b>: >> >> fixing flags + tests >> use externalWriteBackHeadFramePointers before code compaction to ensure stacks are in sync >> declare it as maycallback to ensure call is made through a trampoline and the return address remains correct after compacting jit code >> Protect method freeing in xray primitive <https://github.com/pharo-project/pharo-vm/commit/8a4b4b4ee93ea6ff71ca5671ae653db68ee14978> >> Expose method profiling data (PICs and linked sends type information): >> >> Expose method profiling data <https://github.com/pharo-project/pharo-vm/commit/dbf4154e553109ff17757f4565ca1086cc5cbe91> >> rename picData -> profilingData as it may yield also execution counters >> do not expose counters if not available >> Fix type of methodClassIfSuper, restore array shrinking <https://github.com/pharo-project/pharo-vm/commit/903ba641446c591412b59ff4f258985db9f84f45> >> Rename dollowing the literature <https://github.com/pharo-project/pharo-vm/pull/463/commits/10aba4ad1d6db046074bbf645bb134e5e5543280>: >> >> OpenPIC -> MegamorphicIC >> ClosedPIC -> PolymorphicIC >> Cleanups: >> >> Adding notYetImplemented with message parameter <https://github.com/pharo-project/pharo-vm/commit/75be0cddfe3037aa5f574c6a3791d1f307467259> >> Remove old block compilation related methods <https://github.com/pharo-project/pharo-vm/commit/a806e2f7811973cdfca76f47ee6f45a8c0243b9f> >> Remove SistaCogitClone <https://github.com/pharo-project/pharo-vm/commit/7ea5b11e031707b83b1b6ca0371167f4fd114ccc> >> Cleaning morphic related method <https://github.com/pharo-project/pharo-vm/commit/1ee56c2528503f6380415085a118d11b95078295> >> Cheers, >> G >> >>> El 15 sept 2022, a las 21:15, stephane ducasse <stephane.ducasse@inria.fr <mailto:stephane.ducasse@inria.fr>> escribi贸: >>> >>> Hi >>> >>> In CoInterpreter we can find >>> >>> initializePrimitiveTable >>> super initializePrimitiveTable. >>> PrimNumberHashMultiply := 159. >>> self assert: (PrimitiveTable at: PrimNumberHashMultiply + 1) = #primitiveHashMultiply. >>> >>> #(216 253) do: >>> [:pidx| self assert: (PrimitiveTable at: pidx + 1) = #primitiveFail]. >>> self assert: (PrimitiveTable at: 215 + 1) = #primitiveFlushCacheByMethod. >>> PrimitiveTable >>> at: 253 + 1 put: #primitiveCollectCogCodeConstituents; >>> at: 215 + 1 put: #primitiveVoidVMStateForMethod; >>> at: 216 + 1 put: #primitiveMethodXray >>> >>> >>> There is a primitive primitiveMethodXray :) >>> >>> primitiveMethodXray >>> "Lift the veil from a method and answer an integer describing the interior state >>> of its machine code. >>> Used for e.g. VM tests so they can verify they're testing what they think they're testing. >>> 0 implies a vanilla method. >>> Bit 0 = method might be compiled to machine code >>> Bit 1 = method is currently compiled to machine code >>> Bit 2 = is compiled frameless. >>> Bit 3 = method refers to young object. >>> Bit 4 = method too big to be jitted (more than 64k of code, or needs more than 1.5Mb of stack space to compile) >>> Bit 5 = method contains unknown/unjittable bytecode >>> Bit 6 = method should not be jitted because it contains a primitive not to be called from machine code (unused)" >>> | alreadyCogged flags cogMethod | >>> <var: #cogMethod type: #'CogMethod *'> >>> (self methodWithHeaderShouldBeCogged: (objectMemory methodHeaderOf: self stackTop)) >>> ifTrue: >>> [alreadyCogged := self maybeMethodHasCogMethod: self stackTop. >>> flags := 1. >>> alreadyCogged ifFalse: >>> [cogMethod := cogit cog: self stackTop selector: objectMemory nilObject. >>> (cogMethod = nil >>> and: [cogCompiledCodeCompactionCalledFor]) ifTrue: >>> [self commenceCogCompiledCodeCompaction. >>> cogMethod := cogit cog: self stackTop selector: objectMemory nilObject]. >>> cogMethod asInteger >>> caseOf: { >>> [MethodTooBig] -> [flags := 1 + 16]. >>> [EncounteredUnknownBytecode] -> [flags := 1 + 32]. >>> [ShouldNotJIT] -> [flags := 1 + 64] } >>> otherwise: [self deny: (cogMethod asInteger between: MaxNegativeErrorCode and: NotFullyInitialized)]]. >>> (flags = 1 >>> and: [self maybeMethodHasCogMethod: self stackTop]) ifTrue: >>> [cogMethod := self cogMethodOf: self stackTop. >>> flags := cogMethod stackCheckOffset = 0 ifTrue: [7] ifFalse: [3]. >>> cogMethod cmRefersToYoung ifTrue: >>> [flags := flags + 8]. >>> alreadyCogged ifFalse: >>> [cogit freeMethod: cogMethod]]] >>> ifFalse: [flags := 0]. >>> self pop: 1 thenPush: (objectMemory integerObjectOf: flags) >>> >>> >>> and I wanted to execute it. >>> >>> So on compiledMethod I defined a method >>> >>> CompiledMethod >> xray >>> >>> <primitive: 216> >>> >>> >>> and I did (Point>>#degrees) xray >>> but when I execute I get a compiled method and not an integer. >>> >>> So I probably do something silly. >>> But I would like to understand what. >>> >>> Tx >>> >>> >>> _______________________________________________ >>> Pharo-vm mailing list -- pharo-vm@lists.pharo.org <mailto:pharo-vm@lists.pharo.org> >>> To unsubscribe send an email to pharo-vm-leave@lists.pharo.org <mailto:pharo-vm-leave@lists.pharo.org> >> > > _______________________________________________ > Pharo-vm mailing list -- pharo-vm@lists.pharo.org > To unsubscribe send an email to pharo-vm-leave@lists.pharo.org