aboutsummaryrefslogtreecommitdiff
path: root/gdb/gdbtk.tcl
diff options
context:
space:
mode:
authorStu Grossman <grossman@cygnus>1994-09-14 08:02:51 +0000
committerStu Grossman <grossman@cygnus>1994-09-14 08:02:51 +0000
commit335129a9777b078b3e9945398daa1f61e3034087 (patch)
tree502f3b875f26493e8eafec7c243ac422d840d7d1 /gdb/gdbtk.tcl
parent3deb20fbc10bc5031ed8cf2390f08dac4869bd23 (diff)
downloadbinutils-335129a9777b078b3e9945398daa1f61e3034087.zip
binutils-335129a9777b078b3e9945398daa1f61e3034087.tar.gz
binutils-335129a9777b078b3e9945398daa1f61e3034087.tar.bz2
* gdbtk.tcl: Add ref counts to breakpoint tags.
* Put quotes around function name in disassemble command to better handle assembler names containing `.'. * Make pclist element 0 be filler to avoid off-by-one problem with line numbers. * Set names of top-level windows. * Add register display window. * Add PC to label of assembly window.
Diffstat (limited to 'gdb/gdbtk.tcl')
-rw-r--r--gdb/gdbtk.tcl172
1 files changed, 149 insertions, 23 deletions
diff --git a/gdb/gdbtk.tcl b/gdb/gdbtk.tcl
index 3d9f978..a164fae 100644
--- a/gdb/gdbtk.tcl
+++ b/gdb/gdbtk.tcl
@@ -129,6 +129,12 @@ proc gdbtk_tcl_breakpoint {action bpnum file line pc} {
${action}_breakpoint $bpnum $file $line $pc
}
+proc asm_win_name {funcname} {
+ regsub -all {\.} $funcname _ temp
+
+ return .asm.func_${temp}
+}
+
#
# Local procedure:
#
@@ -148,6 +154,7 @@ proc create_breakpoint {bpnum file line pc} {
global breakpoint_file
global breakpoint_line
global pos_to_breakpoint
+ global pos_to_bpcount
global cfunc
global pclist
@@ -156,6 +163,15 @@ proc create_breakpoint {bpnum file line pc} {
set breakpoint_file($bpnum) $file
set breakpoint_line($bpnum) $line
set pos_to_breakpoint($file:$line) $bpnum
+ if ![info exists pos_to_bpcount($file:$line)] {
+ set pos_to_bpcount($file:$line) 0
+ }
+ incr pos_to_bpcount($file:$line)
+ set pos_to_breakpoint($pc) $bpnum
+ if ![info exists pos_to_bpcount($pc)] {
+ set pos_to_bpcount($pc) 0
+ }
+ incr pos_to_bpcount($pc)
# If there's a window for this file, update it
@@ -165,10 +181,9 @@ proc create_breakpoint {bpnum file line pc} {
# If there's an assembly window, update that too
- set win .asm.func_${cfunc}
+ set win [asm_win_name $cfunc]
if [winfo exists $win] {
set line [lsearch -exact $pclist($cfunc) $pc]
- incr line
insert_breakpoint_tag $win $line
}
}
@@ -192,6 +207,8 @@ proc delete_breakpoint {bpnum file line pc} {
global breakpoint_file
global breakpoint_line
global pos_to_breakpoint
+ global pos_to_bpcount
+ global cfunc pclist
# Save line number and file for later
@@ -201,14 +218,39 @@ proc delete_breakpoint {bpnum file line pc} {
# Reset breakpoint annotation info
- unset pos_to_breakpoint($file:$line)
- unset breakpoint_file($bpnum)
- unset breakpoint_line($bpnum)
+ if {$pos_to_bpcount($file:$line) > 0} {
+ incr pos_to_bpcount($file:$line) -1
+
+ if {$pos_to_bpcount($file:$line) == 0} {
+ if [info exists pos_to_breakpoint($file:$line)] {
+ unset pos_to_breakpoint($file:$line)
+ }
+ unset breakpoint_file($bpnum)
+ unset breakpoint_line($bpnum)
# If there's a window for this file, update it
- if [info exists wins($file)] {
- delete_breakpoint_tag $wins($file) $line
+ if [info exists wins($file)] {
+ delete_breakpoint_tag $wins($file) $line
+ }
+ }
+ }
+
+# If there's an assembly window, update that too
+
+ if {$pos_to_bpcount($pc) > 0} {
+ incr pos_to_bpcount($pc) -1
+
+ if {$pos_to_bpcount($pc) == 0} {
+ if [info exists pos_to_breakpoint($pc)] {
+ unset pos_to_breakpoint($pc)
+ }
+ set win [asm_win_name $cfunc]
+ if [winfo exists $win] {
+ set line [lsearch -exact $pclist($cfunc) $pc]
+ delete_breakpoint_tag $win $line
+ }
+ }
}
}
@@ -226,8 +268,19 @@ proc delete_breakpoint {bpnum file line pc} {
proc enable_breakpoint {bpnum file line pc} {
global wins
+ global cfunc pclist
+
+ if [info exists wins($file)] {
+ $wins($file) tag configure $line -fgstipple {}
+ }
- $wins($file) tag configure $line -fgstipple {}
+# If there's an assembly window, update that too
+
+ set win [asm_win_name $cfunc]
+ if [winfo exists $win] {
+ set line [lsearch -exact $pclist($cfunc) $pc]
+ $win tag configure $line -fgstipple {}
+ }
}
#
@@ -244,8 +297,19 @@ proc enable_breakpoint {bpnum file line pc} {
proc disable_breakpoint {bpnum file line pc} {
global wins
+ global cfunc pclist
+
+ if [info exists wins($file)] {
+ $wins($file) tag configure $line -fgstipple gray50
+ }
- $wins($file) tag configure $line -fgstipple gray50
+# If there's an assembly window, update that too
+
+ set win [asm_win_name $cfunc]
+ if [winfo exists $win] {
+ set line [lsearch -exact $pclist($cfunc) $pc]
+ $win tag configure $line -fgstipple gray50
+ }
}
#
@@ -624,7 +688,7 @@ proc create_asm_win {funcname} {
# Replace all the dirty characters in $filename with clean ones, and generate
# a unique name for the text widget.
- set win .asm.func_${funcname}
+ set win [asm_win_name $funcname]
# Actually create and do basic configuration on the text widget.
@@ -646,7 +710,7 @@ proc create_asm_win {funcname} {
# Disassemble the code, and read it into the new text widget
set current_output_win $win
- gdb_cmd "disassemble $funcname"
+ gdb_cmd "disassemble '$funcname'"
set current_output_win .command.text
set numlines [$win index end]
@@ -660,6 +724,7 @@ proc create_asm_win {funcname} {
# Add margins (for annotations) and note the PC for each line
if [info exists pclist($funcname)] { unset pclist($funcname) }
+ lappend pclist($funcname) Unused
for {set i 1} {$i <= $numlines} {incr i} {
scan [$win get $i.0 "$i.0 lineend"] "%s " pc
lappend pclist($funcname) $pc
@@ -842,9 +907,11 @@ proc asm_command {} {
if ![winfo exists .asm] {
set cfunc *None*
- set win .asm.func_${cfunc}
+ set win [asm_win_name $cfunc]
+
toplevel .asm
wm minsize .asm 1 1
+ wm title .asm Assembly
label .asm.label -text "*NIL*" -borderwidth 2 -relief raised
text $win -height 25 -width 80 -relief raised -borderwidth 2 \
@@ -882,6 +949,62 @@ proc asm_command {} {
#
# Local procedure:
#
+# registers_command - Open up the register display window.
+#
+# Description:
+#
+# Create the register display window, with automatic updates.
+#
+
+proc registers_command {} {
+ global cfunc
+
+ if ![winfo exists .reg] {
+ toplevel .reg
+ wm minsize .reg 1 1
+ wm title .reg Registers
+ set win .reg.regs
+
+ text $win -height 25 -width 80 -relief raised \
+ -borderwidth 2 \
+ -setgrid true -cursor hand2
+
+ pack $win -side left -expand yes -fill both
+ } else {
+ destroy .reg
+ }
+}
+
+#
+# Local procedure:
+#
+# update_registers - Update the registers window.
+#
+# Description:
+#
+# This procedure updates the registers window.
+#
+
+proc update_registers {} {
+ global current_output_win
+
+ set win .reg.regs
+
+ $win configure -state normal
+
+ $win delete 0.0 end
+
+ set current_output_win $win
+ gdb_cmd "info registers"
+ set current_output_win .command.text
+
+ $win yview 1
+ $win configure -state disabled
+}
+
+#
+# Local procedure:
+#
# update_assembly - Update the assembly window.
#
# Description:
@@ -910,7 +1033,7 @@ proc update_assembly {linespec} {
set funcname [lindex $linespec 1]
set debug_file [lindex $linespec 0]
- set win .asm.func_${cfunc}
+ set win [asm_win_name $cfunc]
# Sometimes there's no source file for this location
@@ -923,7 +1046,7 @@ proc update_assembly {linespec} {
pack forget $win
set cfunc $funcname
- set win .asm.func_${cfunc}
+ set win [asm_win_name $cfunc]
# Create a text widget for this func if necessary
@@ -938,15 +1061,14 @@ proc update_assembly {linespec} {
pack $win -side left -expand yes -fill both \
-after .asm.buts
set line [lsearch -exact $pclist($cfunc) $pc]
- incr line
$win yview [expr $line - $asm_screen_height / 2]
}
# Update the label widget in case the filename or function name has changed
- if {$current_asm_label != $funcname} then {
- .asm.label configure -text $funcname
- set current_asm_label $funcname
+ if {$current_asm_label != "$pc $funcname"} then {
+ .asm.label configure -text "$pc $funcname"
+ set current_asm_label "$pc $funcname"
}
# Update the pointer, scrolling the text widget if necessary to keep the
@@ -968,8 +1090,6 @@ proc update_assembly {linespec} {
return
}
- incr line
-
set pointer_pos [$win index $line.1]
set asm_pointers($cfunc) $pointer_pos
@@ -993,6 +1113,9 @@ proc update_ptr {} {
if [winfo exists .asm] {
update_assembly [gdb_loc]
}
+ if [winfo exists .reg] {
+ update_registers
+ }
}
#
@@ -1048,8 +1171,9 @@ button .finish -text Finish -command {gdb_cmd finish ; update_ptr}
button .exit -text Exit -command {gdb_cmd quit}
button .up -text Up -command {gdb_cmd up ; update_ptr}
button .down -text Down -command {gdb_cmd down ; update_ptr}
-button .bottom -text "Bottom" -command {gdb_cmd {frame 0} ; update_ptr}
-button .asm_but -text "Asm" -command {asm_command ; update_ptr}
+button .bottom -text Bottom -command {gdb_cmd {frame 0} ; update_ptr}
+button .asm_but -text Asm -command {asm_command ; update_ptr}
+button .registers -text Regs -command {registers_command ; update_ptr}
proc files_command {} {
toplevel .files_window
@@ -1073,8 +1197,10 @@ button .files -text Files -command files_command
pack .listing -side bottom -fill both -expand yes
#pack .test -side bottom -fill x
-pack .start .step .next .continue .finish .up .down .bottom .asm_but .files .exit -side left
+pack .start .step .next .continue .finish .up .down .bottom .asm_but \
+ .registers .files .exit -side left
toplevel .command
+wm title .command Command
# Setup command window