[Vm-dev] Suggested change for SpurMemoryManager>>#classAtIndex:

Hernan Wilkinson hernan.wilkinson at 10pines.com
Wed Oct 10 09:45:00 UTC 2018


well, I have the same problem but with the message #lengthOf:, but now the
behavior is weird.
If I have the following code, everything works fine:
typesSize := (objectMemory lengthOf: types) - 1.

If I remove the - 1, like this:
typesSize := objectMemory lengthOf: types.

I get redefinition of labels errors:
../../spurstack64src/vm/gcc3x-interp.c:4879:2: error: redefinition of label
'l46'
        l46:    /* end lengthOf:format: */;
        ^
../../spurstack64src/vm/gcc3x-interp.c:4693:2: note: previous definition is
here
        l46:    /* end lengthOf:format: */;
        ^

The thing is that in the first case #lengthOf: is not inlined but in the
second it is and it looks like that the label is not regenerated every time
it gets inlined.
 Is there a well know workaround for this? I mean, I could do:
typesSize := (objectMemory lengthOf: types) - 0.

 and it will compile but that is not the point.
 Also, why in the first case the code generator decides not to inline
#lengthOf: but it does in the second case?

Thanks!
Hernan.



On Tue, Oct 9, 2018 at 8:40 PM Hernan Wilkinson <
hernan.wilkinson at 10pines.com> wrote:

> Hi,
>  I got compile errors when setting <inline: true> in a method I created.
>  The errors where a label redefinition such as:
> ../../spurstack64src/vm/gcc3x-interp.c:4790:2: error: redefinition of
> label 'l35'
>         l35:    /* end classAtIndex: */;
>         ^
> ../../spurstack64src/vm/gcc3x-interp.c:4634:2: note: previous definition
> is here
>         l35:    /* end classAtIndex: */;
>         ^
>
>  After some research I concluded that the problem was
> at SpurMemoryManager>>#classAtIndex: due to how it returns:
> ...
> classTablePage = nilObj ifTrue:
> [^nil].
> ^self
> fetchPointer: (classIndex bitAnd: self classTableMinorIndexMask)
> ofObject: classTablePage
>
>  I think the source code generator does not support correctly returning at
> different points when inlining the same method more than once.
>  So I changed that implementation to:
> ...
> ^classTablePage = nilObj
> ifTrue: [nil]
> ifFalse: [ self
> fetchPointer: (classIndex bitAnd: self classTableMinorIndexMask)
> ofObject: classTablePage ]
>
>  Doing so the compile errors were gone and the VM keeps working correctly.
>  Is this fix correct or does it have some performance hit I do not know?
>  Should I inform about this change with a PR? (Sorry about this question
> but I'm new to this vm stuff :-) )
>
>  Here is the complete code of the method:
> classAtIndex: classIndex
> <api>
> <inline: true>
> | classTablePage |
> self assert: (classIndex >= 0 and: [classIndex <= self tagMask or:
> [classIndex >= self arrayClassIndexPun and: [classIndex <= self
> classIndexMask]]]).
> classTablePage := self fetchPointer: classIndex >> self
> classTableMajorIndexShift
> ofObject: hiddenRootsObj.
> ^classTablePage = nilObj
> ifTrue: [nil]
> ifFalse: [ self
> fetchPointer: (classIndex bitAnd: self classTableMinorIndexMask)
> ofObject: classTablePage ]
>
>  Cheers!
>  Hernan.
> --
>
> *Hernán WilkinsonAgile Software Development, Teaching & Coaching*
> *Phone: +54-011*-4893-2057
> *Twitter: @HernanWilkinson*
> *site: http://www.10Pines.com <http://www.10pines.com/>*
> Address: Alem 896, Floor 6, Buenos Aires, Argentina
>


-- 

*Hernán WilkinsonAgile Software Development, Teaching & Coaching*
*Phone: +54-011*-4893-2057
*Twitter: @HernanWilkinson*
*site: http://www.10Pines.com <http://www.10pines.com/>*
Address: Alem 896, Floor 6, Buenos Aires, Argentina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20181010/e73b7f4e/attachment.html>


More information about the Vm-dev mailing list