Add the -file-list-exec-source-files command to MI.
This commit is contained in:
parent
239ae8c755
commit
57c22c6ce1
13 changed files with 228 additions and 49 deletions
|
@ -1,3 +1,25 @@
|
||||||
|
2004-06-03 Bob Rossi <bob@brasko.net>
|
||||||
|
|
||||||
|
* dbxread.c (read_dbx_symtab): Set pst->dirname when known.
|
||||||
|
* dwarf2read.c (partial_die_info) : Add dirname field.
|
||||||
|
(dwarf2_build_psymtabs_hard) : Set pst->dirname when known.
|
||||||
|
(read_partial_die) : Save away DW_AT_comp_dir.
|
||||||
|
* defs.h (symtab_to_filename) : Removed.
|
||||||
|
* source.c (find_and_open_source) : Added.
|
||||||
|
(open_source_file): Just calls find_and_open_source.
|
||||||
|
(symtab_to_filename) : Removed.
|
||||||
|
(symtab_to_fullname, psymtab_to_fullname ) : Added.
|
||||||
|
* source.h (psymtab_to_fullname,symtab_to_fullname): Added.
|
||||||
|
* symtab.c (lookup_symtab): Call symtab_to_fullname instead of
|
||||||
|
symtab_to_filename.
|
||||||
|
* symtab.h (partial_symtab): Add dirname field.
|
||||||
|
* mi/mi-cmd-file.c (FILENAME,FULLNAME): Added.
|
||||||
|
(mi_cmd_file_list_exec_source_file): Call new function symtab_to_fullname
|
||||||
|
to find fullname.
|
||||||
|
(mi_cmd_file_list_exec_source_files): Added.
|
||||||
|
* mi/mi-cmds.c (mi_cmd_mi_cmds) : Add -file-list-exec-source-files.
|
||||||
|
* mi/mi-cmds.h (mi_cmd_file_list_exec_source_files): Added.
|
||||||
|
|
||||||
2004-06-10 Andrew Cagney <cagney@gnu.org>
|
2004-06-10 Andrew Cagney <cagney@gnu.org>
|
||||||
|
|
||||||
* avr-tdep.c (avr_gdbarch_init): Do not set use_struct_convention
|
* avr-tdep.c (avr_gdbarch_init): Do not set use_struct_convention
|
||||||
|
|
|
@ -1457,6 +1457,7 @@ read_dbx_symtab (struct objfile *objfile)
|
||||||
static int prev_so_symnum = -10;
|
static int prev_so_symnum = -10;
|
||||||
static int first_so_symnum;
|
static int first_so_symnum;
|
||||||
char *p;
|
char *p;
|
||||||
|
static char *dirname_nso;
|
||||||
int prev_textlow_not_set;
|
int prev_textlow_not_set;
|
||||||
|
|
||||||
valu = nlist.n_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
|
valu = nlist.n_value + ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
|
||||||
|
@ -1514,18 +1515,27 @@ read_dbx_symtab (struct objfile *objfile)
|
||||||
|
|
||||||
p = strrchr (namestring, '/');
|
p = strrchr (namestring, '/');
|
||||||
if (p && *(p + 1) == '\000')
|
if (p && *(p + 1) == '\000')
|
||||||
continue; /* Simply ignore directory name SOs */
|
{
|
||||||
|
/* Save the directory name SOs locally, then save it into
|
||||||
|
the psymtab when it's created below. */
|
||||||
|
dirname_nso = namestring;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
/* Some other compilers (C++ ones in particular) emit useless
|
/* Some other compilers (C++ ones in particular) emit useless
|
||||||
SOs for non-existant .c files. We ignore all subsequent SOs that
|
SOs for non-existant .c files. We ignore all subsequent SOs that
|
||||||
immediately follow the first. */
|
immediately follow the first. */
|
||||||
|
|
||||||
if (!pst)
|
if (!pst)
|
||||||
|
{
|
||||||
pst = start_psymtab (objfile,
|
pst = start_psymtab (objfile,
|
||||||
namestring, valu,
|
namestring, valu,
|
||||||
first_so_symnum * symbol_size,
|
first_so_symnum * symbol_size,
|
||||||
objfile->global_psymbols.next,
|
objfile->global_psymbols.next,
|
||||||
objfile->static_psymbols.next);
|
objfile->static_psymbols.next);
|
||||||
|
pst->dirname = dirname_nso;
|
||||||
|
dirname_nso = NULL;
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -626,8 +626,6 @@ extern void init_source_path (void);
|
||||||
|
|
||||||
extern void init_last_source_visited (void);
|
extern void init_last_source_visited (void);
|
||||||
|
|
||||||
extern char *symtab_to_filename (struct symtab *);
|
|
||||||
|
|
||||||
/* From exec.c */
|
/* From exec.c */
|
||||||
|
|
||||||
extern void exec_set_section_offsets (bfd_signed_vma text_off,
|
extern void exec_set_section_offsets (bfd_signed_vma text_off,
|
||||||
|
|
|
@ -16848,14 +16848,24 @@ There's no @value{GDBN} command which directly corresponds to this one.
|
||||||
|
|
||||||
List the source files for the current executable.
|
List the source files for the current executable.
|
||||||
|
|
||||||
|
It will always output the filename, but only when GDB can find the absolute
|
||||||
|
file name of a source file, will it output the fullname.
|
||||||
|
|
||||||
@subsubheading @value{GDBN} Command
|
@subsubheading @value{GDBN} Command
|
||||||
|
|
||||||
There's no @value{GDBN} command which directly corresponds to this one.
|
There's no @value{GDBN} command which directly corresponds to this one.
|
||||||
@code{gdbtk} has an analogous command @samp{gdb_listfiles}.
|
@code{gdbtk} has an analogous command @samp{gdb_listfiles}.
|
||||||
|
|
||||||
@subsubheading Example
|
@subsubheading Example
|
||||||
N.A.
|
@smallexample
|
||||||
|
(@value{GDBP})
|
||||||
|
-file-list-exec-source-files
|
||||||
|
^done,files=[
|
||||||
|
@{file=foo.c,fullname=/home/foo.c@},
|
||||||
|
@{file=/home/bar.c,fullname=/home/bar.c@},
|
||||||
|
@{file=gdb_could_not_find_fullpath.c@}]
|
||||||
|
(@value{GDBP})
|
||||||
|
@end smallexample
|
||||||
|
|
||||||
@subheading The @code{-file-list-shared-libraries} Command
|
@subheading The @code{-file-list-shared-libraries} Command
|
||||||
@findex -file-list-shared-libraries
|
@findex -file-list-shared-libraries
|
||||||
|
|
|
@ -380,6 +380,7 @@ struct partial_die_info
|
||||||
sometimes DW_TAG_MIPS_linkage_name or a string computed in some
|
sometimes DW_TAG_MIPS_linkage_name or a string computed in some
|
||||||
other fashion. */
|
other fashion. */
|
||||||
char *name;
|
char *name;
|
||||||
|
char *dirname;
|
||||||
|
|
||||||
/* The scope to prepend to our children. This is generally
|
/* The scope to prepend to our children. This is generally
|
||||||
allocated on the comp_unit_obstack, so will disappear
|
allocated on the comp_unit_obstack, so will disappear
|
||||||
|
@ -1349,6 +1350,9 @@ dwarf2_build_psymtabs_hard (struct objfile *objfile, int mainline)
|
||||||
objfile->global_psymbols.next,
|
objfile->global_psymbols.next,
|
||||||
objfile->static_psymbols.next);
|
objfile->static_psymbols.next);
|
||||||
|
|
||||||
|
if (comp_unit_die.dirname)
|
||||||
|
pst->dirname = xstrdup (comp_unit_die.dirname);
|
||||||
|
|
||||||
pst->read_symtab_private = (char *)
|
pst->read_symtab_private = (char *)
|
||||||
obstack_alloc (&objfile->objfile_obstack, sizeof (struct dwarf2_pinfo));
|
obstack_alloc (&objfile->objfile_obstack, sizeof (struct dwarf2_pinfo));
|
||||||
DWARF_INFO_OFFSET (pst) = beg_of_comp_unit - dwarf2_per_objfile->info_buffer;
|
DWARF_INFO_OFFSET (pst) = beg_of_comp_unit - dwarf2_per_objfile->info_buffer;
|
||||||
|
@ -4875,6 +4879,10 @@ read_partial_die (struct partial_die_info *part_die,
|
||||||
if (part_die->name == NULL)
|
if (part_die->name == NULL)
|
||||||
part_die->name = DW_STRING (&attr);
|
part_die->name = DW_STRING (&attr);
|
||||||
break;
|
break;
|
||||||
|
case DW_AT_comp_dir:
|
||||||
|
if (part_die->dirname == NULL)
|
||||||
|
part_die->dirname = DW_STRING (&attr);
|
||||||
|
break;
|
||||||
case DW_AT_MIPS_linkage_name:
|
case DW_AT_MIPS_linkage_name:
|
||||||
part_die->name = DW_STRING (&attr);
|
part_die->name = DW_STRING (&attr);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "ui-out.h"
|
#include "ui-out.h"
|
||||||
#include "symtab.h"
|
#include "symtab.h"
|
||||||
#include "source.h"
|
#include "source.h"
|
||||||
|
#include "objfiles.h"
|
||||||
|
|
||||||
/* Return to the client the absolute path and line number of the
|
/* Return to the client the absolute path and line number of the
|
||||||
current file being executed. */
|
current file being executed. */
|
||||||
|
@ -39,7 +40,6 @@ mi_cmd_file_list_exec_source_file(char *command, char **argv, int argc)
|
||||||
if ( !mi_valid_noargs("mi_cmd_file_list_exec_source_file", argc, argv) )
|
if ( !mi_valid_noargs("mi_cmd_file_list_exec_source_file", argc, argv) )
|
||||||
error ("mi_cmd_file_list_exec_source_file: Usage: No args");
|
error ("mi_cmd_file_list_exec_source_file: Usage: No args");
|
||||||
|
|
||||||
|
|
||||||
/* Set the default file and line, also get them */
|
/* Set the default file and line, also get them */
|
||||||
set_default_source_symtab_and_line();
|
set_default_source_symtab_and_line();
|
||||||
st = get_current_source_symtab_and_line();
|
st = get_current_source_symtab_and_line();
|
||||||
|
@ -51,17 +51,68 @@ mi_cmd_file_list_exec_source_file(char *command, char **argv, int argc)
|
||||||
error ("mi_cmd_file_list_exec_source_file: No symtab");
|
error ("mi_cmd_file_list_exec_source_file: No symtab");
|
||||||
|
|
||||||
/* Extract the fullname if it is not known yet */
|
/* Extract the fullname if it is not known yet */
|
||||||
if (st.symtab->fullname == NULL)
|
symtab_to_fullname (st.symtab);
|
||||||
symtab_to_filename (st.symtab);
|
|
||||||
|
|
||||||
/* We may not be able to open the file (not available). */
|
|
||||||
if (st.symtab->fullname == NULL)
|
|
||||||
error ("mi_cmd_file_list_exec_source_file: File not found");
|
|
||||||
|
|
||||||
/* Print to the user the line, filename and fullname */
|
/* Print to the user the line, filename and fullname */
|
||||||
ui_out_field_int (uiout, "line", st.line);
|
ui_out_field_int (uiout, "line", st.line);
|
||||||
ui_out_field_string (uiout, "file", st.symtab->filename);
|
ui_out_field_string (uiout, "file", st.symtab->filename);
|
||||||
|
|
||||||
|
/* We may not be able to open the file (not available). */
|
||||||
|
if (st.symtab->fullname)
|
||||||
ui_out_field_string (uiout, "fullname", st.symtab->fullname);
|
ui_out_field_string (uiout, "fullname", st.symtab->fullname);
|
||||||
|
|
||||||
return MI_CMD_DONE;
|
return MI_CMD_DONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum mi_cmd_result
|
||||||
|
mi_cmd_file_list_exec_source_files (char *command, char **argv, int argc)
|
||||||
|
{
|
||||||
|
struct symtab *s;
|
||||||
|
struct partial_symtab *ps;
|
||||||
|
struct objfile *objfile;
|
||||||
|
|
||||||
|
if (!mi_valid_noargs ("mi_cmd_file_list_exec_source_files", argc, argv))
|
||||||
|
error ("mi_cmd_file_list_exec_source_files: Usage: No args");
|
||||||
|
|
||||||
|
/* Print the table header */
|
||||||
|
ui_out_begin (uiout, ui_out_type_list, "files");
|
||||||
|
|
||||||
|
/* Look at all of the symtabs */
|
||||||
|
ALL_SYMTABS (objfile, s)
|
||||||
|
{
|
||||||
|
ui_out_begin (uiout, ui_out_type_tuple, NULL);
|
||||||
|
|
||||||
|
ui_out_field_string (uiout, "file", s->filename);
|
||||||
|
|
||||||
|
/* Extract the fullname if it is not known yet */
|
||||||
|
symtab_to_fullname (s);
|
||||||
|
|
||||||
|
if (s->fullname)
|
||||||
|
ui_out_field_string (uiout, "fullname", s->fullname);
|
||||||
|
|
||||||
|
ui_out_end (uiout, ui_out_type_tuple);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Look at all of the psymtabs */
|
||||||
|
ALL_PSYMTABS (objfile, ps)
|
||||||
|
{
|
||||||
|
if (!ps->readin)
|
||||||
|
{
|
||||||
|
ui_out_begin (uiout, ui_out_type_tuple, NULL);
|
||||||
|
|
||||||
|
ui_out_field_string (uiout, "file", ps->filename);
|
||||||
|
|
||||||
|
/* Extract the fullname if it is not known yet */
|
||||||
|
psymtab_to_fullname (ps);
|
||||||
|
|
||||||
|
if (ps->fullname)
|
||||||
|
ui_out_field_string (uiout, "fullname", ps->fullname);
|
||||||
|
|
||||||
|
ui_out_end (uiout, ui_out_type_tuple);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ui_out_end (uiout, ui_out_type_list);
|
||||||
|
|
||||||
|
return MI_CMD_DONE;
|
||||||
|
}
|
||||||
|
|
|
@ -81,7 +81,7 @@ struct mi_cmd mi_cmds[] =
|
||||||
{ "file-exec-file", { "exec-file", 1 }, NULL, NULL },
|
{ "file-exec-file", { "exec-file", 1 }, NULL, NULL },
|
||||||
{ "file-list-exec-sections", { NULL, 0 }, NULL, NULL },
|
{ "file-list-exec-sections", { NULL, 0 }, NULL, NULL },
|
||||||
{ "file-list-exec-source-file", { NULL, 0 }, 0, mi_cmd_file_list_exec_source_file},
|
{ "file-list-exec-source-file", { NULL, 0 }, 0, mi_cmd_file_list_exec_source_file},
|
||||||
{ "file-list-exec-source-files", { NULL, 0 }, NULL, NULL },
|
{ "file-list-exec-source-files", { NULL, 0 }, NULL, mi_cmd_file_list_exec_source_files },
|
||||||
{ "file-list-shared-libraries", { NULL, 0 }, NULL, NULL },
|
{ "file-list-shared-libraries", { NULL, 0 }, NULL, NULL },
|
||||||
{ "file-list-symbol-files", { NULL, 0 }, NULL, NULL },
|
{ "file-list-symbol-files", { NULL, 0 }, NULL, NULL },
|
||||||
{ "file-symbol-file", { "symbol-file", 1 }, NULL, NULL },
|
{ "file-symbol-file", { "symbol-file", 1 }, NULL, NULL },
|
||||||
|
|
|
@ -87,6 +87,7 @@ extern mi_cmd_args_ftype mi_cmd_exec_step_instruction;
|
||||||
extern mi_cmd_args_ftype mi_cmd_exec_until;
|
extern mi_cmd_args_ftype mi_cmd_exec_until;
|
||||||
extern mi_cmd_args_ftype mi_cmd_exec_interrupt;
|
extern mi_cmd_args_ftype mi_cmd_exec_interrupt;
|
||||||
extern mi_cmd_argv_ftype mi_cmd_file_list_exec_source_file;
|
extern mi_cmd_argv_ftype mi_cmd_file_list_exec_source_file;
|
||||||
|
extern mi_cmd_argv_ftype mi_cmd_file_list_exec_source_files;
|
||||||
extern mi_cmd_argv_ftype mi_cmd_gdb_exit;
|
extern mi_cmd_argv_ftype mi_cmd_gdb_exit;
|
||||||
extern mi_cmd_argv_ftype mi_cmd_interpreter_exec;
|
extern mi_cmd_argv_ftype mi_cmd_interpreter_exec;
|
||||||
extern mi_cmd_argv_ftype mi_cmd_stack_info_depth;
|
extern mi_cmd_argv_ftype mi_cmd_stack_info_depth;
|
||||||
|
|
126
gdb/source.c
126
gdb/source.c
|
@ -805,30 +805,46 @@ source_full_path_of (char *filename, char **full_pathname)
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function is capable of finding the absolute path to a
|
||||||
|
source file, and opening it, provided you give it an
|
||||||
|
OBJFILE and FILENAME. Both the DIRNAME and FULLNAME are only
|
||||||
|
added suggestions on where to find the file.
|
||||||
|
|
||||||
/* Open a source file given a symtab S. Returns a file descriptor or
|
OBJFILE should be the objfile associated with a psymtab or symtab.
|
||||||
negative number for error. */
|
FILENAME should be the filename to open.
|
||||||
|
DIRNAME is the compilation directory of a particular source file.
|
||||||
|
Only some debug formats provide this info.
|
||||||
|
FULLNAME can be the last known absolute path to the file in question.
|
||||||
|
|
||||||
|
On Success
|
||||||
|
A valid file descriptor is returned. ( the return value is positive )
|
||||||
|
FULLNAME is set to the absolute path to the file just opened.
|
||||||
|
|
||||||
|
On Failure
|
||||||
|
A non valid file descriptor is returned. ( the return value is negitive )
|
||||||
|
FULLNAME is set to NULL. */
|
||||||
int
|
int
|
||||||
open_source_file (struct symtab *s)
|
find_and_open_source (struct objfile *objfile,
|
||||||
|
const char *filename,
|
||||||
|
const char *dirname,
|
||||||
|
char **fullname)
|
||||||
{
|
{
|
||||||
char *path = source_path;
|
char *path = source_path;
|
||||||
const char *p;
|
const char *p;
|
||||||
int result;
|
int result;
|
||||||
char *fullname;
|
|
||||||
|
|
||||||
/* Quick way out if we already know its full name */
|
/* Quick way out if we already know its full name */
|
||||||
if (s->fullname)
|
if (*fullname)
|
||||||
{
|
{
|
||||||
result = open (s->fullname, OPEN_MODE);
|
result = open (*fullname, OPEN_MODE);
|
||||||
if (result >= 0)
|
if (result >= 0)
|
||||||
return result;
|
return result;
|
||||||
/* Didn't work -- free old one, try again. */
|
/* Didn't work -- free old one, try again. */
|
||||||
xmfree (s->objfile->md, s->fullname);
|
xmfree (objfile->md, *fullname);
|
||||||
s->fullname = NULL;
|
*fullname = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s->dirname != NULL)
|
if (dirname != NULL)
|
||||||
{
|
{
|
||||||
/* Replace a path entry of $cdir with the compilation directory name */
|
/* Replace a path entry of $cdir with the compilation directory name */
|
||||||
#define cdir_len 5
|
#define cdir_len 5
|
||||||
|
@ -841,60 +857,106 @@ open_source_file (struct symtab *s)
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
path = (char *)
|
path = (char *)
|
||||||
alloca (strlen (source_path) + 1 + strlen (s->dirname) + 1);
|
alloca (strlen (source_path) + 1 + strlen (dirname) + 1);
|
||||||
len = p - source_path;
|
len = p - source_path;
|
||||||
strncpy (path, source_path, len); /* Before $cdir */
|
strncpy (path, source_path, len); /* Before $cdir */
|
||||||
strcpy (path + len, s->dirname); /* new stuff */
|
strcpy (path + len, dirname); /* new stuff */
|
||||||
strcat (path + len, source_path + len + cdir_len); /* After $cdir */
|
strcat (path + len, source_path + len + cdir_len); /* After $cdir */
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result = openp (path, 0, s->filename, OPEN_MODE, 0, &s->fullname);
|
result = openp (path, 0, filename, OPEN_MODE, 0, fullname);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
{
|
{
|
||||||
/* Didn't work. Try using just the basename. */
|
/* Didn't work. Try using just the basename. */
|
||||||
p = lbasename (s->filename);
|
p = lbasename (filename);
|
||||||
if (p != s->filename)
|
if (p != filename)
|
||||||
result = openp (path, 0, p, OPEN_MODE, 0, &s->fullname);
|
result = openp (path, 0, p, OPEN_MODE, 0, fullname);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (result >= 0)
|
if (result >= 0)
|
||||||
{
|
{
|
||||||
fullname = s->fullname;
|
char *tmp_fullname;
|
||||||
s->fullname = mstrsave (s->objfile->md, s->fullname);
|
tmp_fullname = *fullname;
|
||||||
xfree (fullname);
|
*fullname = mstrsave (objfile->md, *fullname);
|
||||||
|
xfree (tmp_fullname);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the path to the source file associated with symtab. Returns NULL
|
/* Open a source file given a symtab S. Returns a file descriptor or
|
||||||
if no symtab. */
|
negative number for error.
|
||||||
|
|
||||||
|
This function is a convience function to find_and_open_source. */
|
||||||
|
|
||||||
char *
|
int
|
||||||
symtab_to_filename (struct symtab *s)
|
open_source_file (struct symtab *s)
|
||||||
{
|
{
|
||||||
int fd;
|
if (!s)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
return find_and_open_source (s->objfile, s->filename, s->dirname,
|
||||||
|
&s->fullname);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finds the fullname that a symtab represents.
|
||||||
|
|
||||||
|
If this functions finds the fullname, it will save it in ps->fullname
|
||||||
|
and it will also return the value.
|
||||||
|
|
||||||
|
If this function fails to find the file that this symtab represents,
|
||||||
|
NULL will be returned and ps->fullname will be set to NULL. */
|
||||||
|
char *
|
||||||
|
symtab_to_fullname (struct symtab *s)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
if (!s)
|
if (!s)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/* If we've seen the file before, just return fullname. */
|
/* Don't check s->fullname here, the file could have been
|
||||||
|
deleted/moved/..., look for it again */
|
||||||
|
r =
|
||||||
|
find_and_open_source (s->objfile, s->filename, s->dirname, &s->fullname);
|
||||||
|
|
||||||
if (s->fullname)
|
if (r)
|
||||||
|
{
|
||||||
|
close (r);
|
||||||
return s->fullname;
|
return s->fullname;
|
||||||
|
}
|
||||||
|
|
||||||
/* Try opening the file to setup fullname */
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
fd = open_source_file (s);
|
/* Finds the fullname that a partial_symtab represents.
|
||||||
if (fd < 0)
|
|
||||||
return s->filename; /* File not found. Just use short name */
|
|
||||||
|
|
||||||
/* Found the file. Cleanup and return the full name */
|
If this functions finds the fullname, it will save it in ps->fullname
|
||||||
|
and it will also return the value.
|
||||||
|
|
||||||
close (fd);
|
If this function fails to find the file that this partial_symtab represents,
|
||||||
return s->fullname;
|
NULL will be returned and ps->fullname will be set to NULL. */
|
||||||
|
char *
|
||||||
|
psymtab_to_fullname (struct partial_symtab *ps)
|
||||||
|
{
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (!ps)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
/* Don't check ps->fullname here, the file could have been
|
||||||
|
deleted/moved/..., look for it again */
|
||||||
|
r =
|
||||||
|
find_and_open_source (ps->objfile, ps->filename, ps->dirname,
|
||||||
|
&ps->fullname);
|
||||||
|
|
||||||
|
if (r)
|
||||||
|
{
|
||||||
|
close (r);
|
||||||
|
return ps->fullname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create and initialize the table S->line_charpos that records
|
/* Create and initialize the table S->line_charpos that records
|
||||||
the positions of the lines in the source file, which is assumed
|
the positions of the lines in the source file, which is assumed
|
||||||
|
|
|
@ -27,6 +27,9 @@ struct symtab;
|
||||||
negative number for error. */
|
negative number for error. */
|
||||||
extern int open_source_file (struct symtab *s);
|
extern int open_source_file (struct symtab *s);
|
||||||
|
|
||||||
|
extern char* psymtab_to_fullname (struct partial_symtab *ps);
|
||||||
|
extern char* symtab_to_fullname (struct symtab *s);
|
||||||
|
|
||||||
/* Create and initialize the table S->line_charpos that records the
|
/* Create and initialize the table S->line_charpos that records the
|
||||||
positions of the lines in the source file, which is assumed to be
|
positions of the lines in the source file, which is assumed to be
|
||||||
open on descriptor DESC. All set S->nlines to the number of such
|
open on descriptor DESC. All set S->nlines to the number of such
|
||||||
|
|
|
@ -181,7 +181,7 @@ got_symtab:
|
||||||
|
|
||||||
if (full_path != NULL)
|
if (full_path != NULL)
|
||||||
{
|
{
|
||||||
const char *fp = symtab_to_filename (s);
|
const char *fp = symtab_to_fullname (s);
|
||||||
if (FILENAME_CMP (full_path, fp) == 0)
|
if (FILENAME_CMP (full_path, fp) == 0)
|
||||||
{
|
{
|
||||||
return s;
|
return s;
|
||||||
|
@ -190,7 +190,7 @@ got_symtab:
|
||||||
|
|
||||||
if (real_path != NULL)
|
if (real_path != NULL)
|
||||||
{
|
{
|
||||||
char *rp = gdb_realpath (symtab_to_filename (s));
|
char *rp = gdb_realpath (symtab_to_fullname (s));
|
||||||
make_cleanup (xfree, rp);
|
make_cleanup (xfree, rp);
|
||||||
if (FILENAME_CMP (real_path, rp) == 0)
|
if (FILENAME_CMP (real_path, rp) == 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -891,6 +891,10 @@ struct partial_symtab
|
||||||
|
|
||||||
char *fullname;
|
char *fullname;
|
||||||
|
|
||||||
|
/* Directory in which it was compiled, or NULL if we don't know. */
|
||||||
|
|
||||||
|
char *dirname;
|
||||||
|
|
||||||
/* Information about the object file from which symbols should be read. */
|
/* Information about the object file from which symbols should be read. */
|
||||||
|
|
||||||
struct objfile *objfile;
|
struct objfile *objfile;
|
||||||
|
|
|
@ -47,7 +47,7 @@ mi_delete_breakpoints
|
||||||
mi_gdb_reinitialize_dir $srcdir/$subdir
|
mi_gdb_reinitialize_dir $srcdir/$subdir
|
||||||
mi_gdb_load ${binfile}
|
mi_gdb_load ${binfile}
|
||||||
|
|
||||||
proc test_tbreak_creation_and_listing {} {
|
proc test_file_list_exec_source_file {} {
|
||||||
global srcfile
|
global srcfile
|
||||||
global srcdir
|
global srcdir
|
||||||
global subdir
|
global subdir
|
||||||
|
@ -59,7 +59,17 @@ proc test_tbreak_creation_and_listing {} {
|
||||||
"request path info of current source file (${srcfile})"
|
"request path info of current source file (${srcfile})"
|
||||||
}
|
}
|
||||||
|
|
||||||
test_tbreak_creation_and_listing
|
proc test_file_list_exec_source_files {} {
|
||||||
|
global srcfile
|
||||||
|
|
||||||
|
# get the path and absolute path to the current executable
|
||||||
|
mi_gdb_test "222-file-list-exec-source-files" \
|
||||||
|
"222\\\^done,files=\\\[\{file=\".*/${srcfile}\",fullname=\"/.*/${srcfile}\"\},\{file=\".*\"\},\{file=\".*\"\},\{file=\".*\"\},\{file=\".*\"\}\\\]" \
|
||||||
|
"Getting a list of source files."
|
||||||
|
}
|
||||||
|
|
||||||
|
test_file_list_exec_source_file
|
||||||
|
test_file_list_exec_source_files
|
||||||
|
|
||||||
mi_gdb_exit
|
mi_gdb_exit
|
||||||
return 0
|
return 0
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue