1*b725ae77Skettenisproc gdb_emc_readvar { varname } {
2*b725ae77Skettenis    global gdb_prompt;
3*b725ae77Skettenis
4*b725ae77Skettenis    set result -1;
5*b725ae77Skettenis    send_gdb "print $varname\n"
6*b725ae77Skettenis    gdb_expect 5 {
7*b725ae77Skettenis	-re "\[$\].*= (\[0-9\]+).*$gdb_prompt $" {
8*b725ae77Skettenis	    set result $expect_out(1,string);
9*b725ae77Skettenis	}
10*b725ae77Skettenis	-re "$gdb_prompt $" { }
11*b725ae77Skettenis	default { }
12*b725ae77Skettenis    }
13*b725ae77Skettenis    return $result;
14*b725ae77Skettenis}
15*b725ae77Skettenis
16*b725ae77Skettenisproc gdb_emc_gettpnum { testname } {
17*b725ae77Skettenis    global gdb_prompt;
18*b725ae77Skettenis
19*b725ae77Skettenis    if { $testname != "" } {
20*b725ae77Skettenis	gdb_test "trace $testname" "" ""
21*b725ae77Skettenis    }
22*b725ae77Skettenis    return [gdb_emc_readvar "\$tpnum"];
23*b725ae77Skettenis}
24*b725ae77Skettenis
25*b725ae77Skettenisproc gdb_emc_setactions { testname actionname args } {
26*b725ae77Skettenis    global gdb_prompt;
27*b725ae77Skettenis
28*b725ae77Skettenis    set state 0;
29*b725ae77Skettenis    set status "pass";
30*b725ae77Skettenis    send_gdb "actions $actionname\n";
31*b725ae77Skettenis    set expected_result "";
32*b725ae77Skettenis    gdb_expect 5 {
33*b725ae77Skettenis	-re "No tracepoint number .*$gdb_prompt $" {
34*b725ae77Skettenis	    fail $testname
35*b725ae77Skettenis	    return 1;
36*b725ae77Skettenis	}
37*b725ae77Skettenis	-re "Enter actions for tracepoint $actionname.*>" {
38*b725ae77Skettenis	    if { [llength $args] > 0 } {
39*b725ae77Skettenis		set lastcommand "[lindex $args $state]";
40*b725ae77Skettenis		send_gdb "[lindex $args $state]\n";
41*b725ae77Skettenis		incr state;
42*b725ae77Skettenis		set expected_result [lindex $args $state];
43*b725ae77Skettenis		incr state;
44*b725ae77Skettenis	    } else {
45*b725ae77Skettenis		send_gdb "end\n";
46*b725ae77Skettenis	    }
47*b725ae77Skettenis	    exp_continue;
48*b725ae77Skettenis	}
49*b725ae77Skettenis	-re "\(.*\[\r\n\]+)\[ \t]*> $" {
50*b725ae77Skettenis	    if { $expected_result != "" } {
51*b725ae77Skettenis		# Remove echoed command and its associated newline.
52*b725ae77Skettenis		regsub "^\[^\r\n\]+\[\r\n\]+" "$expect_out(1,string)" "" out;
53*b725ae77Skettenis		# Strip off any newlines at the end of the string.
54*b725ae77Skettenis		regsub "\[\r\n\]+$" "$out" "" out;
55*b725ae77Skettenis		verbose "expected '$expected_result', got '$out', expect_out is '$expect_out(1,string)'";
56*b725ae77Skettenis		if ![regexp $expected_result $out] {
57*b725ae77Skettenis		    set status "fail";
58*b725ae77Skettenis		}
59*b725ae77Skettenis		set expected_result "";
60*b725ae77Skettenis	    }
61*b725ae77Skettenis	    if { $state < [llength $args] } {
62*b725ae77Skettenis		send_gdb "[lindex $args $state]\n";
63*b725ae77Skettenis		incr state;
64*b725ae77Skettenis		set expected_result [lindex $args $state];
65*b725ae77Skettenis		incr state;
66*b725ae77Skettenis	    } else {
67*b725ae77Skettenis		send_gdb "end\n";
68*b725ae77Skettenis		set expected_result "";
69*b725ae77Skettenis	    }
70*b725ae77Skettenis	    exp_continue;
71*b725ae77Skettenis	}
72*b725ae77Skettenis	-re "\(.*\)$gdb_prompt $" {
73*b725ae77Skettenis	    if { $expected_result != "" } {
74*b725ae77Skettenis		if ![regexp $expected_result $expect_out(1,string)] {
75*b725ae77Skettenis		    set status "fail";
76*b725ae77Skettenis		}
77*b725ae77Skettenis		set expected_result "";
78*b725ae77Skettenis	    }
79*b725ae77Skettenis	    if { [llength $args] < $state } {
80*b725ae77Skettenis		set status "fail";
81*b725ae77Skettenis	    }
82*b725ae77Skettenis	}
83*b725ae77Skettenis	default {
84*b725ae77Skettenis	    set status "fail";
85*b725ae77Skettenis	}
86*b725ae77Skettenis    }
87*b725ae77Skettenis    if { $testname != "" } {
88*b725ae77Skettenis	$status $testname;
89*b725ae77Skettenis    }
90*b725ae77Skettenis    if { $status == "pass" } then {
91*b725ae77Skettenis	return 0;
92*b725ae77Skettenis    } else {
93*b725ae77Skettenis	return 1;
94*b725ae77Skettenis    }
95*b725ae77Skettenis}
96*b725ae77Skettenis
97*b725ae77Skettenis#
98*b725ae77Skettenis# test collect command
99*b725ae77Skettenis#
100*b725ae77Skettenis
101*b725ae77Skettenisproc gdb_emc_tracetest_collect { arg1 msgstring } {
102*b725ae77Skettenis    global decimal
103*b725ae77Skettenis    global gdb_prompt;
104*b725ae77Skettenis
105*b725ae77Skettenis    set teststate 0
106*b725ae77Skettenis    gdb_expect 30 {
107*b725ae77Skettenis        -re "Enter actions for tracepoint $decimal.*> $" {
108*b725ae77Skettenis            send_gdb "collect $arg1\n"
109*b725ae77Skettenis            incr teststate;
110*b725ae77Skettenis            exp_continue
111*b725ae77Skettenis        }
112*b725ae77Skettenis        -re "> $" {
113*b725ae77Skettenis            if { $teststate == 1 } {
114*b725ae77Skettenis                send_gdb "end\n"
115*b725ae77Skettenis		incr teststate;
116*b725ae77Skettenis                exp_continue
117*b725ae77Skettenis            } else {
118*b725ae77Skettenis                fail "$msgstring"
119*b725ae77Skettenis            }
120*b725ae77Skettenis        }
121*b725ae77Skettenis        -re ".*$gdb_prompt $" {
122*b725ae77Skettenis            if { $teststate == 2 } {
123*b725ae77Skettenis                pass "$msgstring";
124*b725ae77Skettenis            } else {
125*b725ae77Skettenis                fail "$msgstring";
126*b725ae77Skettenis            }
127*b725ae77Skettenis        }
128*b725ae77Skettenis        default {
129*b725ae77Skettenis            fail "$msgstring (default)";
130*b725ae77Skettenis        }
131*b725ae77Skettenis    }
132*b725ae77Skettenis    regsub -all "(\[($@*+)\])" "collect $arg1" "\[\\1\]" arg1_regexp;
133*b725ae77Skettenis    gdb_test "info tracepoints" ".*$arg1_regexp.*" "$msgstring info tracepoint"
134*b725ae77Skettenis}
135*b725ae77Skettenis
136*b725ae77Skettenisproc gdb_delete_tracepoints { } {
137*b725ae77Skettenis    global gdb_prompt;
138*b725ae77Skettenis
139*b725ae77Skettenis    send_gdb "delete tracepoints\n"
140*b725ae77Skettenis    gdb_expect 30 {
141*b725ae77Skettenis	-re "Delete all tracepoints.*y or n.*$" {
142*b725ae77Skettenis	    send_gdb "y\n"
143*b725ae77Skettenis	    exp_continue;
144*b725ae77Skettenis	}
145*b725ae77Skettenis	-re "$gdb_prompt $" { }
146*b725ae77Skettenis	timeout { fail "delete all tracepoints (timeout)" }
147*b725ae77Skettenis    }
148*b725ae77Skettenis}
149*b725ae77Skettenis
150*b725ae77Skettenis
151*b725ae77Skettenis# Send each command in the list CMDLIST to gdb. If we see the string
152*b725ae77Skettenis# "error" or "warning" from gdb, we assume an error has occured and
153*b725ae77Skettenis# return a non-zero result. All of the commands in CMDLIST are always
154*b725ae77Skettenis# sent, even if an error occurs.
155*b725ae77Skettenis# If TESTNAME is non-null, we call pass or fail with the string in TESTNAME
156*b725ae77Skettenis# depending on whether or not an error/warning has occurred.
157*b725ae77Skettenis#
158*b725ae77Skettenisproc gdb_do_cmdlist { cmdlist testname } {
159*b725ae77Skettenis    global gdb_prompt;
160*b725ae77Skettenis
161*b725ae77Skettenis    set status 0;
162*b725ae77Skettenis
163*b725ae77Skettenis    foreach x $cmdlist {
164*b725ae77Skettenis	send_gdb "$x\n";
165*b725ae77Skettenis	gdb_expect 60 {
166*b725ae77Skettenis	    -re "\[Ee\]rror|\[Ww\]arning" {
167*b725ae77Skettenis		set status 1;
168*b725ae77Skettenis		exp_continue;
169*b725ae77Skettenis	    }
170*b725ae77Skettenis	    -re "$gdb_prompt $" { }
171*b725ae77Skettenis	    -re "\[\r\n\]\[ \t\]*> *$" { }
172*b725ae77Skettenis	}
173*b725ae77Skettenis    }
174*b725ae77Skettenis    if { $testname != "" } {
175*b725ae77Skettenis	if { $status == 0 } {
176*b725ae77Skettenis	    pass "$testname";
177*b725ae77Skettenis	} else {
178*b725ae77Skettenis	    fail "$testname";
179*b725ae77Skettenis	}
180*b725ae77Skettenis    }
181*b725ae77Skettenis    return $status;
182*b725ae77Skettenis}
183*b725ae77Skettenis
184*b725ae77Skettenis#
185*b725ae77Skettenis# Given the file FILENAME, we read it as a list of commands and generate
186*b725ae77Skettenis# a list suitable for use by gdb_do_cmdlist. Lines beginning with # are
187*b725ae77Skettenis# ignored; blank lines are interpreted as empty lines to be sent to gdb.
188*b725ae77Skettenis#
189*b725ae77Skettenisproc gdb_process_cmdfile { filename } {
190*b725ae77Skettenis    set id [open $filename "r"];
191*b725ae77Skettenis    if { $id < 0 } {
192*b725ae77Skettenis	return "";
193*b725ae77Skettenis    }
194*b725ae77Skettenis    set result {};
195*b725ae77Skettenis    while { [gets $id line] >= 0 } {
196*b725ae77Skettenis	if [regexp "^#" $line] {
197*b725ae77Skettenis	    continue;
198*b725ae77Skettenis	}
199*b725ae77Skettenis	set result [concat $result [list "$line"]];
200*b725ae77Skettenis    }
201*b725ae77Skettenis    close $id;
202*b725ae77Skettenis    return $result;
203*b725ae77Skettenis}
204*b725ae77Skettenis
205*b725ae77Skettenis# gdb_find_c_test_baseline
206*b725ae77Skettenis# returns -1 on failure (CALLER MUST CHECK RETURN!)
207*b725ae77Skettenisproc gdb_find_c_test_baseline { } {
208*b725ae77Skettenis    global gdb_prompt;
209*b725ae77Skettenis
210*b725ae77Skettenis    set gdb_c_test_baseline -1;
211*b725ae77Skettenis
212*b725ae77Skettenis    send_gdb "list gdb_c_test\n"
213*b725ae77Skettenis    gdb_expect {
214*b725ae77Skettenis	-re "void.*p5,.*void.*p6.*\[\r\n\](\[0-9\]+)\[\t \]+\{.*$gdb_prompt $" {
215*b725ae77Skettenis	    set gdb_c_test_baseline $expect_out(1,string)
216*b725ae77Skettenis	}
217*b725ae77Skettenis	-re "$gdb_prompt $" { }
218*b725ae77Skettenis	default { }
219*b725ae77Skettenis    }
220*b725ae77Skettenis    return $gdb_c_test_baseline;
221*b725ae77Skettenis}
222*b725ae77Skettenis
223*b725ae77Skettenis
224