This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] dwarf: Read register number as unsigned in DW_CFA_def_cfa*
- From: Simon Marchi <simon dot marchi at ericsson dot com>
- To: <binutils at sourceware dot org>
- Cc: Simon Marchi <simon dot marchi at ericsson dot com>
- Date: Thu, 26 Oct 2017 11:41:41 -0400
- Subject: [PATCH] dwarf: Read register number as unsigned in DW_CFA_def_cfa*
- Authentication-results: sourceware.org; auth=none
- Authentication-results: spf=none (sender IP is ) smtp.mailfrom=simon dot marchi at ericsson dot com;
- Spamdiagnosticmetadata: NSPM
- Spamdiagnosticoutput: 1:99
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.
---
binutils/dwarf.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
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;
--
2.7.4