On Thu, 15 Jul 2021 12:25:54 GMT, Jorn Vernee <jver...@openjdk.org> wrote:

>> src/hotspot/share/prims/universalUpcallHandler.cpp line 76:
>> 
>>> 74: 
>>> 75: // modelled after JavaCallWrapper::JavaCallWrapper
>>> 76: Thread* 
>>> ProgrammableUpcallHandler::on_entry(OptimizedEntryBlob::FrameData* context) 
>>> {
>> 
>> This should return JavaThread not Thread.
>
> Thanks.
> 
> I've been careful here to return a `Thread*` since the result is stored in 
> `r15_thread` and I thought converting between sub and super types could 
> potentially result in different pointers due to the way super types are laid 
> out within a subtype. I thought it worked like this:
> 
> 
> Subclass
> +---
> | {Subclass vtable pointer}
> | +--- (base class Super)
> | | {Super vtable pointer}
> | +---
> +---
> 
> 
> So, I thought plainly using a `JavaThread*` in generated machine code where a 
> `Thread*` was expected could cause trouble, since the pointer needs to be 
> offset for the type conversion.
> 
> But now that I'm looking at some cases with compiler explorer, the pointer 
> offset only seems to be needed when using multiple inheritance, for instance:
> 
> 
> class SuperA {
> public:
>     virtual void foo();
> };
> 
> class SuperB {
> public:
>     virtual void bar();
> };
> 
> class Sub : public SuperA, public SuperB {
> public:
>     virtual void baz();
> };
> 
> 
> Results in:
> 
> 
> class Sub     size(16):
>       +---
>  0    | +--- (base class SuperA)
>  0    | | {vfptr}
>       | +---
>  8    | +--- (base class SuperB)
>  8    | | {vfptr}
>       | +---
>       +---
> 
> Sub::$vftable@SuperA@:
>       | &Sub_meta
>       |  0
>  0    | &SuperA::foo 
>  1    | &Sub::baz 
> 
> Sub::$vftable@SuperB@:
>       | -8
>  0    | &SuperB::bar 
> 
> Sub::baz this adjustor: 0
> 
> 
> (https://godbolt.org/z/1665fWzff)
> 
> It seems that the sub type just reuses the vtable pointer of the first super 
> type (probably to avoid having to do this pointer offsetting). Though, 
> converting between `SuperB*` and `Sub*` would require offsetting the pointer. 
> I'm still not sure this is guaranteed to work like this with all compilers 
> though (the example is with MSVC, which has options to dump class layouts).
> 
> The result of `on_entry` is stored in `r15_thread`, so I guess I'm wondering 
> if it's safe to store a `JavaThread*` instead of a `Thread*` in `r15`, and 
> other code, which may expect `r15` to hold a `Thread*`, is guaranteed to keep 
> working? (FWIW, after changing the return type to `JavaThread*` the tests 
> that exercise this code still pass on Windows with MSVC, and on WSL Linux 
> with GCC).

Sorry, I sent the wrong godbolt link: https://godbolt.org/z/1665fWzff

-------------

PR: https://git.openjdk.java.net/jdk17/pull/149

Reply via email to