OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [trunk/] [insight/] [gdb/] [testsuite/] [lib/] [gdb.exp] - Blame information for rev 1767

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 578 markom
# Copyright 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
2
# Free Software Foundation, Inc.
3
 
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 2 of the License, or
7
# (at your option) any later version.
8
#
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
# GNU General Public License for more details.
13
#
14
# You should have received a copy of the GNU General Public License
15
# along with this program; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17
 
18
# Please email any bugs, comments, and/or additions to this file to:
19
# bug-gdb@prep.ai.mit.edu
20
 
21
# This file was written by Fred Fish. (fnf@cygnus.com)
22
 
23
# Generic gdb subroutines that should work for any target.  If these
24
# need to be modified for any target, it can be done with a variable
25
# or by passing arguments.
26
 
27
load_lib libgloss.exp
28
 
29
global GDB
30
global CHILL_LIB
31
global CHILL_RT0
32
 
33
if ![info exists CHILL_LIB] {
34
    set CHILL_LIB [findfile $base_dir/../../gcc/ch/runtime/libchill.a "$base_dir/../../gcc/ch/runtime/libchill.a" [transform -lchill]]
35
}
36
verbose "using CHILL_LIB = $CHILL_LIB" 2
37
if ![info exists CHILL_RT0] {
38
    set CHILL_RT0 [findfile $base_dir/../../gcc/ch/runtime/chillrt0.o "$base_dir/../../gcc/ch/runtime/chillrt0.o" ""]
39
}
40
verbose "using CHILL_RT0 = $CHILL_RT0" 2
41
 
42
if [info exists TOOL_EXECUTABLE] {
43
    set GDB $TOOL_EXECUTABLE;
44
}
45
if ![info exists GDB] {
46
    if ![is_remote host] {
47
        set GDB [findfile $base_dir/../../gdb/gdb "$base_dir/../../gdb/gdb" [transform gdb]]
48
    } else {
49
        set GDB [transform gdb];
50
    }
51
}
52
verbose "using GDB = $GDB" 2
53
 
54
global GDBFLAGS
55
if ![info exists GDBFLAGS] {
56
    set GDBFLAGS "-nx"
57
}
58
verbose "using GDBFLAGS = $GDBFLAGS" 2
59
 
60
# The variable gdb_prompt is a regexp which matches the gdb prompt.
61
# Set it if it is not already set.
62
global gdb_prompt
63
if ![info exists gdb_prompt] then {
64
    set gdb_prompt "\[(\]gdb\[)\]"
65
}
66
 
67
# Needed for some tests under Cygwin.
68
global EXEEXT
69
global env
70
 
71
if ![info exists env(EXEEXT)] {
72
    set EXEEXT ""
73
} else {
74
    set EXEEXT $env(EXEEXT)
75
}
76
 
77
### Only procedures should come after this point.
78
 
79
#
80
# gdb_version -- extract and print the version number of GDB
81
#
82
proc default_gdb_version {} {
83
    global GDB
84
    global GDBFLAGS
85
    global gdb_prompt
86
    set fileid [open "gdb_cmd" w];
87
    puts $fileid "q";
88
    close $fileid;
89
    set cmdfile [remote_download host "gdb_cmd"];
90
    set output [remote_exec host "$GDB -nw --command $cmdfile"]
91
    remote_file build delete "gdb_cmd";
92
    remote_file host delete "$cmdfile";
93
    set tmp [lindex $output 1];
94
    set version ""
95
    regexp " \[0-9\]\[^ \t\n\r\]+" "$tmp" version
96
    if ![is_remote host] {
97
        clone_output "[which $GDB] version $version $GDBFLAGS\n"
98
    } else {
99
        clone_output "$GDB on remote host version $version $GDBFLAGS\n"
100
    }
101
}
102
 
103
proc gdb_version { } {
104
    return [default_gdb_version];
105
}
106
 
107
#
108
# gdb_unload -- unload a file if one is loaded
109
#
110
 
111
proc gdb_unload {} {
112
    global verbose
113
    global GDB
114
    global gdb_prompt
115
    send_gdb "file\n"
116
    gdb_expect 60 {
117
        -re "No executable file now\[^\r\n\]*\[\r\n\]" { exp_continue }
118
        -re "No symbol file now\[^\r\n\]*\[\r\n\]" { exp_continue }
119
        -re "A program is being debugged already..*Kill it.*y or n. $"\
120
            { send_gdb "y\n"
121
                verbose "\t\tKilling previous program being debugged"
122
            exp_continue
123
        }
124
        -re "Discard symbol table from .*y or n.*$" {
125
            send_gdb "y\n"
126
            exp_continue
127
        }
128
        -re "$gdb_prompt $" {}
129
        timeout {
130
            perror "couldn't unload file in $GDB (timed out)."
131
            return -1
132
        }
133
    }
134
}
135
 
136
# Many of the tests depend on setting breakpoints at various places and
137
# running until that breakpoint is reached.  At times, we want to start
138
# with a clean-slate with respect to breakpoints, so this utility proc
139
# lets us do this without duplicating this code everywhere.
140
#
141
 
142
proc delete_breakpoints {} {
143
    global gdb_prompt
144
 
145
    # we need a larger timeout value here or this thing just confuses
146
    # itself.  May need a better implementation if possible. - guo
147
    #
148
    send_gdb "delete breakpoints\n"
149
    gdb_expect 100 {
150
         -re "Delete all breakpoints.*y or n.*$" {
151
            send_gdb "y\n";
152
            exp_continue
153
        }
154
         -re "$gdb_prompt $" { # This happens if there were no breakpoints
155
            }
156
         timeout { perror "Delete all breakpoints in delete_breakpoints (timeout)" ; return }
157
    }
158
    send_gdb "info breakpoints\n"
159
    gdb_expect 100 {
160
         -re "No breakpoints or watchpoints..*$gdb_prompt $" {}
161
         -re "$gdb_prompt $" { perror "breakpoints not deleted" ; return }
162
         -re "Delete all breakpoints.*or n.*$" {
163
            send_gdb "y\n";
164
            exp_continue
165
        }
166
         timeout { perror "info breakpoints (timeout)" ; return }
167
    }
168
}
169
 
170
 
171
#
172
# Generic run command.
173
#
174
# The second pattern below matches up to the first newline *only*.
175
# Using ``.*$'' could swallow up output that we attempt to match
176
# elsewhere.
177
#
178
proc gdb_run_cmd {args} {
179
    global gdb_prompt
180
 
181
    if [target_info exists gdb_init_command] {
182
        send_gdb "[target_info gdb_init_command]\n";
183
        gdb_expect 30 {
184
            -re "$gdb_prompt $" { }
185
            default {
186
                perror "gdb_init_command for target failed";
187
                return;
188
            }
189
        }
190
    }
191
 
192
    if [target_info exists use_gdb_stub] {
193
        if [target_info exists gdb,do_reload_on_run] {
194
            # Specifying no file, defaults to the executable
195
            # currently being debugged.
196
            if { [gdb_load ""] < 0 } {
197
                return;
198
            }
199
            send_gdb "continue\n";
200
            gdb_expect 60 {
201
                -re "Continu\[^\r\n\]*\[\r\n\]" {}
202
                default {}
203
            }
204
            return;
205
        }
206
 
207
        if [target_info exists gdb,start_symbol] {
208
            set start [target_info gdb,start_symbol];
209
        } else {
210
            set start "start";
211
        }
212
        send_gdb  "jump *$start\n"
213
        set start_attempt 1;
214
        while { $start_attempt } {
215
            # Cap (re)start attempts at three to ensure that this loop
216
            # always eventually fails.  Don't worry about trying to be
217
            # clever and not send a command when it has failed.
218
            if [expr $start_attempt > 3] {
219
                perror "Jump to start() failed (retry count exceeded)";
220
                return;
221
            }
222
            set start_attempt [expr $start_attempt + 1];
223
            gdb_expect 30 {
224
                -re "Continuing at \[^\r\n\]*\[\r\n\]" {
225
                    set start_attempt 0;
226
                }
227
                -re "No symbol \"_start\" in current.*$gdb_prompt $" {
228
                    perror "Can't find start symbol to run in gdb_run";
229
                    return;
230
                }
231
                -re "No symbol \"start\" in current.*$gdb_prompt $" {
232
                    send_gdb "jump *_start\n";
233
                }
234
                -re "No symbol.*context.*$gdb_prompt $" {
235
                    set start_attempt 0;
236
                }
237
                -re "Line.* Jump anyway.*y or n. $" {
238
                    send_gdb "y\n"
239
                }
240
                -re "The program is not being run.*$gdb_prompt $" {
241
                    if { [gdb_load ""] < 0 } {
242
                        return;
243
                    }
244
                    send_gdb "jump *$start\n";
245
                }
246
                timeout {
247
                    perror "Jump to start() failed (timeout)";
248
                    return
249
                }
250
            }
251
        }
252
        if [target_info exists gdb_stub] {
253
            gdb_expect 60 {
254
                -re "$gdb_prompt $" {
255
                    send_gdb "continue\n"
256
                }
257
            }
258
        }
259
        return
260
    }
261
    send_gdb "run $args\n"
262
# This doesn't work quite right yet.
263
    gdb_expect 60 {
264
        -re "The program .* has been started already.*y or n. $" {
265
            send_gdb "y\n"
266
            exp_continue
267
        }
268
        -re "Starting program: \[^\r\n\]*" {}
269
    }
270
}
271
 
