mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-12-15 04:31:49 +08:00
c600d77cb7
This changes the file_and_directory object to be able to compute and cache the "fullname" in the same way that is done by other code, like the psymtab reader.
130 lines
3.7 KiB
C++
130 lines
3.7 KiB
C++
/* DWARF file and directory
|
|
|
|
Copyright (C) 1994-2022 Free Software Foundation, Inc.
|
|
|
|
Adapted by Gary Funck (gary@intrepid.com), Intrepid Technology,
|
|
Inc. with support from Florida State University (under contract
|
|
with the Ada Joint Program Office), and Silicon Graphics, Inc.
|
|
Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
|
|
based on Fred Fish's (Cygnus Support) implementation of DWARF 1
|
|
support.
|
|
|
|
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 <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef GDB_DWARF2_FILE_AND_DIR_H
|
|
#define GDB_DWARF2_FILE_AND_DIR_H
|
|
|
|
#include "objfiles.h"
|
|
#include "source.h"
|
|
#include <string>
|
|
|
|
/* The return type of find_file_and_directory. Note, the enclosed
|
|
string pointers are only valid while this object is valid. */
|
|
|
|
struct file_and_directory
|
|
{
|
|
file_and_directory (const char *name, const char *dir)
|
|
: m_name (name),
|
|
m_comp_dir (dir)
|
|
{
|
|
}
|
|
|
|
/* Return true if the file name is unknown. */
|
|
bool is_unknown () const
|
|
{
|
|
return m_name == nullptr;
|
|
}
|
|
|
|
/* Set the compilation directory. */
|
|
void set_comp_dir (std::string &&dir)
|
|
{
|
|
m_comp_dir_storage = std::move (dir);
|
|
m_comp_dir = nullptr;
|
|
}
|
|
|
|
/* Fetch the compilation directory. This may return NULL in some
|
|
circumstances. Note that the return value here is not stable --
|
|
it may change if this object is moved. To get a stable pointer,
|
|
you should call intern_comp_dir. */
|
|
const char *get_comp_dir () const
|
|
{
|
|
if (!m_comp_dir_storage.empty ())
|
|
return m_comp_dir_storage.c_str ();
|
|
return m_comp_dir;
|
|
}
|
|
|
|
/* If necessary, intern the compilation directory using OBJFILE's
|
|
string cache. Returns the compilation directory. */
|
|
const char *intern_comp_dir (struct objfile *objfile)
|
|
{
|
|
if (!m_comp_dir_storage.empty ())
|
|
{
|
|
m_comp_dir = objfile->intern (m_comp_dir_storage);
|
|
m_comp_dir_storage.clear ();
|
|
}
|
|
return m_comp_dir;
|
|
}
|
|
|
|
/* Fetch the filename. This never returns NULL. */
|
|
const char *get_name () const
|
|
{
|
|
return m_name == nullptr ? "<unknown>" : m_name;
|
|
}
|
|
|
|
/* Set the filename. */
|
|
void set_name (gdb::unique_xmalloc_ptr<char> name)
|
|
{
|
|
m_name_storage = std::move (name);
|
|
m_name = m_name_storage.get ();
|
|
}
|
|
|
|
/* Return the full name, computing it if necessary. */
|
|
const char *get_fullname ()
|
|
{
|
|
if (m_fullname == nullptr)
|
|
m_fullname = find_source_or_rewrite (get_name (), get_comp_dir ());
|
|
return m_fullname.get ();
|
|
}
|
|
|
|
/* Forget the full name. */
|
|
void forget_fullname ()
|
|
{
|
|
m_fullname.reset ();
|
|
}
|
|
|
|
private:
|
|
|
|
/* The filename. */
|
|
const char *m_name;
|
|
|
|
/* Storage for the filename, if needed. */
|
|
gdb::unique_xmalloc_ptr<char> m_name_storage;
|
|
|
|
/* The compilation directory. NULL if not known. If we needed to
|
|
compute a new string, it will be stored in the comp_dir_storage
|
|
member, and this will be NULL. Otherwise, points directly to the
|
|
DW_AT_comp_dir string attribute. */
|
|
const char *m_comp_dir;
|
|
|
|
/* The compilation directory, if it needed to be allocated. */
|
|
std::string m_comp_dir_storage;
|
|
|
|
/* The full name. */
|
|
gdb::unique_xmalloc_ptr<char> m_fullname;
|
|
};
|
|
|
|
#endif /* GDB_DWARF2_FILE_AND_DIR_H */
|