[GHC] #14999: unwinding info for stg_catch_frame is wrong

GHC ghc-devs at haskell.org
Wed Apr 4 09:03:14 UTC 2018


#14999: unwinding info for stg_catch_frame is wrong
-------------------------------------+-------------------------------------
           Reporter:  niteria        |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  normal         |         Milestone:  8.4.3
          Component:  Compiler       |           Version:
           Keywords:                 |  Operating System:  Linux
       Architecture:  x86_64         |   Type of failure:  Debugging
  (amd64)                            |  information is incorrect
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 Minimized `stg_catch_frame` (`Small.cmm`):

 {{{
 #define CATCH_FRAME 34

 #define SIZEOF_StgCatchFrame (SIZEOF_StgHeader+16)

 INFO_TABLE_RET(stg_catch_frame, CATCH_FRAME,
                bits64 info_ptr, bits64 exceptions_blocked, gcptr handler)
     return (gcptr ret)
 {
     unwind Sp = Sp + SIZEOF_StgCatchFrame;
     return (ret);
 }
 }}}

 Compile `"inplace/bin/ghc-stage2" -O2 -g  -c Small.cmm` using GHC HEAD.

 `objdump -D` for `stg_catch_frame_info`:

 {{{
 0000000000000010 <stg_catch_frame_info>:
   10:   48 83 c5 18             add    $0x18,%rbp
   14:   ff 65 00                jmpq   *0x0(%rbp)
 }}}

 `readelf --debug-dump=frames-interp Small.o`:

 {{{
 Contents of the .debug_frame section:

 00000000 0000000000000014 ffffffff CIE "" cf=1 df=-8 ra=16
    LOC           CFA      rbp   rsp   ra
 0000000000000000 rbp+0    v+0   s     c+0

 00000018 000000000000002c 00000000 FDE cie=00000000
 pc=000000000000000f..0000000000000017
    LOC           CFA      rbp   rsp   ra
 000000000000000f rbp+0    v+0   s     c+0
 000000000000000f rbp+24   v+0   s     c+0
 0000000000000010 rbp+0    v+0   s     c+0
 }}}

 **How do I know this is wrong?**

 http://www.dwarfstd.org/doc/dwarf-2.0.0.pdf has a nice example in Appendix
 5 (page 101 of the pdf).
 The question that I had was if the CFA value at LOC is after or before the
 instruction at LOC executes. Appendix 5 clearly shows that it's
 **before**.

 Hence for LOC = 0x10 here CFA shouldn't have changed. It can and should
 change at LOC = 0x14.



 For comparison this is what `8.0.2` produced (and it worked more often):

 {{{
 0000000000000010 <stg_catch_frame_info>:
   10:   48 83 c5 18             add    $0x18,%rbp
   14:   ff 65 00                jmpq   *0x0(%rbp)
 }}}

 {{{
 Contents of the .debug_frame section:

 00000000 0000000000000014 ffffffff CIE "" cf=1 df=-8 ra=16
    LOC           CFA      rbp   rsp   ra
 0000000000000000 rbp+0    v+0   s     c+0

 00000018 0000000000000024 00000000 FDE cie=00000000
 pc=000000000000000f..0000000000000017
    LOC           CFA      rbp   rsp   ra
 000000000000000f rbp+0    v+0   s     c+0
 000000000000000f rbp+24   v+0   s     c+0
 }}}

 Debugging follows in the comments.

-- 
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/14999>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list