diff options
author | Stu Grossman <grossman@cygnus> | 1994-11-14 16:59:16 +0000 |
---|---|---|
committer | Stu Grossman <grossman@cygnus> | 1994-11-14 16:59:16 +0000 |
commit | 5b21fb68799d40a830fc0b25ea665e8c36481671 (patch) | |
tree | 7c02ff3cec0d26795178867ef02e92e11a1ebdd7 /gdb/gdbtk.c | |
parent | fee3930ea44f9f94a19a1731612981fcd272dd1a (diff) | |
download | gdb-5b21fb68799d40a830fc0b25ea665e8c36481671.zip gdb-5b21fb68799d40a830fc0b25ea665e8c36481671.tar.gz gdb-5b21fb68799d40a830fc0b25ea665e8c36481671.tar.bz2 |
* Makefile.in: Install gdbtk.tcl.
* configure.in: Add ENABLE_GDBTK flag.
* gdbtk.c (gdb_sourcelines): Returns list of source lines
containing code. (gdb_regnames): Returns list of register names.
Diffstat (limited to 'gdb/gdbtk.c')
-rw-r--r-- | gdb/gdbtk.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/gdb/gdbtk.c b/gdb/gdbtk.c index 291476d..c2a1e38 100644 --- a/gdb/gdbtk.c +++ b/gdb/gdbtk.c @@ -291,6 +291,87 @@ gdb_loc (clientData, interp, argc, argv) return TCL_OK; } +/* This implements the TCL command `gdb_sourcelines', which returns a list of + all of the lines containing executable code for the specified source file + (ie: lines where you can put breakpoints). */ + +static int +gdb_sourcelines (clientData, interp, argc, argv) + ClientData clientData; + Tcl_Interp *interp; + int argc; + char *argv[]; +{ + struct symtab *symtab; + struct linetable_entry *le; + int nlines; + char buf[100]; + + if (argc != 2) + { + Tcl_SetResult (interp, "wrong # args", TCL_STATIC); + return TCL_ERROR; + } + + symtab = lookup_symtab (argv[1]); + + if (!symtab) + { + Tcl_SetResult (interp, "No such file", TCL_STATIC); + return TCL_ERROR; + } + + /* If there's no linetable, or no entries, then we are done. */ + + if (!symtab->linetable + || symtab->linetable->nitems == 0) + { + Tcl_AppendElement (interp, ""); + return TCL_OK; + } + + le = symtab->linetable->item; + nlines = symtab->linetable->nitems; + + for (;nlines > 0; nlines--, le++) + { + /* If the pc of this line is the same as the pc of the next line, then + just skip it. */ + if (nlines > 1 + && le->pc == (le + 1)->pc) + continue; + + sprintf (buf, "%d", le->line); + Tcl_AppendElement (interp, buf); + } + + return TCL_OK; +} + +/* This implements the TCL command `gdb_regnames', which returns a list of + all of the register names. */ + +static int +gdb_regnames (clientData, interp, argc, argv) + ClientData clientData; + Tcl_Interp *interp; + int argc; + char *argv[]; +{ + int i; + + if (argc != 1) + { + Tcl_SetResult (interp, "wrong # args", TCL_STATIC); + return TCL_ERROR; + } + + for (i = 0; i < NUM_REGS; i++) + Tcl_AppendElement (interp, reg_names[i]); + + return TCL_OK; +} + static int gdb_cmd_stub (cmd) char *cmd; @@ -481,6 +562,8 @@ gdbtk_init () Tcl_CreateCommand (interp, "gdb_cmd", gdb_cmd, NULL, NULL); Tcl_CreateCommand (interp, "gdb_loc", gdb_loc, NULL, NULL); + Tcl_CreateCommand (interp, "gdb_sourcelines", gdb_sourcelines, NULL, NULL); + Tcl_CreateCommand (interp, "gdb_regnames", gdb_regnames, NULL, NULL); Tcl_CreateCommand (interp, "gdb_listfiles", gdb_listfiles, NULL, NULL); Tcl_CreateCommand (interp, "gdb_stop", gdb_stop, NULL, NULL); |