[11] RFR(XS): MallocSiteTable::initialize() doesn't take function descriptors into account

Zhengyu Gu zgu at redhat.com
Mon Jul 2 23:09:14 UTC 2018


Hi Volker,

fp[0] should work with little endian as well, right?

I wonder if change

pc[2] = (address)MallocSiteTable::allocation_at;

to

pc[2] = (address)(&MallocSiteTable::allocation_at);

will work.

Thanks,

-Zhengyu

On 07/02/2018 01:27 PM, Volker Simonis wrote:
> Hi,
> 
> can I please have a review for this trivial change which fixes a
> problem on Linux/ppc64
> 
> http://cr.openjdk.java.net/~simonis/webrevs/2018/8206173/
> https://bugs.openjdk.java.net/browse/JDK-8206173
> 
> MallocSiteTable::initialize() creates a pseudo call stack for
> hashtable entry allocations which is populated with the addresses of
> some well-known static methods.
> 
> However, taking the address of a function or static method in C/C++
> isn't required to return the actual code address where that function
> lives in memory. On ppc64 (i.e. big-endian, ABI ELFv1) applying the
> address operator on a function will return the functions "function
> descriptor" (see
> http://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#FUNC-DES)
> which is a struct of three pointers where the first one points to the
> actual function address.
> 
> In order to get a correct stack trace on ppc64 as well, we therefore
> have to dereference the function descriptor before we can store the
> real function address in the stack trace.
> 
> In order to make the shared code fix less intrusive, I've added a pair
> of LITTLE_ENDIAN_ONLY/BIG_ENDIAN_ONLY macros to macros.hpp.
> 
> This bug is the reason why runtime/ElfDecoder/TestElfDirectRead.java
> fails on Linux/ppc64.
> 
> Thank you and best regards,
> Volker
> 


More information about the hotspot-dev mailing list