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