*** empty log message ***
[binutils-gdb.git] / gas / testsuite / lib / gas-defs.exp
index 773158e688ae7dbfdc69a7698a7dd2d863b0ecb1..e7be7ea1a67792bc4da583c31f6ab340b2303856 100644 (file)
@@ -56,7 +56,7 @@ proc gas_start { prog as_opts } {
 
     verbose "Starting $AS $ASFLAGS $as_opts $prog" 2
     catch {
-       spawn -noecho -nottyinit $srcdir/lib/run $AS $ASFLAGS $as_opts $srcdir/$subdir/$prog
+       spawn -noecho -nottycopy $srcdir/lib/run $AS $ASFLAGS $as_opts $srcdir/$subdir/$prog
     } foo
     if ![regexp {^[0-9]+} $foo] then {
        perror "Can't run $subdir/$prog: $foo"
@@ -109,7 +109,7 @@ proc gas_test { file as_opts var_opts testname } {
            if [expr $i&$num] then {
                set extra_opts "$extra_opts $opt($bit)"
                if $ignore_stdout($bit) then {
-                   set maybe_ignore_stdout "1>/dev/null"
+                   set maybe_ignore_stdout ">/dev/null"
                }
            }
        }
@@ -131,14 +131,14 @@ proc gas_test { file as_opts var_opts testname } {
 proc gas_test_ignore_stdout { file as_opts testname } {
     global comp_output
 
-    gas_run $file $as_opts "2>&1 1>/dev/null"
+    gas_run $file $as_opts ">/dev/null"
     want_no_output $testname
 }
 
 proc gas_test_error { file as_opts testname } {
     global comp_output
 
-    gas_run $file $as_opts "2>&1 1>/dev/null"
+    gas_run $file $as_opts ">/dev/null"
     if ![string match "" $comp_output] then {
        send_log "$comp_output\n"
        verbose "$comp_output" 3
@@ -186,28 +186,41 @@ proc fail_phase { name phase opts } {
 # assembly source, and a .d file containing the expected output from
 # objdump or nm or whatever, and leading comments indicating any options
 # to be passed to the assembler or dump program.
+
 proc run_dump_test { name } {
     global subdir srcdir
     global OBJDUMP NM AS
     global OBJDUMPFLAGS NMFLAGS ASFLAGS
 
-    set file "$srcdir/$subdir/$name"
+    if [string match "*/*" $name] {
+       set file $name
+       set name [file tail $name]
+    } else {
+       set file "$srcdir/$subdir/$name"
+    }
     set opt_array [slurp_options "${file}.d"]
+    if { $opt_array == -1 } {
+       unresolved $subdir/$name
+       return
+    }
     set opts(as) {}
     set opts(objdump) {}
     set opts(nm) {}
     set opts(name) {}
     set opts(PROG) {}
+    set opts(source) {}
 
     foreach i $opt_array {
        set opt_name [lindex $i 0]
        set opt_val [lindex $i 1]
        if ![info exists opts($opt_name)] {
            perror "unknown option $opt_name in file $file.d"
+           unresolved $subdir/$name
            return
        }
        if [string length $opts($opt_name)] {
            perror "option $opt_name multiply set in $file.d"
+           unresolved $subdir/$name
            return
        }
        set opts($opt_name) $opt_val
@@ -221,6 +234,7 @@ proc run_dump_test { name } {
                { set program nm }
            default
                { perror "unrecognized program option $opts(PROG) in $file.d"
+                 unresolved $subdir/$name
                  return }
        }
     } elseif {$opts(objdump) == "" && $opts(nm) != ""} {
@@ -229,14 +243,25 @@ proc run_dump_test { name } {
        set program objdump
     } else {
        perror "dump program unspecified in $file.d"
+       unresolved $subdir/$name
        return
     }
     set progopts1 $opts($program)
     eval set progopts \$[string toupper $program]FLAGS
     eval set program \$[string toupper $program]
-    if { $opts(name) == "" } { set testname "$subdir/$name" } else { set testname $opts(name) }
+    if { $opts(name) == "" } {
+       set testname "$subdir/$name"
+    } else {
+       set testname $opts(name)
+    }
 
-    catch "exec $srcdir/lib/run $AS $ASFLAGS $opts(as) ${file}.s" comp_output
+    if { $opts(source) == "" } {
+       set sourcefile ${file}.s
+    } else {
+       set sourcefile $srcdir/$subdir/$opts(source)
+    }
+
+    catch "exec $srcdir/lib/run $AS $ASFLAGS $opts(as) $sourcefile" comp_output
 
     if ![string match "" $comp_output] then {
        send_log "$comp_output\n"
@@ -245,11 +270,14 @@ proc run_dump_test { name } {
        return
     }
 
-    if [catch "exec $program -r > dump.out" comp_output] {
-       fail_phase $testname {running objdump} {-r}
+    if { $progopts1 == "" } { set $progopts1 "-r" }
+    verbose "running $program $progopts $progopts1" 3
+    if [catch "exec $program $progopts $progopts1 > dump.out" comp_output] {
+       fail_phase $testname {running objdump} "$progopts $progopts1"
        return
     }
 
+    verbose_eval {[file_contents "dump.out"]} 3
     if { [regexp_diff "dump.out" "${file}.d"] } then {
        fail_phase $testname {checking output} "$ASFLAGS $opts(as)"
        return
@@ -260,7 +288,9 @@ proc run_dump_test { name } {
 
 proc slurp_options { file } {
     if [catch { set f [open $file r] } x] {
-       perror "couldn't open `$file': $x"
+       #perror "couldn't open `$file': $x"
+       perror "$x"
+       return -1
     }
     set opt_array {}
     # whitespace expression
@@ -268,7 +298,7 @@ proc slurp_options { file } {
     set nws {[^        ]*}
     # whitespace is ignored anywhere except within the options list;
     # option names are alphabetic only
-    set pat "^#${ws}(\[a-zA-Z\]*)$ws:${ws}($nws)$ws\$"
+    set pat "^#${ws}(\[a-zA-Z\]*)$ws:${ws}(.*)$ws\$"
     while { [gets $f line] != -1 } {
        set line [string trim $line]
        # Whitespace here is space-tab.
@@ -312,7 +342,11 @@ proc objdump_finish { } {
     catch "wait"
 }
 
-expect_after {
+# Default timeout is 10 seconds, loses on a slow machine.  But some
+# configurations of dejagnu may override it.
+if {$timeout<120} then { set timeout 120 }
+
+expect_after -i {
     timeout                    { perror "timeout" }
     "virtual memory exhausted" { perror "virtual memory exhausted" }
     buffer_full                        { perror "buffer full" }
@@ -366,12 +400,14 @@ proc regexp_diff { file_1 file_2 } {
        if { $end } { break }
        verbose "regexp \"^$line_b$\"\nline   \"$line_a\"" 3
        if ![regexp "^$line_b$" "$line_a"] {
-               verbose "no match" 3
+               send_log "regexp_diff match failure\n"
+               send_log "regexp \"^$line_b$\"\nline   \"$line_a\"\n"
                set differences 1
        }
     }
 
     if { $differences == 0 && [eof $file_a] != [eof $file_b] } {
+       send_log "different lengths\n"
        verbose "different lengths" 3
        set differences 1
     }
@@ -381,3 +417,15 @@ proc regexp_diff { file_1 file_2 } {
 
     return $differences
 }
+
+proc file_contents { filename } {
+    set file [open $filename r]
+    set contents [read $file]
+    close $file
+    return $contents
+}
+
+proc verbose_eval { expr { level 1 } } {
+    global verbose
+    if $verbose>$level then { eval verbose "$expr" $level }
+}