272
proc gdb_breakpoint { function } {
273
    global gdb_prompt
274
    global decimal
275
 
276
    send_gdb "break $function\n"
277
    # The first two regexps are what we get with -g, the third is without -g.
278
    gdb_expect 30 {
279
        -re "Breakpoint \[0-9\]* at .*: file .*, line $decimal.\r\n$gdb_prompt $" {}
280
        -re "Breakpoint \[0-9\]*: file .*, line $decimal.\r\n$gdb_prompt $" {}
281
        -re "Breakpoint \[0-9\]* at .*$gdb_prompt $" {}
282
        -re "$gdb_prompt $" { fail "setting breakpoint at $function" ; return 0 }
283
        timeout { fail "setting breakpoint at $function (timeout)" ; return 0 }
284
    }
285
    return 1;
286
}
287
 
288
# Set breakpoint at function and run gdb until it breaks there.
289
# Since this is the only breakpoint that will be set, if it stops
290
# at a breakpoint, we will assume it is the one we want.  We can't
291
# just compare to "function" because it might be a fully qualified,
292
# single quoted C++ function specifier.
293
 
294
proc runto { function } {
295
    global gdb_prompt
296
    global decimal
297
 
298
    delete_breakpoints
299
 
300
    if ![gdb_breakpoint $function] {
301
        return 0;
302
    }
303
 
304
    gdb_run_cmd
305
 
306
    # the "at foo.c:36" output we get with -g.
307
    # the "in func" output we get without -g.
308
    gdb_expect 30 {
309
        -re "Break.* at .*:$decimal.*$gdb_prompt $" {
310
            return 1
311
        }
312
        -re "Breakpoint \[0-9\]*, \[0-9xa-f\]* in .*$gdb_prompt $" {
313
            return 1
314
        }
315
        -re "$gdb_prompt $" {
316
            fail "running to $function in runto"
317
            return 0
318
        }
319
        timeout {
320
            fail "running to $function in runto (timeout)"
321
            return 0
322
        }
323
    }
324
    return 1
325
}
326
 
327
#
328
# runto_main -- ask gdb to run until we hit a breakpoint at main.
329
#               The case where the target uses stubs has to be handled
330
#               specially--if it uses stubs, assuming we hit
331
#               breakpoint() and just step out of the function.
332
#
333
proc runto_main { } {
334
    global gdb_prompt
335
    global decimal
336
 
337
    if ![target_info exists gdb_stub] {
338
        return [runto main]
339
    }
340
 
341
    delete_breakpoints
342
 
343
    gdb_step_for_stub;
344
 
345
    return 1
346
}
347
 
348
 
349
### Continue, and expect to hit a breakpoint.
350
### Report a pass or fail, depending on whether it seems to have
351
### worked.  Use NAME as part of the test name; each call to
352
### continue_to_breakpoint should use a NAME which is unique within
353
### that test file.
354
proc gdb_continue_to_breakpoint {name} {
355
    global gdb_prompt
356
    set full_name "continue to breakpoint: $name"
357
 
358
    send_gdb "continue\n"
359
    gdb_expect {
360
        -re "Breakpoint .* at .*\r\n$gdb_prompt $" {
361
            pass $full_name
362
        }
363
        -re ".*$gdb_prompt $" {
364
            fail $full_name
365
        }
366
        timeout {
367
            fail "$full_name (timeout)"
368
        }
369
    }
370
}
371
 
372
 
373
 
374
# gdb_test COMMAND PATTERN MESSAGE QUESTION RESPONSE
375
# Send a command to gdb; test the result.
376
#
377
# COMMAND is the command to execute, send to GDB with send_gdb.  If
378
#   this is the null string no command is sent.
379
# PATTERN is the pattern to match for a PASS, and must NOT include
380
#   the \r\n sequence immediately before the gdb prompt.
381
# MESSAGE is an optional message to be printed.  If this is
382
#   omitted, then the pass/fail messages use the command string as the
383
#   message.  (If this is the empty string, then sometimes we don't
384
#   call pass or fail at all; I don't understand this at all.)
385
# QUESTION is a question GDB may ask in response to COMMAND, like
386
#   "are you sure?"
387
# RESPONSE is the response to send if QUESTION appears.
388
#
389
# Returns:
390
#    1 if the test failed,
391
#    0 if the test passes,
392
#   -1 if there was an internal error.
393
#
394
proc gdb_test { args } {
395
    global verbose
396
    global gdb_prompt
397
    global GDB
398
    upvar timeout timeout
399
 
400
    if [llength $args]>2 then {
401
        set message [lindex $args 2]
402
    } else {
403
        set message [lindex $args 0]
404
    }
405
    set command [lindex $args 0]
406
    set pattern [lindex $args 1]
407
 
408
    if [llength $args]==5 {
409
        set question_string [lindex $args 3];
410
        set response_string [lindex $args 4];
411
    } else {
412
        set question_string "^FOOBAR$"
413
    }
414
 
415
    if $verbose>2 then {
416
        send_user "Sending \"$command\" to gdb\n"
417
        send_user "Looking to match \"$pattern\"\n"
418
        send_user "Message is \"$message\"\n"
419
    }
420
 
421
    set result -1
422
    set string "${command}\n";
423
    if { $command != "" } {
424
        while { "$string" != "" } {
425
            set foo [string first "\n" "$string"];
426
            set len [string length "$string"];
427
            if { $foo < [expr $len - 1] } {
428
                set str [string range "$string" 0 $foo];
429
                if { [send_gdb "$str"] != "" } {
430
                    global suppress_flag;
431
 
432
                    if { ! $suppress_flag } {
433
                        perror "Couldn't send $command to GDB.";
434
                    }
435
                    fail "$message";
436
                    return $result;
437
                }
438
                # since we're checking if each line of the multi-line
439
                # command are 'accepted' by GDB here,
440
                # we need to set -notransfer expect option so that
441
                # command output is not lost for pattern matching
442
                # - guo
443
                gdb_expect -notransfer 2 {
444
                    -re "\[\r\n\]" { }
445
                    timeout { }
446
                }
447
                set string [string range "$string" [expr $foo + 1] end];
448
            } else {
449
                break;
450
            }
451
        }
452
        if { "$string" != "" } {
453
            if { [send_gdb "$string"] != "" } {
454
                global suppress_flag;
455
 
456
                if { ! $suppress_flag } {
457
                    perror "Couldn't send $command to GDB.";
458
                }
459
                fail "$message";
460
                return $result;
461
            }
462
        }
463
    }
464
 
465
    if [target_info exists gdb,timeout] {
466
        set tmt [target_info gdb,timeout];
467
    } else {
468
        if [info exists timeout] {
469
            set tmt $timeout;
470
        } else {
471
            global timeout;
472
            if [info exists timeout] {
473
                set tmt $timeout;
474
            } else {
475
                set tmt 60;
476
            }
477
        }
478
    }
479
    gdb_expect $tmt {
480
         -re "\\*\\*\\* DOSEXIT code.*" {
481
             if { $message != "" } {
482
                 fail "$message";
483
             }
484
             gdb_suppress_entire_file "GDB died";
485
             return -1;
486
         }
487
         -re "Ending remote debugging.*$gdb_prompt $" {
488
            if ![isnative] then {
489
                warning "Can`t communicate to remote target."
490
            }
491
            gdb_exit
492
            gdb_start
493
            set result -1
494
        }
495
         -re "\[\r\n\]*($pattern)\[\r\n\]+$gdb_prompt $" {
496
            if ![string match "" $message] then {
497
                pass "$message"
498
            }
499
            set result 0
500
        }
501
         -re "(${question_string})$" {
502
            send_gdb "$response_string\n";
503
            exp_continue;
504
        }
505
         -re "Undefined\[a-z\]* command:.*$gdb_prompt $" {
506
            perror "Undefined command \"$command\"."
507
            fail "$message"
508
            set result 1
509
        }
510
         -re "Ambiguous command.*$gdb_prompt $" {
511
            perror "\"$command\" is not a unique command name."
512
            fail "$message"
513
            set result 1
514
        }
515
         -re "Program exited with code \[0-9\]+.*$gdb_prompt $" {
516
            if ![string match "" $message] then {
517
                set errmsg "$message: the program exited"
518
            } else {
519
                set errmsg "$command: the program exited"
520
            }
521
            fail "$errmsg"
522
            return -1
523
        }
524
         -re "The program is not being run.*$gdb_prompt $" {
525
            if ![string match "" $message] then {
526
                set errmsg "$message: the program is no longer running"
527
            } else {
528
                set errmsg "$command: the program is no longer running"
529
            }
530
            fail "$errmsg"
531
            return -1
532
        }
533
         -re ".*$gdb_prompt $" {
534
            if ![string match "" $message] then {
535
                fail "$message"
536
            }
537
            set result 1
538
        }
539
         "" {
540
            send_gdb "\n"
541
            perror "Window too small."
542
            fail "$message"
543
        }
544
         -re "\\(y or n\\) " {
545
            send_gdb "n\n"
546
            perror "Got interactive prompt."
547
            fail "$message"
548
        }
549
         eof {
550
             perror "Process no longer exists"
551
             if { $message != "" } {
552
                 fail "$message"
553
             }
554
             return -1
555
        }
556
         full_buffer {
557
            perror "internal buffer is full."
558
            fail "$message"
559
        }
560
        timeout {
561
            if ![string match "" $message] then {
562
                fail "$message (timeout)"
563
            }
564
            set result 1
565
        }
566
    }
567
    return $result
568
}
569
 
