diff options
author | Simon Marchi <simon.marchi@ericsson.com> | 2017-10-27 09:01:36 -0400 |
---|---|---|
committer | Simon Marchi <simon.marchi@ericsson.com> | 2017-10-27 09:01:36 -0400 |
commit | 32ef30002cee3661eb645cd14bcc4ff77ea10f45 (patch) | |
tree | d80954cc6034f9922c28c1a628473bf1c1137a5c /binutils | |
parent | 7453e6b2ea451dfba68cf4442e58706d51f88411 (diff) | |
download | fsf-binutils-gdb-32ef30002cee3661eb645cd14bcc4ff77ea10f45.zip fsf-binutils-gdb-32ef30002cee3661eb645cd14bcc4ff77ea10f45.tar.gz fsf-binutils-gdb-32ef30002cee3661eb645cd14bcc4ff77ea10f45.tar.bz2 |
dwarf: Read register number as unsigned in DW_CFA_def_cfa*
When displaying the .debug_frame section, the register numbers in the
DW_CFA_def_cfa* statements are read as signed numbers. I have come
across a target that has register 121, encoded as 0x79 in unsigned LEB128.
Interpreting this as signed results in -7, which makes readelf display
"r-7".
The DWARF5 standard (6.4.2.2) states that the register numbers should be
treated as unsigned LEB128.
Simply replacing READ_SLEB with READ_ULEB resulted in warnings like
these:
/home/emaisin/src/binutils-gdb/binutils/dwarf.c: In function ‘display_debug_frames’:
/home/emaisin/src/binutils-gdb/binutils/dwarf.c:355:17: error: comparison between signed and unsigned integer expressions [-Werror=sign-compare]
if ((var) != _val) \
^
/home/emaisin/src/binutils-gdb/binutils/dwarf.c:7866:8: note: in expansion of macro ‘READ_ULEB’
READ_ULEB (fc->cfa_reg);
^
... so I also changed Frame_Chunk::cfa_reg to an unsigned int.
binutils/ChangeLog:
* dwarf.c (struct Frame_Chunk) <cfa_reg>: Change type to
unsigned int.
(display_debug_frames): Read CFA reg as an unsigned number.
Diffstat (limited to 'binutils')
-rw-r--r-- | binutils/ChangeLog | 6 | ||||
-rw-r--r-- | binutils/dwarf.c | 8 |
2 files changed, 10 insertions, 4 deletions
diff --git a/binutils/ChangeLog b/binutils/ChangeLog index ad9d33b..8d77c68 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,9 @@ +2017-10-27 Simon Marchi <simon.marchi@ericsson.com> + + * dwarf.c (struct Frame_Chunk) <cfa_reg>: Change type to + unsigned int. + (display_debug_frames): Read CFA reg as an unsigned number. + 2017-10-25 Alan Modra <amodra@gmail.com> * nm.c (filter_symbols): Match "__gnu_lto_slim" optionally prefixed diff --git a/binutils/dwarf.c b/binutils/dwarf.c index 06702ef..873f104 100644 --- a/binutils/dwarf.c +++ b/binutils/dwarf.c @@ -6646,7 +6646,7 @@ typedef struct Frame_Chunk int data_factor; dwarf_vma pc_begin; dwarf_vma pc_range; - int cfa_reg; + unsigned int cfa_reg; dwarf_vma cfa_offset; unsigned int ra; unsigned char fde_encoding; @@ -7863,7 +7863,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa: - READ_SLEB (fc->cfa_reg); + READ_ULEB (fc->cfa_reg); READ_ULEB (fc->cfa_offset); fc->cfa_exp = 0; if (! do_debug_frames_interp) @@ -7872,7 +7872,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa_register: - READ_SLEB (fc->cfa_reg); + READ_ULEB (fc->cfa_reg); fc->cfa_exp = 0; if (! do_debug_frames_interp) printf (" DW_CFA_def_cfa_register: %s\n", @@ -7991,7 +7991,7 @@ display_debug_frames (struct dwarf_section *section, break; case DW_CFA_def_cfa_sf: - READ_SLEB (fc->cfa_reg); + READ_ULEB (fc->cfa_reg); READ_ULEB (fc->cfa_offset); fc->cfa_offset = fc->cfa_offset * fc->data_factor; fc->cfa_exp = 0; |