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