570
# Test that a command gives an error.  For pass or fail, return
571
# a 1 to indicate that more tests can proceed.  However a timeout
572
# is a serious error, generates a special fail message, and causes
573
# a 0 to be returned to indicate that more tests are likely to fail
574
# as well.
575
 
576
proc test_print_reject { args } {
577
    global gdb_prompt
578
    global verbose
579
 
580
    if [llength $args]==2 then {
581
        set expectthis [lindex $args 1]
582
    } else {
583
        set expectthis "should never match this bogus string"
584
    }
585
    set sendthis [lindex $args 0]
586
    if $verbose>2 then {
587
        send_user "Sending \"$sendthis\" to gdb\n"
588
        send_user "Looking to match \"$expectthis\"\n"
589
    }
590
    send_gdb "$sendthis\n"
591
    #FIXME: Should add timeout as parameter.
592
    gdb_expect {
593
        -re "A .* in expression.*\\.*$gdb_prompt $" {
594
            pass "reject $sendthis"
595
            return 1
596
        }
597
        -re "Invalid syntax in expression.*$gdb_prompt $" {
598
            pass "reject $sendthis"
599
            return 1
600
        }
601
        -re "Junk after end of expression.*$gdb_prompt $" {
602
            pass "reject $sendthis"
603
            return 1
604
        }
605
        -re "Invalid number.*$gdb_prompt $" {
606
            pass "reject $sendthis"
607
            return 1
608
        }
609
        -re "Invalid character constant.*$gdb_prompt $" {
610
            pass "reject $sendthis"
611
            return 1
612
        }
613
        -re "No symbol table is loaded.*$gdb_prompt $" {
614
            pass "reject $sendthis"
615
            return 1
616
        }
617
        -re "No symbol .* in current context.*$gdb_prompt $" {
618
            pass "reject $sendthis"
619
            return 1
620
        }
621
        -re "$expectthis.*$gdb_prompt $" {
622
            pass "reject $sendthis"
623
            return 1
624
        }
625
        -re ".*$gdb_prompt $" {
626
            fail "reject $sendthis"
627
            return 1
628
        }
629
        default {
630
            fail "reject $sendthis (eof or timeout)"
631
            return 0
632
        }
633
    }
634
}
635
 
636
# Given an input string, adds backslashes as needed to create a
637
# regexp that will match the string.
638
 
639
proc string_to_regexp {str} {
640
    set result $str
641
    regsub -all {[]*+.|()^$\[]} $str {\\&} result
642
    return $result
643
}
644
 
645
# Same as gdb_test, but the second parameter is not a regexp,
646
# but a string that must match exactly.
647
 
648
proc gdb_test_exact { args } {
649
    upvar timeout timeout
650
 
651
    set command [lindex $args 0]
652
 
653
    # This applies a special meaning to a null string pattern.  Without
654
    # this, "$pattern\r\n$gdb_prompt $" will match anything, including error
655
    # messages from commands that should have no output except a new
656
    # prompt.  With this, only results of a null string will match a null
657
    # string pattern.
658
 
659
    set pattern [lindex $args 1]
660
    if [string match $pattern ""] {
661
        set pattern [string_to_regexp [lindex $args 0]]
662
    } else {
663
        set pattern [string_to_regexp [lindex $args 1]]
664
    }
665
 
666
    # It is most natural to write the pattern argument with only
667
    # embedded \n's, especially if you are trying to avoid Tcl quoting
668
    # problems.  But gdb_expect really wants to see \r\n in patterns.  So
669
    # transform the pattern here.  First transform \r\n back to \n, in
670
    # case some users of gdb_test_exact already do the right thing.
671
    regsub -all "\r\n" $pattern "\n" pattern
672
    regsub -all "\n" $pattern "\r\n" pattern
673
    if [llength $args]==3 then {
674
        set message [lindex $args 2]
675
    } else {
676
        set message $command
677
    }
678
 
679
    return [gdb_test $command $pattern $message]
680
}
681
 
682
proc gdb_reinitialize_dir { subdir } {
683
    global gdb_prompt
684
 
685
    if [is_remote host] {
686
        return "";
687
    }
688
    send_gdb "dir\n"
689
    gdb_expect 60 {
690
        -re "Reinitialize source path to empty.*y or n. " {
691
            send_gdb "y\n"
692
            gdb_expect 60 {
693
                -re "Source directories searched.*$gdb_prompt $" {
694
                    send_gdb "dir $subdir\n"
695
                    gdb_expect 60 {
696
                        -re "Source directories searched.*$gdb_prompt $" {
697
                            verbose "Dir set to $subdir"
698
                        }
699
                        -re "$gdb_prompt $" {
700
                            perror "Dir \"$subdir\" failed."
701
                        }
702
                    }
703
                }
704
                -re "$gdb_prompt $" {
705
                    perror "Dir \"$subdir\" failed."
706
                }
707
            }
708
        }
709
        -re "$gdb_prompt $" {
710
            perror "Dir \"$subdir\" failed."
711
        }
712
    }
713
}
714
 
715
#
716
# gdb_exit -- exit the GDB, killing the target program if necessary
717
#
718
proc default_gdb_exit {} {
719
    global GDB
720
    global GDBFLAGS
721
    global verbose
722
    global gdb_spawn_id;
723
 
724
    gdb_stop_suppressing_tests;
725
 
726
    if ![info exists gdb_spawn_id] {
727
        return;
728
    }
729
 
730
    verbose "Quitting $GDB $GDBFLAGS"
731
 
732
    if { [is_remote host] && [board_info host exists fileid] } {
733
        send_gdb "quit\n";
734
        gdb_expect 10 {
735
            -re "y or n" {
736
                send_gdb "y\n";
737
                exp_continue;
738
            }
739
            -re "DOSEXIT code" { }
740
            default { }
741
        }
742
    }
743
 
744
    if ![is_remote host] {
745
        remote_close host;
746
    }
747
    unset gdb_spawn_id
748
}
749
 
