aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2020-02-12 15:45:08 -0700
committerTom Tromey <tom@tromey.com>2020-02-12 15:51:58 -0700
commita7a3ae5c02d6d8711c2c336b9b809d05211fc497 (patch)
treeaa25855ca446dd5214fc5672617cd4dd17f951e3
parenta9d654186220b958b63185603675e69dd9316067 (diff)
downloadgdb-a7a3ae5c02d6d8711c2c336b9b809d05211fc497.zip
gdb-a7a3ae5c02d6d8711c2c336b9b809d05211fc497.tar.gz
gdb-a7a3ae5c02d6d8711c2c336b9b809d05211fc497.tar.bz2
Store the comp_unit instead of the FDE table
This changes the DWARF frame code to store the comp_unit on the objfile, rather than storing the FDE table. It also changes the comp_unit to be heap-allocated using "new". This change makes it simpler for a later patch to add a field to the comp_unit, and to have deallaction work properly. This in turn is important for making the frame data be independent of the objfile. gdb/ChangeLog 2020-02-12 Tom Tromey <tom@tromey.com> * dwarf2/frame.c (struct comp_unit): Add initializers and constructor. (dwarf2_frame_objfile_data): Store a comp_unit. (dwarf2_frame_find_fde): Update. (dwarf2_build_frame_info): Use "new".
-rw-r--r--gdb/ChangeLog8
-rw-r--r--gdb/dwarf2/frame.c51
2 files changed, 34 insertions, 25 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 16a1443..1ac9884 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,13 @@
2020-02-12 Tom Tromey <tom@tromey.com>
+ * dwarf2/frame.c (struct comp_unit): Add initializers and
+ constructor.
+ (dwarf2_frame_objfile_data): Store a comp_unit.
+ (dwarf2_frame_find_fde): Update.
+ (dwarf2_build_frame_info): Use "new".
+
+2020-02-12 Tom Tromey <tom@tromey.com>
+
* dwarf2/frame.c (struct dwarf2_fde_table): Remove.
(dwarf2_fde_table): Typedef for std::vector.
(dwarf2_frame_objfile_data): Remove the deleter. Now static.
diff --git a/gdb/dwarf2/frame.c b/gdb/dwarf2/frame.c
index 0e1564e..b08e792 100644
--- a/gdb/dwarf2/frame.c
+++ b/gdb/dwarf2/frame.c
@@ -136,25 +136,34 @@ typedef std::vector<dwarf2_fde *> dwarf2_fde_table;
struct comp_unit
{
+ comp_unit (struct objfile *objf)
+ : abfd (objf->obfd),
+ objfile (objf)
+ {
+ }
+
/* Keep the bfd convenient. */
bfd *abfd;
struct objfile *objfile;
/* Pointer to the .debug_frame section loaded into memory. */
- const gdb_byte *dwarf_frame_buffer;
+ const gdb_byte *dwarf_frame_buffer = nullptr;
/* Length of the loaded .debug_frame section. */
- bfd_size_type dwarf_frame_size;
+ bfd_size_type dwarf_frame_size = 0;
/* Pointer to the .debug_frame section. */
- asection *dwarf_frame_section;
+ asection *dwarf_frame_section = nullptr;
/* Base for DW_EH_PE_datarel encodings. */
- bfd_vma dbase;
+ bfd_vma dbase = 0;
/* Base for DW_EH_PE_textrel encodings. */
- bfd_vma tbase;
+ bfd_vma tbase = 0;
+
+ /* The FDE table. */
+ dwarf2_fde_table fde_table;
};
static struct dwarf2_fde *dwarf2_frame_find_fde (CORE_ADDR *pc,
@@ -1467,7 +1476,7 @@ dwarf2_frame_cfa (struct frame_info *this_frame)
return get_frame_base (this_frame);
}
-static const struct objfile_key<dwarf2_fde_table> dwarf2_frame_objfile_data;
+static const struct objfile_key<comp_unit> dwarf2_frame_objfile_data;
@@ -1630,18 +1639,18 @@ dwarf2_frame_find_fde (CORE_ADDR *pc, CORE_ADDR *out_offset)
{
for (objfile *objfile : current_program_space->objfiles ())
{
- dwarf2_fde_table *fde_table;
CORE_ADDR offset;
CORE_ADDR seek_pc;
- fde_table = dwarf2_frame_objfile_data.get (objfile);
- if (fde_table == NULL)
+ comp_unit *unit = dwarf2_frame_objfile_data.get (objfile);
+ if (unit == NULL)
{
dwarf2_build_frame_info (objfile);
- fde_table = dwarf2_frame_objfile_data.get (objfile);
+ unit = dwarf2_frame_objfile_data.get (objfile);
}
- gdb_assert (fde_table != NULL);
+ gdb_assert (unit != NULL);
+ dwarf2_fde_table *fde_table = &unit->fde_table;
if (fde_table->empty ())
continue;
@@ -2116,18 +2125,12 @@ fde_is_less_than (const dwarf2_fde *aa, const dwarf2_fde *bb)
void
dwarf2_build_frame_info (struct objfile *objfile)
{
- struct comp_unit *unit;
const gdb_byte *frame_ptr;
dwarf2_cie_table cie_table;
dwarf2_fde_table fde_table;
- dwarf2_fde_table *fde_table2;
/* Build a minimal decoding of the DWARF2 compilation unit. */
- unit = XOBNEW (&objfile->objfile_obstack, comp_unit);
- unit->abfd = objfile->obfd;
- unit->objfile = objfile;
- unit->dbase = 0;
- unit->tbase = 0;
+ std::unique_ptr<comp_unit> unit (new comp_unit (objfile));
if (objfile->separate_debug_objfile_backlink == NULL)
{
@@ -2159,7 +2162,7 @@ dwarf2_build_frame_info (struct objfile *objfile)
{
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,
+ frame_ptr = decode_frame_entry (unit.get (), frame_ptr, 1,
cie_table, &fde_table,
EH_CIE_OR_FDE_TYPE_ID);
}
@@ -2189,7 +2192,7 @@ dwarf2_build_frame_info (struct objfile *objfile)
{
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,
+ frame_ptr = decode_frame_entry (unit.get (), frame_ptr, 0,
cie_table, &fde_table,
EH_CIE_OR_FDE_TYPE_ID);
}
@@ -2202,8 +2205,6 @@ dwarf2_build_frame_info (struct objfile *objfile)
}
}
- fde_table2 = new dwarf2_fde_table;
-
struct dwarf2_fde *fde_prev = NULL;
struct dwarf2_fde *first_non_zero_fde = NULL;
@@ -2246,12 +2247,12 @@ dwarf2_build_frame_info (struct objfile *objfile)
&& fde_prev->initial_location == fde->initial_location)
continue;
- fde_table2->push_back (fde);
+ unit->fde_table.push_back (fde);
fde_prev = fde;
}
- fde_table2->shrink_to_fit ();
+ unit->fde_table.shrink_to_fit ();
- dwarf2_frame_objfile_data.set (objfile, fde_table2);
+ dwarf2_frame_objfile_data.set (objfile, unit.release ());
}
/* Handle 'maintenance show dwarf unwinders'. */