#   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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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"
	}
    }
}