750
#
751
# load a file into the debugger.
752
# return a -1 if anything goes wrong.
753
#
754
proc gdb_file_cmd { arg } {
755
    global verbose
756
    global loadpath
757
    global loadfile
758
    global GDB
759
    global gdb_prompt
760
    upvar timeout timeout
761
 
762
    if [is_remote host] {
763
        set arg [remote_download host $arg];
764
        if { $arg == "" } {
765
            error "download failed"
766
            return -1;
767
        }
768
    }
769
 
770
    send_gdb "file $arg\n"
771
    gdb_expect 120 {
772
        -re "Reading symbols from.*done.*$gdb_prompt $" {
773
            verbose "\t\tLoaded $arg into the $GDB"
774
            return 0
775
        }
776
        -re "has no symbol-table.*$gdb_prompt $" {
777
            perror "$arg wasn't compiled with \"-g\""
778
            return -1
779
        }
780
        -re "A program is being debugged already.*Kill it.*y or n. $" {
781
            send_gdb "y\n"
782
                verbose "\t\tKilling previous program being debugged"
783
            exp_continue
784
        }
785
        -re "Load new symbol table from \".*\".*y or n. $" {
786
            send_gdb "y\n"
787
            gdb_expect 120 {
788
                -re "Reading symbols from.*done.*$gdb_prompt $" {
789
                    verbose "\t\tLoaded $arg with new symbol table into $GDB"
790
                    return 0
791
                }
792
                timeout {
793
                    perror "(timeout) Couldn't load $arg, other program already loaded."
794
                    return -1
795
                }
796
            }
797
        }
798
        -re "No such file or directory.*$gdb_prompt $" {
799
            perror "($arg) No such file or directory\n"
800
            return -1
801
        }
802
        -re "$gdb_prompt $" {
803
            perror "couldn't load $arg into $GDB."
804
            return -1
805
            }
806
        timeout {
807
            perror "couldn't load $arg into $GDB (timed out)."
808
            return -1
809
        }
810
        eof {
811
            # This is an attempt to detect a core dump, but seems not to
812
            # work.  Perhaps we need to match .* followed by eof, in which
813
            # gdb_expect does not seem to have a way to do that.
814
            perror "couldn't load $arg into $GDB (end of file)."
815
            return -1
816
        }
817
    }
818
}
819
 
820
#
821
# start gdb -- start gdb running, default procedure
822
#
823
# When running over NFS, particularly if running many simultaneous
824
# tests on different hosts all using the same server, things can
825
# get really slow.  Give gdb at least 3 minutes to start up.
826
#
827
proc default_gdb_start { } {
828
    global verbose
829
    global GDB
830
    global GDBFLAGS
831
    global gdb_prompt
832
    global timeout
833
    global gdb_spawn_id;
834
 
835
    gdb_stop_suppressing_tests;
836
 
837
    verbose "Spawning $GDB -nw $GDBFLAGS"
838
 
839
    if [info exists gdb_spawn_id] {
840
        return 0;
841
    }
842
 
843
    if ![is_remote host] {
844
        if { [which $GDB] == 0 } then {
845
            perror "$GDB does not exist."
846
            exit 1
847
        }
848
    }
849
    set res [remote_spawn host "$GDB -nw $GDBFLAGS [host_info gdb_opts]"];
850
    if { $res < 0 || $res == "" } {
851
        perror "Spawning $GDB failed."
852
        return 1;
853
    }
854
    gdb_expect 360 {
855
        -re "\[\r\n\]$gdb_prompt $" {
856
            verbose "GDB initialized."
857
        }
858
        -re "$gdb_prompt $"     {
859
            perror "GDB never initialized."
860
            return -1
861
        }
862
        timeout {
863
            perror "(timeout) GDB never initialized after 10 seconds."
864
            remote_close host;
865
            return -1
866
        }
867
    }
868
    set gdb_spawn_id -1;
869
    # force the height to "unlimited", so no pagers get used
870
 
871
    send_gdb "set height 0\n"
872
    gdb_expect 10 {
873
        -re "$gdb_prompt $" {
874
            verbose "Setting height to 0." 2
875
        }
876
        timeout {
877
            warning "Couldn't set the height to 0"
878
        }
879
    }
880
    # force the width to "unlimited", so no wraparound occurs
881
    send_gdb "set width 0\n"
882
    gdb_expect 10 {
883
        -re "$gdb_prompt $" {
884
            verbose "Setting width to 0." 2
885
        }
886
        timeout {
887
            warning "Couldn't set the width to 0."
888
        }
889
    }
890
    return 0;
891
}
892
 
893
# Return a 1 for configurations for which we don't even want to try to
894
# test C++.
895
 
896
proc skip_cplus_tests {} {
897
    if { [istarget "d10v-*-*"] } {
898
        return 1
899
    }
900
    if { [istarget "h8300-*-*"] } {
901
        return 1
902
    }
903
    return 0
904
}
905
 
906
# * For crosses, the CHILL runtime doesn't build because it can't find
907
# setjmp.h, stdio.h, etc.
908
# * For AIX (as of 16 Mar 95), (a) there is no language code for
909
# CHILL in output_epilog in gcc/config/rs6000/rs6000.c, (b) collect2
910
# does not get along with AIX's too-clever linker.
911
# * On Irix5, there is a bug whereby set of bool, etc., don't get
912
# TYPE_LOW_BOUND for the bool right because force_to_range_type doesn't
913
# work with stub types.
914
# Lots of things seem to fail on the PA, and since it's not a supported
915
# chill target at the moment, don't run the chill tests.
916
 
917
proc skip_chill_tests {} {
918
    if ![info exists do_chill_tests] {
919
        return 1;
920
    }
921
    eval set skip_chill [expr ![isnative] || [istarget "*-*-aix*"] || [istarget "*-*-irix5*"] || [istarget "*-*-irix6*"] || [istarget "alpha-*-osf*"] || [istarget "hppa*-*-*"]]
922
    verbose "Skip chill tests is $skip_chill"
923
    return $skip_chill
924
}
925
 
926
# Skip all the tests in the file if you are not on an hppa running
927
# hpux target.
928
 
929
proc skip_hp_tests {} {
930
    eval set skip_hp [ expr ![isnative] || ![istarget "hppa*-*-hpux*"] ]
931
    verbose "Skip hp tests is $skip_hp"
932
    return $skip_hp
933
}
934
 
935
proc get_compiler_info {binfile args} {
936
    # Create and source the file that provides information about the compiler
937
    # used to compile the test case.
938
    # Compiler_type can be null or c++. If null we assume c.
939
    global srcdir
940
    global subdir
941
    # These two come from compiler.c.
942
    global signed_keyword_not_used
943
    global gcc_compiled
944
 
945
    if {![istarget "hppa*-*-hpux*"]} {
946
        if { [llength $args] > 0 } {
947
            if {$args == "c++"} {
948
                if { [gdb_compile "${srcdir}/lib/compiler.cc" "${binfile}.ci" preprocess {}] != "" } {
949
                    perror "Couldn't make ${binfile}.ci file"
950
                    return 1;
951
                }
952
            }
953
        } else {
954
            if { [gdb_compile "${srcdir}/lib/compiler.c" "${binfile}.ci" preprocess {}] != "" } {
955
                perror "Couldn't make ${binfile}.ci file"
956
                return 1;
957
            }
958
        }
959
    } else {
960
        if { [llength $args] > 0 } {
961
            if {$args == "c++"} {
962
                if { [eval gdb_preprocess \
963
                        [list "${srcdir}/lib/compiler.cc" "${binfile}.ci"] \
964
                        $args] != "" } {
965
                    perror "Couldn't make ${binfile}.ci file"
966
                    return 1;
967
                }
968
            }
969
        } elseif { $args != "f77" } {
970
            if { [eval gdb_preprocess \
971
                    [list "${srcdir}/lib/compiler.c" "${binfile}.ci"] \
972
                    $args] != "" } {
973
                perror "Couldn't make ${binfile}.ci file"
974
                return 1;
975
            }
976
        }
977
    }
978
 
979
    uplevel \#0 { set gcc_compiled 0 }
980
 
981
    if { [llength $args] == 0 || $args != "f77" } {
982
        source ${binfile}.ci
983
    }
984
 
985
    # Most compilers will evaluate comparisons and other boolean
986
    # operations to 0 or 1.
987
    uplevel \#0 { set true 1 }
988
    uplevel \#0 { set false 0 }
989
 
990
    uplevel \#0 { set hp_cc_compiler 0 }
991
    uplevel \#0 { set hp_aCC_compiler 0 }
992
    uplevel \#0 { set hp_f77_compiler 0 }
993
    uplevel \#0 { set hp_f90_compiler 0 }
994
    if { !$gcc_compiled && [istarget "hppa*-*-hpux*"] } {
995
        # Check for the HP compilers
996
        set compiler [lindex [split [get_compiler $args] " "] 0]
997
        catch "exec what $compiler" output
998
        if [regexp ".*HP aC\\+\\+.*" $output] {
999
            uplevel \#0 { set hp_aCC_compiler 1 }
1000
            # Use of aCC results in boolean results being displayed as
1001
            # "true" or "false"
1002
            uplevel \#0 { set true true }
1003
            uplevel \#0 { set false false }
1004
        } elseif [regexp ".*HP C Compiler.*" $output] {
1005
            uplevel \#0 { set hp_cc_compiler 1 }
1006
        } elseif [regexp ".*HP-UX f77.*" $output] {
1007
            uplevel \#0 { set hp_f77_compiler 1 }
1008
        } elseif [regexp ".*HP-UX f90.*" $output] {
1009
            uplevel \#0 { set hp_f90_compiler 1 }
1010
        }
1011
    }
1012
 
1013
    return 0;
1014
}
1015
 
