# Copyright (C) 2005 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.  

# Run the LANGUAGE compiler with GCC_OPTIONS and inspect the compiler,
# assembler and linker output (from gcc -v) to make sure that they
# match the patterns COMPILER_PATTERN, AS_PATTERN and LD_PATTERN,
# respectively.

proc check_for_options {language gcc_options compiler_pattern as_pattern ld_pattern} {
    set filename test-[pid]
    set fd [open $filename.c w]
    puts $fd "int main (void) \{ return 0; \}"
    close $fd
    remote_download host $filename.c

    set test "compiler driver $gcc_options option(s)"
    set gcc_options "\{additional_flags=$gcc_options -v\}"

    switch "$language" {
	"c" { set compiler cc1 }
	default { error "unknown language" }
    }
    set gcc_output [gcc_target_compile $filename.c $filename.x executable $gcc_options]
    remote_file build delete $filename.c $filename.x $filename.gcno

    if {![regexp -- "/$compiler -quiet.*$compiler_pattern" $gcc_output]} {
	fail "$test (compiler options)"
	return
    }
    if {![regexp -- " *as .*$as_pattern" $gcc_output]} {
	fail "$test (assembler options)"
	return
    }
    if {![regexp -- "/collect2 .*$ld_pattern" $gcc_output]} {
	fail "$test (linker options)"
	return
    }
    pass $test
}

check_for_options c {--coverage} {-fprofile-arcs -ftest-coverage} {} {-lgcov}
