------- Comment #3 from jakub at gcc dot gnu dot org 2008-11-18 09:03 ------- libunwind also scales all of DW_CFA_advance_loc{,1,2,4} by code alignment factor and IMHO it matches the standard wording too: DW_CFA_advance_loc The DW_CFA_advance instruction takes a single operand (encoded with the opcode) that represents a constant delta. The required action is to create a new table row with a location value that is computed by taking the current entry's location value and adding the value of delta * code_alignment_factor. All other values in the new row are initially identical to the current row. DW_CFA_advance_loc1 The DW_CFA_advance_loc1 instruction takes a single ubyte operand that represents a constant delta. This instruction is identical to DW_CFA_advance_loc except for the encoding and size of the delta operand.
Can you submit the trivial fix (replace 3 times (delta) with (scaled) in dw2gencfi.c to binutils? On the GCC side we'll need to write a configury test which will fail if this bug is detected and the target has code alignment factor bigger than 1. -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37610