This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] mi-symbol-*


Jelmer Vernooij writes:
 > Hi!
 > 
 > Here's the latest version of my mi-symbol-* patch. I received the copyright
 > assignment I signed back today from the FSF, signed by Bradly Kuhn.
 > Anything else I should do before the patch gets in and who will put it
 > in?
 > 

I think we are getting closer, but there is still some work to be done.
Every new command in the mi should have test cases.
See below for specific comments.

 > Thanks,
 > 
 > Jelmer
 > 
 > -- 
 > Jelmer Vernooij <jelmer@nl.linux.org> - http://nl.linux.org/~jelmer/
 >  18:04:45 up 3 days, 10:58,  9 users,  load average: 0.13, 0.54, 0.50
 > diff -r -u gdb+dejagnu-20020907/gdb/Makefile.in gdb-jelmer/gdb/Makefile.in
 > --- gdb+dejagnu-20020907/gdb/Makefile.in	2002-09-02 20:09:06.000000000 +0200
 > +++ gdb-jelmer/gdb/Makefile.in	2002-09-11 20:22:30.000000000 +0200
 > @@ -165,12 +165,12 @@
 >  	mi-out.o mi-console.o \
 >  	mi-cmds.o mi-cmd-var.o mi-cmd-break.o mi-cmd-stack.o \
 >  	mi-cmd-disas.o \
 > -	mi-main.o mi-parse.o mi-getopt.o
 > +	mi-main.o mi-parse.o mi-getopt.o mi-cmd-symbol.o
 >  SUBDIR_MI_SRCS = \
 >  	mi/mi-out.c mi/mi-console.c \
 >  	mi/mi-cmds.c \
 >  	mi/mi-cmd-var.c mi/mi-cmd-break.c mi/mi-cmd-stack.c \
 > -	mi/mi-cmd-disas.c \
 > +	mi/mi-cmd-disas.c mi/mi-cmd-symbol.c \
 >  	mi/mi-main.c mi/mi-parse.c mi/mi-getopt.c
 >  SUBDIR_MI_DEPS =
 >  SUBDIR_MI_INITS = \
 > @@ -2411,6 +2411,10 @@
 >  # Need to explicitly specify the compile rule as make will do nothing
 >  # or try to compile the object file into the mi directory.
 >  
 > +mi-cmd-symbol.o: $(srcdir)/mi/mi-cmd-symbol.c $(defs_h) $(mi_cmds_h) \
 > +	$(ui_out_h) $(mi_out_h) $(breakpoint_h) $(gdb_string_h) \
 > +	$(mi_getopt_h) $(gdb_events_h) $(gdb_h)
 > +	$(CC) -c $(INTERNAL_CFLAGS) $(srcdir)/mi/mi-cmd-symbol.c
 >  mi-cmd-break.o: $(srcdir)/mi/mi-cmd-break.c $(defs_h) $(mi_cmds_h) \
 >  	$(ui_out_h) $(mi_out_h) $(breakpoint_h) $(gdb_string_h) \
 >  	$(mi_getopt_h) $(gdb_events_h) $(gdb_h)
 > diff -r -u gdb+dejagnu-20020907/gdb/mi/gdbmi.texinfo gdb-jelmer/gdb/mi/gdbmi.texinfo
 > --- gdb+dejagnu-20020907/gdb/mi/gdbmi.texinfo	2002-06-17 19:30:57.000000000 +0200
 > +++ gdb-jelmer/gdb/mi/gdbmi.texinfo	2002-09-25 20:07:32.000000000 +0200
 > @@ -97,8 +97,8 @@
 >  
 >  @heading Acknowledgments
 >  
 > -In alphabetic order: Andrew Cagney, Fernando Nasser, Stan Shebs and
 > -Elena Zannoni.
 > +In alphabetic order: Andrew Cagney, Fernando Nasser, Stan Shebs, 
 > +Jelmer Vernooij and Elena Zannoni.
 >  
 >  @menu
 >  * GDB/MI Command Syntax::
 > @@ -355,7 +355,7 @@
 >  the output received from @sc{gdb/mi}.
 >  
 >  @subsubheading Target Stop
 > -@c Ummm... There is no "-stop" command. This assumes async, no?
 > +@c Ummm... There is no "-stop" command.  This assumes async, no?
 >  Here's an example of stopping the inferior process:
 >  
 >  @example
 > @@ -2366,10 +2366,12 @@
 >  used without arguments, clears @value{GDBN}'s symbol table info.  No output is
 >  produced, except for a completion notification.
 >  
 > +
 >  @subsubheading @value{GDBN} Command
 >  
 >  The corresponding @value{GDBN} command is @samp{symbol-file}.
 >  
 > +
 >  @subsubheading Example
 >  
 >  @smallexample
 > @@ -2858,13 +2860,19 @@
 >  
 >  Describe where @var{symbol} is stored.
 >  
 > +
 >  @subsubheading @value{GDBN} Command
 >  
 >  The corresponding @value{GDBN} command is @samp{info address}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-info-address main
 > +^done,symbol=@{file="bla.c",line="16",name="main",address="0x0804842c"@}
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-info-file} Command
 >  @findex -symbol-info-file
 > @@ -2872,19 +2880,25 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-info-file
 > + -symbol-info-file @var{file}
 >  @end example
 >  
 > -Show the file for the symbol.
 > +Show the full path to the source file @var{file}.
 > +
 >  
 >  @subsubheading @value{GDBN} Command
 >  
 >  There's no equivalent @value{GDBN} command.  @code{gdbtk} has
 >  @samp{gdb_find_file}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-info-file bla.c
 > +^done,file="/home/jelmer/bla.c"
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-info-function} Command
 >  @findex -symbol-info-function
 > @@ -2892,18 +2906,24 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-info-function
 > + -symbol-info-function @var{symbol}
 >  @end example
 >  
 > -Show which function the symbol lives in.
 > +Show which function the @var{symbol} lives in.
 > +
 >  
 >  @subsubheading @value{GDBN} Command
 >  
 >  @samp{gdb_get_function} in @code{gdbtk}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-info-function *0x0804842d
 > +^done,function="main"
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-info-line} Command
 >  @findex -symbol-info-line
 > @@ -2911,19 +2931,25 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-info-line
 > + -symbol-info-line @var{symbol}
 >  @end example
 >  
 > -Show the core addresses of the code for a source line.
 > +Show the line and file that contains @var{symbol}
 > +
 >  
 >  @subsubheading @value{GDBN} Command
 >  
 >  The corresponding @value{GDBN} comamnd is @samp{info line}.
 >  @code{gdbtk} has the @samp{gdb_get_line} and @samp{gdb_get_file} commands.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-info-line main
 > +^done,line="17",file="bla.c"
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-info-symbol} Command
 >  @findex -symbol-info-symbol
 > @@ -2931,18 +2957,24 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-info-symbol @var{addr}
 > + -symbol-info-symbol @var{symbol}
 >  @end example
 >  
 > -Describe what symbol is at location @var{addr}.
 > +Give details about @var{symbol}.
 > +
 >  
 >  @subsubheading @value{GDBN} Command
 >  
 >  The corresponding @value{GDBN} command is @samp{info symbol}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-info-symbol function_a
 > +^done,symbol=@{file="bla.c",line="6",name="function_a",address="0x080483f0"@}
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-list-functions} Command
 >  @findex -symbol-list-functions
 > @@ -2950,19 +2982,27 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-list-functions
 > + -symbol-list-functions @var{pattern}
 >  @end example
 >  
 > -List the functions in the executable.
 > +List functions in the executable.  If @var{pattern} is specified, 
 > +list all functions that match @var{pattern}; otherwise, list 
 > +all functions.
 > +
 >  
 >  @subsubheading @value{GDBN} Command
 >  
 >  @samp{info functions} in @value{GDBN}, @samp{gdb_listfunc} and
 >  @samp{gdb_search} in @code{gdbtk}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-list-functions funct.*
 > +^done,symbols=[symbol=@{file="./gdb.mi/symbol.c",line="14",name="function_a",address="0x080483d0"@},symbol=@{file="./gdb.mi/symbol.c",line="19",name="function_b",address="0x080483dc"@}]
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-list-types} Command
 >  @findex -symbol-list-types
 > @@ -2970,10 +3010,13 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-list-types
 > + -symbol-list-types @var{pattern}
 >  @end example
 >  
 > -List all the type names.
 > +List type names.  If @var{pattern} is specified, 
 > +list all types that match @var{pattern}; otherwise, list
 > +all types.
 > +
 >  
 >  @subsubheading @value{GDBN} Command
 >  
 > @@ -2981,7 +3024,12 @@
 >  @samp{gdb_search} in @code{gdbtk}.
 >  
 >  @subsubheading Example
 > -N.A.
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-list-types .*int$
 > +^done,symbols=[symbol=@{file="./gdb.mi/symbol.c",line="0",name="complex int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long long int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long long unsigned int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="long unsigned int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="short int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="short unsigned int"@},symbol=@{file="./gdb.mi/symbol.c",line="0",name="unsigned int"@}]
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  
 >  @subheading The @code{-symbol-list-variables} Command
 > @@ -2990,18 +3038,26 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-list-variables
 > + -symbol-list-variables @var{pattern}
 >  @end example
 >  
 > -List all the global and static variable names.
 > +List global and static variable names.  If @var{pattern} is specified, 
 > +list all variables that match @var{pattern}; otherwise, list
 > +all variables.
 > +
 >  
 >  @subsubheading @value{GDBN} Command
 >  
 >  @samp{info variables} in @value{GDBN}, @samp{gdb_search} in @code{gdbtk}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-list-variables glob
 > +^done,symbols=[symbol=@{file="./gdb.mi/symbol.c",line="23",name="global_a"@},symbol=@{file="./gdb.mi/symbol.c",line="23",name="global_b"@},symbol=@{file="./gdb.mi/symbol.c",line="24",name="global_c"@},symbol=@{file="./gdb.mi/symbol.c",line="25",name="global_d"@}]
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-locate} Command
 >  @findex -symbol-locate
 > @@ -3009,16 +3065,24 @@
 >  @subsubheading Synopsis
 >  
 >  @example
 > - -symbol-locate
 > + -symbol-locate @var{symbol}
 >  @end example
 >  
 > +Show details for @var{symbol}
 > +
 > +
 >  @subsubheading @value{GDBN} Command
 >  
 >  @samp{gdb_loc} in @code{gdbtk}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-symbol-locate function_b
 > +^done,symbol=@{file="./gdb.mi/symbol.c",line="19",name="function_b",address="0x080483dc"@}
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-symbol-type} Command
 >  @findex -symbol-type
 > @@ -3031,6 +3095,7 @@
 >  
 >  Show type of @var{variable}.
 >  
 > +
 >  @subsubheading @value{GDBN} Command
 >  
 >  The corresponding @value{GDBN} command is @samp{ptype}, @code{gdbtk} has
 > @@ -3056,13 +3121,19 @@
 >  
 >  Attach to a process @var{pid} or a file @var{file} outside of @value{GDBN}.
 >  
 > +
 >  @subsubheading @value{GDBN} command
 >  
 >  The corresponding @value{GDBN} command is @samp{attach}.
 >  
 > -@subsubheading Example
 > -N.A.
 >  
 > +@subsubheading Example
 > +@smallexample
 > +(@value{GDBP})
 > +-target-attach 20666
 > +^done,thread-id="0",frame=@{addr="0x400bc991",func="nanosleep",args=[],from="/lib/libc.so.6"@}
 > +(@value{GDBP})
 > +@end smallexample
 >  
 >  @subheading The @code{-target-compare-sections} Command
 >  @findex -target-compare-sections
 > diff -r -u gdb+dejagnu-20020907/gdb/mi/mi-cmds.c gdb-jelmer/gdb/mi/mi-cmds.c
 > --- gdb+dejagnu-20020907/gdb/mi/mi-cmds.c	2001-03-06 09:21:45.000000000 +0100
 > +++ gdb-jelmer/gdb/mi/mi-cmds.c	2002-09-13 21:48:08.000000000 +0200
 > @@ -109,17 +109,17 @@
 >    {"stack-list-frames", 0, 0, mi_cmd_stack_list_frames},
 >    {"stack-list-locals", 0, 0, mi_cmd_stack_list_locals},
 >    {"stack-select-frame", 0, 0, mi_cmd_stack_select_frame},
 > -  {"symbol-info-address", 0, 0},
 > -  {"symbol-info-file", 0, 0},
 > -  {"symbol-info-function", 0, 0},
 > -  {"symbol-info-line", 0, 0},
 > -  {"symbol-info-symbol", 0, 0},
 > -  {"symbol-list-functions", 0, 0},
 > -  {"symbol-list-types", 0, 0},
 > -  {"symbol-list-variables", 0, 0},
 > -  {"symbol-locate", 0, 0},
 > +  {"symbol-info-address", 0, 0, mi_cmd_symbol_locate},
 > +  {"symbol-info-file", 0, 0, mi_cmd_symbol_info_file},
 > +  {"symbol-info-function", 0, 0, mi_cmd_symbol_info_function},
 > +  {"symbol-info-line", 0, 0, mi_cmd_symbol_info_line},
 > +  {"symbol-info-symbol", 0, 0, mi_cmd_symbol_locate},

