#define OPEN_MODE (O_RDONLY | O_BINARY)
#define FDOPEN_MODE FOPEN_RB
-/* Prototypes for exported functions. */
-
-void _initialize_source (void);
-
/* Prototypes for local functions. */
static int get_filename_and_charpos (struct symtab *, char **);
static void forward_search_command (char *, int);
-static void line_info (char *, int);
+static void info_line_command (char *, int);
-static void source_info (char *, int);
+static void info_source_command (char *, int);
/* Path of directories to search for source files.
Same format as the PATH environment variable's value. */
struct symtab_and_line
get_current_source_symtab_and_line (void)
{
- struct symtab_and_line cursal = { 0 };
+ symtab_and_line cursal;
cursal.pspace = current_source_pspace;
cursal.symtab = current_source_symtab;
NOTE: The returned sal pc and end fields are not valid. */
struct symtab_and_line
-set_current_source_symtab_and_line (const struct symtab_and_line *sal)
+set_current_source_symtab_and_line (const symtab_and_line &sal)
{
- struct symtab_and_line cursal = { 0 };
+ symtab_and_line cursal;
cursal.pspace = current_source_pspace;
cursal.symtab = current_source_symtab;
cursal.pc = 0;
cursal.end = 0;
- current_source_pspace = sal->pspace;
- current_source_symtab = sal->symtab;
- current_source_line = sal->line;
+ current_source_pspace = sal.pspace;
+ current_source_symtab = sal.symtab;
+ current_source_line = sal.line;
/* Force the next "list" to center around the current line. */
clear_lines_listed_range ();
void
select_source_symtab (struct symtab *s)
{
- struct symtabs_and_lines sals;
- struct symtab_and_line sal;
struct objfile *ofp;
struct compunit_symtab *cu;
if one exists. */
if (lookup_symbol (main_name (), 0, VAR_DOMAIN, 0).symbol)
{
- sals = decode_line_with_current_source (main_name (),
- DECODE_LINE_FUNFIRSTLINE);
- sal = sals.sals[0];
- xfree (sals.sals);
+ std::vector<symtab_and_line> sals
+ = decode_line_with_current_source (main_name (),
+ DECODE_LINE_FUNFIRSTLINE);
+ const symtab_and_line &sal = sals[0];
current_source_pspace = sal.pspace;
current_source_symtab = sal.symtab;
current_source_line = std::max (sal.line - (lines_to_list - 1), 1);
static void
-source_info (char *ignore, int from_tty)
+info_source_command (char *ignore, int from_tty)
{
struct symtab *s = current_source_symtab;
struct compunit_symtab *cust;
if (fd < 0)
*filename_opened = NULL;
else if ((opts & OPF_RETURN_REALPATH) != 0)
- *filename_opened = gdb_realpath (filename);
+ *filename_opened = gdb_realpath (filename).release ();
else
- *filename_opened = gdb_abspath (filename);
+ *filename_opened = gdb_abspath (filename).release ();
}
errno = last_errno;
}
/* If the user specified a source path substitution rule that applies
- to PATH, then apply it and return the new path. This new path must
- be deallocated afterwards.
-
+ to PATH, then apply it and return the new path.
+
Return NULL if no substitution rule was specified by the user,
or if no rule applied to the given PATH. */
-
-char *
+
+gdb::unique_xmalloc_ptr<char>
rewrite_source_path (const char *path)
{
const struct substitute_path_rule *rule = get_substitute_path_rule (path);
strcpy (new_path, rule->to);
strcat (new_path, path + from_len);
- return new_path;
+ return gdb::unique_xmalloc_ptr<char> (new_path);
}
int
char *path = source_path;
const char *p;
int result;
- struct cleanup *cleanup;
/* Quick way out if we already know its full name. */
/* The user may have requested that source paths be rewritten
according to substitution rules he provided. If a substitution
rule applies to this path, then apply it. */
- char *rewritten_fullname = rewrite_source_path (*fullname);
+ char *rewritten_fullname = rewrite_source_path (*fullname).release ();
if (rewritten_fullname != NULL)
{
result = gdb_open_cloexec (*fullname, OPEN_MODE, 0);
if (result >= 0)
{
- char *lpath = gdb_realpath (*fullname);
+ char *lpath = gdb_realpath (*fullname).release ();
xfree (*fullname);
*fullname = lpath;
*fullname = NULL;
}
- cleanup = make_cleanup (null_cleanup, NULL);
-
+ gdb::unique_xmalloc_ptr<char> rewritten_dirname;
if (dirname != NULL)
{
/* If necessary, rewrite the compilation directory name according
to the source path substitution rules specified by the user. */
- char *rewritten_dirname = rewrite_source_path (dirname);
+ rewritten_dirname = rewrite_source_path (dirname);
if (rewritten_dirname != NULL)
- {
- make_cleanup (xfree, rewritten_dirname);
- dirname = rewritten_dirname;
- }
-
+ dirname = rewritten_dirname.get ();
+
/* Replace a path entry of $cdir with the compilation directory
name. */
#define cdir_len 5
}
}
+ gdb::unique_xmalloc_ptr<char> rewritten_filename;
if (IS_ABSOLUTE_PATH (filename))
{
/* If filename is absolute path, try the source path
substitution on it. */
- char *rewritten_filename = rewrite_source_path (filename);
+ rewritten_filename = rewrite_source_path (filename);
if (rewritten_filename != NULL)
- {
- make_cleanup (xfree, rewritten_filename);
- filename = rewritten_filename;
- }
+ filename = rewritten_filename.get ();
}
result = openp (path, OPF_SEARCH_IN_PATH | OPF_RETURN_REALPATH, filename,
OPEN_MODE, fullname);
}
- do_cleanups (cleanup);
return result;
}
close (fd);
else
{
- char *fullname;
- struct cleanup *back_to;
+ gdb::unique_xmalloc_ptr<char> fullname;
/* rewrite_source_path would be applied by find_and_open_source, we
should report the pathname where GDB tried to find the file. */
if (SYMTAB_DIRNAME (s) == NULL || IS_ABSOLUTE_PATH (s->filename))
- fullname = xstrdup (s->filename);
+ fullname.reset (xstrdup (s->filename));
else
- fullname = concat (SYMTAB_DIRNAME (s), SLASH_STRING,
- s->filename, (char *) NULL);
+ fullname.reset (concat (SYMTAB_DIRNAME (s), SLASH_STRING,
+ s->filename, (char *) NULL));
- back_to = make_cleanup (xfree, fullname);
- s->fullname = rewrite_source_path (fullname);
+ s->fullname = rewrite_source_path (fullname.get ()).release ();
if (s->fullname == NULL)
- s->fullname = xstrdup (fullname);
- do_cleanups (back_to);
+ s->fullname = fullname.release ();
}
}
/* Print info on range of pc's in a specified line. */
static void
-line_info (char *arg, int from_tty)
+info_line_command (char *arg, int from_tty)
{
- struct symtabs_and_lines sals;
- struct symtab_and_line sal;
CORE_ADDR start_pc, end_pc;
- int i;
- struct cleanup *cleanups;
- init_sal (&sal); /* initialize to zeroes */
+ std::vector<symtab_and_line> decoded_sals;
+ symtab_and_line curr_sal;
+ gdb::array_view<symtab_and_line> sals;
if (arg == 0)
{
- sal.symtab = current_source_symtab;
- sal.pspace = current_program_space;
+ curr_sal.symtab = current_source_symtab;
+ curr_sal.pspace = current_program_space;
if (last_line_listed != 0)
- sal.line = last_line_listed;
+ curr_sal.line = last_line_listed;
else
- sal.line = current_source_line;
+ curr_sal.line = current_source_line;
- sals.nelts = 1;
- sals.sals = XNEW (struct symtab_and_line);
- sals.sals[0] = sal;
+ sals = curr_sal;
}
else
{
- sals = decode_line_with_last_displayed (arg, DECODE_LINE_LIST_MODE);
+ decoded_sals = decode_line_with_last_displayed (arg,
+ DECODE_LINE_LIST_MODE);
+ sals = decoded_sals;
dont_repeat ();
}
- cleanups = make_cleanup (xfree, sals.sals);
-
/* C++ More than one line may have been specified, as when the user
specifies an overloaded function name. Print info on them all. */
- for (i = 0; i < sals.nelts; i++)
+ for (const auto &sal : sals)
{
- sal = sals.sals[i];
if (sal.pspace != current_program_space)
continue;
/* If this is the only line, show the source code. If it could
not find the file, don't do anything special. */
- if (annotation_level && sals.nelts == 1)
+ if (annotation_level && sals.size () == 1)
identify_source_line (sal.symtab, sal.line, 0, start_pc);
}
else
printf_filtered (_("Line number %d is out of range for \"%s\".\n"),
sal.line, symtab_to_filename_for_display (sal.symtab));
}
- do_cleanups (cleanups);
}
\f
/* Commands to search the source file for a regexp. */
/* Implement the "show substitute-path" command. */
static void
-show_substitute_path_command (char *args, int from_tty)
+show_substitute_path_command (const char *args, int from_tty)
{
struct substitute_path_rule *rule = substitute_path_rules;
char *from = NULL;
/* Implement the "unset substitute-path" command. */
static void
-unset_substitute_path_command (char *args, int from_tty)
+unset_substitute_path_command (const char *args, int from_tty)
{
struct substitute_path_rule *rule = substitute_path_rules;
gdb_argv argv (args);
/* Add a new source path substitution rule. */
static void
-set_substitute_path_command (char *args, int from_tty)
+set_substitute_path_command (const char *args, int from_tty)
{
struct substitute_path_rule *rule;
show_directories_command,
&setlist, &showlist);
- add_info ("source", source_info,
+ add_info ("source", info_source_command,
_("Information about the current source file."));
- add_info ("line", line_info, _("\
+ add_info ("line", info_line_command, _("\
Core addresses of the code for a source line.\n\
Line can be specified as\n\
LINENUM, to list around that line in current file,\n\