RFR JDK-8021954 VM SIGSEGV during classloading on MacOS; hs_err_pid file produced
David Holmes
david.holmes at oracle.com
Tue Aug 27 04:31:41 PDT 2013
On 27/08/2013 6:01 PM, Mikael Gerdin wrote:
> On 2013-08-27 04:41, David Holmes wrote:
>> On 27/08/2013 4:36 AM, Lois Foltan wrote:
>>> Please review the following fix:
>>>
>>> Internal webrev:
>>>
>>> http://cr.openjdk.java.net/~coleenp/bug_jdk8021954/
>>>
>>> Bug: VM SIGSEGV during classloading on MacOS; hs_err_pid file produced &
>>> runtime/6878713/Test6878713.sh fails on mac
>>>
>>> bug links at: https://bugs.openjdk.java.net/browse/JDK-8021954
>>> https://bugs.openjdk.java.net/browse/JDK-8022140
>>>
>>> Summary of fix:
>>> On MacOS, currently Hotspot is built specifying the -fcheck-new
>>> command line option to the llvm-g++ compiler.
>>> The -fcheck-new option directs the compiler to "check that the
>>> pointer returned by |operator new| is non-null
>>> before attempting to modify the storage allocated." The clang++
>>> compiler does not support the
>>> -fcheck-new option. To obtain similiar functionality when
>>> building Hotspot with clang++, empty exception
>>> throw() specifications must be added to all user-defined operator
>>> new()'s.
>>
>> We just spotted something related in the PPC64 port and were going the
>> other way or removing these "spurious" throw() declarations.
>>
>> But this seems really ugly - is there really a need to specialize this
>> for clang and use NOEXCEPT to hide it? Shouldn't all C++ compilers
>> honour the nothrow() semantics?
>>
>> That said I thought we already handled this using the "const
>> std::nothrow_t& nothrow_constant" where needed? Our other operator new
>> implementations shouldn't return NULL but will abort.
>>
>> So why do we need -fcheck-new or this empty throw() ?
>
> I guess that if the C++ compiler knows that operator new() will throw an
> exception if an allocation fails then it doesn't need to emit code to
> explicitly avoid calling the constructor.
Yes that is what happens, but why do _we_ need it when ...
> If we declare operator new() with an empty throw() we will also inform
> the compiler that new can't throw an exception and therefore the
> compiler needs to explicitly handle failed allocations.
... we have two kinds of operator new implementations (or at least we
_should_ only have two kinds):
1. Will abort on OOM (either ResourceArea exhaustion or Stack
exhaustion) and so never returns NULL
2. Can return NULL and uses std::nothrow to indicate that
So we should not need this if the nothrow is acting as I think it
should. Have we missed places where nothrow is needed? Do we have errant
operator new definitions unrelated to the allocation base classes?
David
-----
> The g++ man page states:
>
> -fcheck-new
> Check that the pointer returned by "operator new" is
> non-null before attempting to modify the storage allocated. This check
> is normally unnecessary because the C++ standard specifies that
> "operator new" will only return 0 if it is declared throw(),
> in which case the compiler will always check the return value even
> without this option. In all other cases, when "operator new"
> has a non-empty exception specification, memory exhaustion
> is signalled by throwing "std::bad_alloc". See also new (nothrow).
>
> /Mikael
>
>>
>> Thanks,
>> David
>>
>>> Tests:
>>>
>>> Solaris: built fastdebug & product images
>>> Linux: built fastdebug & product images
>>> MacOS: built fastdebug & product images using llvm-g++ - ran
>>> JTREG
>>> built fastdebug & product images using clang++ -
>>> ran JTREG, JCK vm & lang, vm.quick.testlist (in progress)
>>> Windows: built fastdebug & product images with VS2010
>>>
More information about the hotspot-runtime-dev
mailing list