Home | History | Annotate | Line # | Download | only in dwarf2
      1      1.1  christos /* DWARF file and directory
      2      1.1  christos 
      3  1.1.1.2  christos    Copyright (C) 1994-2024 Free Software Foundation, Inc.
      4      1.1  christos 
      5      1.1  christos    Adapted by Gary Funck (gary (at) intrepid.com), Intrepid Technology,
      6      1.1  christos    Inc.  with support from Florida State University (under contract
      7      1.1  christos    with the Ada Joint Program Office), and Silicon Graphics, Inc.
      8      1.1  christos    Initial contribution by Brent Benson, Harris Computer Systems, Inc.,
      9      1.1  christos    based on Fred Fish's (Cygnus Support) implementation of DWARF 1
     10      1.1  christos    support.
     11      1.1  christos 
     12      1.1  christos    This file is part of GDB.
     13      1.1  christos 
     14      1.1  christos    This program is free software; you can redistribute it and/or modify
     15      1.1  christos    it under the terms of the GNU General Public License as published by
     16      1.1  christos    the Free Software Foundation; either version 3 of the License, or
     17      1.1  christos    (at your option) any later version.
     18      1.1  christos 
     19      1.1  christos    This program is distributed in the hope that it will be useful,
     20      1.1  christos    but WITHOUT ANY WARRANTY; without even the implied warranty of
     21      1.1  christos    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     22      1.1  christos    GNU General Public License for more details.
     23      1.1  christos 
     24      1.1  christos    You should have received a copy of the GNU General Public License
     25      1.1  christos    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
     26      1.1  christos 
     27      1.1  christos #ifndef GDB_DWARF2_FILE_AND_DIR_H
     28      1.1  christos #define GDB_DWARF2_FILE_AND_DIR_H
     29      1.1  christos 
     30      1.1  christos #include "objfiles.h"
     31      1.1  christos #include "source.h"
     32      1.1  christos #include <string>
     33      1.1  christos 
     34      1.1  christos /* The return type of find_file_and_directory.  Note, the enclosed
     35      1.1  christos    string pointers are only valid while this object is valid.  */
     36      1.1  christos 
     37      1.1  christos struct file_and_directory
     38      1.1  christos {
     39      1.1  christos   file_and_directory (const char *name, const char *dir)
     40      1.1  christos     : m_name (name),
     41      1.1  christos       m_comp_dir (dir)
     42      1.1  christos   {
     43      1.1  christos   }
     44      1.1  christos 
     45      1.1  christos   /* Return true if the file name is unknown.  */
     46      1.1  christos   bool is_unknown () const
     47      1.1  christos   {
     48      1.1  christos     return m_name == nullptr;
     49      1.1  christos   }
     50      1.1  christos 
     51      1.1  christos   /* Set the compilation directory.  */
     52      1.1  christos   void set_comp_dir (std::string &&dir)
     53      1.1  christos   {
     54      1.1  christos     m_comp_dir_storage = std::move (dir);
     55      1.1  christos     m_comp_dir = nullptr;
     56      1.1  christos   }
     57      1.1  christos 
     58      1.1  christos   /* Fetch the compilation directory.  This may return NULL in some
     59      1.1  christos      circumstances.  Note that the return value here is not stable --
     60      1.1  christos      it may change if this object is moved.  To get a stable pointer,
     61      1.1  christos      you should call intern_comp_dir.  */
     62      1.1  christos   const char *get_comp_dir () const
     63      1.1  christos   {
     64      1.1  christos     if (!m_comp_dir_storage.empty ())
     65      1.1  christos       return m_comp_dir_storage.c_str ();
     66      1.1  christos     return m_comp_dir;
     67      1.1  christos   }
     68      1.1  christos 
     69      1.1  christos   /* If necessary, intern the compilation directory using OBJFILE's
     70      1.1  christos      string cache.  Returns the compilation directory.  */
     71      1.1  christos   const char *intern_comp_dir (struct objfile *objfile)
     72      1.1  christos   {
     73      1.1  christos     if (!m_comp_dir_storage.empty ())
     74      1.1  christos       {
     75      1.1  christos 	m_comp_dir = objfile->intern (m_comp_dir_storage);
     76      1.1  christos 	m_comp_dir_storage.clear ();
     77      1.1  christos       }
     78      1.1  christos     return m_comp_dir;
     79      1.1  christos   }
     80      1.1  christos 
     81      1.1  christos   /* Fetch the filename.  This never returns NULL.  */
     82      1.1  christos   const char *get_name () const
     83      1.1  christos   {
     84      1.1  christos     return m_name == nullptr ? "<unknown>" : m_name;
     85      1.1  christos   }
     86      1.1  christos 
     87      1.1  christos   /* Set the filename.  */
     88      1.1  christos   void set_name (gdb::unique_xmalloc_ptr<char> name)
     89      1.1  christos   {
     90      1.1  christos     m_name_storage = std::move (name);
     91      1.1  christos     m_name = m_name_storage.get ();
     92      1.1  christos   }
     93      1.1  christos 
     94      1.1  christos   /* Return the full name, computing it if necessary.  */
     95      1.1  christos   const char *get_fullname ()
     96      1.1  christos   {
     97      1.1  christos     if (m_fullname == nullptr)
     98      1.1  christos       m_fullname = find_source_or_rewrite (get_name (), get_comp_dir ());
     99      1.1  christos     return m_fullname.get ();
    100      1.1  christos   }
    101      1.1  christos 
    102      1.1  christos   /* Forget the full name.  */
    103      1.1  christos   void forget_fullname ()
    104      1.1  christos   {
    105      1.1  christos     m_fullname.reset ();
    106      1.1  christos   }
    107      1.1  christos 
    108      1.1  christos private:
    109      1.1  christos 
    110      1.1  christos   /* The filename.  */
    111      1.1  christos   const char *m_name;
    112      1.1  christos 
    113      1.1  christos   /* Storage for the filename, if needed.  */
    114      1.1  christos   gdb::unique_xmalloc_ptr<char> m_name_storage;
    115      1.1  christos 
    116      1.1  christos   /* The compilation directory.  NULL if not known.  If we needed to
    117      1.1  christos      compute a new string, it will be stored in the comp_dir_storage
    118      1.1  christos      member, and this will be NULL.  Otherwise, points directly to the
    119      1.1  christos      DW_AT_comp_dir string attribute.  */
    120      1.1  christos   const char *m_comp_dir;
    121      1.1  christos 
    122      1.1  christos   /* The compilation directory, if it needed to be allocated.  */
    123      1.1  christos   std::string m_comp_dir_storage;
    124      1.1  christos 
    125      1.1  christos   /* The full name.  */
    126      1.1  christos   gdb::unique_xmalloc_ptr<char> m_fullname;
    127      1.1  christos };
    128      1.1  christos 
    129      1.1  christos #endif /* GDB_DWARF2_FILE_AND_DIR_H */
    130