If there are several commands that map to the same function, then the
interface needs a redesign. However I think that the initial intent of
these commands was to have them print different things. It is a bit
hard to implement commands w/o having a clear idea of how the GUI will
end up using them.  The initial idea was that the symbol-info-address
would take a symbol name as argument, and print information about his
location, while symbol-info-symbol would take an address as argument
and print the name of the symbol located at that
address. symbol-locate would instead return the "source code" location
of a symbol. It is similar to a function that gdbtk uses to recenter
the source window around the current PC, for instance.


 > +  {"symbol-list-functions", 0, 0, mi_cmd_symbol_list_symbols},
 > +  {"symbol-list-types", 0, 0, mi_cmd_symbol_list_symbols},
 > +  {"symbol-list-variables", 0, 0, mi_cmd_symbol_list_symbols},

I would prefer if these 3 command map to 3 different wrapper
functions, instead of trying to decide the behavior based on the
command used, you could set up a variable, and pass that into the main
worker function.

 > +  {"symbol-locate", 0, 0, mi_cmd_symbol_locate},

See comment above.

 >    {"symbol-type", 0, 0},
 > -  {"target-attach", 0, 0},
 > +  {"target-attach", "attach %s", 0},

Sorry, no. It is not that simple, see the thread:
http://sources.redhat.com/ml/gdb-patches/2002-10/msg00288.html

 >    {"target-compare-sections", 0, 0},
 >    {"target-detach", "detach", 0},
 >    {"target-download", 0, mi_cmd_target_download},
 > diff -r -u gdb+dejagnu-20020907/gdb/mi/mi-cmds.h gdb-jelmer/gdb/mi/mi-cmds.h
 > --- gdb+dejagnu-20020907/gdb/mi/mi-cmds.h	2001-03-06 09:21:45.000000000 +0100
 > +++ gdb-jelmer/gdb/mi/mi-cmds.h	2002-09-13 21:33:47.000000000 +0200
 > @@ -75,6 +75,12 @@
 >  extern mi_cmd_args_ftype mi_cmd_exec_until;
 >  extern mi_cmd_args_ftype mi_cmd_exec_interrupt;
 >  extern mi_cmd_argv_ftype mi_cmd_gdb_exit;
 > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_file;
 > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_function;
 > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_line;
 > +extern mi_cmd_argv_ftype mi_cmd_symbol_info_symbol;
 > +extern mi_cmd_argv_ftype mi_cmd_symbol_list_symbols;
 > +extern mi_cmd_argv_ftype mi_cmd_symbol_locate;
 >  extern mi_cmd_argv_ftype mi_cmd_stack_info_depth;
 >  extern mi_cmd_argv_ftype mi_cmd_stack_list_args;
 >  extern mi_cmd_argv_ftype mi_cmd_stack_list_frames;
 > --- /dev/null	2002-08-29 13:57:56.000000000 +0200
 > +++ gdb-jelmer/gdb/mi/mi-cmd-symbol.c	2002-09-17 18:29:39.000000000 +0200
 > @@ -0,0 +1,222 @@
 > +/* MI Command Set - symbol query commands.
 > +   Copyright 2000, 2002 Free Software Foundation, Inc.
 > +   Contributed by Jelmer Vernooij
 > +
 > +   This file is part of GDB.
 > +
 > +   This program is free software; you can redistribute it and/or modify
 > +   it under the terms of the GNU General Public License as published by
 > +   the Free Software Foundation; either version 2 of the License, or
 > +   (at your option) any later version.
 > +
 > +   This program is distributed in the hope that it will be useful,
 > +   but WITHOUT ANY WARRANTY; without even the implied warranty of
 > +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 > +   GNU General Public License for more details.
 > +
 > +   You should have received a copy of the GNU General Public License
 > +   along with this program; if not, write to the Free Software
 > +   Foundation, Inc., 59 Temple Place - Suite 330,
 > +   Boston, MA 02111-1307, USA.  */
 > +
 > +#include "defs.h"
 > +#include "target.h"
 > +#include "frame.h"
 > +#include "value.h"
 > +#include "mi-cmds.h"
 > +#include "ui-out.h"
 > +#include "symtab.h"
 > +#include "linespec.h"
 > +
 > +static void
 > +print_symbol_info (struct symtab *symtab, struct symbol *sym,
 > +                   struct minimal_symbol *msym)
 > +{
 > +  /* Strip off some C++ special symbols, like RTTI and global
 > +   *          constructors/destructors. */
 > +  if ((sym != NULL && !STREQN (SYMBOL_NAME (sym), "__tf", 4)
 > +       && !STREQN (SYMBOL_NAME (sym), "_GLOBAL_", 8)) || msym != NULL)
 > +    {
 > +
 > +      ui_out_tuple_begin (uiout, "symbol");
 > +      if (sym)
 > +        {
 > +          if (symtab->filename)
 > +            ui_out_field_string (uiout, "file", symtab->filename);
 > +          ui_out_field_int (uiout, "line", SYMBOL_LINE (sym));
 > +          ui_out_field_string (uiout, "name", SYMBOL_SOURCE_NAME (sym));
 > +          if (SYMBOL_CLASS (sym) == LOC_BLOCK)
 > +            ui_out_field_core_addr (uiout, "address",
 > +                                    SYMBOL_BLOCK_VALUE (sym)->startaddr);
 > +        }
 > +      else if (msym)
 > +        {
 > +          ui_out_field_string (uiout, "name", SYMBOL_SOURCE_NAME (msym));
 > +          ui_out_field_core_addr (uiout, "address",
 > +                                  SYMBOL_VALUE_ADDRESS (msym));
 > +        }
 > +      ui_out_tuple_end (uiout);
 > +    }
 > +}
 > +
 > +enum mi_cmd_result
 > +mi_cmd_symbol_info_line (char *command, char **argv, int argc)
 > +{
 > +  struct symtabs_and_lines sals;
 > +  struct cleanup *old_chain;
 > +  char *args, **canonical;
 > +
 > +  if (argc != 1)
 > +    error ("mi_cmd_symbol_info_line: Usage: SYMBOL");
 > +
 > +  args = argv[0];
 > +
 > +  sals = decode_line_1 (&args, 1, NULL, 0, &canonical);
 > +
 > +  old_chain = make_cleanup (xfree, sals.sals);
 > +
 > +  if (sals.nelts == 1)
 > +    {
 > +      ui_out_field_int (uiout, "line", sals.sals[0].line);
 > +      ui_out_field_string (uiout, "file", sals.sals[0].symtab->filename);
 > +      return MI_CMD_DONE;
 > +    }
 > +
 > +  do_cleanups(old_chain);
 > +
 > +  error ("mi_cmd_symbol_info_line: No such symbol");
 > +
 > +  return MI_CMD_DONE;
 > +}
 > +