1016
proc get_compiler {args} {
1017
    global CC CC_FOR_TARGET CXX CXX_FOR_TARGET F77_FOR_TARGET
1018
 
1019
    if { [llength $args] == 0
1020
         || ([llength $args] == 1 && [lindex $args 0] == "") } {
1021
        set which_compiler "c"
1022
    } else {
1023
        if { $args =="c++" } {
1024
            set which_compiler "c++"
1025
        } elseif { $args =="f77" } {
1026
            set which_compiler "f77"
1027
        } else {
1028
            perror "Unknown compiler type supplied to gdb_preprocess"
1029
            return ""
1030
        }
1031
    }
1032
 
1033
    if [info exists CC_FOR_TARGET] {
1034
        if {$which_compiler == "c"} {
1035
            set compiler $CC_FOR_TARGET
1036
        }
1037
    }
1038
 
1039
    if [info exists CXX_FOR_TARGET] {
1040
        if {$which_compiler == "c++"} {
1041
            set compiler $CXX_FOR_TARGET
1042
        }
1043
    }
1044
 
1045
    if [info exists F77_FOR_TARGET] {
1046
        if {$which_compiler == "f77"} {
1047
            set compiler $F77_FOR_TARGET
1048
        }
1049
    }
1050
 
1051
    if { ![info exists compiler] } {
1052
        if { $which_compiler == "c" } {
1053
            if {[info exists CC]} {
1054
                set compiler $CC
1055
            }
1056
        }
1057
        if { $which_compiler == "c++" } {
1058
            if {[info exists CXX]} {
1059
                set compiler $CXX
1060
            }
1061
        }
1062
        if {![info exists compiler]} {
1063
            set compiler [board_info [target_info name] compiler];
1064
            if { $compiler == "" } {
1065
                perror "get_compiler: No compiler found"
1066
                return ""
1067
            }
1068
        }
1069
    }
1070
 
1071
    return $compiler
1072
}
1073
 
1074
proc gdb_preprocess {source dest args} {
1075
    set compiler [get_compiler "$args"]
1076
    if { $compiler == "" } {
1077
        return 1
1078
    }
1079
 
1080
    set cmdline "$compiler -E $source > $dest"
1081
 
1082
    verbose "Invoking $compiler -E $source > $dest"
1083
    verbose -log "Executing on local host: $cmdline" 2
1084
    set status [catch "exec ${cmdline}" exec_output]
1085
 
1086
    set result [prune_warnings $exec_output]
1087
    regsub "\[\r\n\]*$" "$result" "" result;
1088
    regsub "^\[\r\n\]*" "$result" "" result;
1089
    if { $result != "" } {
1090
        clone_output "gdb compile failed, $result"
1091
    }
1092
    return $result;
1093
}
1094
 
1095
proc gdb_compile {source dest type options} {
1096
    global GDB_TESTCASE_OPTIONS;
1097
 
1098
    if [target_info exists gdb_stub] {
1099
        set options2 { "additional_flags=-Dusestubs" }
1100
        lappend options "libs=[target_info gdb_stub]";
1101
        set options [concat $options2 $options]
1102
    }
1103
    if [target_info exists is_vxworks] {
1104
        set options2 { "additional_flags=-Dvxworks" }
1105
        lappend options "libs=[target_info gdb_stub]";
1106
        set options [concat $options2 $options]
1107
    }
1108
    if [info exists GDB_TESTCASE_OPTIONS] {
1109
        lappend options "additional_flags=$GDB_TESTCASE_OPTIONS";
1110
    }
1111
    verbose "options are $options"
1112
    verbose "source is $source $dest $type $options"
1113
 
1114
    set result [target_compile $source $dest $type $options];
1115
    regsub "\[\r\n\]*$" "$result" "" result;
1116
    regsub "^\[\r\n\]*" "$result" "" result;
1117
    if { $result != "" } {
1118
        clone_output "gdb compile failed, $result"
1119
    }
1120
    return $result;
1121
}
1122
 
1123
proc send_gdb { string } {
1124
    global suppress_flag;
1125
    if { $suppress_flag } {
1126
        return "suppressed";
1127
    }
1128
    return [remote_send host "$string"];
1129
}
1130
 
1131
#
1132
#
1133
 
1134
proc gdb_expect { args } {
1135
    # allow -notransfer expect flag specification,
1136
    # used by gdb_test routine for multi-line commands.
1137
    # packed with gtimeout when fed to remote_expect routine,
1138
    # which is a hack but due to what looks like a res and orig
1139
    # parsing problem in remote_expect routine (dejagnu/lib/remote.exp):
1140
    # what's fed into res is not removed from orig.
1141
    # - guo
1142
    if { [lindex $args 0] == "-notransfer" } {
1143
        set notransfer -notransfer;
1144
        set args [lrange $args 1 end];
1145
    } else {
1146
        set notransfer "";
1147
    }
1148
 
1149
    if { [llength $args] == 2  && [lindex $args 0] != "-re" } {
1150
        set gtimeout [lindex $args 0];
1151
        set expcode [list [lindex $args 1]];
1152
    } else {
1153
        upvar timeout timeout;
1154
 
1155
        set expcode $args;
1156
        if [target_info exists gdb,timeout] {
1157
            if [info exists timeout] {
1158
                if { $timeout < [target_info gdb,timeout] } {
1159
                    set gtimeout [target_info gdb,timeout];
1160
                } else {
1161
                    set gtimeout $timeout;
1162
                }
1163
            } else {
1164
                set gtimeout [target_info gdb,timeout];
1165
            }
1166
        }
1167
 
1168
        if ![info exists gtimeout] {
1169
            global timeout;
1170
            if [info exists timeout] {
1171
                set gtimeout $timeout;
1172
            } else {
1173
                # Eeeeew.
1174
                set gtimeout 60;
1175
            }
1176
        }
1177
    }
1178
    global suppress_flag;
1179
    global remote_suppress_flag;
1180
    if [info exists remote_suppress_flag] {
1181
        set old_val $remote_suppress_flag;
1182
    }
1183
    if [info exists suppress_flag] {
1184
        if { $suppress_flag } {
1185
            set remote_suppress_flag 1;
1186
        }
1187
    }
1188
    set code [catch \
1189
        {uplevel remote_expect host "$gtimeout $notransfer" $expcode} string];
1190
    if [info exists old_val] {
1191
        set remote_suppress_flag $old_val;
1192
    } else {
1193
        if [info exists remote_suppress_flag] {
1194
            unset remote_suppress_flag;
1195
        }
1196
    }
1197
 
1198
    if {$code == 1} {
1199
        global errorInfo errorCode;
1200
 
1201
        return -code error -errorinfo $errorInfo -errorcode $errorCode $string
1202
    } elseif {$code == 2} {
1203
        return -code return $string
1204
    } elseif {$code == 3} {
1205
        return
1206
    } elseif {$code > 4} {
1207
        return -code $code $string
1208
    }
1209
}
1210
 
