aboutsummaryrefslogtreecommitdiff
path: root/gdb/dwarf2/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/dwarf2/read.c')
-rw-r--r--gdb/dwarf2/read.c255
1 files changed, 2 insertions, 253 deletions
diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
index 6844ce1..9501a9e 100644
--- a/gdb/dwarf2/read.c
+++ b/gdb/dwarf2/read.c
@@ -35,6 +35,7 @@
#include "dwarf2/index-cache.h"
#include "dwarf2/index-common.h"
#include "dwarf2/leb.h"
+#include "dwarf2/line-header.h"
#include "bfd.h"
#include "elf-bfd.h"
#include "symtab.h"
@@ -90,7 +91,7 @@ static unsigned int dwarf_read_debug = 0;
static unsigned int dwarf_die_debug = 0;
/* When non-zero, dump line number entries as they are read in. */
-static unsigned int dwarf_line_debug = 0;
+unsigned int dwarf_line_debug = 0;
/* When true, cross-check physname against demangler. */
static bool check_physname = false;
@@ -946,167 +947,6 @@ private:
abbrev_table_up m_dwo_abbrev_table;
};
-/* dir_index is 1-based in DWARF 4 and before, and is 0-based in DWARF 5 and
- later. */
-typedef int dir_index;
-
-/* file_name_index is 1-based in DWARF 4 and before, and is 0-based in DWARF 5
- and later. */
-typedef int file_name_index;
-
-struct file_entry
-{
- file_entry () = default;
-
- file_entry (const char *name_, dir_index d_index_,
- unsigned int mod_time_, unsigned int length_)
- : name (name_),
- d_index (d_index_),
- mod_time (mod_time_),
- length (length_)
- {}
-
- /* Return the include directory at D_INDEX stored in LH. Returns
- NULL if D_INDEX is out of bounds. */
- const char *include_dir (const line_header *lh) const;
-
- /* 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). */
- dir_index d_index {};
-
- unsigned int mod_time {};
-
- unsigned int length {};
-
- /* True if referenced by the Line Number Program. */
- bool included_p {};
-
- /* The associated symbol table, if any. */
- struct symtab *symtab {};
-};
-
-/* The line number information for a compilation unit (found in the
- .debug_line section) begins with a "statement program header",
- which contains the following information. */
-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, dir_index d_index,
- unsigned int mod_time, unsigned int length);
-
- /* Return the include dir at INDEX (0-based in DWARF 5 and 1-based before).
- Returns NULL if INDEX is out of bounds. */
- const char *include_dir_at (dir_index index) const
- {
- int vec_index;
- if (version >= 5)
- vec_index = index;
- else
- vec_index = index - 1;
- if (vec_index < 0 || vec_index >= m_include_dirs.size ())
- return NULL;
- return m_include_dirs[vec_index];
- }
-
- bool is_valid_file_index (int file_index)
- {
- if (version >= 5)
- return 0 <= file_index && file_index < file_names_size ();
- return 1 <= file_index && file_index <= file_names_size ();
- }
-
- /* Return the file name at INDEX (0-based in DWARF 5 and 1-based before).
- Returns NULL if INDEX is out of bounds. */
- file_entry *file_name_at (file_name_index index)
- {
- int vec_index;
- if (version >= 5)
- vec_index = index;
- else
- vec_index = index - 1;
- if (vec_index < 0 || vec_index >= m_file_names.size ())
- return NULL;
- return &m_file_names[vec_index];
- }
-
- /* The indexes are 0-based in DWARF 5 and 1-based in DWARF 4. Therefore,
- this method should only be used to iterate through all file entries in an
- index-agnostic manner. */
- std::vector<file_entry> &file_names ()
- { return m_file_names; }
-
- /* Offset of line number information in .debug_line section. */
- sect_offset sect_off {};
-
- /* OFFSET is for struct dwz_file associated with dwarf2_per_objfile. */
- unsigned offset_in_dwz : 1; /* Can't initialize bitfields in-class. */
-
- unsigned int total_length {};
- unsigned short version {};
- unsigned int header_length {};
- unsigned char minimum_instruction_length {};
- unsigned char maximum_ops_per_instruction {};
- unsigned char default_is_stmt {};
- int line_base {};
- unsigned char line_range {};
- unsigned char opcode_base {};
-
- /* standard_opcode_lengths[i] is the number of operands for the
- standard opcode whose value is i. This means that
- standard_opcode_lengths[0] is unused, and the last meaningful
- element is standard_opcode_lengths[opcode_base - 1]. */
- std::unique_ptr<unsigned char[]> standard_opcode_lengths;
-
- int file_names_size ()
- { return m_file_names.size(); }
-
- /* The start and end of the statement program following this
- header. These point into dwarf2_per_objfile->line_buffer. */
- const gdb_byte *statement_program_start {}, *statement_program_end {};
-
- /* Return the full name of file number I in this object's file name
- table. Use COMP_DIR as the name of the current directory of the
- compilation. The result is allocated using xmalloc; the caller
- is responsible for freeing it. */
- gdb::unique_xmalloc_ptr<char> file_full_name (int file,
- const char *comp_dir);
-
- /* Return file name relative to the compilation directory of file
- number I in this object's file name table. The result is
- allocated using xmalloc; the caller is responsible for freeing
- it. */
- gdb::unique_xmalloc_ptr<char> file_file_name (int file);
-
- private:
- /* The include_directories table. Note these are observing
- pointers. The memory is owned by debug_line_buffer. */
- std::vector<const char *> m_include_dirs;
-
- /* The file_names table. This is private because the meaning of indexes
- differs among DWARF versions (The first valid index is 1 in DWARF 4 and
- before, and is 0 in DWARF 5 and later). So the client should use
- file_name_at method for access. */
- std::vector<file_entry> m_file_names;
-};
-
-typedef std::unique_ptr<line_header> line_header_up;
-
-const char *
-file_entry::include_dir (const line_header *lh) const
-{
- return lh->include_dir_at (d_index);
-}
-
/* When we construct a partial symbol table entry we only
need this much information. */
struct partial_die_info : public allocate_on_obstack
@@ -19850,41 +19690,6 @@ free_line_header_voidp (void *arg)
delete lh;
}
-void
-line_header::add_include_dir (const char *include_dir)
-{
- if (dwarf_line_debug >= 2)
- {
- size_t new_size;
- if (version >= 5)
- new_size = m_include_dirs.size ();
- else
- new_size = m_include_dirs.size () + 1;
- fprintf_unfiltered (gdb_stdlog, "Adding dir %zu: %s\n",
- new_size, include_dir);
- }
- m_include_dirs.push_back (include_dir);
-}
-
-void
-line_header::add_file_name (const char *name,
- dir_index d_index,
- unsigned int mod_time,
- unsigned int length)
-{
- if (dwarf_line_debug >= 2)
- {
- size_t new_size;
- if (version >= 5)
- new_size = file_names_size ();
- else
- new_size = file_names_size () + 1;
- fprintf_unfiltered (gdb_stdlog, "Adding file %zu: %s\n",
- new_size, name);
- }
- m_file_names.emplace_back (name, d_index, mod_time, length);
-}
-
/* A convenience function to find the proper .debug_line section for a CU. */
static struct dwarf2_section_info *
@@ -23756,62 +23561,6 @@ dwarf_alloc_die (struct dwarf2_cu *cu, int num_attrs)
/* Macro support. */
-gdb::unique_xmalloc_ptr<char>
-line_header::file_file_name (int file)
-{
- /* Is the file number a valid index into the line header's file name
- table? Remember that file numbers start with one, not zero. */
- if (is_valid_file_index (file))
- {
- const file_entry *fe = file_name_at (file);
-
- if (!IS_ABSOLUTE_PATH (fe->name))
- {
- const char *dir = fe->include_dir (this);
- if (dir != NULL)
- return gdb::unique_xmalloc_ptr<char> (concat (dir, SLASH_STRING,
- fe->name,
- (char *) NULL));
- }
- return make_unique_xstrdup (fe->name);
- }
- else
- {
- /* The compiler produced a bogus file number. We can at least
- record the macro definitions made in the file, even if we
- won't be able to find the file by name. */
- char fake_name[80];
-
- xsnprintf (fake_name, sizeof (fake_name),
- "<bad macro file number %d>", file);
-
- complaint (_("bad file number in macro information (%d)"),
- file);
-
- return make_unique_xstrdup (fake_name);
- }
-}
-
-gdb::unique_xmalloc_ptr<char>
-line_header::file_full_name (int file, const char *comp_dir)
-{
- /* Is the file number a valid index into the line header's file name
- table? Remember that file numbers start with one, not zero. */
- if (is_valid_file_index (file))
- {
- gdb::unique_xmalloc_ptr<char> relative = file_file_name (file);
-
- if (IS_ABSOLUTE_PATH (relative.get ()) || comp_dir == NULL)
- return relative;
- return gdb::unique_xmalloc_ptr<char> (concat (comp_dir, SLASH_STRING,
- relative.get (),
- (char *) NULL));
- }
- else
- return file_file_name (file);
-}
-
-
static struct macro_source_file *
macro_start_file (struct dwarf2_cu *cu,
int file, int line,