# This file defines a tcl proc to assist with testing the llvm2cpp. There are
# no llvm2cpp specific test cases. Instead, it utilizes all the existing test
# cases and makes sure llvm2cpp can run them. The basic idea is that we find
# all the LLVM Assembly (*.ll) files, run llvm2cpp on them to generate a C++
# program, compile those programs, run them and see if what they produce matches
# the original input to llvm2cpp.

proc llvm2cpp-test { files } {
  global subdir llvmtoolsdir llvmlibsdir objdir srcdir objroot srcroot 
  set timeout 30
  set path [file join $objdir $subdir]
  set llc [file join $llvmtoolsdir llc ]
  set llvmas [file join $llvmtoolsdir llvm-as ]
  set llvmdis [file join $llvmtoolsdir llvm-dis ]

  #Make Output Directory if it does not exist already
  if { [file exists path] } {
      cd $path
  } else {
      file mkdir $path
      cd $path
  }
  
  file mkdir Output

  foreach test $files {
      
    set filename [file tail $test]
    set generated [file join Output $filename.cpp]
    set executable [file join Output $filename.exe]
    set output [file join Output $filename.gen]
    set assembly [file join Output $filename.asm]
    set testname [file rootname $filename]
    set bytecode [file join Output $filename.bc]

    # Note that the stderr for llvm-as, etc. must be redirected to /dev/null 
    # because otherwise exec will see the msgs and return 1 even though they 
    # are only warnings. If real errors are generated on stderr then llvm-as 
    # will return a non-zero retval anyway so we're good.

    # Scan the test file to see if there's an XFAIL file. If so, don't run it
    set retval [ catch { 
      exec -keepnewline grep XFAIL $test 2>/dev/null } msg ]
    if { $retval == 0 } {
      continue;
    }

    # Run llvm-as/llvm-dis
    set pipeline llvm-as|llvm-dis
    set retval [ catch { 
      exec -keepnewline $llvmas < $test -o - | $llvmdis -o $assembly 2>/dev/null } msg ]

    if { $retval != 0 } {
      fail "$test: $pipeline returned $retval\n$msg"
      continue 
    }

    # Build bytecode for llvm2cpp input
    set retval [ catch { 
      exec -keepnewline $llvmas < $assembly > $bytecode 2>/dev/null } msg ]

    if { $retval != 0 } {
      fail "$test: llvm-as returned $retval\n$msg"
      continue 
    }

    set retval [ catch { 
      exec -keepnewline $llc -march=cpp -o $generated < $bytecode 2>/dev/null } msg]

    if { $retval != 0 } {
      fail "$test: llvm2cpp returned $retval\n$msg"
      continue
    }

    set retval [ catch { 
      exec -keepnewline gcc -g -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS -o $executable $generated -I$srcroot/include -I$objroot/include -L$llvmlibsdir -lLLVMCore -lLLVMSupport -lLLVMSystem -lstdc++ } msg ] 
    if { $retval != 0 } {
      fail "$test: gcc returned $retval\n$msg"
      continue
    }

    set retval [ catch { exec -keepnewline $executable > $output } msg ]
    if { $retval != 0 } {
      set execname [file tail $executable]
      fail "$test: $execname returned $retval:\n$msg"
      continue
    } 

    set retval [ catch { 
      exec -keepnewline diff $assembly $output } msg ]

    if { $retval != 0 } {
      fail "$test: diff returned $retval:\n$msg"
      continue
    }
    pass "$test"
  }
}


