| 1 | /* List lines of source files for GDB, the GNU debugger. |
| 2 | Copyright (C) 1999-2020 Free Software Foundation, Inc. |
| 3 | |
| 4 | This file is part of GDB. |
| 5 | |
| 6 | This program is free software; you can redistribute it and/or modify |
| 7 | it under the terms of the GNU General Public License as published by |
| 8 | the Free Software Foundation; either version 3 of the License, or |
| 9 | (at your option) any later version. |
| 10 | |
| 11 | This program is distributed in the hope that it will be useful, |
| 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 14 | GNU General Public License for more details. |
| 15 | |
| 16 | You should have received a copy of the GNU General Public License |
| 17 | along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
| 18 | |
| 19 | #ifndef SOURCE_H |
| 20 | #define SOURCE_H |
| 21 | |
| 22 | #include "gdbsupport/scoped_fd.h" |
| 23 | |
| 24 | struct symtab; |
| 25 | |
| 26 | /* See openp function definition for their description. */ |
| 27 | |
| 28 | enum openp_flag |
| 29 | { |
| 30 | OPF_TRY_CWD_FIRST = 0x01, |
| 31 | OPF_SEARCH_IN_PATH = 0x02, |
| 32 | OPF_RETURN_REALPATH = 0x04, |
| 33 | }; |
| 34 | |
| 35 | DEF_ENUM_FLAGS_TYPE(openp_flag, openp_flags); |
| 36 | |
| 37 | extern int openp (const char *, openp_flags, const char *, int, |
| 38 | gdb::unique_xmalloc_ptr<char> *); |
| 39 | |
| 40 | extern int source_full_path_of (const char *, gdb::unique_xmalloc_ptr<char> *); |
| 41 | |
| 42 | extern void mod_path (const char *, char **); |
| 43 | |
| 44 | extern void add_path (const char *, char **, int); |
| 45 | |
| 46 | extern void directory_switch (const char *, int); |
| 47 | |
| 48 | extern char *source_path; |
| 49 | |
| 50 | extern void init_source_path (void); |
| 51 | |
| 52 | /* This function is capable of finding the absolute path to a |
| 53 | source file, and opening it, provided you give it a FILENAME. Both the |
| 54 | DIRNAME and FULLNAME are only added suggestions on where to find the file. |
| 55 | |
| 56 | FILENAME should be the filename to open. |
| 57 | DIRNAME is the compilation directory of a particular source file. |
| 58 | Only some debug formats provide this info. |
| 59 | FULLNAME can be the last known absolute path to the file in question. |
| 60 | Space for the path must have been malloc'd. If a path substitution |
| 61 | is applied we free the old value and set a new one. |
| 62 | |
| 63 | On Success |
| 64 | A valid file descriptor is returned (the return value is positive). |
| 65 | FULLNAME is set to the absolute path to the file just opened. |
| 66 | The caller is responsible for freeing FULLNAME. |
| 67 | |
| 68 | On Failure |
| 69 | An invalid file descriptor is returned (the return value is negative). |
| 70 | FULLNAME is set to NULL. */ |
| 71 | extern scoped_fd find_and_open_source (const char *filename, |
| 72 | const char *dirname, |
| 73 | gdb::unique_xmalloc_ptr<char> *fullname); |
| 74 | |
| 75 | /* Open a source file given a symtab S. Returns a file descriptor or |
| 76 | negative number for error. */ |
| 77 | extern scoped_fd open_source_file (struct symtab *s); |
| 78 | |
| 79 | extern gdb::unique_xmalloc_ptr<char> rewrite_source_path (const char *path); |
| 80 | |
| 81 | extern const char *symtab_to_fullname (struct symtab *s); |
| 82 | |
| 83 | /* Returns filename without the compile directory part, basename or absolute |
| 84 | filename. It depends on 'set filename-display' value. */ |
| 85 | extern const char *symtab_to_filename_for_display (struct symtab *symtab); |
| 86 | |
| 87 | /* Return the first line listed by print_source_lines. Used by |
| 88 | command interpreters to request listing from a previous point. If |
| 89 | 0, then no source lines have yet been listed since the last time |
| 90 | the current source line was changed. */ |
| 91 | extern int get_first_line_listed (void); |
| 92 | |
| 93 | /* Return the default number of lines to print with commands like the |
| 94 | cli "list". The caller of print_source_lines must use this to |
| 95 | calculate the end line and use it in the call to print_source_lines |
| 96 | as it does not automatically use this value. */ |
| 97 | extern int get_lines_to_list (void); |
| 98 | |
| 99 | /* Return the current source file for listing and next line to list. |
| 100 | NOTE: The returned sal pc and end fields are not valid. */ |
| 101 | extern struct symtab_and_line get_current_source_symtab_and_line (void); |
| 102 | |
| 103 | /* If the current source file for listing is not set, try and get a default. |
| 104 | Usually called before get_current_source_symtab_and_line() is called. |
| 105 | It may err out if a default cannot be determined. |
| 106 | We must be cautious about where it is called, as it can recurse as the |
| 107 | process of determining a new default may call the caller! |
| 108 | Use get_current_source_symtab_and_line only to get whatever |
| 109 | we have without erroring out or trying to get a default. */ |
| 110 | extern void set_default_source_symtab_and_line (void); |
| 111 | |
| 112 | /* Return the current default file for listing and next line to list |
| 113 | (the returned sal pc and end fields are not valid.) |
| 114 | and set the current default to whatever is in SAL. |
| 115 | NOTE: The returned sal pc and end fields are not valid. */ |
| 116 | extern symtab_and_line set_current_source_symtab_and_line |
| 117 | (const symtab_and_line &sal); |
| 118 | |
| 119 | /* Reset any information stored about a default file and line to print. */ |
| 120 | extern void clear_current_source_symtab_and_line (void); |
| 121 | |
| 122 | /* Add a source path substitution rule. */ |
| 123 | extern void add_substitute_path_rule (char *, char *); |
| 124 | |
| 125 | /* Flags passed as 4th argument to print_source_lines. */ |
| 126 | enum print_source_lines_flag |
| 127 | { |
| 128 | /* Do not print an error message. */ |
| 129 | PRINT_SOURCE_LINES_NOERROR = (1 << 0), |
| 130 | |
| 131 | /* Print the filename in front of the source lines. */ |
| 132 | PRINT_SOURCE_LINES_FILENAME = (1 << 1) |
| 133 | }; |
| 134 | DEF_ENUM_FLAGS_TYPE (enum print_source_lines_flag, print_source_lines_flags); |
| 135 | |
| 136 | /* Show source lines from the file of symtab S, starting with line |
| 137 | number LINE and stopping before line number STOPLINE. If this is |
| 138 | not the command line version, then the source is shown in the source |
| 139 | window otherwise it is simply printed. */ |
| 140 | extern void print_source_lines (struct symtab *s, int line, int stopline, |
| 141 | print_source_lines_flags flags); |
| 142 | |
| 143 | /* Wrap up the logic to build a line number range for passing to |
| 144 | print_source_lines when using get_lines_to_list. An instance of this |
| 145 | class can be built from a single line number and a direction (forward or |
| 146 | backward) the range is then computed using get_lines_to_list. */ |
| 147 | class source_lines_range |
| 148 | { |
| 149 | public: |
| 150 | /* When constructing the range from a single line number, does the line |
| 151 | range extend forward, or backward. */ |
| 152 | enum direction |
| 153 | { |
| 154 | FORWARD, |
| 155 | BACKWARD |
| 156 | }; |
| 157 | |
| 158 | /* Construct a SOURCE_LINES_RANGE starting at STARTLINE and extending in |
| 159 | direction DIR. The number of lines is from GET_LINES_TO_LIST. If the |
| 160 | direction is backward then the start is actually (STARTLINE - |
| 161 | GET_LINES_TO_LIST). There is also logic in place to ensure the start |
| 162 | is always 1 or more, and the end will be at most INT_MAX. */ |
| 163 | explicit source_lines_range (int startline, direction dir = FORWARD); |
| 164 | |
| 165 | /* Construct a SOURCE_LINES_RANGE from STARTLINE to STOPLINE. */ |
| 166 | explicit source_lines_range (int startline, int stopline) |
| 167 | : m_startline (startline), |
| 168 | m_stopline (stopline) |
| 169 | { /* Nothing. */ } |
| 170 | |
| 171 | /* Return the line to start listing from. */ |
| 172 | int startline () const |
| 173 | { return m_startline; } |
| 174 | |
| 175 | /* Return the line after the last line that should be listed. */ |
| 176 | int stopline () const |
| 177 | { return m_stopline; } |
| 178 | |
| 179 | private: |
| 180 | |
| 181 | /* The start and end of the range. */ |
| 182 | int m_startline; |
| 183 | int m_stopline; |
| 184 | }; |
| 185 | |
| 186 | /* Variation of previous print_source_lines that takes a range instead of a |
| 187 | start and end line number. */ |
| 188 | extern void print_source_lines (struct symtab *s, source_lines_range r, |
| 189 | print_source_lines_flags flags); |
| 190 | |
| 191 | /* Forget line positions and file names for the symtabs in a |
| 192 | particular objfile. */ |
| 193 | extern void forget_cached_source_info_for_objfile (struct objfile *); |
| 194 | |
| 195 | /* Forget what we learned about line positions in source files, and |
| 196 | which directories contain them; must check again now since files |
| 197 | may be found in a different directory now. */ |
| 198 | extern void forget_cached_source_info (void); |
| 199 | |
| 200 | /* Set the source file default for the "list" command to be S. |
| 201 | |
| 202 | If S is NULL, and we don't have a default, find one. This |
| 203 | should only be called when the user actually tries to use the |
| 204 | default, since we produce an error if we can't find a reasonable |
| 205 | default. Also, since this can cause symbols to be read, doing it |
| 206 | before we need to would make things slower than necessary. */ |
| 207 | extern void select_source_symtab (struct symtab *s); |
| 208 | |
| 209 | #endif |