1211
# gdb_expect_list MESSAGE SENTINEL LIST -- expect a sequence of outputs
1212
#
1213
# Check for long sequence of output by parts.
1214
# MESSAGE: is the test message to be printed with the test success/fail.
1215
# SENTINEL: Is the terminal pattern indicating that output has finished.
1216
# LIST: is the sequence of outputs to match.
1217
# If the sentinel is recognized early, it is considered an error.
1218
#
1219
# Returns:
1220
#    1 if the test failed,
1221
#    0 if the test passes,
1222
#   -1 if there was an internal error.
1223
#
1224
proc gdb_expect_list {test sentinel list} {
1225
    global gdb_prompt
1226
    global suppress_flag
1227
    set index 0
1228
    set ok 1
1229
    if { $suppress_flag } {
1230
        set ok 0
1231
    }
1232
    while { ${index} < [llength ${list}] } {
1233
        set pattern [lindex ${list} ${index}]
1234
        set index [expr ${index} + 1]
1235
        if { ${index} == [llength ${list}] } {
1236
            if { ${ok} } {
1237
                gdb_expect {
1238
                    -re "${pattern}${sentinel}" {
1239
                        pass "${test}, pattern ${index} + sentinel"
1240
                    }
1241
                    -re "${sentinel}" {
1242
                        fail "${test}, pattern ${index} + sentinel"
1243
                        set ok 0
1244
                    }
1245
                    timeout {
1246
                        fail "${test}, pattern ${index} + sentinel (timeout)"
1247
                        set ok 0
1248
                    }
1249
                }
1250
            } else {
1251
                unresolved "${test}, pattern ${index} + sentinel"
1252
            }
1253
        } else {
1254
            if { ${ok} } {
1255
                gdb_expect {
1256
                    -re "${pattern}" {
1257
                        pass "${test}, pattern ${index}"
1258
                    }
1259
                    -re "${sentinel}" {
1260
                        fail "${test}, pattern ${index}"
1261
                        set ok 0
1262
                    }
1263
                    timeout {
1264
                        fail "${test}, pattern ${index} (timeout)"
1265
                        set ok 0
1266
                    }
1267
                }
1268
            } else {
1269
                unresolved "${test}, pattern ${index}"
1270
            }
1271
        }
1272
    }
1273
    if { ${ok} } {
1274
        return 0
1275
    } else {
1276
        return 1
1277
    }
1278
}
1279
 
1280
#
1281
#
1282
proc gdb_suppress_entire_file { reason } {
1283
    global suppress_flag;
1284
 
1285
    warning "$reason\n";
1286
    set suppress_flag -1;
1287
}
1288
 
1289
#
1290
# Set suppress_flag, which will cause all subsequent calls to send_gdb and
1291
# gdb_expect to fail immediately (until the next call to
1292
# gdb_stop_suppressing_tests).
1293
#
1294
proc gdb_suppress_tests { args } {
1295
    global suppress_flag;
1296
 
1297
    return;  # fnf - disable pending review of results where
1298
             # testsuite ran better without this
1299
    incr suppress_flag;
1300
 
1301
    if { $suppress_flag == 1 } {
1302
        if { [llength $args] > 0 } {
1303
            warning "[lindex $args 0]\n";
1304
        } else {
1305
            warning "Because of previous failure, all subsequent tests in this group will automatically fail.\n";
1306
        }
1307
    }
1308
}
1309
 
1310
#
1311
# Clear suppress_flag.
1312
#
1313
proc gdb_stop_suppressing_tests { } {
1314
    global suppress_flag;
1315
 
1316
    if [info exists suppress_flag] {
1317
        if { $suppress_flag > 0 } {
1318
            set suppress_flag 0;
1319
            clone_output "Tests restarted.\n";
1320
        }
1321
    } else {
1322
        set suppress_flag 0;
1323
    }
1324
}
1325
 
1326
proc gdb_clear_suppressed { } {
1327
    global suppress_flag;
1328
 
1329
    set suppress_flag 0;
1330
}
1331
 
1332
proc gdb_start { } {
1333
    default_gdb_start
1334
}
1335
 
1336
proc gdb_exit { } {
1337
    catch default_gdb_exit
1338
}
1339
 
1340
#
1341
# gdb_load -- load a file into the debugger.
1342
#             return a -1 if anything goes wrong.
1343
#
1344
proc gdb_load { arg } {
1345
    return [gdb_file_cmd $arg]
1346
}
1347
 
1348
proc gdb_continue { function } {
1349
    global decimal
1350
 
1351
    return [gdb_test "continue" ".*Breakpoint $decimal, $function .*" "continue to $function"];
1352
}
1353
 
1354
proc default_gdb_init { args } {
1355
    gdb_clear_suppressed;
1356
 
1357
    # Uh, this is lame. Really, really, really lame. But there's this *one*
1358
    # testcase that will fail in random places if we don't increase this.
1359
    match_max -d 20000
1360
 
1361
    # We want to add the name of the TCL testcase to the PASS/FAIL messages.
1362
    if { [llength $args] > 0 } {
1363
        global pf_prefix
1364
 
1365
        set file [lindex $args 0];
1366
 
1367
        set pf_prefix "[file tail [file dirname $file]]/[file tail $file]:";
1368
    }
1369
    global gdb_prompt;
1370
    if [target_info exists gdb_prompt] {
1371
        set gdb_prompt [target_info gdb_prompt];
1372
    } else {
1373
        set gdb_prompt "\\(gdb\\)"
1374
    }
1375
}
1376
 
1377
proc gdb_init { args } {
1378
    return [eval default_gdb_init $args];
1379
}
1380
 
1381
proc gdb_finish { } {
1382
    gdb_exit;
1383
}
1384
 
1385
global debug_format
1386
set debug_format "unknown"
1387
 
1388
# Run the gdb command "info source" and extract the debugging format
1389
# information from the output and save it in debug_format.
1390
 
1391
proc get_debug_format { } {
1392
    global gdb_prompt
1393
    global verbose
1394
    global expect_out
1395
    global debug_format
1396
 
1397
    set debug_format "unknown"
1398
    send_gdb "info source\n"
1399
    gdb_expect 10 {
1400
        -re "Compiled with (.*) debugging format.\r\n$gdb_prompt $" {
1401
            set debug_format $expect_out(1,string)
1402
            verbose "debug format is $debug_format"
1403
            return 1;
1404
        }
1405
        -re "No current source file.\r\n$gdb_prompt $" {
1406
            perror "get_debug_format used when no current source file"
1407
            return 0;
1408
        }
1409
        -re "$gdb_prompt $" {
1410
            warning "couldn't check debug format (no valid response)."
1411
            return 1;
1412
        }
1413
        timeout {
1414
            warning "couldn't check debug format (timed out)."
1415
            return 1;
1416
        }
1417
    }
1418
}
1419
 
1420
# Like setup_xfail, but takes the name of a debug format (DWARF 1,
1421
# COFF, stabs, etc).  If that format matches the format that the
1422
# current test was compiled with, then the next test is expected to
1423
# fail for any target.  Returns 1 if the next test or set of tests is
1424
# expected to fail, 0 otherwise (or if it is unknown).  Must have
1425
# previously called get_debug_format.
1426
 
1427
proc setup_xfail_format { format } {
1428
    global debug_format
1429
 
1430
    if [string match $debug_format $format] then {
1431
        setup_xfail "*-*-*"
1432
        return 1;
1433
    }
1434
    return 0
1435
}
1436
 
1437
proc gdb_step_for_stub { } {
1438
    global gdb_prompt;
1439
 
1440
    if ![target_info exists gdb,use_breakpoint_for_stub] {
1441
        if [target_info exists gdb_stub_step_command] {
1442
            set command [target_info gdb_stub_step_command];
1443
        } else {
1444
            set command "step";
1445
        }
1446
        send_gdb "${command}\n";
1447
        set tries 0;
1448
        gdb_expect 60 {
1449
            -re "(main.* at |.*in .*start).*$gdb_prompt" {
1450
                return;
1451
            }
1452
            -re ".*$gdb_prompt" {
1453
                incr tries;
1454
                if { $tries == 5 } {
1455
                    fail "stepping out of breakpoint function";
1456
                    return;
1457
                }
1458
                send_gdb "${command}\n";
1459
                exp_continue;
1460
            }
1461
            default {
1462
                fail "stepping out of breakpoint function";
1463
                return;
1464
            }
1465
        }
1466
    }
1467
    send_gdb "where\n";
1468
    gdb_expect {
1469
        -re "main\[^\r\n\]*at \(\[^:]+\):\(\[0-9\]+\)" {
1470
            set file $expect_out(1,string);
1471
            set linenum [expr $expect_out(2,string) + 1];
1472
            set breakplace "${file}:${linenum}";
1473
        }
1474
        default {}
1475
    }
1476
    send_gdb "break ${breakplace}\n";
1477
    gdb_expect 60 {
1478
        -re "Breakpoint (\[0-9\]+) at.*$gdb_prompt" {
1479
            set breakpoint $expect_out(1,string);
1480
        }
1481
        -re "Breakpoint (\[0-9\]+): file.*$gdb_prompt" {
1482
            set breakpoint $expect_out(1,string);
1483
        }
1484
        default {}
1485
    }
1486
    send_gdb "continue\n";
1487
    gdb_expect 60 {
1488
        -re "Breakpoint ${breakpoint},.*$gdb_prompt" {
1489
            gdb_test "delete $breakpoint" ".*" "";
1490
            return;
1491
        }
1492
        default {}
1493
    }
1494
}
1495
 
