# Copyright (C) 2003-2024 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 3 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 GCC; see the file COPYING3.  If not see
# <http://www.gnu.org/licenses/>.

load_lib copy-file.exp

proc pch-init { args } {
    global pch_unsupported_debug pch_unsupported

    if [info exists pch_unsupported_debug] {
	error "pch-init: pch_unsupported_debug is not empty as expected"
    }
    if [info exists pch_unsupported] {
	error "pch-init: pch_unsupported is not empty as expected"
    }

    set result [check_compile pchtest object "int i;" "-g -x c-header"]
    set pch_unsupported_debug \
	[regexp "debug info cannot be used with pre-compiled headers" \
		[lindex $result 0]]
    remote_file build delete [lindex $result 1]

    set pch_unsupported 0
    if { $pch_unsupported_debug } {
	verbose -log "pch is unsupported with the debug info format"

	set result [check_compile pchtest object "int i;" "-x c-header"]
	set pch_unsupported \
	    [regexp "debug info cannot be used with pre-compiled headers" \
		 [lindex $result 0]]
	remote_file build delete [lindex $result 1]
    }
}

proc pch-finish { args } {
    global pch_unsupported_debug pch_unsupported
    unset pch_unsupported_debug
    unset pch_unsupported
}

proc check_effective_target_pch_supported_debug { } {
    global pch_unsupported_debug
    if { $pch_unsupported_debug } {
	return 0
    }
    return 1
}

proc dg-flags-pch { subdir test otherflags options suffix } {
    global runtests dg-do-what-default
    global pch_unsupported_debug pch_unsupported

    # If we're only testing specific files and this isn't one of them, skip it.
    if ![runtest_file_p $runtests $test] {
	return
    }

    if { [istarget "powerpc-ibm-aix*"] } {
	set torture_execute_xfail "powerpc-ibm-aix*"
	return
    }

    set nshort "$subdir/[file tail $test]"
    set bname "[file rootname [file tail $nshort]]"

    catch { file_on_host delete "$bname$suffix.gch" }
    catch { file_on_host delete "$bname.s" }
    catch { file_on_host 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, $otherflags $flags" 1

	if { $pch_unsupported != 0 \
	     || ( $pch_unsupported_debug != 0 && [regexp " -g" " $flags"] ) } {
	    verbose -log "$nshort unsupported because debug format conflicts with PCH"
	    unsupported "$nshort $flags"
	    continue
	}

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

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

	# Process the target selectors to see whether the remaining
	# part of the test should be skipped.
	#
	# ??? This doesn't currently handle flag-specific skips,
	# based on dg-options.
	set dg-do-what [list compile "" P]
	set dg-extra-tool-flags ""
	foreach op [dg-get-options "./$bname$suffix"] {
	    switch [lindex $op 0] {
		dg-require-effective-target -
		dg-skip-if {
		    if { [catch "$op" msg] } {
			perror "$bname$suffix: $msg for \"$op\""
		    }
		}
	    }
	}
	if { [lindex ${dg-do-what} 1] == "N" } {
	    continue
	}

	set have_errs [llength [grep $test "{\[ \t\]\+dg-error\[ \t\]\+.*\[ \t\]\+}"]]

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

	    # The flags "-Dwith_PCH" and "-Dwithout_PCH" are to distinguish the
	    # two compiles in test summary lines.
	    dg-test -keep-output $test "$otherflags $flags -I. -Dwith_PCH" ""
	    file_on_host delete "$bname$suffix.gch"
	    if { !$have_errs } {
		if { [ file_on_host exists "$bname.s" ] } {
		    remote_upload host "$bname.s" "$bname.s-gch"
		    remote_download host "$bname.s-gch"
		    gcc_copy_files "[file rootname $test]${suffix}s" "$bname$suffix"
		    dg-test -keep-output $test "$otherflags $flags -I. -Dwithout_PCH" ""
		    remote_upload host "$bname.s"
		    set tmp [ diff "$bname.s" "$bname.s-gch" ]
		    if { $tmp == 0 } {
			verbose -log "assembly file '$bname.s', '$bname.s-gch' comparison error"
			fail "$nshort $otherflags $flags assembly comparison"
		    } elseif { $tmp == 1 } {
			pass "$nshort $otherflags $flags assembly comparison"
		    } else {
			fail "$nshort $otherflags $flags assembly comparison"
		    }
		    file_on_host delete "$bname$suffix"
		    file_on_host delete "$bname.s"
		    file_on_host delete "$bname.s-gch"
		} else {
		    verbose -log "assembly file '$bname.s' missing"
 		    fail "$nshort $flags assembly comparison"
		}
	    }
	} else {
	    verbose -log "pch file '$bname$suffix.gch' missing"
	    fail "$nshort $flags"
	    if { !$have_errs } {
		verbose -log "assembly file '$bname.s' missing" 1
		fail "$nshort $flags assembly comparison"
	    }
	}
    }
}

proc dg-pch { subdir test options suffix } {
  return [dg-flags-pch $subdir $test "" $options $suffix]
}
