* gdbtk.tcl: Add ref counts to breakpoint tags.
authorStu Grossman <grossman@cygnus>
Wed, 14 Sep 1994 08:02:51 +0000 (08:02 +0000)
committerStu Grossman <grossman@cygnus>
Wed, 14 Sep 1994 08:02:51 +0000 (08:02 +0000)
* 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.

gdb/ChangeLog
gdb/gdbtk.tcl

index f3f9bd58888d02d52d9c83e936df42069a623008..f8313e09a07748a2c8293055e496889afdaad1ca 100644 (file)
@@ -1,3 +1,14 @@
+Wed Sep 14 00:55:26 1994  Stu Grossman  (grossman@cygnus.com)
+
+       * 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.
+
 Tue Sep 13 18:23:26 1994  Rob Savoye  (rob@darkstar.cygnus.com)
 
        * w89k-rom.c op50-rom.c monitor.c config/pa/hppapro.mt: New files
index 3d9f9789cc3840e227a749c9925682f2b5ce213d..a164faea15c33bf370926587078a83f236803055 100644 (file)
@@ -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 \
@@ -879,6 +946,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:
 #
@@ -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