1496
### gdb_get_line_number TEXT [FILE]
1497
###
1498
### Search the source file FILE, and return the line number of a line
1499
### containing TEXT.  Use this function instead of hard-coding line
1500
### numbers into your test script.
1501
###
1502
### Specifically, this function uses GDB's "search" command to search
1503
### FILE for the first line containing TEXT, and returns its line
1504
### number.  Thus, FILE must be a source file, compiled into the
1505
### executable you are running.  If omitted, FILE defaults to the
1506
### value of the global variable `srcfile'; most test scripts set
1507
### `srcfile' appropriately at the top anyway.
1508
###
1509
### Use this function to keep your test scripts independent of the
1510
### exact line numbering of the source file.  Don't write:
1511
###
1512
###   send_gdb "break 20"
1513
###
1514
### This means that if anyone ever edits your test's source file,
1515
### your test could break.  Instead, put a comment like this on the
1516
### source file line you want to break at:
1517
###
1518
###   /* breakpoint spot: frotz.exp: test name */
1519
###
1520
### and then write, in your test script (which we assume is named
1521
### frotz.exp):
1522
###
1523
###   send_gdb "break [gdb_get_line_number "frotz.exp: test name"]\n"
1524
###
1525
### (Yes, Tcl knows how to handle the nested quotes and brackets.
1526
### Try this:
1527
###     $ tclsh
1528
###     % puts "foo [lindex "bar baz" 1]"
1529
###     foo baz
1530
###     %
1531
### Tcl is quite clever, for a little stringy language.)
1532
 
1533
proc gdb_get_line_number {text {file /omitted/}} {
1534
    global gdb_prompt;
1535
    global srcfile;
1536
 
1537
    if {! [string compare $file /omitted/]} {
1538
        set file $srcfile
1539
    }
1540
 
1541
    set result -1;
1542
    gdb_test "list ${file}:1,1" ".*" ""
1543
    send_gdb "search ${text}\n"
1544
    gdb_expect {
1545
        -re "\[\r\n\]+(\[0-9\]+)\[ \t\].*${text}.*$gdb_prompt $" {
1546
            set result $expect_out(1,string)
1547
        }
1548
        -re ".*$gdb_prompt $" {
1549
            fail "find line number containing \"${text}\""
1550
        }
1551
        timeout {
1552
            fail "find line number containing \"${text}\" (timeout)"
1553
        }
1554
    }
1555
    return $result;
1556
}
1557
 
1558
# gdb_continue_to_end:
1559
#       The case where the target uses stubs has to be handled specially. If a
1560
#       stub is used, we set a breakpoint at exit because we cannot rely on
1561
#       exit() behavior of a remote target.
1562
#
1563
# mssg is the error message that gets printed.
1564
 
1565
proc gdb_continue_to_end {mssg} {
1566
  if [target_info exists use_gdb_stub] {
1567
    if {![gdb_breakpoint "exit"]} {
1568
      return 0
1569
    }
1570
    gdb_test "continue" "Continuing..*Breakpoint .*exit.*" \
1571
      "continue until exit at $mssg"
1572
  } else {
1573
    # Continue until we exit.  Should not stop again.
1574
    # Don't bother to check the output of the program, that may be
1575
    # extremely tough for some remote systems.
1576
    gdb_test "continue"\
1577
      "Continuing.\[\r\n0-9\]+Program exited normally\\..*"\
1578
      "continue until exit at $mssg"
1579
  }
1580
}
1581
 
1582
proc rerun_to_main {} {
1583
  global gdb_prompt
1584
 
1585
  if [target_info exists use_gdb_stub] {
1586
    gdb_run_cmd
1587
    gdb_expect {
1588
      -re ".*Breakpoint .*main .*$gdb_prompt $"\
1589
              {pass "rerun to main" ; return 0}
1590
      -re "$gdb_prompt $"\
1591
              {fail "rerun to main" ; return 0}
1592
      timeout {fail "(timeout) rerun to main" ; return 0}
1593
    }
1594
  } else {
1595
    send_gdb "run\n"
1596
    gdb_expect {
1597
      -re "Starting program.*$gdb_prompt $"\
1598
              {pass "rerun to main" ; return 0}
1599
      -re "$gdb_prompt $"\
1600
              {fail "rerun to main" ; return 0}
1601
      timeout {fail "(timeout) rerun to main" ; return 0}
1602
    }
1603
  }
1604
}
1605
 
1606
# Initializes the display for gdbtk testing.
1607
# Returns 1 if tests should run, 0 otherwise.
1608
proc gdbtk_initialize_display {} {
1609
  global _using_windows
1610
 
1611
  # This is hacky, but, we don't have much choice. When running
1612
  # expect under Windows, tcl_platform(platform) is "unix".
1613
  if {![info exists _using_windows]} {
1614
    set _using_windows [expr {![catch {exec cygpath --help}]}]
1615
  }
1616
 
1617
  if {![_gdbtk_xvfb_init]} {
1618
    if {$_using_windows} {
1619
      untested "No GDB_DISPLAY -- skipping tests"
1620
    } else {
1621
      untested "No GDB_DISPLAY or Xvfb -- skipping tests"
1622
    }
1623
 
1624
    return 0
1625
  }
1626
 
1627
  return 1
1628
}
1629
 
1630
# From dejagnu:
1631
# srcdir = testsuite src dir (e.g., devo/gdb/testsuite)
1632
# objdir = testsuite obj dir (e.g., gdb/testsuite)
1633
# subdir = subdir of testsuite (e.g., gdb.gdbtk)
1634
#
1635
# To gdbtk:
1636
# env(DEFS)=the "defs" files (e.g., devo/gdb/testsuite/gdb.gdbtk/defs)
1637
# env(SRCDIR)=directory containing the test code (e.g., *.test)
1638
# env(OBJDIR)=directory which contains any executables
1639
#            (e.g., gdb/testsuite/gdb.gdbtk)
1640
proc gdbtk_start {test} {
1641
  global verbose
1642
  global GDB
1643
  global GDBFLAGS
1644
  global env srcdir subdir objdir
1645
 
1646
  gdb_stop_suppressing_tests;
1647
 
1648
  verbose "Starting $GDB -nx -q --tclcommand=$test"
1649
 
1650
  set real_test [which $test]
1651
  if {$real_test == 0} {
1652
    perror "$test is not found"
1653
    exit 1
1654
  }
1655
 
1656
  if {![is_remote host]} {
1657
    if { [which $GDB] == 0 } {
1658
      perror "$GDB does not exist."
1659
      exit 1
1660
    }
1661
  }
1662
 
1663
  set wd [pwd]
1664
 
1665
  # Find absolute path to test
1666
  set test [to_tcl_path -abs $test]
1667
 
1668
  # Set environment variables for tcl libraries and such
1669
  cd $srcdir
1670
  set abs_srcdir [pwd]
1671
  set env(GDBTK_LIBRARY) [to_tcl_path -abs [file join $abs_srcdir .. gdbtk library]]
1672
  set env(TCL_LIBRARY) [to_tcl_path -abs [file join $abs_srcdir .. .. tcl library]]
1673
  set env(TK_LIBRARY) [to_tcl_path -abs [file join $abs_srcdir .. .. tk library]]
1674
  set env(TIX_LIBRARY) [to_tcl_path -abs [file join $abs_srcdir .. .. tix library]]
1675
  set env(ITCL_LIBRARY) [to_tcl_path -abs [file join $abs_srcdir .. .. itcl itcl library]]
1676
  set env(CYGNUS_GUI_LIBRARY) [to_tcl_path -abs [file join .. $abs_srcdir .. .. libgui library]]
1677
  set env(DEFS) [to_tcl_path -abs [file join $abs_srcdir $subdir defs]]
1678
 
1679
  cd $wd
1680
  cd [file join $objdir $subdir]
1681
  set env(OBJDIR) [pwd]
1682
  cd $wd
1683
 
1684
  # Set info about target into env
1685
  _gdbtk_export_target_info
1686
 
1687
  set env(SRCDIR) $abs_srcdir
1688
  set env(GDBTK_VERBOSE) 1
1689
  set env(GDBTK_LOGFILE) [to_tcl_path [file join $objdir gdb.log]]
1690
 
1691
  set err [catch {exec $GDB -nx -q --tclcommand=$test} res]
1692
  if { $err } {
1693
    perror "Execing $GDB failed: $res"
1694
    exit 1;
1695
  }
1696
  return $res
1697
}
1698
 
