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