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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libjava/] [testsuite/] [libjava.mauve/] [mauve.exp] - Rev 765

Compare with Previous | Blame | View Log

# Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software Foundation.
# Written by Tom Tromey <tromey@cygnus.com>.
# Incorporate Mauve into libjava's DejaGNU test suite framework.

# FIXME: should be able to compile from source as well as from .class.


# Compute list of files to compile.  Returns list of all files
# representing classes that must be tested.  Result parameter `uses'
# maps source file names onto list of objects required for link.
proc mauve_compute_uses {aName} {
  upvar $aName uses
  global env runtests

  set fd [open classes r]
  set line [read $fd]
  close $fd

  foreach item [split $line] {
    if {$item == ""} then {
      continue
    }
    set item [join [split $item .] /].java

    # User might have specified "mauve.exp=something.java".
    if {! [runtest_file_p $runtests $item]} {
      continue
    }

    # Look for Uses line in source file.
    set fd [open $env(MAUVEDIR)/$item r]
    set ufiles [list $item]
    set dir [file dirname $item]
    while {[gets $fd sline] != -1} {
      if {[regsub -- {^// Uses:} $sline {} sline]} then {
        foreach uf [split $sline] {
          if {$uf != ""} then {
            lappend ufiles $dir/$uf
          }
        }
      }
    }
    close $fd

    set uses($item) {}
    foreach file $ufiles {
      set file [file rootname $file].o
      lappend uses($item) $file
      # Now add all inner classes
      foreach inner [glob -nocomplain [file rootname $file]$*.class] {
        # Prevent excessive escaping by replacing $ with a ^ in the .o name
        set inner [file rootname $inner].o
        regsub -all "\\$" $inner "\^" inner
        lappend uses($item) $inner
      }
    }
  }

  return [lsort [array names uses]]
}

# Find Mauve sources.  At end, env(MAUVEDIR) points to sources.
# Returns 0 if sources not found, 1 otherwise.
proc find_mauve_sources {} {
  global env srcdir

  if {[info exists env(MAUVEDIR)]} {
    return 1
  } elseif {[file isdirectory $srcdir/libjava.mauve/mauve]} {
    set env(MAUVEDIR) $srcdir/libjava.mauve/mauve
    return 1
  }

  return 0
}

# Find all the harness files and return a list of them, with no
# suffix.
proc mauve_find_harness_files {} {
  set result {}
  foreach file [glob -nocomplain -- *.class gnu/testlet/*.class] {
    lappend result [file root $file]
  }
  return $result
}

# Run all the Mauve tests.  Return 1 on success, 0 on any failure.  If
# the tests are skipped, that is treated like success.
proc test_mauve {} {
  global srcdir objdir subdir env

  if {! [find_mauve_sources]} then {
    verbose "MAUVEDIR not set; not running Mauve tests"
    return 1
  }

  # Run in subdir so we don't overwrite our own Makefile.
  catch {system "rm -rf mauve-build"}
  file mkdir mauve-build
  # Some weirdness to set srcdir correctly.
  set here [pwd]
  cd $srcdir
  set full_srcdir [pwd]
  cd $here/mauve-build

  global env libgcj_jar
  global GCJ_UNDER_TEST
  global TOOL_EXECUTABLE

  if ![info exists GCJ_UNDER_TEST] {
    if [info exists TOOL_EXECUTABLE] {
      set GCJ_UNDER_TEST $TOOL_EXECUTABLE;
    } else {
      if [info exists env(GCJ)] {
        set GCJ_UNDER_TEST env(GCJ)
      } else {
        set GCJ_UNDER_TEST "[find_gcj]"
      }
    }
  }

  # Append -B and -I so that libgcj.spec and libgcj.jar are found
  # before they're installed.
  # Append -Wno-deprecated since Mauve tests lots of deprecated stuff.
  set env(GCJ) "$GCJ_UNDER_TEST -Wno-deprecated -B$objdir/../ -I$libgcj_jar"

  if {[catch {
    system "$env(MAUVEDIR)/configure --with-gcj 2>&1"
  } msg]} then {
    fail "Mauve configure"
    verbose "configure failed with $msg"
    return 0
  }
  pass "Mauve configure"

  # Copy appropriate tags file locally.
  set fd [open $full_srcdir/../mauve-libgcj r]
  set c [read $fd]
  close $fd
  set fd [open mauve-libgcj w]
  puts -nonewline $fd $c
  close $fd

  catch {system "ln -s $full_srcdir/libjava.mauve/xfails xfails"}

  if {[catch {
    system "make KEYS=libgcj classes.stamp 2>&1"
  } msg]} then {
    fail "Mauve build"
    verbose "build failed with $msg"
    return 0
  }
  pass "Mauve build"

  set srcfile $full_srcdir/$subdir/DejaGNUTestHarness.java
  if {! [bytecompile_file $srcfile [pwd] $env(MAUVEDIR):[pwd]]} then {
    fail "Compile DejaGNUTestHarness.java"
    return 0
  }
  pass "Compile DejaGNUTestHarness.java"

  # Compute list of files to test, and also all files to build.
  set choices [mauve_compute_uses uses]

  # Compute flags to use to do the build.
  set compile_args [libjava_arguments]
  set link_args [concat [libjava_arguments link] \
                   [list "additional_flags=--main=DejaGNUTestHarness"]]

  if {[string match "*libtool*" $compile_args]} {
    set objext lo
  } else {
    set objext o
  }

  set ok 1
  set objlist {}
  foreach base [mauve_find_harness_files] {
    set file $base.class
    set obj $base.$objext
    set x [libjava_prune_warnings \
             [target_compile [pwd]/$file $obj object $compile_args]]
    if {$x != ""} then {
      fail "Compile $obj"
      set ok 0
    } else {
      pass "Compile $obj"
    }
    lappend objlist $obj
  }
  if {! $ok} then {
    return 0
  }

  set proc_ok 1
  set Executable DejaGNUTestHarness
  foreach file $choices {
    # Turn `java/lang/Foo.java' into `java.lang.Foo'.
    set class [file rootname $file]
    regsub -all -- / $class . class

    set ok 1
    set this_olist {}
    foreach obj $uses($file) {
      set obj [file rootname $obj].$objext
      lappend this_olist $obj
      if {! [file exists $obj]} then {
        verbose "compiling $obj for test of $class"
        # The .class file does contain a $, but we can quote it between "'"s.
        set srcfile [file rootname $obj].class
        regsub -all "\\^" $srcfile "\$" srcfile
        set x [libjava_prune_warnings \
                 [libjava_tcompile '[pwd]/$srcfile' $obj object $compile_args]]
        if {$x != ""} then {
          fail "Compile $obj for $class"
          set ok 0
          break
        }
        pass "Compile $obj for $class"
      }
    }
    if {! $ok} then {
      set proc_ok 0
      continue
    }

    set x [libjava_prune_warnings \
             [libjava_tcompile [concat $this_olist $objlist] \
                $Executable executable $link_args]]
    if {$x != ""} then {
      set proc_ok 0
      fail "Link for $class"
      continue
    }
    pass "Link for $class"

    set result [libjava_load [pwd]/DejaGNUTestHarness \
                  "$env(MAUVEDIR) $class" ""]

    # Extract pass/failure info from output.
    foreach line [split [lindex $result 1] \n] {
      if {[regexp -- {^(PASS|FAIL|XFAIL|XPASS): (.*)$} $line ignore what msg]} then {
        if {$what == "XFAIL" || $what == "XPASS"} then {
          setup_xfail *-*-*
        }
        if {$what == "PASS" || $what == "XPASS"} then {
          pass $msg
        } else {
          set proc_ok 0
          fail $msg
        }
      }
    }
  }

  return $proc_ok
}

# Run all the Mauve tests in a sim environment.  In this case, the
# program cannot use argv[] because there's no way to pass in the
# command line, so tha name of the class to test is substituted by
# patching the source of the DejaGNUTestHarness.  Return 1 on success,
# 0 on any failure.  If the tests are skipped, that is treated like
# success.
proc test_mauve_sim {} {
  global srcdir subdir env

  if {! [find_mauve_sources]} then {
    verbose "MAUVEDIR not set; not running Mauve tests"
    return 1
  }

  # Run in subdir so we don't overwrite our own Makefile.
  catch {system "rm -rf mauve-build"}
  file mkdir mauve-build
  # Some weirdness to set srcdir correctly.
  set here [pwd]
  cd $srcdir
  set full_srcdir [pwd]
  cd $here/mauve-build

  if {[catch {
    system "$env(MAUVEDIR)/configure --with-gcj 2>&1"
  } msg]} then {
    fail "Mauve configure"
    verbose "configure failed with $msg"
    return 0
  }
  pass "Mauve configure"

  # Copy appropriate tags file locally.
  set fd [open $full_srcdir/../mauve-libgcj r]
  set c [read $fd]
  close $fd
  set fd [open mauve-libgcj w]
  puts -nonewline $fd $c
  close $fd

  catch {system "ln -s $full_srcdir/libjava.mauve/xfails xfails"}

  if {[catch {
    system "make KEYS=libgcj classes.stamp 2>&1"
  } msg]} then {
    fail "Mauve build"
    verbose "build failed with $msg"
    return 0
  }
  pass "Mauve build"

  # Compute list of files to test, and also all files to build.
  set choices [mauve_compute_uses uses]

  # Compute flags to use to do the build.
  set compile_args [libjava_arguments]
  set link_args [concat [libjava_arguments link] \
                   [list "additional_flags=--main=DejaGNUTestHarness"]]

  set ok 1
  set objlist {}
  foreach base [mauve_find_harness_files] {
    set file $base.class
    set obj $base.o
    set x [libjava_prune_warnings \
             [target_compile [pwd]/$file $obj object $compile_args]]
    if {$x != ""} then {
      fail "Compile $obj"
      set ok 0
    } else {
      pass "Compile $obj"
    }
    lappend objlist $obj
  }
  if {! $ok} then {
    return 0
  }

  set proc_ok 1
  set Executable DejaGNUTestHarness
  foreach file $choices {
    # Turn `java/lang/Foo.java' into `java.lang.Foo'.
    
    set class [file rootname $file]
    regsub -all -- / $class . class

    set ok 1
    foreach obj $uses($file) {
      if {! [file exists $obj]} then {
        verbose "compiling $obj for test of $class"
        set srcfile [file rootname $obj].class
        set x [libjava_prune_warnings \
                 [target_compile [pwd]/$srcfile $obj object $compile_args]]
        if {$x != ""} then {
          fail "Compile $obj for $class"
          set ok 0
          break
        }
        pass "Compile $obj for $class"
      }
    }
    if {! $ok} then {
      set proc_ok 0
      continue
    }

    set infile $full_srcdir/$subdir/DejaGNUTestHarness.java
    set srcfile DejaGNUTestHarness.java
    set f [open $infile r]
    set d [open gnu/testlet/$srcfile w]
    while {[gets $f line] >= 0} {
        if [regexp {harness\.runtest \(args\[1\]\)} $line] then {
            regsub {args\[1\]} $line "\"$class\"" out
        } else {
            set out $line
        }
        puts $d $out
    }
    close $f
    close $d

    if {! [bytecompile_file [pwd]/gnu/testlet/$srcfile [pwd]/gnu/testlet \
               $env(MAUVEDIR):[pwd]]} then {
        fail "Compile DejaGNUTestHarness.java"
        return 0
    }

    set x [libjava_prune_warnings \
             [target_compile DejaGNUTestHarness.class \
                DejaGNUTestHarness.o object $compile_args]]
    if {$x != ""} then {
        fail "Compile DejaGNUTestHarness.java"
        set proc_ok 0
        continue
    }

    set x [libjava_prune_warnings \
             [target_compile [concat $uses($file) $objlist] \
                $Executable executable $link_args]]
    if {$x != ""} then {
      set proc_ok 0
      fail "Link for $class"
      continue
    }
    pass "Link for $class"

    set result [libjava_load [pwd]/DejaGNUTestHarness \
                  "$env(MAUVEDIR) $class" ""]

    # Extract pass/failure info from output.
    foreach line [split [lindex $result 1] \n] {
      if {[regexp -- {^(PASS|FAIL|XFAIL|XPASS): (.*)$} $line ignore what msg]} then {
        if {$what == "XFAIL" || $what == "XPASS"} then {
          setup_xfail *-*-*
        }
        if {$what == "PASS" || $what == "XPASS"} then {
          pass $msg
        } else {
          set proc_ok 0
          fail $msg
        }
      }
    }
  }

  return $proc_ok
}

proc gcj_run_mauve_tests {} {
  # The test_mauve* procs will change the current directory.  It's
  # simpler to fix this up here than to keep track of this in the
  # procs.
  set here [pwd]
  if { [board_info target exists is_simulator] } {
    set r [test_mauve_sim]
  } else {
    set r [test_mauve]
  }
  cd $here

  if {$r} {
    # No need to keep the build around.  FIXME: this knows how the
    # tests work.  This whole file could use a rewrite.
    system "rm -rf mauve-build"
  }
}

gcj_run_mauve_tests

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

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