2011-07-15 Fawzi Mohamed <fawzi.mohamed@nokia.com>
* dwarf2-frame.c (decode_frame_entry, decode_frame_entry_1): Ensure that CIE pointer of an FDE really points to a CIE .
This commit is contained in:
parent
ce4515734c
commit
8bd908398f
@ -1,3 +1,8 @@
|
||||
2011-07-15 Fawzi Mohamed <fawzi.mohamed@nokia.com>
|
||||
|
||||
* dwarf2-frame.c (decode_frame_entry, decode_frame_entry_1): Ensure
|
||||
that CIE pointer of an FDE really points to a CIE .
|
||||
|
||||
2011-07-15 Hui Zhu <teawater@gmail.com>
|
||||
|
||||
* remote.c (remote_get_trace_status): Add comments.
|
||||
|
@ -1801,17 +1801,30 @@ add_fde (struct dwarf2_fde_table *fde_table, struct dwarf2_fde *fde)
|
||||
#define DW64_CIE_ID ~0
|
||||
#endif
|
||||
|
||||
/* Defines the type of eh_frames that are expected to be decoded: CIE, FDE
|
||||
or any of them. */
|
||||
|
||||
enum eh_frame_type
|
||||
{
|
||||
EH_CIE_TYPE_ID = 1 << 0,
|
||||
EH_FDE_TYPE_ID = 1 << 1,
|
||||
EH_CIE_OR_FDE_TYPE_ID = EH_CIE_TYPE_ID | EH_FDE_TYPE_ID
|
||||
};
|
||||
|
||||
static gdb_byte *decode_frame_entry (struct comp_unit *unit, gdb_byte *start,
|
||||
int eh_frame_p,
|
||||
struct dwarf2_cie_table *cie_table,
|
||||
struct dwarf2_fde_table *fde_table);
|
||||
struct dwarf2_fde_table *fde_table,
|
||||
enum eh_frame_type entry_type);
|
||||
|
||||
/* Decode the next CIE or FDE, entry_type specifies the expected type.
|
||||
Return NULL if invalid input, otherwise the next byte to be processed. */
|
||||
|
||||
/* Decode the next CIE or FDE. Return NULL if invalid input, otherwise
|
||||
the next byte to be processed. */
|
||||
static gdb_byte *
|
||||
decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p,
|
||||
struct dwarf2_cie_table *cie_table,
|
||||
struct dwarf2_fde_table *fde_table)
|
||||
struct dwarf2_fde_table *fde_table,
|
||||
enum eh_frame_type entry_type)
|
||||
{
|
||||
struct gdbarch *gdbarch = get_objfile_arch (unit->objfile);
|
||||
gdb_byte *buf, *end;
|
||||
@ -1862,6 +1875,10 @@ decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p,
|
||||
char *augmentation;
|
||||
unsigned int cie_version;
|
||||
|
||||
/* Check that a CIE was expected. */
|
||||
if ((entry_type & EH_CIE_TYPE_ID) == 0)
|
||||
error (_("Found a CIE when not expecting it."));
|
||||
|
||||
/* Record the offset into the .debug_frame section of this CIE. */
|
||||
cie_pointer = start - unit->dwarf_frame_buffer;
|
||||
|
||||
@ -2027,6 +2044,10 @@ decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p,
|
||||
/* This is a FDE. */
|
||||
struct dwarf2_fde *fde;
|
||||
|
||||
/* Check that an FDE was expected. */
|
||||
if ((entry_type & EH_FDE_TYPE_ID) == 0)
|
||||
error (_("Found an FDE when not expecting it."));
|
||||
|
||||
/* In an .eh_frame section, the CIE pointer is the delta between the
|
||||
address within the FDE where the CIE pointer is stored and the
|
||||
address of the CIE. Convert it to an offset into the .eh_frame
|
||||
@ -2048,7 +2069,8 @@ decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p,
|
||||
if (fde->cie == NULL)
|
||||
{
|
||||
decode_frame_entry (unit, unit->dwarf_frame_buffer + cie_pointer,
|
||||
eh_frame_p, cie_table, fde_table);
|
||||
eh_frame_p, cie_table, fde_table,
|
||||
EH_CIE_TYPE_ID);
|
||||
fde->cie = find_cie (cie_table, cie_pointer);
|
||||
}
|
||||
|
||||
@ -2089,11 +2111,14 @@ decode_frame_entry_1 (struct comp_unit *unit, gdb_byte *start, int eh_frame_p,
|
||||
return end;
|
||||
}
|
||||
|
||||
/* Read a CIE or FDE in BUF and decode it. */
|
||||
/* Read a CIE or FDE in BUF and decode it. Entry_type specifies whether we
|
||||
expect an FDE or a CIE. */
|
||||
|
||||
static gdb_byte *
|
||||
decode_frame_entry (struct comp_unit *unit, gdb_byte *start, int eh_frame_p,
|
||||
struct dwarf2_cie_table *cie_table,
|
||||
struct dwarf2_fde_table *fde_table)
|
||||
struct dwarf2_fde_table *fde_table,
|
||||
enum eh_frame_type entry_type)
|
||||
{
|
||||
enum { NONE, ALIGN4, ALIGN8, FAIL } workaround = NONE;
|
||||
gdb_byte *ret;
|
||||
@ -2102,7 +2127,7 @@ decode_frame_entry (struct comp_unit *unit, gdb_byte *start, int eh_frame_p,
|
||||
while (1)
|
||||
{
|
||||
ret = decode_frame_entry_1 (unit, start, eh_frame_p,
|
||||
cie_table, fde_table);
|
||||
cie_table, fde_table, entry_type);
|
||||
if (ret != NULL)
|
||||
break;
|
||||
|
||||
@ -2212,6 +2237,7 @@ dwarf2_build_frame_info (struct objfile *objfile)
|
||||
struct dwarf2_cie_table cie_table;
|
||||
struct dwarf2_fde_table fde_table;
|
||||
struct dwarf2_fde_table *fde_table2;
|
||||
volatile struct gdb_exception e;
|
||||
|
||||
cie_table.num_entries = 0;
|
||||
cie_table.entries = NULL;
|
||||
@ -2253,10 +2279,28 @@ dwarf2_build_frame_info (struct objfile *objfile)
|
||||
if (txt)
|
||||
unit->tbase = txt->vma;
|
||||
|
||||
frame_ptr = unit->dwarf_frame_buffer;
|
||||
while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size)
|
||||
frame_ptr = decode_frame_entry (unit, frame_ptr, 1,
|
||||
&cie_table, &fde_table);
|
||||
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||
{
|
||||
frame_ptr = unit->dwarf_frame_buffer;
|
||||
while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size)
|
||||
frame_ptr = decode_frame_entry (unit, frame_ptr, 1,
|
||||
&cie_table, &fde_table,
|
||||
EH_CIE_OR_FDE_TYPE_ID);
|
||||
}
|
||||
|
||||
if (e.reason < 0)
|
||||
{
|
||||
warning (_("skipping .eh_frame info of %s: %s"),
|
||||
objfile->name, e.message);
|
||||
|
||||
if (fde_table.num_entries != 0)
|
||||
{
|
||||
xfree (fde_table.entries);
|
||||
fde_table.entries = NULL;
|
||||
fde_table.num_entries = 0;
|
||||
}
|
||||
/* The cie_table is discarded by the next if. */
|
||||
}
|
||||
|
||||
if (cie_table.num_entries != 0)
|
||||
{
|
||||
@ -2274,10 +2318,39 @@ dwarf2_build_frame_info (struct objfile *objfile)
|
||||
&unit->dwarf_frame_size);
|
||||
if (unit->dwarf_frame_size)
|
||||
{
|
||||
frame_ptr = unit->dwarf_frame_buffer;
|
||||
while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size)
|
||||
frame_ptr = decode_frame_entry (unit, frame_ptr, 0,
|
||||
&cie_table, &fde_table);
|
||||
int num_old_fde_entries = fde_table.num_entries;
|
||||
|
||||
TRY_CATCH (e, RETURN_MASK_ERROR)
|
||||
{
|
||||
frame_ptr = unit->dwarf_frame_buffer;
|
||||
while (frame_ptr < unit->dwarf_frame_buffer + unit->dwarf_frame_size)
|
||||
frame_ptr = decode_frame_entry (unit, frame_ptr, 0,
|
||||
&cie_table, &fde_table,
|
||||
EH_CIE_OR_FDE_TYPE_ID);
|
||||
}
|
||||
if (e.reason < 0)
|
||||
{
|
||||
warning (_("skipping .debug_frame info of %s: %s"),
|
||||
objfile->name, e.message);
|
||||
|
||||
if (fde_table.num_entries != 0)
|
||||
{
|
||||
fde_table.num_entries = num_old_fde_entries;
|
||||
if (num_old_fde_entries == 0)
|
||||
{
|
||||
xfree (fde_table.entries);
|
||||
fde_table.entries = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
fde_table.entries = xrealloc (fde_table.entries,
|
||||
fde_table.num_entries *
|
||||
sizeof (fde_table.entries[0]));
|
||||
}
|
||||
}
|
||||
fde_table.num_entries = num_old_fde_entries;
|
||||
/* The cie_table is discarded by the next if. */
|
||||
}
|
||||
}
|
||||
|
||||
/* Discard the cie_table, it is no longer needed. */
|
||||
|
Loading…
x
Reference in New Issue
Block a user