RFR: JDK-8150828 Consider using '-fno-asynchronous-unwind-tables' to reduce the size of libjvm.so by 10 percent

David Holmes david.holmes at oracle.com
Tue Jun 16 04:09:48 UTC 2020


On 16/06/2020 12:34 am, Magnus Ihse Bursie wrote:
> On 2020-06-15 15:15, David Holmes wrote:
>> Hi Magnus,
>>
>> On 15/06/2020 10:57 pm, Magnus Ihse Bursie wrote:
>>> On 2020-06-12 15:09, Erik Joelsson wrote:
>>>> Looks good to me at least.
>>> Thank you Erik.
>>>
>>> Any hotspotters who care to comment?
>>
>> I'd like a little more assurance that nothing is broken than just:
>>
>> "I've done some quick tests (debugging, creation of hs_err files)"
>>
>> I don't know whether these tables play any part in stack walking.
> I thought Volker's bug report were quite comprehensive.
> 
> Unwind tables are only used for C++ exception handling. This is not used 
> by Hotspot. (Why gcc still generates those when they are not needed is a 
> bit of a mystery...)

Part of my concern as well. It was not clear from the bug report that 
these are _only_ used by C++ exceptions, otherwise why would gcc 
generate them when we have C++ exceptions disabled?

> If we add -g (which we do), gcc will create the data needed for 
> debugging in the debug sections, from where we strip it to debuginfo files.

And in a non-debug build what does a stacktrace look like? It is correct 
but non-symbolic?

> If hs_err files are generated correctly, and it is possible to debug 
> hotspot, I think that covers the areas that could be problematic?

Yes that is the requirement, but I'm not clear to what extent these 
requirements have been verified. Have different hs_err generation 
contexts been examined or only the synchronous ones produced by the test 
flag? What kind of debugging has been checked?

> If anything else can be broken by this, it is likely to be some odd 
> corner-case. That's why I want this integrated at the start of JDK 16, 
> so we have plenty of time to discover any potential issues, and if 
> necessary, revert the change (or fix the problematic case).

We obviously have a different view on where the pre-integration testing 
bar should be set. Please at least ensure mach5 tiers 1-3 pass before 
pushing.

Thanks,
David

> /Magnus
>>
>> Thanks,
>> David
>> -----
>>
>>>
>>> /Magnus
>>>>
>>>> /Erik
>>>>
>>>> On 2020-06-12 05:21, Magnus Ihse Bursie wrote:
>>>>> From Volker's bug report:
>>>>>
>>>>> "We are building and linking the libjvm.so on Linux with 
>>>>> -fnoexceptions because we currently don't use C++ exception 
>>>>> handling in the HotSpot.
>>>>>
>>>>> Nevertheless, g++ generates unwind tables (i.e. .eh_frame sections) 
>>>>> in the object files and shared libraries which can not be stripped 
>>>>> from the binary. In the case of libjvm.so, these sections consume 
>>>>> 10% of the whole library.
>>>>>
>>>>> It is possible to omit the creation of these sections by using the 
>>>>> '-fno-asynchronous-unwind-tables' option during compilation and 
>>>>> linking. Ive verified that this indeed reduces the size of 
>>>>> libjvm.so by 10% on Linux/x86_64 for a product build:
>>>>>
>>>>> -rwxrwxr-x 1 simonis simonis 18798859 Feb 24 18:32 
>>>>> hotspot/linux_amd64_compiler2/product/libjvm.so
>>>>> -rwxrwxr-x 1 simonis simonis 17049867 Feb 25 18:12 
>>>>> hotspot_no_unwind/linux_amd64_compiler2/product/libjvm.so
>>>>>
>>>>> The gcc documentation mentions that the unwind information is used 
>>>>> "for stack unwinding from asynchronous events (such as debugger or 
>>>>> garbage collector)". But various references [1,2] also mention that 
>>>>> using '-fno-asynchronous-unwind-tables' together with '-g' will 
>>>>> force gcc to create this information in the debug sections of the 
>>>>> object files (i.e. .debug_frame) which can easily be stripped from 
>>>>> the object files and libraries.
>>>>>
>>>>> As we build the product version of the libjvm.so with '-g' anyway, 
>>>>> I'd suggest to use '-fno-asynchronous-unwind-tables' to reduce its 
>>>>> size.
>>>>>
>>>>> I've done some quick tests (debugging, creation of hs_err files) 
>>>>> with a product version of libjvm.so which was build with 
>>>>> '-fno-asynchronous-unwind-tables' and couldn't find any draw backs. 
>>>>> I could observe that all the date from the current .eh_frame 
>>>>> sections has bee moved to the .debug_frame sections in the stripped 
>>>>> out data of the libjvm.debuginfo file."
>>>>>
>>>>> The patch itself is trivial, see below.
>>>>>
>>>>> Hotspot folks: Are there any reasons why we should not do it? I've 
>>>>> waited for JDK 16 to push this; if something unexpected turns up 
>>>>> during the development of JDK 16 (if anything, it's odd corner 
>>>>> cases that might be a problem), we can always revert this.
>>>>>
>>>>> Bug: https://bugs.openjdk.java.net/browse/JDK-8150828
>>>>> Patch inline:
>>>>> diff --git a/make/autoconf/flags-cflags.m4 
>>>>> b/make/autoconf/flags-cflags.m4
>>>>> --- a/make/autoconf/flags-cflags.m4
>>>>> +++ b/make/autoconf/flags-cflags.m4
>>>>> @@ -442,7 +442,8 @@
>>>>>    if test "x$TOOLCHAIN_TYPE" = xgcc || test "x$TOOLCHAIN_TYPE" = 
>>>>> xclang; then
>>>>>      # COMMON to gcc and clang
>>>>>      TOOLCHAIN_CFLAGS_JVM="-pipe -fno-rtti -fno-exceptions \
>>>>> -        -fvisibility=hidden -fno-strict-aliasing 
>>>>> -fno-omit-frame-pointer"
>>>>> +        -fvisibility=hidden -fno-strict-aliasing 
>>>>> -fno-omit-frame-pointer \
>>>>> +        -fno-asynchronous-unwind-tables"
>>>>>    fi
>>>>>
>>>>>    if test "x$TOOLCHAIN_TYPE" = xgcc; then
>>>>>
>>>>> /Magnus
>>>
> 



More information about the build-dev mailing list