dwarf2read.c: Some C++fycation, use std::vector, std::unique_ptr
This starts off as replacing a couple custom open coded vector implementations in the file with std::vector, and then the rest falls off of that. I.e., use new/delete instead of XCNEW/xfree, add ctors/dtors/initializers where appropriate. And then use std::unique_ptr instead of cleanups. Some functions became methods, and in a couple spots, some single-use callback functions that would have to be tweaked anyway are converted to lambdas instead. gdb/ChangeLog: 2017-04-04 Pedro Alves <palves@redhat.com> * dwarf2read.c (struct file_entry): Add ctors, and initialize all fields. (line_header): Initialize all data fields. Change type of standard_opcode_lengths to std::unique_ptr<unsigned char[]>. Change type of include_dirs to std::vector<const char *>. Remove num_include_dirs, include_dirs_size. Change type of file_names to std::vector<file_entry>. Remove num_file_names, file_names_size. (line_header::line_header): New. (line_header::add_include_dir, line_header::add_file_name): New methods. (line_header::include_dir_at): Remove NULL check. (line_header::file_name_at): Add const overload. (line_header_up): New unique_ptr typedef. (dw2_get_file_names_reader): Use line_header_up. Adjust to use std::vector. Remove free_line_header call. (dwarf2_build_include_psymtabs): Use line_header_up. Remove free_line_header call. (free_cu_line_header): Delete. (handle_DW_AT_stmt_list, handle_DW_AT_stmt_list) (setup_type_unit_groups): Use line_header_up instead of cleanups. Adjust to use std::vector. (free_line_header): Delete. (free_line_header_voidp): Use delete. (add_include_dir): Replace with ... (line_header::add_include_dir): ... this method. Use std::vector. (add_file_name): Replace with ... (line_header::add_file_name): ... this method. Use std::vector. (add_include_dir_stub): Delete. (read_formatted_entries): Remove memset. (dwarf_decode_line_header): Return a line_header_up instead of a raw pointer. Remove cleanup handling. Pass lambdas to read_formatted_entries. Adjust to use line_header methods. (dwarf_decode_lines_1): Adjust to use line_header methods. (dwarf_decode_lines, file_file_name, file_full_name): Adjust to use std::vector.
This commit is contained in:
parent
477bdd393c
commit
fff8551cf5
|
@ -1,3 +1,41 @@
|
||||||
|
2017-04-04 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* dwarf2read.c (struct file_entry): Add ctors, and initialize all
|
||||||
|
fields.
|
||||||
|
(line_header): Initialize all data fields. Change type of
|
||||||
|
standard_opcode_lengths to std::unique_ptr<unsigned char[]>.
|
||||||
|
Change type of include_dirs to std::vector<const char *>. Remove
|
||||||
|
num_include_dirs, include_dirs_size. Change type of file_names to
|
||||||
|
std::vector<file_entry>. Remove num_file_names, file_names_size.
|
||||||
|
(line_header::line_header): New.
|
||||||
|
(line_header::add_include_dir, line_header::add_file_name): New
|
||||||
|
methods.
|
||||||
|
(line_header::include_dir_at): Remove NULL check.
|
||||||
|
(line_header::file_name_at): Add const overload.
|
||||||
|
(line_header_up): New unique_ptr typedef.
|
||||||
|
(dw2_get_file_names_reader): Use line_header_up. Adjust to use
|
||||||
|
std::vector. Remove free_line_header call.
|
||||||
|
(dwarf2_build_include_psymtabs): Use line_header_up. Remove
|
||||||
|
free_line_header call.
|
||||||
|
(free_cu_line_header): Delete.
|
||||||
|
(handle_DW_AT_stmt_list, handle_DW_AT_stmt_list)
|
||||||
|
(setup_type_unit_groups): Use line_header_up instead of cleanups.
|
||||||
|
Adjust to use std::vector.
|
||||||
|
(free_line_header): Delete.
|
||||||
|
(free_line_header_voidp): Use delete.
|
||||||
|
(add_include_dir): Replace with ...
|
||||||
|
(line_header::add_include_dir): ... this method. Use std::vector.
|
||||||
|
(add_file_name): Replace with ...
|
||||||
|
(line_header::add_file_name): ... this method. Use std::vector.
|
||||||
|
(add_include_dir_stub): Delete.
|
||||||
|
(read_formatted_entries): Remove memset.
|
||||||
|
(dwarf_decode_line_header): Return a line_header_up instead of a
|
||||||
|
raw pointer. Remove cleanup handling. Pass lambdas to
|
||||||
|
read_formatted_entries. Adjust to use line_header methods.
|
||||||
|
(dwarf_decode_lines_1): Adjust to use line_header methods.
|
||||||
|
(dwarf_decode_lines, file_file_name, file_full_name): Adjust to
|
||||||
|
use std::vector.
|
||||||
|
|
||||||
2017-04-04 Simon Marchi <simon.marchi@polymtl.ca>
|
2017-04-04 Simon Marchi <simon.marchi@polymtl.ca>
|
||||||
|
|
||||||
* remote.c (set_general_thread, set_continue_thread): Use ptid_t
|
* remote.c (set_general_thread, set_continue_thread): Use ptid_t
|
||||||
|
|
306
gdb/dwarf2read.c
306
gdb/dwarf2read.c
|
@ -1054,19 +1054,36 @@ typedef void (die_reader_func_ftype) (const struct die_reader_specs *reader,
|
||||||
|
|
||||||
struct file_entry
|
struct file_entry
|
||||||
{
|
{
|
||||||
|
file_entry () = default;
|
||||||
|
|
||||||
|
file_entry (const char *name_, unsigned int dir_index_,
|
||||||
|
unsigned int mod_time_, unsigned int length_)
|
||||||
|
: name (name_),
|
||||||
|
dir_index (dir_index_),
|
||||||
|
mod_time (mod_time_),
|
||||||
|
length (length_)
|
||||||
|
{}
|
||||||
|
|
||||||
/* Return the include directory at DIR_INDEX stored in LH. Returns
|
/* Return the include directory at DIR_INDEX stored in LH. Returns
|
||||||
NULL if DIR_INDEX is out of bounds. */
|
NULL if DIR_INDEX is out of bounds. */
|
||||||
const char *include_dir (const line_header *lh) const;
|
const char *include_dir (const line_header *lh) const;
|
||||||
|
|
||||||
const char *name;
|
/* The file name. Note this is an observing pointer. The memory is
|
||||||
|
owned by debug_line_buffer. */
|
||||||
|
const char *name {};
|
||||||
|
|
||||||
/* The directory index (1-based). */
|
/* The directory index (1-based). */
|
||||||
unsigned int dir_index;
|
unsigned int dir_index {};
|
||||||
unsigned int mod_time;
|
|
||||||
unsigned int length;
|
unsigned int mod_time {};
|
||||||
/* Non-zero if referenced by the Line Number Program. */
|
|
||||||
int included_p;
|
unsigned int length {};
|
||||||
|
|
||||||
|
/* True if referenced by the Line Number Program. */
|
||||||
|
bool included_p {};
|
||||||
|
|
||||||
/* The associated symbol table, if any. */
|
/* The associated symbol table, if any. */
|
||||||
struct symtab *symtab;
|
struct symtab *symtab {};
|
||||||
};
|
};
|
||||||
|
|
||||||
/* The line number information for a compilation unit (found in the
|
/* The line number information for a compilation unit (found in the
|
||||||
|
@ -1074,64 +1091,79 @@ struct file_entry
|
||||||
which contains the following information. */
|
which contains the following information. */
|
||||||
struct line_header
|
struct line_header
|
||||||
{
|
{
|
||||||
|
line_header ()
|
||||||
|
: offset_in_dwz {}
|
||||||
|
{}
|
||||||
|
|
||||||
|
/* Add an entry to the include directory table. */
|
||||||
|
void add_include_dir (const char *include_dir);
|
||||||
|
|
||||||
|
/* Add an entry to the file name table. */
|
||||||
|
void add_file_name (const char *name, unsigned int dir_index,
|
||||||
|
unsigned int mod_time, unsigned int length);
|
||||||
|
|
||||||
/* Return the include dir at INDEX (0-based). Returns NULL if INDEX
|
/* Return the include dir at INDEX (0-based). Returns NULL if INDEX
|
||||||
is out of bounds. */
|
is out of bounds. */
|
||||||
const char *include_dir_at (unsigned int index) const
|
const char *include_dir_at (unsigned int index) const
|
||||||
{
|
{
|
||||||
if (include_dirs == NULL || index >= num_include_dirs)
|
if (index >= include_dirs.size ())
|
||||||
return NULL;
|
return NULL;
|
||||||
return include_dirs[index];
|
return include_dirs[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the file name at INDEX (0-based). Returns NULL if INDEX
|
/* Return the file name at INDEX (0-based). Returns NULL if INDEX
|
||||||
is out of bounds. */
|
is out of bounds. */
|
||||||
file_entry *file_name_at (unsigned int index) const
|
file_entry *file_name_at (unsigned int index)
|
||||||
{
|
{
|
||||||
if (file_names == NULL || index >= num_file_names)
|
if (index >= file_names.size ())
|
||||||
|
return NULL;
|
||||||
|
return &file_names[index];
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Const version of the above. */
|
||||||
|
const file_entry *file_name_at (unsigned int index) const
|
||||||
|
{
|
||||||
|
if (index >= file_names.size ())
|
||||||
return NULL;
|
return NULL;
|
||||||
return &file_names[index];
|
return &file_names[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Offset of line number information in .debug_line section. */
|
/* Offset of line number information in .debug_line section. */
|
||||||
sect_offset offset;
|
sect_offset offset {};
|
||||||
|
|
||||||
/* OFFSET is for struct dwz_file associated with dwarf2_per_objfile. */
|
/* OFFSET is for struct dwz_file associated with dwarf2_per_objfile. */
|
||||||
unsigned offset_in_dwz : 1;
|
unsigned offset_in_dwz : 1; /* Can't initialize bitfields in-class. */
|
||||||
|
|
||||||
unsigned int total_length;
|
unsigned int total_length {};
|
||||||
unsigned short version;
|
unsigned short version {};
|
||||||
unsigned int header_length;
|
unsigned int header_length {};
|
||||||
unsigned char minimum_instruction_length;
|
unsigned char minimum_instruction_length {};
|
||||||
unsigned char maximum_ops_per_instruction;
|
unsigned char maximum_ops_per_instruction {};
|
||||||
unsigned char default_is_stmt;
|
unsigned char default_is_stmt {};
|
||||||
int line_base;
|
int line_base {};
|
||||||
unsigned char line_range;
|
unsigned char line_range {};
|
||||||
unsigned char opcode_base;
|
unsigned char opcode_base {};
|
||||||
|
|
||||||
/* standard_opcode_lengths[i] is the number of operands for the
|
/* standard_opcode_lengths[i] is the number of operands for the
|
||||||
standard opcode whose value is i. This means that
|
standard opcode whose value is i. This means that
|
||||||
standard_opcode_lengths[0] is unused, and the last meaningful
|
standard_opcode_lengths[0] is unused, and the last meaningful
|
||||||
element is standard_opcode_lengths[opcode_base - 1]. */
|
element is standard_opcode_lengths[opcode_base - 1]. */
|
||||||
unsigned char *standard_opcode_lengths;
|
std::unique_ptr<unsigned char[]> standard_opcode_lengths;
|
||||||
|
|
||||||
/* The include_directories table. NOTE! These strings are not
|
/* The include_directories table. Note these are observing
|
||||||
allocated with xmalloc; instead, they are pointers into
|
pointers. The memory is owned by debug_line_buffer. */
|
||||||
debug_line_buffer. If you try to free them, `free' will get
|
std::vector<const char *> include_dirs;
|
||||||
indigestion. */
|
|
||||||
unsigned int num_include_dirs, include_dirs_size;
|
|
||||||
const char **include_dirs;
|
|
||||||
|
|
||||||
/* The file_names table. NOTE! These strings are not allocated
|
/* The file_names table. */
|
||||||
with xmalloc; instead, they are pointers into debug_line_buffer.
|
std::vector<file_entry> file_names;
|
||||||
Don't try to free them directly. */
|
|
||||||
unsigned int num_file_names, file_names_size;
|
|
||||||
struct file_entry *file_names;
|
|
||||||
|
|
||||||
/* The start and end of the statement program following this
|
/* The start and end of the statement program following this
|
||||||
header. These point into dwarf2_per_objfile->line_buffer. */
|
header. These point into dwarf2_per_objfile->line_buffer. */
|
||||||
const gdb_byte *statement_program_start, *statement_program_end;
|
const gdb_byte *statement_program_start {}, *statement_program_end {};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef std::unique_ptr<line_header> line_header_up;
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
file_entry::include_dir (const line_header *lh) const
|
file_entry::include_dir (const line_header *lh) const
|
||||||
{
|
{
|
||||||
|
@ -1597,10 +1629,8 @@ static int die_is_declaration (struct die_info *, struct dwarf2_cu *cu);
|
||||||
static struct die_info *die_specification (struct die_info *die,
|
static struct die_info *die_specification (struct die_info *die,
|
||||||
struct dwarf2_cu **);
|
struct dwarf2_cu **);
|
||||||
|
|
||||||
static void free_line_header (struct line_header *lh);
|
static line_header_up dwarf_decode_line_header (unsigned int offset,
|
||||||
|
struct dwarf2_cu *cu);
|
||||||
static struct line_header *dwarf_decode_line_header (unsigned int offset,
|
|
||||||
struct dwarf2_cu *cu);
|
|
||||||
|
|
||||||
static void dwarf_decode_lines (struct line_header *, const char *,
|
static void dwarf_decode_lines (struct line_header *, const char *,
|
||||||
struct dwarf2_cu *, struct partial_symtab *,
|
struct dwarf2_cu *, struct partial_symtab *,
|
||||||
|
@ -3375,7 +3405,6 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader,
|
||||||
struct dwarf2_per_cu_data *this_cu = cu->per_cu;
|
struct dwarf2_per_cu_data *this_cu = cu->per_cu;
|
||||||
struct objfile *objfile = dwarf2_per_objfile->objfile;
|
struct objfile *objfile = dwarf2_per_objfile->objfile;
|
||||||
struct dwarf2_per_cu_data *lh_cu;
|
struct dwarf2_per_cu_data *lh_cu;
|
||||||
struct line_header *lh;
|
|
||||||
struct attribute *attr;
|
struct attribute *attr;
|
||||||
int i;
|
int i;
|
||||||
void **slot;
|
void **slot;
|
||||||
|
@ -3393,10 +3422,11 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader,
|
||||||
}
|
}
|
||||||
|
|
||||||
lh_cu = this_cu;
|
lh_cu = this_cu;
|
||||||
lh = NULL;
|
|
||||||
slot = NULL;
|
slot = NULL;
|
||||||
line_offset = 0;
|
line_offset = 0;
|
||||||
|
|
||||||
|
line_header_up lh;
|
||||||
|
|
||||||
attr = dwarf2_attr (comp_unit_die, DW_AT_stmt_list, cu);
|
attr = dwarf2_attr (comp_unit_die, DW_AT_stmt_list, cu);
|
||||||
if (attr)
|
if (attr)
|
||||||
{
|
{
|
||||||
|
@ -3432,15 +3462,13 @@ dw2_get_file_names_reader (const struct die_reader_specs *reader,
|
||||||
|
|
||||||
file_and_directory fnd = find_file_and_directory (comp_unit_die, cu);
|
file_and_directory fnd = find_file_and_directory (comp_unit_die, cu);
|
||||||
|
|
||||||
qfn->num_file_names = lh->num_file_names;
|
qfn->num_file_names = lh->file_names.size ();
|
||||||
qfn->file_names =
|
qfn->file_names =
|
||||||
XOBNEWVEC (&objfile->objfile_obstack, const char *, lh->num_file_names);
|
XOBNEWVEC (&objfile->objfile_obstack, const char *, lh->file_names.size ());
|
||||||
for (i = 0; i < lh->num_file_names; ++i)
|
for (i = 0; i < lh->file_names.size (); ++i)
|
||||||
qfn->file_names[i] = file_full_name (i + 1, lh, fnd.comp_dir);
|
qfn->file_names[i] = file_full_name (i + 1, lh.get (), fnd.comp_dir);
|
||||||
qfn->real_names = NULL;
|
qfn->real_names = NULL;
|
||||||
|
|
||||||
free_line_header (lh);
|
|
||||||
|
|
||||||
lh_cu->v.quick->file_names = qfn;
|
lh_cu->v.quick->file_names = qfn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4661,7 +4689,7 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
|
||||||
struct die_info *die,
|
struct die_info *die,
|
||||||
struct partial_symtab *pst)
|
struct partial_symtab *pst)
|
||||||
{
|
{
|
||||||
struct line_header *lh = NULL;
|
line_header_up lh;
|
||||||
struct attribute *attr;
|
struct attribute *attr;
|
||||||
|
|
||||||
attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
|
attr = dwarf2_attr (die, DW_AT_stmt_list, cu);
|
||||||
|
@ -4671,9 +4699,7 @@ dwarf2_build_include_psymtabs (struct dwarf2_cu *cu,
|
||||||
return; /* No linetable, so no includes. */
|
return; /* No linetable, so no includes. */
|
||||||
|
|
||||||
/* NOTE: pst->dirname is DW_AT_comp_dir (if present). */
|
/* NOTE: pst->dirname is DW_AT_comp_dir (if present). */
|
||||||
dwarf_decode_lines (lh, pst->dirname, cu, pst, pst->textlow, 1);
|
dwarf_decode_lines (lh.get (), pst->dirname, cu, pst, pst->textlow, 1);
|
||||||
|
|
||||||
free_line_header (lh);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static hashval_t
|
static hashval_t
|
||||||
|
@ -9143,17 +9169,6 @@ read_import_statement (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
do_cleanups (cleanups);
|
do_cleanups (cleanups);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Cleanup function for handle_DW_AT_stmt_list. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_cu_line_header (void *arg)
|
|
||||||
{
|
|
||||||
struct dwarf2_cu *cu = (struct dwarf2_cu *) arg;
|
|
||||||
|
|
||||||
free_line_header (cu->line_header);
|
|
||||||
cu->line_header = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check for possibly missing DW_AT_comp_dir with relative .debug_line
|
/* Check for possibly missing DW_AT_comp_dir with relative .debug_line
|
||||||
directory paths. GCC SVN r127613 (new option -fdebug-prefix-map) fixed
|
directory paths. GCC SVN r127613 (new option -fdebug-prefix-map) fixed
|
||||||
this, it was first present in GCC release 4.3.0. */
|
this, it was first present in GCC release 4.3.0. */
|
||||||
|
@ -9267,9 +9282,10 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
|
||||||
|
|
||||||
/* dwarf_decode_line_header does not yet provide sufficient information.
|
/* dwarf_decode_line_header does not yet provide sufficient information.
|
||||||
We always have to call also dwarf_decode_lines for it. */
|
We always have to call also dwarf_decode_lines for it. */
|
||||||
cu->line_header = dwarf_decode_line_header (line_offset, cu);
|
line_header_up lh = dwarf_decode_line_header (line_offset, cu);
|
||||||
if (cu->line_header == NULL)
|
if (lh == NULL)
|
||||||
return;
|
return;
|
||||||
|
cu->line_header = lh.get ();
|
||||||
|
|
||||||
if (dwarf2_per_objfile->line_header_hash == NULL)
|
if (dwarf2_per_objfile->line_header_hash == NULL)
|
||||||
slot = NULL;
|
slot = NULL;
|
||||||
|
@ -9294,11 +9310,12 @@ handle_DW_AT_stmt_list (struct die_info *die, struct dwarf2_cu *cu,
|
||||||
number information unit. And if we're not using line_header_hash
|
number information unit. And if we're not using line_header_hash
|
||||||
then this is what we want as well. */
|
then this is what we want as well. */
|
||||||
gdb_assert (die->tag != DW_TAG_partial_unit);
|
gdb_assert (die->tag != DW_TAG_partial_unit);
|
||||||
make_cleanup (free_cu_line_header, cu);
|
|
||||||
}
|
}
|
||||||
decode_mapping = (die->tag != DW_TAG_partial_unit);
|
decode_mapping = (die->tag != DW_TAG_partial_unit);
|
||||||
dwarf_decode_lines (cu->line_header, comp_dir, cu, NULL, lowpc,
|
dwarf_decode_lines (cu->line_header, comp_dir, cu, NULL, lowpc,
|
||||||
decode_mapping);
|
decode_mapping);
|
||||||
|
|
||||||
|
lh.release ();
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Process DW_TAG_compile_unit or DW_TAG_partial_unit. */
|
/* Process DW_TAG_compile_unit or DW_TAG_partial_unit. */
|
||||||
|
@ -9395,7 +9412,6 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
struct dwarf2_per_cu_data *per_cu = cu->per_cu;
|
struct dwarf2_per_cu_data *per_cu = cu->per_cu;
|
||||||
struct type_unit_group *tu_group;
|
struct type_unit_group *tu_group;
|
||||||
int first_time;
|
int first_time;
|
||||||
struct line_header *lh;
|
|
||||||
struct attribute *attr;
|
struct attribute *attr;
|
||||||
unsigned int i, line_offset;
|
unsigned int i, line_offset;
|
||||||
struct signatured_type *sig_type;
|
struct signatured_type *sig_type;
|
||||||
|
@ -9419,7 +9435,7 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
|
|
||||||
/* We have to handle the case of both a missing DW_AT_stmt_list or bad
|
/* We have to handle the case of both a missing DW_AT_stmt_list or bad
|
||||||
debug info. */
|
debug info. */
|
||||||
lh = NULL;
|
line_header_up lh;
|
||||||
if (attr != NULL)
|
if (attr != NULL)
|
||||||
{
|
{
|
||||||
line_offset = DW_UNSND (attr);
|
line_offset = DW_UNSND (attr);
|
||||||
|
@ -9437,8 +9453,7 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
cu->line_header = lh;
|
cu->line_header = lh.get ();
|
||||||
make_cleanup (free_cu_line_header, cu);
|
|
||||||
|
|
||||||
if (first_time)
|
if (first_time)
|
||||||
{
|
{
|
||||||
|
@ -9449,14 +9464,14 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
process_full_type_unit still needs to know if this is the first
|
process_full_type_unit still needs to know if this is the first
|
||||||
time. */
|
time. */
|
||||||
|
|
||||||
tu_group->num_symtabs = lh->num_file_names;
|
tu_group->num_symtabs = lh->file_names.size ();
|
||||||
tu_group->symtabs = XNEWVEC (struct symtab *, lh->num_file_names);
|
tu_group->symtabs = XNEWVEC (struct symtab *, lh->file_names.size ());
|
||||||
|
|
||||||
for (i = 0; i < lh->num_file_names; ++i)
|
for (i = 0; i < lh->file_names.size (); ++i)
|
||||||
{
|
{
|
||||||
file_entry &fe = lh->file_names[i];
|
file_entry &fe = lh->file_names[i];
|
||||||
|
|
||||||
dwarf2_start_subfile (fe.name, fe.include_dir (lh));
|
dwarf2_start_subfile (fe.name, fe.include_dir (lh.get ()));
|
||||||
|
|
||||||
if (current_subfile->symtab == NULL)
|
if (current_subfile->symtab == NULL)
|
||||||
{
|
{
|
||||||
|
@ -9476,7 +9491,7 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
{
|
{
|
||||||
restart_symtab (tu_group->compunit_symtab, "", 0);
|
restart_symtab (tu_group->compunit_symtab, "", 0);
|
||||||
|
|
||||||
for (i = 0; i < lh->num_file_names; ++i)
|
for (i = 0; i < lh->file_names.size (); ++i)
|
||||||
{
|
{
|
||||||
struct file_entry *fe = &lh->file_names[i];
|
struct file_entry *fe = &lh->file_names[i];
|
||||||
|
|
||||||
|
@ -9484,6 +9499,8 @@ setup_type_unit_groups (struct die_info *die, struct dwarf2_cu *cu)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lh.release ();
|
||||||
|
|
||||||
/* The main symtab is allocated last. Type units don't have DW_AT_name
|
/* The main symtab is allocated last. Type units don't have DW_AT_name
|
||||||
so they don't have a "real" (so to speak) symtab anyway.
|
so they don't have a "real" (so to speak) symtab anyway.
|
||||||
There is later code that will assign the main symtab to all symbols
|
There is later code that will assign the main symtab to all symbols
|
||||||
|
@ -17564,28 +17581,6 @@ die_specification (struct die_info *die, struct dwarf2_cu **spec_cu)
|
||||||
return follow_die_ref (die, spec_attr, spec_cu);
|
return follow_die_ref (die, spec_attr, spec_cu);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Free the line_header structure *LH, and any arrays and strings it
|
|
||||||
refers to.
|
|
||||||
NOTE: This is also used as a "cleanup" function. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
free_line_header (struct line_header *lh)
|
|
||||||
{
|
|
||||||
if (lh->standard_opcode_lengths)
|
|
||||||
xfree (lh->standard_opcode_lengths);
|
|
||||||
|
|
||||||
/* Remember that all the lh->file_names[i].name pointers are
|
|
||||||
pointers into debug_line_buffer, and don't need to be freed. */
|
|
||||||
if (lh->file_names)
|
|
||||||
xfree (lh->file_names);
|
|
||||||
|
|
||||||
/* Similarly for the include directory names. */
|
|
||||||
if (lh->include_dirs)
|
|
||||||
xfree (lh->include_dirs);
|
|
||||||
|
|
||||||
xfree (lh);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Stub for free_line_header to match void * callback types. */
|
/* Stub for free_line_header to match void * callback types. */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -17593,69 +17588,30 @@ free_line_header_voidp (void *arg)
|
||||||
{
|
{
|
||||||
struct line_header *lh = (struct line_header *) arg;
|
struct line_header *lh = (struct line_header *) arg;
|
||||||
|
|
||||||
free_line_header (lh);
|
delete lh;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add an entry to LH's include directory table. */
|
void
|
||||||
|
line_header::add_include_dir (const char *include_dir)
|
||||||
static void
|
|
||||||
add_include_dir (struct line_header *lh, const char *include_dir)
|
|
||||||
{
|
{
|
||||||
if (dwarf_line_debug >= 2)
|
if (dwarf_line_debug >= 2)
|
||||||
fprintf_unfiltered (gdb_stdlog, "Adding dir %u: %s\n",
|
fprintf_unfiltered (gdb_stdlog, "Adding dir %zu: %s\n",
|
||||||
lh->num_include_dirs + 1, include_dir);
|
include_dirs.size () + 1, include_dir);
|
||||||
|
|
||||||
/* Grow the array if necessary. */
|
include_dirs.push_back (include_dir);
|
||||||
if (lh->include_dirs_size == 0)
|
|
||||||
{
|
|
||||||
lh->include_dirs_size = 1; /* for testing */
|
|
||||||
lh->include_dirs = XNEWVEC (const char *, lh->include_dirs_size);
|
|
||||||
}
|
|
||||||
else if (lh->num_include_dirs >= lh->include_dirs_size)
|
|
||||||
{
|
|
||||||
lh->include_dirs_size *= 2;
|
|
||||||
lh->include_dirs = XRESIZEVEC (const char *, lh->include_dirs,
|
|
||||||
lh->include_dirs_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
lh->include_dirs[lh->num_include_dirs++] = include_dir;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Add an entry to LH's file name table. */
|
void
|
||||||
|
line_header::add_file_name (const char *name,
|
||||||
static void
|
unsigned int dir_index,
|
||||||
add_file_name (struct line_header *lh,
|
unsigned int mod_time,
|
||||||
const char *name,
|
unsigned int length)
|
||||||
unsigned int dir_index,
|
|
||||||
unsigned int mod_time,
|
|
||||||
unsigned int length)
|
|
||||||
{
|
{
|
||||||
struct file_entry *fe;
|
|
||||||
|
|
||||||
if (dwarf_line_debug >= 2)
|
if (dwarf_line_debug >= 2)
|
||||||
fprintf_unfiltered (gdb_stdlog, "Adding file %u: %s\n",
|
fprintf_unfiltered (gdb_stdlog, "Adding file %u: %s\n",
|
||||||
lh->num_file_names + 1, name);
|
(unsigned) file_names.size () + 1, name);
|
||||||
|
|
||||||
/* Grow the array if necessary. */
|
file_names.emplace_back (name, dir_index, mod_time, length);
|
||||||
if (lh->file_names_size == 0)
|
|
||||||
{
|
|
||||||
lh->file_names_size = 1; /* for testing */
|
|
||||||
lh->file_names = XNEWVEC (struct file_entry, lh->file_names_size);
|
|
||||||
}
|
|
||||||
else if (lh->num_file_names >= lh->file_names_size)
|
|
||||||
{
|
|
||||||
lh->file_names_size *= 2;
|
|
||||||
lh->file_names
|
|
||||||
= XRESIZEVEC (struct file_entry, lh->file_names, lh->file_names_size);
|
|
||||||
}
|
|
||||||
|
|
||||||
fe = &lh->file_names[lh->num_file_names++];
|
|
||||||
fe->name = name;
|
|
||||||
fe->dir_index = dir_index;
|
|
||||||
fe->mod_time = mod_time;
|
|
||||||
fe->length = length;
|
|
||||||
fe->included_p = 0;
|
|
||||||
fe->symtab = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* A convenience function to find the proper .debug_line section for a CU. */
|
/* A convenience function to find the proper .debug_line section for a CU. */
|
||||||
|
@ -17681,16 +17637,6 @@ get_debug_line_section (struct dwarf2_cu *cu)
|
||||||
return section;
|
return section;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Forwarding function for read_formatted_entries. */
|
|
||||||
|
|
||||||
static void
|
|
||||||
add_include_dir_stub (struct line_header *lh, const char *name,
|
|
||||||
unsigned int dir_index, unsigned int mod_time,
|
|
||||||
unsigned int length)
|
|
||||||
{
|
|
||||||
add_include_dir (lh, name);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Read directory or file name entry format, starting with byte of
|
/* Read directory or file name entry format, starting with byte of
|
||||||
format count entries, ULEB128 pairs of entry formats, ULEB128 of
|
format count entries, ULEB128 pairs of entry formats, ULEB128 of
|
||||||
entries count and the entries themselves in the described entry
|
entries count and the entries themselves in the described entry
|
||||||
|
@ -17731,8 +17677,6 @@ read_formatted_entries (bfd *abfd, const gdb_byte **bufp,
|
||||||
const gdb_byte *format = format_header_data;
|
const gdb_byte *format = format_header_data;
|
||||||
struct file_entry fe;
|
struct file_entry fe;
|
||||||
|
|
||||||
memset (&fe, 0, sizeof (fe));
|
|
||||||
|
|
||||||
for (formati = 0; formati < format_count; formati++)
|
for (formati = 0; formati < format_count; formati++)
|
||||||
{
|
{
|
||||||
ULONGEST content_type, form;
|
ULONGEST content_type, form;
|
||||||
|
@ -17826,11 +17770,9 @@ read_formatted_entries (bfd *abfd, const gdb_byte **bufp,
|
||||||
the returned object point into the dwarf line section buffer,
|
the returned object point into the dwarf line section buffer,
|
||||||
and must not be freed. */
|
and must not be freed. */
|
||||||
|
|
||||||
static struct line_header *
|
static line_header_up
|
||||||
dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
{
|
{
|
||||||
struct cleanup *back_to;
|
|
||||||
struct line_header *lh;
|
|
||||||
const gdb_byte *line_ptr;
|
const gdb_byte *line_ptr;
|
||||||
unsigned int bytes_read, offset_size;
|
unsigned int bytes_read, offset_size;
|
||||||
int i;
|
int i;
|
||||||
|
@ -17861,10 +17803,7 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
lh = XNEW (struct line_header);
|
line_header_up lh (new line_header ());
|
||||||
memset (lh, 0, sizeof (*lh));
|
|
||||||
back_to = make_cleanup ((make_cleanup_ftype *) free_line_header,
|
|
||||||
(void *) lh);
|
|
||||||
|
|
||||||
lh->offset.sect_off = offset;
|
lh->offset.sect_off = offset;
|
||||||
lh->offset_in_dwz = cu->per_cu->is_dwz;
|
lh->offset_in_dwz = cu->per_cu->is_dwz;
|
||||||
|
@ -17879,7 +17818,6 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
if (line_ptr + lh->total_length > (section->buffer + section->size))
|
if (line_ptr + lh->total_length > (section->buffer + section->size))
|
||||||
{
|
{
|
||||||
dwarf2_statement_list_fits_in_line_number_section_complaint ();
|
dwarf2_statement_list_fits_in_line_number_section_complaint ();
|
||||||
do_cleanups (back_to);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
lh->statement_program_end = line_ptr + lh->total_length;
|
lh->statement_program_end = line_ptr + lh->total_length;
|
||||||
|
@ -17940,7 +17878,7 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
line_ptr += 1;
|
line_ptr += 1;
|
||||||
lh->opcode_base = read_1_byte (abfd, line_ptr);
|
lh->opcode_base = read_1_byte (abfd, line_ptr);
|
||||||
line_ptr += 1;
|
line_ptr += 1;
|
||||||
lh->standard_opcode_lengths = XNEWVEC (unsigned char, lh->opcode_base);
|
lh->standard_opcode_lengths.reset (new unsigned char[lh->opcode_base]);
|
||||||
|
|
||||||
lh->standard_opcode_lengths[0] = 1; /* This should never be used anyway. */
|
lh->standard_opcode_lengths[0] = 1; /* This should never be used anyway. */
|
||||||
for (i = 1; i < lh->opcode_base; ++i)
|
for (i = 1; i < lh->opcode_base; ++i)
|
||||||
|
@ -17952,11 +17890,22 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
if (lh->version >= 5)
|
if (lh->version >= 5)
|
||||||
{
|
{
|
||||||
/* Read directory table. */
|
/* Read directory table. */
|
||||||
read_formatted_entries (abfd, &line_ptr, lh, &cu->header,
|
read_formatted_entries (abfd, &line_ptr, lh.get (), &cu->header,
|
||||||
add_include_dir_stub);
|
[] (struct line_header *lh, const char *name,
|
||||||
|
unsigned int dir_index, unsigned int mod_time,
|
||||||
|
unsigned int length)
|
||||||
|
{
|
||||||
|
lh->add_include_dir (name);
|
||||||
|
});
|
||||||
|
|
||||||
/* Read file name table. */
|
/* Read file name table. */
|
||||||
read_formatted_entries (abfd, &line_ptr, lh, &cu->header, add_file_name);
|
read_formatted_entries (abfd, &line_ptr, lh.get (), &cu->header,
|
||||||
|
[] (struct line_header *lh, const char *name,
|
||||||
|
unsigned int dir_index, unsigned int mod_time,
|
||||||
|
unsigned int length)
|
||||||
|
{
|
||||||
|
lh->add_file_name (name, dir_index, mod_time, length);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -17964,7 +17913,7 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
while ((cur_dir = read_direct_string (abfd, line_ptr, &bytes_read)) != NULL)
|
while ((cur_dir = read_direct_string (abfd, line_ptr, &bytes_read)) != NULL)
|
||||||
{
|
{
|
||||||
line_ptr += bytes_read;
|
line_ptr += bytes_read;
|
||||||
add_include_dir (lh, cur_dir);
|
lh->add_include_dir (cur_dir);
|
||||||
}
|
}
|
||||||
line_ptr += bytes_read;
|
line_ptr += bytes_read;
|
||||||
|
|
||||||
|
@ -17981,7 +17930,7 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
length = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
|
length = read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
|
||||||
line_ptr += bytes_read;
|
line_ptr += bytes_read;
|
||||||
|
|
||||||
add_file_name (lh, cur_file, dir_index, mod_time, length);
|
lh->add_file_name (cur_file, dir_index, mod_time, length);
|
||||||
}
|
}
|
||||||
line_ptr += bytes_read;
|
line_ptr += bytes_read;
|
||||||
}
|
}
|
||||||
|
@ -17992,7 +17941,6 @@ dwarf_decode_line_header (unsigned int offset, struct dwarf2_cu *cu)
|
||||||
_("line number info header doesn't "
|
_("line number info header doesn't "
|
||||||
"fit in `.debug_line' section"));
|
"fit in `.debug_line' section"));
|
||||||
|
|
||||||
discard_cleanups (back_to);
|
|
||||||
return lh;
|
return lh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -18489,7 +18437,7 @@ dwarf_decode_lines_1 (struct line_header *lh, struct dwarf2_cu *cu,
|
||||||
length =
|
length =
|
||||||
read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
|
read_unsigned_leb128 (abfd, line_ptr, &bytes_read);
|
||||||
line_ptr += bytes_read;
|
line_ptr += bytes_read;
|
||||||
add_file_name (lh, cur_file, dir_index, mod_time, length);
|
lh->add_file_name (cur_file, dir_index, mod_time, length);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case DW_LNE_set_discriminator:
|
case DW_LNE_set_discriminator:
|
||||||
|
@ -18681,7 +18629,7 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir,
|
||||||
|
|
||||||
/* Now that we're done scanning the Line Header Program, we can
|
/* Now that we're done scanning the Line Header Program, we can
|
||||||
create the psymtab of each included file. */
|
create the psymtab of each included file. */
|
||||||
for (file_index = 0; file_index < lh->num_file_names; file_index++)
|
for (file_index = 0; file_index < lh->file_names.size (); file_index++)
|
||||||
if (lh->file_names[file_index].included_p == 1)
|
if (lh->file_names[file_index].included_p == 1)
|
||||||
{
|
{
|
||||||
const char *include_name =
|
const char *include_name =
|
||||||
|
@ -18698,7 +18646,7 @@ dwarf_decode_lines (struct line_header *lh, const char *comp_dir,
|
||||||
struct compunit_symtab *cust = buildsym_compunit_symtab ();
|
struct compunit_symtab *cust = buildsym_compunit_symtab ();
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < lh->num_file_names; i++)
|
for (i = 0; i < lh->file_names.size (); i++)
|
||||||
{
|
{
|
||||||
file_entry &fe = lh->file_names[i];
|
file_entry &fe = lh->file_names[i];
|
||||||
|
|
||||||
|
@ -21404,7 +21352,7 @@ file_file_name (int file, struct line_header *lh)
|
||||||
{
|
{
|
||||||
/* Is the file number a valid index into the line header's file name
|
/* Is the file number a valid index into the line header's file name
|
||||||
table? Remember that file numbers start with one, not zero. */
|
table? Remember that file numbers start with one, not zero. */
|
||||||
if (1 <= file && file <= lh->num_file_names)
|
if (1 <= file && file <= lh->file_names.size ())
|
||||||
{
|
{
|
||||||
const file_entry &fe = lh->file_names[file - 1];
|
const file_entry &fe = lh->file_names[file - 1];
|
||||||
|
|
||||||
|
@ -21443,7 +21391,7 @@ file_full_name (int file, struct line_header *lh, const char *comp_dir)
|
||||||
{
|
{
|
||||||
/* Is the file number a valid index into the line header's file name
|
/* Is the file number a valid index into the line header's file name
|
||||||
table? Remember that file numbers start with one, not zero. */
|
table? Remember that file numbers start with one, not zero. */
|
||||||
if (1 <= file && file <= lh->num_file_names)
|
if (1 <= file && file <= lh->file_names.size ())
|
||||||
{
|
{
|
||||||
char *relative = file_file_name (file, lh);
|
char *relative = file_file_name (file, lh);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue