Skip to content
  • Bertram Felgenhauer's avatar
    Compute DW_FORM_block length correctly; also fixes #15068 · 358b5080
    Bertram Felgenhauer authored and Ömer Sinan Ağacan's avatar Ömer Sinan Ağacan committed
    Before this patch, the pprUnwindwExpr function computed the length of
    by the following assembly fragment:
    
    	.uleb128 1f-.-1
    	<expression data>
    1:
    
    That is, to compute the length, it takes the difference of the label 1
    and the address of the .uleb128 directive, and subtracts 1.
    
    In #15068 it was reported that `as` from binutils 4.30 has trouble with
    evaluating the `.` part of the expression. However, there is actually a
    problem with the expression, if the length of the data ever becomes
    larger than 128: In that case, the .uleb128 directive will emit more
    than 1 byte, and the computed length will be wrong.
    
    The present patch changes the assembly fragment to use two labels,
    which fixes both these problems.
    
    	.uleb128 2f-1f
    1:
    	<expression data>
    2:
    
    Test Plan: validate
    
    Reviewers: bgamari, osa1
    
    Reviewed By: bgamari
    
    Subscribers: thomie, carter
    
    GHC Trac Issues: #15068
    
    Differential Revision: https://phabricator.haskell.org/D4654
    358b5080