Info_line should return the core addr ranges for a given line number.
You instead have implemented a different behavior: given a line number
name, print the line number which we just gave as input, and the file name.
Also in the usage and error messages, the use of the word 'symbol' is a bit
inappropriate, because the argument of the command is not a symbol name.

 > +enum mi_cmd_result
 > +mi_cmd_symbol_locate (char *command, char **argv, int argc)
 > +{
 > +  struct symtabs_and_lines sals;
 > +  struct symbol *sym;
 > +  struct minimal_symbol *msym;
 > +  struct cleanup *old_chain;
 > +
 > +  if (argc != 1)
 > +    error ("mi_cmd_symbol_locate: Usage: SYMBOL");
 > +
 > +  sals = decode_line_spec (argv[0], 1);
 > +  old_chain = make_cleanup( xfree, sals.sals);
 > +  
 > +  if (sals.nelts != 1)
 > +    error ("mi_cmd_symbol_locate: No such symbol");
 > +
 > +  resolve_sal_pc (&sals.sals[0]);
 > +
 > +  sym = find_pc_function (sals.sals[0].pc);
 > +  msym = lookup_minimal_symbol_by_pc (sals.sals[0].pc);
 > +
 > +  print_symbol_info (sals.sals[0].symtab, sym, msym);
 > +  
 > +  do_cleanups(old_chain);
 > +
 > +  return MI_CMD_DONE;
 > +}
 > +
 > +enum mi_cmd_result
 > +mi_cmd_symbol_info_file (char *command, char **argv, int argc)
 > +{
 > +  struct symtab *st;
 > +  char *fullname;
 > +
 > +  if (argc != 1)
 > +    error ("mi_cmd_symbol_info_file: Usage: FILE");
 > +

No, the argument is a symbol, it returns the file name.

 > +  st = lookup_symtab (argv[0]);
 > +

this is wrong also, argv[0] is a symbol name, not a filename.

 > +  if (!st)
 > +    error ("mi_cmd_symbol_info_file: No such source file");
 > +
 > +  if (st->fullname)
 > +    ui_out_field_string (uiout, "file", st->fullname);
 > +  else
 > +    ui_out_field_string (uiout, "file", symtab_to_filename (st));
 > +
 > +  return MI_CMD_DONE;
 > +}
 > +
 > +enum mi_cmd_result
 > +mi_cmd_symbol_info_function (char *command, char **argv, int argc)
 > +{
 > +  char *function = "";
 > +  struct symtabs_and_lines sals;
 > +  struct symbol *sym;
 > +  struct minimal_symbol *msym;
 > +  struct cleanup *old_chain;
 > +  char *args, **canonical;
 > +
 > +  if (argc != 1)
 > +    error ("mi_cmd_symbol_info_function: Usage: SYMBOL");
 > +
 > +  args = argv[0];
 > +
 > +  sals = decode_line_1 (&args, 1, NULL, 0, &canonical);

this one could be ok, but there is contradictory information in the
current documentation. It was documented as taking a symbol and
returning the function where the symbol is in, however it suggest that
it should provide the functionality that a gdbtk function
provides. That gdbtk function however takes a linespec as argument.

I think this mi command needs to be revisited.
So, wait until the issue is cleared.

 > +  old_chain = make_cleanup( xfree, sals.sals);
 > +
 > +  if (sals.nelts == 1)
 > +    {
 > +      resolve_sal_pc (&sals.sals[0]);
 > +      /* Try 'normal' symbol first */
 > +      if ((sym = find_pc_function (sals.sals[0].pc)))
 > +        {
 > +          function = SYMBOL_SOURCE_NAME (sym);
 > +        }
 > +      else if ((msym = lookup_minimal_symbol_by_pc (sals.sals[0].pc)))
 > +        {
 > +          function = SYMBOL_SOURCE_NAME (msym);
 > +        }
 > +
 > +      ui_out_field_string (uiout, "function", function);
 > +      return MI_CMD_DONE;
 > +    }
 > +  do_cleanups(old_chain);
 > +
 > +  error ("mi_cmd_symbol_info_function: No such symbol");
 > +  return MI_CMD_DONE;
 > +}
 > +
 > +enum mi_cmd_result
 > +mi_cmd_symbol_list_symbols (char *command, char **argv, int argc)
 > +{
 > +  struct symbol_search *matches;
 > +  struct symbol_search *p;
 > +  struct cleanup *old_chain = NULL;
 > +  namespace_enum space = 0;
 > +  char *function_name;
 > +  if (argc > 1)
 > +    error ("%s: Usage: [FUNCTION]", command);
 > +
 > +  if (strcmp (command, "symbol-list-functions") == 0)
 > +    space = FUNCTIONS_NAMESPACE;
 > +  else if (strcmp (command, "symbol-list-types") == 0)
 > +    space = TYPES_NAMESPACE;
 > +  else if (strcmp (command, "symbol-list-variables") == 0)
 > +    space = VARIABLES_NAMESPACE;
 > +  else
 > +    error ("mi_cmd_symbol_list_symbols: Called for illegal command %s!",
 > +           command);
 > +
 > +  search_symbols (argv[0], space, 0, NULL, &matches);
 > +
 > +  if (matches != NULL)
 > +    old_chain = make_cleanup_free_search_symbols (matches);
 > +
 > +  ui_out_list_begin (uiout, "symbols");
 > +
 > +  for (p = matches; p; p = p->next)
 > +    {
 > +      print_symbol_info (p->symtab, p->symbol, p->msymbol);
 > +    }
 > +

I am not sure that this implementation is really useful. I tried a
'info symbols' for a simple program, and it returned every symbol that
is included in the executable, i.e. a very very long list.  gdbtk has
changed this to search for the symbols in a given file.  Again, this
is probably something that should be revisited for the interface.
Unless we force a regexp as argument, but I don't really know what
would be more useful for a GUI.


 > +  ui_out_list_end (uiout);
 > +
 > +  if (matches)
 > +    do_cleanups (old_chain);
 > +
 > +  return MI_CMD_DONE;
 > +}


Elena


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]