1699
# Start xvfb when using it.
1700
# The precedence is:
1701
#   1. If GDB_DISPLAY is set, use it
1702
#   2. If Xvfb exists, use it (not on cygwin)
1703
#   3. Skip tests
1704
proc _gdbtk_xvfb_init {} {
1705
  global env spawn_id _xvfb_spawn_id _using_windows
1706
 
1707
  if {[info exists env(GDB_DISPLAY)]} {
1708
    set env(DISPLAY) $env(GDB_DISPLAY)
1709
  } elseif {!$_using_windows && [which Xvfb] != 0} {
1710
    set screen ":[getpid]"
1711
    set pid [spawn  Xvfb $screen]
1712
    set _xvfb_spawn_id $spawn_id
1713
    set env(DISPLAY) $screen
1714
  } else {
1715
    # No Xvfb found -- skip test
1716
    return 0
1717
  }
1718
 
1719
  return 1
1720
}
1721
 
1722
# Kill xvfb
1723
proc _gdbtk_xvfb_exit {} {
1724
  global objdir subdir env _xvfb_spawn_id
1725
 
1726
  if {[info exists _xvfb_spawn_id]} {
1727
    exec kill [exp_pid -i $_xvfb_spawn_id]
1728
    wait -i $_xvfb_spawn_id
1729
  }
1730
}
1731
 
1732
# help proc for setting tcl-style paths from unix-style paths
1733
# pass "-abs" to make it an absolute path
1734
proc to_tcl_path {unix_path {arg {}}} {
1735
  global _using_windows
1736
 
1737
  if {[string compare $unix_path "-abs"] == 0} {
1738
    set unix_path $arg
1739
    set wd [pwd]
1740
    cd [file dirname $unix_path]
1741
    set dirname [pwd]
1742
    set unix_name [file join $dirname [file tail $unix_path]]
1743
    cd $wd
1744
  }
1745
 
1746
  if {$_using_windows} {
1747
    set unix_path [exec cygpath -aw $unix_path]
1748
    set unix_path [join [split $unix_path \\] /]
1749
  }
1750
 
1751
  return $unix_path
1752
}
1753
 
1754
# Set information about the target into the environment
1755
# variable TARGET_INFO. This array will contain a list
1756
# of commands that are necessary to run a target.
1757
#
1758
# This is mostly devined from how dejagnu works, what
1759
# procs are defined, and analyzing unix.exp, monitor.exp,
1760
# and sim.exp.
1761
#
1762
# Array elements exported:
1763
# Index   Meaning
1764
# -----   -------
1765
# init    list of target/board initialization commands
1766
# target  target command for target/board
1767
# load    load command for target/board
1768
# run     run command for target_board
1769
proc _gdbtk_export_target_info {} {
1770
  global env
1771
 
1772
  # Figure out what "target class" the testsuite is using,
1773
  # i.e., sim, monitor, native
1774
  if {[string compare [info proc gdb_target_monitor] gdb_target_monitor] == 0} {
1775
    # Using a monitor/remote target
1776
    set target monitor
1777
  } elseif {[string compare [info proc gdb_target_sim] gdb_target_sim] == 0} {
1778
    # Using a simulator target
1779
    set target simulator
1780
  } else {
1781
    # Assume native
1782
    set target native
1783
  }
1784
 
1785
  # Now setup the array to be exported.
1786
  set info(init) {}
1787
  set info(target) {}
1788
  set info(load) {}
1789
  set info(run) {}
1790
 
1791
  switch $target {
1792
    simulator {
1793
      set opts "[target_info gdb,target_sim_options]"
1794
      set info(target) "target sim $opts"
1795
      set info(load) "load"
1796
      set info(run) "run"
1797
    }
1798
 
1799
    monitor {
1800
      # Setup options for the connection
1801
      if {[target_info exists baud]} {
1802
        lappend info(init) "set remotebaud [target_info baud]"
1803
      }
1804
      if {[target_info exists binarydownload]} {
1805
        lappend info(init) "set remotebinarydownload [target_info binarydownload]"
1806
      }
1807
      if {[target_info exists disable_x_packet]} {
1808
        lappend info(init) "set remote X-packet disable"
1809
      }
1810
      if {[target_info exists disable_z_packet]} {
1811
        lappend info(init) "set remote Z-packet disable"
1812
      }
1813
 
1814
      # Get target name and connection info
1815
      if {[target_info exists gdb_protocol]} {
1816
        set targetname "[target_info gdb_protocol]"
1817
      } else {
1818
        set targetname "not_specified"
1819
      }
1820
      if {[target_info exists gdb_serial]} {
1821
        set serialport "[target_info gdb_serial]"
1822
      } elseif {[target_info exists netport]} {
1823
        set serialport "[target_info netport]"
1824
      } else {
1825
        set serialport "[target_info serial]"
1826
      }
1827
 
1828
      set info(target) "target $targetname $serialport"
1829
      set info(load) "load"
1830
      set info(run) "continue"
1831
    }
1832
 
1833
    native {
1834
      set info(run) "run"
1835
    }
1836
  }
1837
 
1838
  # Export the array to the environment
1839
  set env(TARGET_INFO) [array get info]
1840
}
1841
 
1842
# gdbtk tests call this function to print out the results of the
1843
# tests. The argument is a proper list of lists of the form:
1844
# {status name description msg}. All of these things typically
1845
# come from the testsuite harness.
1846
proc gdbtk_analyze_results {results} {
1847
  foreach test $results {
1848
    set status [lindex $test 0]
1849
    set name [lindex $test 1]
1850
    set description [lindex $test 2]
1851
    set msg [lindex $test 3]
1852
 
1853
    switch $status {
1854
      PASS {
1855
        pass "$description ($name)"
1856
      }
1857
 
1858
      FAIL {
1859
        fail "$description ($name)"
1860
      }
1861
 
1862
      ERROR {
1863
        perror "$name"
1864
      }
1865
 
1866
      XFAIL {
1867
        xfail "$description ($name)"
1868
      }
1869
 
1870
      XPASS {
1871
        xpass "$description ($name)"
1872
      }
1873
    }
1874
  }
1875
}
1876
 
1877
proc gdbtk_done {{results {}}} {
1878
  global _xvfb_spawn_id
1879
  gdbtk_analyze_results $results
1880
 
1881
  # Kill off xvfb if using it
1882
  if {[info exists _xvfb_spawn_id]} {
1883
    _gdbtk_xvfb_exit
1884
  }
1885
}
1886
 
1887
# Print a message and return true if a test should be skipped
1888
# due to lack of floating point suport.
1889
 
1890
proc gdb_skip_float_test { msg } {
1891
    if [target_info exists gdb,skip_float_tests] {
1892
        verbose "Skipping test '$msg': no float tests.";
1893
        return 1;
1894
    }
1895
    return 0;
1896
}
1897
 
1898
# Print a message and return true if a test should be skipped
1899
# due to lack of stdio support.
1900
 
1901
proc gdb_skip_stdio_test { msg } {
1902
    if [target_info exists gdb,noinferiorio] {
1903
        verbose "Skipping test '$msg': no inferior i/o.";
1904
        return 1;
1905
    }
1906
    return 0;
1907
}
1908
 
1909
proc gdb_skip_bogus_test { msg } {
1910
    return 0;
1911
}
1912
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.