This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
debug_frame dumps
- To: binutils at sources dot redhat dot com
- Subject: debug_frame dumps
- From: Richard Henderson <rth at redhat dot com>
- Date: Wed, 16 May 2001 09:29:10 -0700
The tabular debug_frame dumps are, IMO, useless. Certainly they are
of no help if you're writting utilities that process debug_frame data.
I've left them in though. Access them via -wF instead of -wf.
I've fixed things so that it works against a 64-bit target, at least
when run from a 64-bit host. Further, gcc3's .eh_frame can use
pointers smaller than normal, based on the augmentation string.
r~
* readelf.c (do_debug_frames_interp): New.
(byte_get_little_endian): If BFD64, always read entire 8-byte fields.
(byte_get_big_endian): Likewise.
(parse_args) ['F']: Set do_debug_frames_interp.
(Frame_Chunk): Make data_factor signed, add fde_encoding.
(frame_display_row): Don't trunc pc_begin to int.
(size_of_encoded_value): New.
(display_debug_frames): Handle 64-bit targets. Print raw data
unless do_debug_frames_interp.
(debug_displays): Remove duplicate .debug_frame.
Index: readelf.c
===================================================================
RCS file: /cvs/src/src/binutils/readelf.c,v
retrieving revision 1.101
diff -c -p -d -r1.101 readelf.c
*** readelf.c 2001/05/15 12:24:29 1.101
--- readelf.c 2001/05/16 16:14:52
*************** int do_debug_lines;
*** 118,123 ****
--- 118,124 ----
int do_debug_pubnames;
int do_debug_aranges;
int do_debug_frames;
+ int do_debug_frames_interp;
int do_arch;
int do_notes;
int is_32bit_elf;
*************** byte_get_little_endian (field, size)
*** 376,386 ****
--- 377,389 ----
return ((unsigned int) (field [0]))
| (((unsigned int) (field [1])) << 8);
+ #ifndef BFD64
case 8:
/* We want to extract data from an 8 byte wide field and
place it into a 4 byte wide field. Since this is a little
endian source we can juts use the 4 byte extraction code. */
/* Fall through. */
+ #endif
case 4:
return ((unsigned long) (field [0]))
| (((unsigned long) (field [1])) << 8)
*************** byte_get_little_endian (field, size)
*** 388,393 ****
--- 391,397 ----
| (((unsigned long) (field [3])) << 24);
#ifdef BFD64
+ case 8:
case -8:
/* This is a special case, generated by the BYTE_GET8 macro.
It means that we are loading an 8 byte value from a field
*************** byte_get_big_endian (field, size)
*** 516,521 ****
--- 520,526 ----
| (((unsigned long) (field [1])) << 16)
| (((unsigned long) (field [0])) << 24);
+ #ifndef BFD64
case 8:
/* Although we are extracing data from an 8 byte wide field, we
are returning only 4 bytes of data. */
*************** byte_get_big_endian (field, size)
*** 523,530 ****
| (((unsigned long) (field [6])) << 8)
| (((unsigned long) (field [5])) << 16)
| (((unsigned long) (field [4])) << 24);
!
! #ifdef BFD64
case -8:
/* This is a special case, generated by the BYTE_GET8 macro.
It means that we are loading an 8 byte value from a field
--- 528,535 ----
| (((unsigned long) (field [6])) << 8)
| (((unsigned long) (field [5])) << 16)
| (((unsigned long) (field [4])) << 24);
! #else
! case 8:
case -8:
/* This is a special case, generated by the BYTE_GET8 macro.
It means that we are loading an 8 byte value from a field
*************** parse_args (argc, argv)
*** 2164,2171 ****
do_debug_aranges = 1;
break;
- case 'f':
case 'F':
do_debug_frames = 1;
break;
--- 2169,2177 ----
do_debug_aranges = 1;
break;
case 'F':
+ do_debug_frames_interp = 1;
+ case 'f':
do_debug_frames = 1;
break;
*************** process_section_headers (file)
*** 2895,2901 ****
dynamic_strings, char *, "dynamic strings");
}
else if ((do_debugging || do_debug_info || do_debug_abbrevs
! || do_debug_lines || do_debug_pubnames || do_debug_aranges || do_debug_frames)
&& strncmp (name, ".debug_", 7) == 0)
{
name += 7;
--- 2901,2908 ----
dynamic_strings, char *, "dynamic strings");
}
else if ((do_debugging || do_debug_info || do_debug_abbrevs
! || do_debug_lines || do_debug_pubnames || do_debug_aranges
! || do_debug_frames)
&& strncmp (name, ".debug_", 7) == 0)
{
name += 7;
*************** typedef struct Frame_Chunk
*** 6991,7002 ****
int * col_offset;
char * augmentation;
unsigned int code_factor;
! unsigned int data_factor;
unsigned long pc_begin;
unsigned long pc_range;
int cfa_reg;
int cfa_offset;
int ra;
}
Frame_Chunk;
--- 6998,7010 ----
int * col_offset;
char * augmentation;
unsigned int code_factor;
! int data_factor;
unsigned long pc_begin;
unsigned long pc_range;
int cfa_reg;
int cfa_offset;
int ra;
+ unsigned char fde_encoding;
}
Frame_Chunk;
*************** frame_display_row (fc, need_col_headers,
*** 7058,7064 ****
printf ("\n");
}
! printf ("%08x ", (unsigned int) fc->pc_begin);
sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
printf ("%-8s ", tmp);
--- 7066,7072 ----
printf ("\n");
}
! printf ("%08lx ", fc->pc_begin);
sprintf (tmp, "r%d%+d", fc->cfa_reg, fc->cfa_offset);
printf ("%-8s ", tmp);
*************** frame_display_row (fc, need_col_headers,
*** 7090,7095 ****
--- 7098,7117 ----
printf ("\n");
}
+ static int
+ size_of_encoded_value (encoding)
+ int encoding;
+ {
+ switch (encoding & 0x7)
+ {
+ default: /* ??? */
+ case 0: return is_32bit_elf ? 4 : 8;
+ case 2: return 2;
+ case 3: return 4;
+ case 4: return 8;
+ }
+ }
+
#define GET(N) byte_get (start, N); start += N
#define LEB() read_leb128 (start, & length_return, 0); start += length_return
#define SLEB() read_leb128 (start, & length_return, 1); start += length_return
*************** display_debug_frames (section, start, fi
*** 7108,7113 ****
--- 7130,7136 ----
int is_eh = (strcmp (SECTION_NAME (section), ".eh_frame") == 0);
int length_return;
int max_regs = 0;
+ int addr_size = is_32bit_elf ? 4 : 8;
printf (_("The section %s contains:\n"), SECTION_NAME (section));
*************** display_debug_frames (section, start, fi
*** 7120,7125 ****
--- 7143,7151 ----
Frame_Chunk * fc;
Frame_Chunk * cie;
int need_col_headers = 1;
+ unsigned char * augmentation_data = NULL;
+ unsigned long augmentation_data_len = 0;
+ int encoded_ptr_size = addr_size;
saved_start = start;
length = byte_get (start, 4); start += 4;
*************** display_debug_frames (section, start, fi
*** 7130,7139 ****
block_end = saved_start + length + 4;
cie_id = byte_get (start, 4); start += 4;
- printf ("\n%08x %08lx %08lx ", saved_start - section_start, length, cie_id);
-
if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
{
fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
memset (fc, 0, sizeof (Frame_Chunk));
--- 7156,7165 ----
block_end = saved_start + length + 4;
cie_id = byte_get (start, 4); start += 4;
if (is_eh ? (cie_id == 0) : (cie_id == DW_CIE_ID))
{
+ int version;
+
fc = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
memset (fc, 0, sizeof (Frame_Chunk));
*************** display_debug_frames (section, start, fi
*** 7144,7171 ****
fc->col_type = (short int *) xmalloc (sizeof (short int));
fc->col_offset = (int *) xmalloc (sizeof (int));
frame_need_space (fc, max_regs-1);
-
- start ++; /* version */
- fc->augmentation = start;
! while (* start)
! start++;
! start++; /* skip past NUL */
if (fc->augmentation[0] == 'z')
{
- int xtra;
fc->code_factor = LEB ();
fc->data_factor = SLEB ();
fc->ra = byte_get (start, 1); start += 1;
! xtra = LEB ();
! printf ("skipping %d extra bytes\n", xtra);
! start += xtra;
}
else if (strcmp (fc->augmentation, "eh") == 0)
{
! start += 4;
fc->code_factor = LEB ();
fc->data_factor = SLEB ();
fc->ra = byte_get (start, 1); start += 1;
--- 7170,7193 ----
fc->col_type = (short int *) xmalloc (sizeof (short int));
fc->col_offset = (int *) xmalloc (sizeof (int));
frame_need_space (fc, max_regs-1);
! version = *start++;
! fc->augmentation = start;
! start = strchr (start, '\0') + 1;
if (fc->augmentation[0] == 'z')
{
fc->code_factor = LEB ();
fc->data_factor = SLEB ();
fc->ra = byte_get (start, 1); start += 1;
! augmentation_data_len = LEB ();
! augmentation_data = start;
! start += augmentation_data_len;
}
else if (strcmp (fc->augmentation, "eh") == 0)
{
! start += addr_size;
fc->code_factor = LEB ();
fc->data_factor = SLEB ();
fc->ra = byte_get (start, 1); start += 1;
*************** display_debug_frames (section, start, fi
*** 7177,7204 ****
fc->ra = byte_get (start, 1); start += 1;
}
cie = fc;
- printf ("CIE \"%s\" cf=%d df=%d ra=%d\n",
- fc->augmentation, fc->code_factor, fc->data_factor, fc->ra);
frame_need_space (fc, fc->ra);
}
else
{
unsigned char * look_for;
static Frame_Chunk fde_fc;
fc = & fde_fc;
memset (fc, 0, sizeof (Frame_Chunk));
! look_for = is_eh ? start-4-cie_id : (unsigned char *) cie_id;
! fc->pc_begin = byte_get (start, 4); start += 4;
! fc->pc_range = byte_get (start, 4); start += 4;
- for (cie=chunks; cie && (cie->chunk_start != look_for); cie = cie->next);
if (!cie)
{
! warn ("Invalid CIE pointer %08x in FDE at %08x\n", cie_id, saved_start);
start = block_end;
fc->ncols = 0;
fc->col_type = (short int *) xmalloc (sizeof (short int));
--- 7199,7275 ----
fc->ra = byte_get (start, 1); start += 1;
}
cie = fc;
+ if (do_debug_frames_interp)
+ printf ("\n%08lx %08lx %08lx CIE \"%s\" cf=%d df=%d ra=%d\n",
+ saved_start - section_start, length, cie_id,
+ fc->augmentation, fc->code_factor, fc->data_factor,
+ fc->ra);
+ else
+ {
+ printf ("\n%08lx %08lx %08lx CIE\n",
+ saved_start - section_start, length, cie_id);
+ printf (" Version: %d\n", version);
+ printf (" Augmentation: \"%s\"\n", fc->augmentation);
+ printf (" Code alignment factor: %u\n", fc->code_factor);
+ printf (" Data alignment factor: %d\n", fc->data_factor);
+ printf (" Return address column: %d\n", fc->ra);
+
+ if (augmentation_data_len)
+ {
+ unsigned long i;
+ printf (" Augmentation data: ");
+ for (i = 0; i < augmentation_data_len; ++i)
+ printf (" %02x", augmentation_data[i]);
+ putchar ('\n');
+ }
+ putchar ('\n');
+ }
+
+ if (augmentation_data_len)
+ {
+ unsigned char *p, *q;
+ p = fc->augmentation + 1;
+ q = augmentation_data;
+
+ while (1)
+ {
+ if (*p == 'L')
+ *q++;
+ else if (*p == 'P')
+ q += 1 + size_of_encoded_value (*q);
+ else if (*p == 'R')
+ fc->fde_encoding = *q++;
+ else
+ break;
+ p++;
+ }
+
+ if (fc->fde_encoding)
+ encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
+ }
+
frame_need_space (fc, fc->ra);
}
else
{
unsigned char * look_for;
static Frame_Chunk fde_fc;
+ int size;
fc = & fde_fc;
memset (fc, 0, sizeof (Frame_Chunk));
! look_for = is_eh ? start - 4 - cie_id : section_start + cie_id;
! for (cie=chunks; cie ; cie = cie->next)
! if (cie->chunk_start == look_for)
! break;
if (!cie)
{
! warn ("Invalid CIE pointer %08lx in FDE at %08lx\n",
! cie_id, saved_start);
start = block_end;
fc->ncols = 0;
fc->col_type = (short int *) xmalloc (sizeof (short int));
*************** display_debug_frames (section, start, fi
*** 7206,7211 ****
--- 7277,7283 ----
frame_need_space (fc, max_regs - 1);
cie = fc;
fc->augmentation = "";
+ fc->fde_encoding = 0;
}
else
{
*************** display_debug_frames (section, start, fi
*** 7221,7245 ****
fc->cfa_offset = cie->cfa_offset;
fc->ra = cie->ra;
frame_need_space (fc, max_regs-1);
}
if (cie->augmentation[0] == 'z')
{
! unsigned long l = LEB ();
! start += l;
}
! printf ("FDE cie=%08x pc=%08lx..%08lx\n",
! cie->chunk_start-section_start, fc->pc_begin,
fc->pc_begin + fc->pc_range);
}
/* At this point, fc is the current chunk, cie (if any) is set, and we're
about to interpret instructions for the chunk. */
! /* This exists for readelf maintainers. */
! #define FDEBUG 0
!
{
/* Start by making a pass over the chunk, allocating storage
and taking note of what registers are used. */
--- 7293,7335 ----
fc->cfa_offset = cie->cfa_offset;
fc->ra = cie->ra;
frame_need_space (fc, max_regs-1);
+ fc->fde_encoding = cie->fde_encoding;
}
+ if (fc->fde_encoding)
+ encoded_ptr_size = size_of_encoded_value (fc->fde_encoding);
+
+ fc->pc_begin = byte_get (start, encoded_ptr_size);
+ start += encoded_ptr_size;
+ fc->pc_range = byte_get (start, encoded_ptr_size);
+ start += encoded_ptr_size;
+
if (cie->augmentation[0] == 'z')
{
! augmentation_data_len = LEB ();
! augmentation_data = start;
! start += augmentation_data_len;
}
! printf ("\n%08lx %08lx %08lx FDE cie=%08x pc=%08lx..%08lx\n",
! saved_start - section_start, length, cie_id,
! cie->chunk_start - section_start, fc->pc_begin,
fc->pc_begin + fc->pc_range);
+ if (! do_debug_frames_interp && augmentation_data_len)
+ {
+ unsigned long i;
+ printf (" Augmentation data: ");
+ for (i = 0; i < augmentation_data_len; ++i)
+ printf (" %02x", augmentation_data[i]);
+ putchar ('\n');
+ putchar ('\n');
+ }
}
/* At this point, fc is the current chunk, cie (if any) is set, and we're
about to interpret instructions for the chunk. */
! if (do_debug_frames_interp)
{
/* Start by making a pass over the chunk, allocating storage
and taking note of what registers are used. */
*************** display_debug_frames (section, start, fi
*** 7272,7278 ****
fc->col_type[opa] = DW_CFA_undefined;
break;
case DW_CFA_set_loc:
! start += sizeof (vma);
break;
case DW_CFA_advance_loc1:
start += 1;
--- 7362,7368 ----
fc->col_type[opa] = DW_CFA_undefined;
break;
case DW_CFA_set_loc:
! start += encoded_ptr_size;
break;
case DW_CFA_advance_loc1:
start += 1;
*************** display_debug_frames (section, start, fi
*** 7358,7460 ****
switch (op)
{
case DW_CFA_advance_loc:
! frame_display_row (fc, &need_col_headers, &max_regs);
! #if FDEBUG
! printf (" DW_CFA_advance_loc: %08x = %08x + %d*%d\n",
! fc->pc_begin + opa * fc->code_factor, fc->pc_begin, opa, fc->code_factor);
! #endif
fc->pc_begin += opa * fc->code_factor;
break;
case DW_CFA_offset:
roffs = LEB ();
! #if FDEBUG
! printf (" DW_CFA_offset: r%d = cfa[%d*%d]\n", opa, roffs, fc->data_factor);
! #endif
fc->col_type[opa] = DW_CFA_offset;
fc->col_offset[opa] = roffs * fc->data_factor;
break;
case DW_CFA_restore:
! #if FDEBUG
! printf (" DW_CFA_restore: r%d\n", opa);
! #endif
fc->col_type[opa] = cie->col_type[opa];
fc->col_offset[opa] = cie->col_offset[opa];
break;
case DW_CFA_set_loc:
! frame_display_row (fc, &need_col_headers, &max_regs);
! vma = byte_get (start, sizeof (vma)); start += sizeof (vma);
! #if FDEBUG
! printf (" DW_CFA_set_loc: %08x\n", vma);
! #endif
fc->pc_begin = vma;
break;
case DW_CFA_advance_loc1:
- frame_display_row (fc, &need_col_headers, &max_regs);
ofs = byte_get (start, 1); start += 1;
! #if FDEBUG
! printf (" DW_CFA_advance_loc1: %08x = %08x + %d*%d\n",
! fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
! #endif
fc->pc_begin += ofs * fc->code_factor;
break;
case DW_CFA_advance_loc2:
- frame_display_row (fc, &need_col_headers, &max_regs);
ofs = byte_get (start, 2); start += 2;
! #if FDEBUG
! printf (" DW_CFA_advance_loc2: %08x = %08x + %d*%d\n",
! fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
! #endif
fc->pc_begin += ofs * fc->code_factor;
break;
case DW_CFA_advance_loc4:
- frame_display_row (fc, &need_col_headers, &max_regs);
ofs = byte_get (start, 4); start += 4;
! #if FDEBUG
! printf (" DW_CFA_advance_loc4: %08x = %08x + %d*%d\n",
! fc->pc_begin + ofs * fc->code_factor, fc->pc_begin, ofs, fc->code_factor);
! #endif
fc->pc_begin += ofs * fc->code_factor;
break;
case DW_CFA_offset_extended:
reg = LEB ();
roffs = LEB ();
! #if FDEBUG
! printf (" DW_CFA_offset_extended: r%d = cfa[%d*%d]\n", reg, roffs, fc->data_factor);
! #endif
fc->col_type[reg] = DW_CFA_offset;
fc->col_offset[reg] = roffs * fc->data_factor;
break;
case DW_CFA_restore_extended:
reg = LEB ();
! #if FDEBUG
! printf (" DW_CFA_restore_extended: r%d\n", reg);
! #endif
fc->col_type[reg] = cie->col_type[reg];
fc->col_offset[reg] = cie->col_offset[reg];
break;
case DW_CFA_undefined:
reg = LEB ();
! #if FDEBUG
! printf (" DW_CFA_undefined: r%d\n", reg);
! #endif
fc->col_type[reg] = DW_CFA_undefined;
fc->col_offset[reg] = 0;
break;
case DW_CFA_same_value:
reg = LEB ();
! #if FDEBUG
! printf (" DW_CFA_same_value: r%d\n", reg);
! #endif
fc->col_type[reg] = DW_CFA_same_value;
fc->col_offset[reg] = 0;
break;
--- 7448,7551 ----
switch (op)
{
case DW_CFA_advance_loc:
! if (do_debug_frames_interp)
! frame_display_row (fc, &need_col_headers, &max_regs);
! else
! printf (" DW_CFA_advance_loc: %d to %08lx\n",
! opa * fc->code_factor,
! fc->pc_begin + opa * fc->code_factor);
fc->pc_begin += opa * fc->code_factor;
break;
case DW_CFA_offset:
roffs = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_offset: r%d at cfa%+d\n",
! opa, roffs * fc->data_factor);
fc->col_type[opa] = DW_CFA_offset;
fc->col_offset[opa] = roffs * fc->data_factor;
break;
case DW_CFA_restore:
! if (! do_debug_frames_interp)
! printf (" DW_CFA_restore: r%d\n", opa);
fc->col_type[opa] = cie->col_type[opa];
fc->col_offset[opa] = cie->col_offset[opa];
break;
case DW_CFA_set_loc:
! vma = byte_get (start, encoded_ptr_size);
! start += encoded_ptr_size;
! if (do_debug_frames_interp)
! frame_display_row (fc, &need_col_headers, &max_regs);
! else
! printf (" DW_CFA_set_loc: %08x\n", vma);
fc->pc_begin = vma;
break;
case DW_CFA_advance_loc1:
ofs = byte_get (start, 1); start += 1;
! if (do_debug_frames_interp)
! frame_display_row (fc, &need_col_headers, &max_regs);
! else
! printf (" DW_CFA_advance_loc1: %d to %08lx\n",
! ofs * fc->code_factor,
! fc->pc_begin + ofs * fc->code_factor);
fc->pc_begin += ofs * fc->code_factor;
break;
case DW_CFA_advance_loc2:
ofs = byte_get (start, 2); start += 2;
! if (do_debug_frames_interp)
! frame_display_row (fc, &need_col_headers, &max_regs);
! else
! printf (" DW_CFA_advance_loc2: %d to %08lx\n",
! ofs * fc->code_factor,
! fc->pc_begin + ofs * fc->code_factor);
fc->pc_begin += ofs * fc->code_factor;
break;
case DW_CFA_advance_loc4:
ofs = byte_get (start, 4); start += 4;
! if (do_debug_frames_interp)
! frame_display_row (fc, &need_col_headers, &max_regs);
! else
! printf (" DW_CFA_advance_loc4: %d to %08lx\n",
! ofs * fc->code_factor,
! fc->pc_begin + ofs * fc->code_factor);
fc->pc_begin += ofs * fc->code_factor;
break;
case DW_CFA_offset_extended:
reg = LEB ();
roffs = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_offset_extended: r%d at cfa%+d\n",
! reg, roffs * fc->data_factor);
fc->col_type[reg] = DW_CFA_offset;
fc->col_offset[reg] = roffs * fc->data_factor;
break;
case DW_CFA_restore_extended:
reg = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_restore_extended: r%d\n", reg);
fc->col_type[reg] = cie->col_type[reg];
fc->col_offset[reg] = cie->col_offset[reg];
break;
case DW_CFA_undefined:
reg = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_undefined: r%d\n", reg);
fc->col_type[reg] = DW_CFA_undefined;
fc->col_offset[reg] = 0;
break;
case DW_CFA_same_value:
reg = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_same_value: r%d\n", reg);
fc->col_type[reg] = DW_CFA_same_value;
fc->col_offset[reg] = 0;
break;
*************** display_debug_frames (section, start, fi
*** 7462,7478 ****
case DW_CFA_register:
reg = LEB ();
roffs = LEB ();
! #if FDEBUG
! printf (" DW_CFA_register: r%d\n", reg);
! #endif
fc->col_type[reg] = DW_CFA_register;
fc->col_offset[reg] = roffs;
break;
case DW_CFA_remember_state:
! #if FDEBUG
! printf (" DW_CFA_remember_state\n");
! #endif
rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
rs->ncols = fc->ncols;
rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
--- 7553,7567 ----
case DW_CFA_register:
reg = LEB ();
roffs = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_register: r%d\n", reg);
fc->col_type[reg] = DW_CFA_register;
fc->col_offset[reg] = roffs;
break;
case DW_CFA_remember_state:
! if (! do_debug_frames_interp)
! printf (" DW_CFA_remember_state\n");
rs = (Frame_Chunk *) xmalloc (sizeof (Frame_Chunk));
rs->ncols = fc->ncols;
rs->col_type = (short int *) xmalloc (rs->ncols * sizeof (short int));
*************** display_debug_frames (section, start, fi
*** 7484,7492 ****
break;
case DW_CFA_restore_state:
! #if FDEBUG
! printf (" DW_CFA_restore_state\n");
! #endif
rs = remembered_state;
remembered_state = rs->next;
frame_need_space (fc, rs->ncols-1);
--- 7573,7580 ----
break;
case DW_CFA_restore_state:
! if (! do_debug_frames_interp)
! printf (" DW_CFA_restore_state\n");
rs = remembered_state;
remembered_state = rs->next;
frame_need_space (fc, rs->ncols-1);
*************** display_debug_frames (section, start, fi
*** 7500,7559 ****
case DW_CFA_def_cfa:
fc->cfa_reg = LEB ();
fc->cfa_offset = LEB ();
! #if FDEBUG
! printf (" DW_CFA_def_cfa: reg %d ofs %d\n", fc->cfa_reg, fc->cfa_offset);
! #endif
break;
case DW_CFA_def_cfa_register:
fc->cfa_reg = LEB ();
! #if FDEBUG
! printf (" DW_CFA_def_cfa_reg: %d\n", fc->cfa_reg);
! #endif
break;
case DW_CFA_def_cfa_offset:
fc->cfa_offset = LEB ();
! #if FDEBUG
! printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
! #endif
break;
case DW_CFA_nop:
! #if FDEBUG
! printf (" DW_CFA_nop\n");
! #endif
break;
#ifndef DW_CFA_GNU_window_save
#define DW_CFA_GNU_window_save 0x2d
#endif
case DW_CFA_GNU_window_save:
! #if FDEBUG
! printf (" DW_CFA_GNU_window_save\n");
! #endif
break;
- #ifndef DW_CFA_GNU_args_size
- #define DW_CFA_GNU_args_size 0x2e
- #endif
case DW_CFA_GNU_args_size:
ul = LEB ();
! #if FDEBUG
! printf (" DW_CFA_GNU_args_size: %d\n", ul);
! #endif
break;
- #ifndef DW_CFA_GNU_negative_offset_extended
- #define DW_CFA_GNU_negative_offset_extended 0x2f
- #endif
case DW_CFA_GNU_negative_offset_extended:
reg = LEB ();
l = - LEB ();
frame_need_space (fc, reg);
! #if FDEBUG
! printf (" DW_CFA_GNU_negative_offset_extended: r%d = cfa[%d*%d]\n", reg, l, fc->data_factor);
! #endif
fc->col_type[reg] = DW_CFA_offset;
fc->col_offset[reg] = l * fc->data_factor;
break;
--- 7588,7636 ----
case DW_CFA_def_cfa:
fc->cfa_reg = LEB ();
fc->cfa_offset = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_def_cfa: r%d ofs %d\n",
! fc->cfa_reg, fc->cfa_offset);
break;
case DW_CFA_def_cfa_register:
fc->cfa_reg = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_def_cfa_reg: r%d\n", fc->cfa_reg);
break;
case DW_CFA_def_cfa_offset:
fc->cfa_offset = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_def_cfa_offset: %d\n", fc->cfa_offset);
break;
case DW_CFA_nop:
! if (! do_debug_frames_interp)
! printf (" DW_CFA_nop\n");
break;
#ifndef DW_CFA_GNU_window_save
#define DW_CFA_GNU_window_save 0x2d
#endif
case DW_CFA_GNU_window_save:
! if (! do_debug_frames_interp)
! printf (" DW_CFA_GNU_window_save\n");
break;
case DW_CFA_GNU_args_size:
ul = LEB ();
! if (! do_debug_frames_interp)
! printf (" DW_CFA_GNU_args_size: %d\n", ul);
break;
case DW_CFA_GNU_negative_offset_extended:
reg = LEB ();
l = - LEB ();
frame_need_space (fc, reg);
! if (! do_debug_frames_interp)
! printf (" DW_CFA_GNU_negative_offset_extended: r%d at cfa%+d\n",
! reg, l * fc->data_factor);
fc->col_type[reg] = DW_CFA_offset;
fc->col_offset[reg] = l * fc->data_factor;
break;
*************** display_debug_frames (section, start, fi
*** 7564,7570 ****
}
}
! frame_display_row (fc, &need_col_headers, &max_regs);
start = block_end;
}
--- 7641,7648 ----
}
}
! if (do_debug_frames_interp)
! frame_display_row (fc, &need_col_headers, &max_regs);
start = block_end;
}
*************** debug_displays[] =
*** 7627,7633 ****
{ ".debug_frame", display_debug_frames, NULL },
{ ".eh_frame", display_debug_frames, NULL },
{ ".debug_macinfo", display_debug_not_supported, NULL },
- { ".debug_frame", display_debug_not_supported, NULL },
{ ".debug_str", display_debug_not_supported, NULL },
{ ".debug_static_func", display_debug_not_supported, NULL },
{ ".debug_static_vars", display_debug_not_supported, NULL },
--- 7705,7710 ----