#   Copyright (C) 2003 Free Software Foundation, Inc.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# 
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
# 
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  

load_lib copy-file.exp

proc dg-pch { subdir test options suffix } {
    global runtests dg-do-what-default

    # If we're only testing specific files and this isn't one of them, skip it.
    if ![runtest_file_p $runtests $test] {
	return
    }
    set nshort "$subdir/[file tail $test]"
    set bname "[file rootname [file tail $nshort]]"

    catch { file delete "$bname$suffix.gch" }
    catch { file delete "$bname.s" }
    catch { file delete "$bname.s-gch" }

    # We don't try to use the loop-optimizing options, since they are highly
    # unlikely to make any difference to PCH.
    foreach flags $options {
	verbose "Testing $nshort, $flags" 1

	# For the header files, the default is to precompile.
	set dg-do-what-default precompile
	catch { file delete "$bname$suffix" }
	gcc_copy_files "[file rootname $test]${suffix}s" "$bname$suffix"
	dg-test -keep-output "./$bname$suffix" $flags ""

	# For the rest, the default is to compile to .s.
	set dg-do-what-default compile

	if { [ file exists "$bname$suffix.gch" ] } {
	    # Ensure that the PCH file is used, not the original header.
	    file delete "$bname$suffix"

	    dg-test -keep-output $test $flags "-I."
	    file delete "$bname$suffix.gch"
	    if { [ file exists "$bname.s" ] } {
		file rename "$bname.s" "$bname.s-gch"
		gcc_copy_files "[file rootname $test]${suffix}s" "$bname$suffix"
		dg-test -keep-output $test $flags "-I."
		set tmp [ diff "$bname.s" "$bname.s-gch" ]
		if { $tmp == 0 } {
		    untested "$nshort $flags assembly comparison"
		} elseif { $tmp == 1 } {
		    pass "$nshort $flags assembly comparison"
		} else {
		    fail "$nshort $flags assembly comparison"
		}
		file delete "$bname$suffix"
		file delete "$bname.s"
		file delete "$bname.s-gch"
	    } else {
		untested "$nshort $flags assembly comparison"
	    }

	} else {
	    untested "$nshort $flags"
	    untested "$nshort $flags assembly comparison"
	}
    }
}
