RFR (S): 8245833: crash_with_sigfpe uses pthread_kill(SIGFPE) on macOS

gerard ziemski gerard.ziemski at oracle.com
Fri May 29 16:52:43 UTC 2020


hi David,

Thank you for the review.

On 5/28/20 7:03 PM, David Holmes wrote:
> Hi Gerard,
>
> On 29/05/2020 3:34 am, gerard ziemski wrote:
>> hi all,
>>
>> Please review this small and simple fix, that implements 
>> crash_with_sigfpe() in a way that causes an actual crash on macOS, so 
>> it doesn't need to fallback that uses pthread_kill()
>>
>> bug link at https://bugs.openjdk.java.net/browse/JDK-8245833
>> webrev at http://cr.openjdk.java.net/~gziemski/8245833_rev1
>> passes Mach5 hs_tier1,2,3,4,5
>
> Fix looks fine.
>
> So presumably this old code:
>
>    volatile int x = 0;
>    volatile int y = 1/x;
>
> is actually elided by the compiler when we build for macOS?

It's not exactly elided, since the compiler still generates assembly for 
that code, but I noticed that while normally the compiler would complain 
about the unused "y", in this case it does not, so it probably optimizes 
it without actually performing the division by zero, due to some 
compiler flag we are using (I don't know which one makes the difference 
here), i.e.:

   volatile int x = 0;
   volatile int y = 1/x;

   xorl  %eax, %eax
   .loc  37 1751 16              ## 
open/src/hotspot/share/utilities/vmError.cpp:1751:16
   movl  %eax, -88(%rbp)
   .loc  37 1752 22              ## 
open/src/hotspot/share/utilities/vmError.cpp:1752:22
   movl  -88(%rbp), %ecx
   .loc  37 1752 21 is_stmt 0    ## 
open/src/hotspot/share/utilities/vmError.cpp:1752:21
   leal  1(%rcx), %edx
   cmpl  $3, %edx
   cmovael  %eax, %ecx
   .loc  37 1752 16              ## 
open/src/hotspot/share/utilities/vmError.cpp:1752:16
   movl  %ecx, -152(%rbp)

I don't see division instruction here, however for:

  sigfpe_int = sigfpe_int/sigfpe_int;

   .loc  37 1751 16              ## 
open/src/hotspot/share/utilities/vmError.cpp:1751:16
   movl  _sigfpe_int(%rip), %eax
   .loc  37 1751 26 is_stmt 0    ## 
open/src/hotspot/share/utilities/vmError.cpp:1751:26
   cltd
   idivl  _sigfpe_int(%rip)
   .loc  37 1751 14              ## 
open/src/hotspot/share/utilities/vmError.cpp:1751:14
   movl  %eax, _sigfpe_int(%rip)

we see the "idivl" instruction in the assembly.

For reference, a simple C test case with standard compiler flags produces:

  volatile int x = 0;
  volatile int y = 1/x;

  .loc  1 439 16                ## hello/main.cpp:439:16
  movl  $0, -20(%rbp)
  .loc  1 440 22                ## hello/main.cpp:440:22
  movl  -20(%rbp), %ecx
  .loc  1 440 21 is_stmt 0      ## hello/main.cpp:440:21
  movl  $1, %edx
  movl  %eax, -28(%rbp)         ## 4-byte Spill
  movl  %edx, %eax
  cltd
  idivl  %ecx
  .loc  1 440 16                ## hello/main.cpp:440:16
  movl  %eax, -24(%rbp)
  .loc  1 441 3 is_stmt 1       ## hello/main.cpp:441:3

which also has the "idivl" instruction and also crashes, so it must be 
one of our compiler flags that optimizes the unused variable?


cheers


More information about the hotspot-runtime-dev mailing list