# Copyright (C) 2003-2022 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" ""

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

	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"
		}
	    }
	} elseif { $pch_unsupported_debug == 0 \
		   || [llength [grep $test "{\[ \t\]\+dg-require-effective-target\[ \t\]\+pch_supported_debug\[ \t\]\+.*\[ \t\]\+}"]] > 0 } {
	    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]
}
