/* DWARF 2 debugging format support for GDB. Copyright (C) 1994-2020 Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include "defs.h" #include "dwarf2/line-header.h" #include "dwarf2/read.h" #include "complaints.h" #include "filenames.h" 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); } gdb::unique_xmalloc_ptr 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 (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), "", file); complaint (_("bad file number in macro information (%d)"), file); return make_unique_xstrdup (fake_name); } } gdb::unique_xmalloc_ptr 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 relative = file_file_name (file); if (IS_ABSOLUTE_PATH (relative.get ()) || comp_dir == NULL) return relative; return gdb::unique_xmalloc_ptr (concat (comp_dir, SLASH_STRING, relative.get (), (char *) NULL)); } else return file_file_name (file); }